
В настоящее время у меня возникли проблемы при попытке использовать Apache в качестве обратного прокси-сервера для интерфейса нашего приложения и API нашего бэкэнда.
Например, если пользователь нажимает на URL, https://my.app.com/
он должен быть перенаправлен на наше фронтенд-приложение, обслуживаемое S3. Если вы нажмете на URL, https://my.app.com/api/hello
вы получите ответ JSON от нашего бэкенд-API.
Идеальным поведением является https://my.app.com/
обратное проксирование на http://s3app.private
.
Аналогично мы захотим https://my.app.com/api/hello
иметь обратный прокси-сервер дляhttp://myapi.private/api/hello
Наша текущая конфигурация Apache выглядит так:
Listen 443
<VirtualHost *:443>
ServerName my.app.com
ErrorDocument 404 /index.html
ProxyErrorOverride On
RequestHeader set X-Forwarded-Proto https
SSLEngine on
SSLCertificateFile "/usr/local/apache2/certs/certificate.crt"
SSLCertificateKeyFile "/usr/local/apache2/certs/private.key"
SSLProtocol TLSv1.2
ProxyAddHeaders On
<Location "/">
ProxyPass "http://s3app.private/" retry=0
</Location>
<Location "/api">
ProxyPreserveHost On
ProxyPass "http://myapi.private/api" retry=0
</Location>
</VirtualHost>
Текущее поведение таково, что когда мы нажимаем, https://my.app.com/
мы видим наше фронтенд-приложение. Однако когда мы нажимаем, https://my.app.com/api/hello
мы получаем 503
ошибку от сервера.
В логах Apache есть следующие строки:
[proxy:error] The timeout specified has expired: AH00957: HTTP: attempt to connect to <internal_ip>:80 (api.private) failed
[proxy_http:error] AH01114: HTTP: failed to make connection to backend: myapi.private, referer: https://my.app.com/
"GET /api/hello HTTP/1.1" 503 299
Мы убедились, что наш API действительно прослушивает этот механизм, указав Apache только на API следующим образом:
Listen 443
<VirtualHost *:443>
ServerName my.app.com
ErrorDocument 404 /index.html
ProxyErrorOverride On
RequestHeader set X-Forwarded-Proto https
SSLEngine on
SSLCertificateFile "/usr/local/apache2/certs/certificate.crt"
SSLCertificateKeyFile "/usr/local/apache2/certs/private.key"
SSLProtocol TLSv1.2
ProxyAddHeaders On
<Location "/api">
ProxyPreserveHost On
ProxyPass "http://myapi.private/api" retry=0
</Location>
</VirtualHost>
Это позволяет нам попасть https://my.app.com/api/hello
и увидеть ожидаемый ответ JSON. Но это успешно только тогда, когда нет другого блока местоположения.
Если говорить точнее, наш внутренний DNS предоставляется Route53, а наш API размещен в ECS.
Любая помощь будет высоко оценена!
решение1
Использование двух виртуальных хостов может помочь, но это не самое идеальное решение.
Listen 443
<VirtualHost *:443>
ServerName my.app.com
ErrorDocument 404 /index.html
ProxyErrorOverride On
RequestHeader set X-Forwarded-Proto https
SSLEngine on
SSLCertificateFile "/usr/local/apache2/certs/certificate.crt"
SSLCertificateKeyFile "/usr/local/apache2/certs/private.key"
SSLProtocol TLSv1.2
ProxyAddHeaders On
<Location "/">
ProxyPass "http://s3app.private/" retry=0
</Location>
<Location "/api">
ProxyPreserveHost On
ProxyPass "http://localhost:8443/api" retry=0
</Location>
</VirtualHost>
Listen 8443
<VirtualHost *:8443>
ServerName localhost
<Location "/api">
ProxyPreserveHost On
ProxyPass "http://myapi.private/api" retry=0
</Location>
</VirtualHost>
У меня нет технических оснований полагать, что это решит вашу проблему, но, возможно, стоит попробовать.