- PR -

Apache1.3のタイムアウトについて

1
投稿者投稿内容
フレ
会議室デビュー日: 2003/03/23
投稿数: 12
投稿日時: 2003-05-29 10:53
お世話になります。
Apacheのタイムアウトの動作について
ご存知の方がいらっしゃたら教えてください。

【環境】
・OS :MiracleLinux Standard Edition 1.0
・Webサーバ :Apache1.3.22(RPM形式)
・サーブレットコンテナ :Tomcat3.1
・Apache〜Tomcat間のコネクタ:mod_jserv(ajp12)

【質問】
開発環境でApacheとTomcatを使用しています。
Apache〜Tomcat間はmod_jservを使ってajp12で通信しています。

上記の構成で動作検証したところ
Apacheのタイムアウトが
想像していた動作をしてくれませんでした。

【やったこと】
/etc/httpd/conf/httpd.conf の
timeoutディレクティブの設定で
120秒を設定して、Apacheを再起動しました。

HTTPクライアントのテストツールから
HTTPリクエストを送信しました。

このとき、HTTPボディ部のサイズが
HTTPヘッダの Content-Length に指定したサイズよりも
小さいHTTPリクエストを送信しました。


私の予想では、120秒後にApacheがタイムアウトを検出して
HTTPクライアントとのコネクションが強制切断されると
考えていたのですが4時間たっても切断されません。

Apacheの仕様では、HTTPリクエストを全て受信し終わってから
タイムアウト検出のためのタイマー監視が開始されるということでしょうか?


試しに netstat -tnp で確認したところ
HTTP受信直後にTomcatとの ajp12 のコネクションも張っているようです。
※ajp12のコネクタでは 8007 ポートを使用しています。

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8007 127.0.0.1:1075 ESTABLISHED 674/java
tcp 0 0 127.0.0.1:1075 127.0.0.1:8007 ESTABLISHED 368/httpd
tcp 0 0 192.168.0.1:80 192.168.0.2:1044 ESTABLISHED 368/httpd

いつまでたってもタイムアウトしないので
HTTPクライアント側から強制切断すると以下のようになります。
なお、強制切断した契機でTomcat上のサーブレットで
InputStreamの入力待ちが終了して doPost()メソッドの処理を開始します。

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8007 127.0.0.1:1075 ESTABLISHED 674/java
tcp 0 0 127.0.0.1:1075 127.0.0.1:8007 ESTABLISHED 368/httpd
tcp 0 0 192.168.0.1:80 192.168.0.2:1044 CLOSE_WAIT 368/httpd

HTTPクライアントとの接続は切断されますが、
Apache〜Tomcat間のコネクションはまだまだ接続中のようです。

そしてApacheのタイムアウト時間として設定した
120秒を経過すると以下のようになります。

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8007 127.0.0.1:1076 TIME_WAIT -
tcp 0 35 127.0.0.1:8007 127.0.0.1:1075 CLOSE 674/java

そしてこの時にTomcatの起動コマンドを入力したコンソールに
HANDLER THREAD PROBLEM: java.lang.NullPointerException
java.lang.NullPointerException
at org.apache.tomcat.service.connector.AJP12ResponseAdapter.sendStatus(Ajp12ConnectionHandler.java:439)
at org.apache.tomcat.service.http.HttpResponseAdapter.endHeaders(HttpResponseAdapter.java:111)
at org.apache.tomcat.core.BufferedServletOutputStream.sendHeaders(BufferedServletOutputStream.java:127)
at org.apache.tomcat.core.BufferedServletOutputStream.reallyFlush(BufferedServletOutputStream.java:239)
at org.apache.tomcat.core.BufferedServletOutputStream.close(BufferedServletOutputStream.java:258)
at java.io.OutputStreamWriter.close(OutputStreamWriter.java:254)
at java.io.PrintWriter.close(PrintWriter.java:129)
at org.apache.tomcat.core.ResponseImpl.finish(ResponseImpl.java:176)
at org.apache.tomcat.service.connector.Ajp12ConnectionHandler.processConnection(Ajp12ConnectionHandler.java:158)
at org.apache.tomcat.service.TcpConnectionThread.run(SimpleTcpEndpoint.java:338)
at java.lang.Thread.run(Thread.java:479)
というスタックトレースが出力されます。

上記の動作の流れを見ていて
HTTPリクエストを全て受信し終わってからApacheのタイマーが起動し、
120秒後にApache〜Tomcat間のコネクションを強制切断したため
上記のNullPointerExceptionという例外がTomcatで発生したのではないかと
考えついたわけです。

Apacheのソースを見て確認しろと言われればそれまでですが
C言語の経験がほとんどないため困難です。困っちゃいました

以上です。
申し訳ございませんがご存知の方がいらっしゃたらお助けください。
よろしくお願いします。

1

スキルアップ/キャリアアップ(JOB@IT)