ほとんどのリクエストをTomcatにプロキシするhttpd設定の問題

ほとんどのリクエストをTomcatにプロキシするhttpd設定の問題

Apache で次のものを動作させるのに少し苦労しました:

AWS ELB の背後に Apache/Tomcat インスタンスがあります。ELB は SSL ターミネーションを実行しているため、これを処理するためにサーバー上でリダイレクトが行われます。

/healthELB ヘルスチェックが機能するには、http でアクセスできる必要があります。

/または以外のもの、つまりプロキシthemeを tomcat に送信する必要があります。/foolocalhost: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>

関連情報