- - PR -
Apache1.3のタイムアウトについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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