2011年12月31日土曜日

worker MPM じゃないと ttl が動かない

サイオス鎌田です。
2011年ももうすぐ終わりですね。
今回は、Apache のプロキシ設定に関するお話です。

Apache のプロキシ設定に、コネクションの生存時間を設定する ttl 設定があることはご存じでしょうか。

ProxyPass ディレクティブ
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass

実はこの ttl 設定、Apache のコンパイル時にデフォルトで選択されたり、RHEL 等のデフォルトである prefork MPM では動作しません。ソースコード上ではスレッド MPM が有効な場合のみ動作するよう設計されているんです。従って、worker MPM 等のスレッド MPM でなければ ttl が使えません。

そのため、例えば prefork MPM のまま ttl 設定を行い、プロキシ先のサーバ、例えば Tomcat で connectionTimeout を設定していると、Apache からコネクションを切断することがないため、Tomcat からコネクションの切断要求が送信されたままになってしまい、CLOSE_WAIT の状態になってしまいます。

現在の Apache の trunk 上にあるソースコードを見た限りでは、スレッド MPM 限定となるような設計にはなっていなかったので、おそらく Apache 2.4 からは prefork MPM でも ttl が動作すると思われますが、Apache 2.0 系または Apache 2.2 系で ttl を使う場合は、worker MPM を使う方がいいかもしれません。

0 件のコメント:

コメントを投稿