2012年04月08日

mod_proxy_ajpによるApache-Tomcat間通信でのエラー

DMZにApacheをリバースプロキシとして配置して、LAN内のTomcatへ
連携する仕組みで、

The timeout specified has expired: ajp_ilink_receive() can't receive header
(120006)APR does not understand this error code: proxy: read response failed from
ajp_read_header: ajp_ilink_receive failed


こんなタイムアウトエラーが発生しまして、ブラウザ上は503エラーとなるのですが、発生タイミングが1時間程度アクセスを行わないと発生して、エラー後は正常にアクセスできるようになるという状況。

エラーメッセージからGoogle先生に問い合わせるとmod_proxy_ajpのバグみたいな情報があり、mod_jkに切り替えないと直らないような情報が出てくる。まあ、それは最終手段として別の可能性を調査しました。

結論を言うと、今回はDMZ-LAN間にあるFWによって無通信間隔が監視されていて、Apache-Tomcat間のコネクションプールが自動的に切断されていることによるものでした。

切り分け方としては、先ず以下の"disablereuse=On"(http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy.html)オプションを付けて、コネクションプール(常時接続)をOFFにしました。


ProxyPass ajp://192.168.24.XXX:8009/ disablereuse=On
ProxyPassReverse ajp://192.168.24.XXX:8009/


これで現象は再現しなくなったので、コネクションプールが原因となっていることが切り分けられました。まあ、とりあえずこれで本対応でもいいのですが、多分以下のオプションを使用してもOKでしょう。


ProxyPass ajp://192.168.24.XXX:8009/ keepalive=On
ProxyPassReverse ajp://192.168.24.XXX:8009/


posted by 台北猫々 at 20:46| Comment(0) | TrackBack(0) | 技術メモ