メモの日々


2019年09月13日(金) [長年日記]

[web][java] TomcatをApacheと連携させる方法

Tomcatの前段にリバースプロキシとしてApacheを配置し、Apache経由でTomcatにアクセスできるようにする方法を少し調べたのでメモ。試したバージョンはTomcat 8.5.39とApache 2.4.29。

リバースプロキシとして動作させるためにはApacheにモジュールを導入する必要があるが、その選択肢として次の3つがある。

モジュール名Apache~Tomcat間のプロトコルメモ
mod_proxy_httpHTTPApacheの同梱モジュールで導入は簡単
mod_proxy_ajpAJPApacheの同梱モジュールで導入はまあ簡単
mod_jkAJPTomcat側で開発されている。試してないけど上記モジュールよりは面倒そう

mod_proxy_httpを使う場合

TomcatはデフォルトでHTTPを受け付けるようになっているので、mod_proxy_httpを使う場合はApache側の設定だけで連携を実現できる。必要な設定はモジュールのロードと要求の転送設定で、次のような感じで指定する。

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so

<IfModule mod_proxy.c>
    ProxyPass /test http://localhost:8080/app1
    ProxyPassReverse /test http://localhost:8080/app1
</IfModule>
  • mod_proxy_httpを動作させるにはmod_proxyも必要なのでそれもロードする。
  • ProxyPassが要求を転送するためのディレクティブ。
  • ProxyPassReverseはリダイレクト先を適切にマッピングするためのディレクティブ。
  • mod_proxyにはほかにも色々なディレクティブがあるので、必要に応じてそれらを使う。

mod_proxy_ajpを使う場合

mod_proxy_ajpを使うには、TomcatがAJPを受け付けるように設定する必要がある。server.xmlの中に

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

というような行があるので、これを生かす(コメントアウトを外す)ようにすればよい。

Apache側の設定はmod_proxy_httpと同様。ロードするモジュール、プロトコル名、ポート番号を変えればよい。

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

<IfModule mod_proxy.c>
    ProxyPass /test ajp://localhost:8009/app1
    ProxyPassReverse /test ajp://localhost:8009/app1
</IfModule>