
現在、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>
これがあなたの問題を解決する技術的な理由はありませんが、試してみる価値はあるかもしれません。