
Atualmente estou tendo problemas ao tentar usar o Apache para atuar como um proxy reverso para o front-end de nosso aplicativo e nossa API de back-end.
Por exemplo, se um usuário acessar o URL, https://my.app.com/
ele deverá ser direcionado para nosso aplicativo front-end servido no S3. Se você acessar o URL, https://my.app.com/api/hello
receberá uma resposta JSON de nossa API de back-end.
O comportamento ideal é https://my.app.com/
ter proxy reverso para http://s3app.private
.
Da mesma forma, desejaremos https://my.app.com/api/hello
ter proxy reverso parahttp://myapi.private/api/hello
Nossa configuração atual do Apache é semelhante a esta:
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>
O comportamento atual é que quando acertamos https://my.app.com/
vemos nosso aplicativo front-end. No entanto, quando acertamos, https://my.app.com/api/hello
recebemos um 503
erro do servidor.
Os Logs do Apache mostram estas linhas:
[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
Verificamos que nossa API está realmente escutando esse mecanismo, apontando o Apache apenas para a API, assim:
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>
Fazer isso nos permite acessar https://my.app.com/api/hello
e ver a resposta JSON esperada. Mas isso só é bem-sucedido quando não há outro bloco de localização presente.
Pelo que vale, nosso DNS interno é fornecido pelo Route53 e nossa API é hospedada no ECS.
Toda e qualquer ajuda seria muito apreciada!
Responder1
Usar dois hosts virtuais pode ajudar, mas pode não ser a solução ideal.
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>
Não tenho uma razão técnica para explicar por que isso resolveria seu problema, mas pode valer a pena tentar.