Edited at

Apacheのプロキシ機能を使って特定のパスのみTomcatへ連携(AJP連携)する

Apache/Tomca連携で調べたことをメモっておく(特に目新しい内容はないけど・・・)。


前提


  • 特定のパス(例:/hello)のみTomcatに連携し、それ以外のパス(HTML、CSS、JavaScriptなどの静的コンテンツ)へのアクセスはApacheのドキュメントルートにあるファイルを応答

  • Tomcatアプリにはコンテキストパスがある(例:/app

  • Tomcatへの連携はAJP経由で行う(HTTPではなくAJPを使う理由は特に触れないw)


Apacheの設定

Apacheに以下の設定を追加する。

# コメントアウトされている場合はコメントを除去

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

# ...

# リバースプロキシの設定
ProxyRequests Off
ProxyPass /hello ajp://ap:8009/app/hello
# レスポンスヘッダー値からコンテキストパスを除去
ProxyPassReverse / /app/
# クッキーパスの書き換え
ProxyPassReverseCookiePath /app /


検証アプリ

バックエンドアプリをSpring Boot(組み込みTomcat)で作っていることに特に意味はなし。単にTomcatインストールして・・・設定追加して・・・とかが面倒だっただけ。実際・・・調べた内容を反映することになる実アプリは・・・Spring Bootアプリじゃない(ってかSpringも使ってない)w

でもって、検証アプリでは以下の動作を検証した。


Apache管理のリソースへのアクセス

単純にApacheのドキュメントルート内で管理しているリソースへアクセスしてみる。


Tomcat管理のリソースへのアクセス

Apache経由でTomcatで管理しているリソースへアクセスしてみる。リバースプロキシの確認をするために意図的にリダイレクトしている。なお、Springのフラッシュスコープを使うことでセッション(=クッキー)連携の検証も行っている。


TomcatからApache管理のリソースへのリダイレクト

念のため・・・実アプリのエラーパターンも確認しておく。


補足

リバースプロキシの設定はヘッダー値の書き換えは行うが、レスポンスBODY内にあるURLの書き換えは行われない。

レスポンスBODYの中にあるコンテキストパスを除去する場合は・・・


  • mod_substitute

  • mod_actions

  • mod_ext_filter

  • mod_proxy_html

などを使う必要があるが、今回は未検証。