Apache で次のものを動作させるのに少し苦労しました:
AWS ELB の背後に Apache/Tomcat インスタンスがあります。ELB は SSL ターミネーションを実行しているため、これを処理するためにサーバー上でリダイレクトが行われます。
/health
ELB ヘルスチェックが機能するには、http でアクセスできる必要があります。
/
または以外のもの、つまりプロキシtheme
を tomcat に送信する必要があります。/foo
localhost:8080/foo
mod_proxy や mod_rewrite を使用して以下の設定のいくつかのバリエーションを試しましたが、正常に動作しないようですので、ご指摘いただければ幸いです。
<Location /health>
ProxyPass http://localhost:8080/health ttl=1
ProxyPassReverse http://localhost:8080/health
</Location>
<Location ~ "^/(.+)">
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteCond %{REQUEST_URI} !^/(health|theme)/
RewriteRule . http://localhost:8080/$1 [P]
ProxyPassReverse http://localhost:8080/$1
</Location>
<Location />
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/health
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</Location>
Tomcat はプレーンな http を使用してポート 8080 でリッスンしています。
答え1
私は Tomcat にポート 8009 で ajp をリッスンさせています。他の利点とは別に、これにより両方のサーバーの構成で同じ仮想ホストを定義できるため、リクエスト (デフォルトではポート 80) は最初に Apache に到達します。Apache では、複数の仮想ホストが定義されています。リバース プロキシ ルールは、どのリクエストをさまざまな他のホスト (リモートまたは他のローカル仮想ホスト) に転送するか、DocumentRoot からコンテンツを提供するか、または ajp 経由で Tomcat に転送するかを決定します。mod_proxy_ajp がリクエストを Tomcat に転送する場合、デフォルトではホスト名が保持されるため、Tomcat は、server.xml で定義した一致する仮想ホスト名を持つさまざまな Web アプリケーションにリクエストを転送できます。
以下の例は、まさにあなたが説明したとおりのことを行っているわけではありませんが、両方のサーバー構成で仮想ホストで利用できる柔軟性を示し、ニーズを満たす構成を作成できるようになることを願っています。
apache2.conf のファイル
<VirtualHost *:80>
ServerName my.local.website.com
<Proxy *>
Require all granted
</Proxy>
# proxy specific paths to other virtual hosts
ProxyPass /articles http://a.local.website.com/articles
ProxyPassReverse /articles http://a.local.website.com/articles
ProxyPass /entertainment http://b.local.website.com/entertainment
ProxyPassReverse /entertainment http://b.local.website.com/entertainment
# send everything else to tomcat via ajp on port 8009
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>
$CATALINA_HOME/server.xml
<Host name="my.local.website.com" appBase="temp" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
prefix="website_access." suffix=".log" pattern="common"/>
</Host>