Apache ProxyPass em vários locais

Apache ProxyPass em vários locais

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/helloreceberá 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/helloter 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/hellorecebemos um 503erro 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/helloe 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.

informação relacionada