Apache ProxyPassing 複数の場所

Apache ProxyPassing 複数の場所

現在、Apache を使用してアプリケーションのフロントエンドとバックエンド API のリバース プロキシとして機能させようとしているときに問題が発生しています。

たとえば、ユーザーが URL にアクセスすると、https://my.app.com/S3 から提供されるフロントエンド アプリケーションに移動します。URL にアクセスすると、https://my.app.com/api/helloバックエンド API から JSON 応答が返されます。

理想的な動作は、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

次のように Apache を API のみにポイントすることで、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

2 つの仮想ホストを使用すると役立つかもしれませんが、最適な解決策ではない可能性があります。

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>

これがあなたの問題を解決する技術的な理由はありませんが、試してみる価値はあるかもしれません。

関連情報