apacheとtomcat構成でセッションエラー。mod_proxy_ajpを使用
数年前に開発したシステムで
当時よくあったapacheとtomcatを連携しているjavaのWEBアプリケーションだったのですが、
その改修依頼があった際に発生した障害の備忘録。
改修してapache+tomcatの再起動をしたところ、
セッションのエラーが出たので
その際の回避策メモ。
障害の発生
いつものように改修を行い、apacheとtomcatの再起動を行ったが、
新規ウィンドウを立ち上げて画面操作をするページで
セッションエラーが発生。
セッションエラーというよりは、
セッションがないのでログイン画面へリダイレクトされてしまうという現象。
同ウィンドウ内の遷移は正常で、
数回再起動を行うと新規ウィンドウでも正常に遷移する場合もあるので、
原因がなかなか判明せずという状態。
障害点の切り分け
ローカルの開発環境(tomcat単体)では
特に問題なく稼働するため
プログラム上の原因ではないと仮定。
環境依存によるものとみて調査。
正常に稼働してしまう!?場合もあるので、
ログイン画面へリダイレクトされてしまった際の
catalina.outを詳細に確認していたところ、
正常稼働時と障害時に微妙な違いがあることを発見。
TP-ProcessorのIDがずれている。
※TP-ProcessorはThreadPoolProcessorの略っぽい
DEBUG: YYYY-MM-DD 00:00:00,607 [TP-Processor5] END jp.co.xxx.xxx.action.IndexAction#index() : Login.jsp ↑の5が今までのページ遷移と異なる
上記を元に調査をしたところ、
スレッドプールを管理するプロセス番号が異なっている場合に、
セッションエラー(セッションの引き継ぎができていない)が発生することがありそう。
対応策はapacheとtomcatのセッション保持
上記からapacheとtomcatのセッション維持に問題があるようなので、
mod_proxy_ajpの設定が指定してある
conf.d以下のproxy.confへkeepalive=onを追加
<Location /アプリケーション名/> ProxyPass ajp://localhost:ポート番号/アプリケーション名/ keepalive=on </Location>
ロードバランサ―を設置している場合は必須だったけれど、
apache:tomcat=1:1の場合はなくても動いていたはずなんだけどな、十年近く前だけど。。。
どこかのバージョンアップなどで非活性のセッションを自動で落とすようになった模様。
サーバーを変更したのでOSのデフォルト設定が異なるものになったのかもしれない。
結果正常にセッション情報を引き継ぐようになったので、
この設定で正常稼働するようになりました。