Spring Boot Apache SSL Обратный Прокси

Вопрос или проблема

У меня есть приложение на Spring Boot, которое работает на сервере Amazon Linux. Я использую Apache HTTP сервер в качестве прокси-сервера для этого приложения. Недавно я установил SSL-сертификат Let’s Encrypt и добавил запись виртуального хоста в Apache. Однако я не могу заставить его нормально работать с Spring Boot. Ни одна версия SSL, похоже, не работает исправно.

Что я наблюдал, так это то, что запросы приходят к приложению Spring Boot, когда пользователь вызывает его https-версию, но пользователь получает ошибку HTTP 404 от Apache. Например, это работает нормально: http://example.com/oauth/token, но это не работает и возвращает 404: https://example.com/oauth/token

Я разместил конфигурационные файлы ниже, что я упустил?

vhosts.conf

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin [email protected]
    DocumentRoot /var/www/example.com/public_html
    ErrorLog /var/www/example.com/logs/error.log
    CustomLog /var/www/example.com/logs/access.log combined

    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
    RewriteRule ^ - [L]
    RewriteRule ^(/api/v1) - [L]
    RewriteRule ^(/oauth/token) - [L]

    RewriteRule ^ /index.html [L]

    SSLEngine on
    SSLCertificateFile /var/www/example.com/cert/cert.pem
    SSLCertificateKeyFile /var/www/example.com/cert/privkey.pem

    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto https
    RequestHeader set X-Forwarded-Port 443
    ProxyPass /api/v1 http://127.0.0.1:8080/api/v1
    ProxyPassReverse /api/v1 http://127.0.0.1:8080/api/v1
    ProxyPass /oauth/token http://127.0.0.1:8080/oauth/token
    ProxyPassReverse /oauth/token http://127.0.0.1:8080/oauth/token
</VirtualHost>

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin [email protected]
    DocumentRoot /var/www/example.com/public_html
    ErrorLog /var/www/example.com/logs/error.log
    CustomLog /var/www/example.com/logs/access.log combined

    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
    RewriteRule ^ - [L]
    RewriteRule ^(/api/v1) - [L]
    RewriteRule ^(/oauth/token) - [L]

    RewriteRule ^ /index.html [L]

    ProxyPreserveHost on
    ProxyPass /api/v1 http://127.0.0.1:8080/api/v1
    ProxyPassReverse /api/v1 http://127.0.0.1:8080/api/v1
    ProxyPass /oauth/token http://127.0.0.1:8080/oauth/token
    ProxyPassReverse /oauth/token http://127.0.0.1:8080/oauth/token
</VirtualHost>

application.properties

server.context-path=/api/v1
server.address=127.0.0.1
server.port=8080
server.use-forward-headers=true
server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto

Я считаю, что это должно быть “server.tomcat.protocol-header”, а не “protocol_header”

Пример:
server.tomcat.protocol-header-https-value=https
server.tomcat.protocol-header=X-Forwarded-Proto
server.tomcat.port-header=X-Forwarded-Port

server.tomcat.remote_ip_header=x-forwarded-for

server.tomcat.protocol_header=x-forwarded-proto

Ссылка на источник:
https://docs.spring.io/spring-boot/docs/1.1.5.RELEASE/reference/html/howto-embedded-servlet-containers.html

Ответ или решение

Конечно! Давайте рассмотрим вашу проблему с обратным прокси-сервером Apache для приложения Spring Boot, которое использует SSL-сертификаты Let’s Encrypt.

Судя по вашей конфигурации Apache и настройкам приложения Spring Boot, вы столкнулись с проблемой, когда запросы, поступающие по HTTPS, возвращают ошибку 404. Основная причина этого может заключаться в неправильной конфигурации заголовков и/или путей.

Шаги для решения проблемы

1. Проверка конфигурации виртуального хоста Apache

Ваш файл vhosts.conf имеет некоторые правила перенаправления (RewriteRule), которые могут блокировать правильную маршрутизацию запросов к Spring Boot приложению. Вам необходимо убедиться, что вы правильно обрабатываете маршруты, к которым делаются запросы.

Вот пример исправленной конфигурации:

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin [email protected]
    DocumentRoot /var/www/example.com/public_html
    ErrorLog /var/www/example.com/logs/error.log
    CustomLog /var/www/example.com/logs/access.log combined

    # Включаем SSL
    SSLEngine on
    SSLCertificateFile /var/www/example.com/cert/cert.pem
    SSLCertificateKeyFile /var/www/example.com/cert/privkey.pem

    # Настройки проксирования
    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto https
    RequestHeader set X-Forwarded-Port 443

    ProxyPass /api/v1 http://127.0.0.1:8080/api/v1
    ProxyPassReverse /api/v1 http://127.0.0.1:8080/api/v1
    ProxyPass /oauth/token http://127.0.0.1:8080/oauth/token
    ProxyPassReverse /oauth/token http://127.0.0.1:8080/oauth/token

    # Обработка ошибок 404
    ErrorDocument 404 /index.html
</VirtualHost>

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin [email protected]

    RewriteEngine On
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

2. Изменение настроек в application.properties

Ваш файл application.properties необходимо корректно настроить для обработки заголовков от прокси-сервера. Попробуйте следующие настройки:

server.context-path=/api/v1
server.address=127.0.0.1
server.port=8080

# Обработка заголовков для SSL
server.use-forward-headers=true
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=X-Forwarded-Proto
server.tomcat.protocol-header-https-value=https
server.tomcat.port-header=X-Forwarded-Port

3. Перезапуск сервисов

После внесения изменений в конфигурацию Apache и файл свойств Spring Boot, не забудьте перезапустить оба сервиса:

sudo systemctl restart httpd  # Для Apache
sudo systemctl restart <your-spring-boot-service>  # Для вашего приложения

4. Тестирование

После перезапуска, протестируйте доступ к вашему приложению по HTTPS:

  • Проверьте, что запросы на https://example.com/oauth/token и https://example.com/api/v1/... работают.
  • Убедитесь, что браузер не показывает ошибки сертификата SSL.

Заключение

Эти изменения должны помочь решить проблему с ошибкой 404 при использовании SSL с Apache и Spring Boot. Если проблема не исчезает, проверьте логи Apache по указанным вами путям для получения более детальной информации о возможных ошибках.

Если у вас есть дополнительные вопросы или требуется дальнейшая помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...