- - PR -
Apacheのtomcat連携について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-07-05 19:12
初めまして、toと申します。
ApacheとTomcatとの連携で解決できない問題あり、雑誌、WEBで 調べても原因がわからないため、皆様のお知恵を拝借できれば と考え投稿いたしました。 (過去に似たような投稿が有りましたが若干現象が違ったので 新規投稿しました) 問題はApache2.2.2 と Tomcat5.5.17 で連携の以下のような設定を行い [httpd.conf]以下の3行を最後に追加 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so <Location /test/> ProxyPass ajp://localhost:8009/test/ </Location> 1度目のサーブレットの実行(http://localhot/test/myservlet)には 成功するのですが、Apacheを起動させた状態でTomcatを再起動して、 再度同様のサーブレットを実行するとブラウザに以下のようなエラー がでます。 「Service Temporarily Unavailable」HTTPステータスコード:503 また、Apacheのエラーログには以下のように表示されていました。 [error](OS 10054)既存の接続はリモート ホストに強制的に切断 れました。 : ajp_ilink_send(): send failed [error] ajp_send_header: ajp_ilink_send failed [error](OS 10054)既存の接続はリモート ホストに強制的に切断 れました。 :proxy: AJP: request failed to 127.0.0.1:8009(localhost) ここで、再度サーブレットを実行させたり、Apacheを再起動すると 正常に実行できます。 自分が考えるに、tomcatを停止させても、Apacheがtomcatのインスタンス を何かしら掴んでいる為にこのようになり、再度サーブレット実行時に Apacheが新しいtomcatのインスタンスを取得し直すといったことが 起こっているのではと考えています。 (Apacheを再起動せずに)tomcatを再起動してもサーブレットの実行を 成功させるにはどのようにすればいいのでしょうか? ご存知の方がおられましたらどうかご教授下さい。 以上、よろしくお願いいたします。 環境: WindowsXP Professional SP2 Apache2.2.2 Tomcat5.5.17 | ||||||||
|
投稿日時: 2006-07-05 23:29
なぜにTomcatをというよりサーブレットコンテナを再起動する必要があるのでしょうか。 そっちを何とかしたほうがいいような気が。。。 「連携」とは微妙に関係ない気がしますが。。。 たしかに、意味合いとしては分からなくはありませんが、、 ajp_ilink_send();は以下のようになっています。
apr_socket_send()関数では、接続した後の実装でしょうから、 tomcatを再起動をしたら、ソケットが死んでるのでエラーになってそのままなのでしょう。 それをしたかったら上記の対象ソースを実装しなおすとか、、、 オープンソースだから、やってやれなくはない(苦笑) | ||||||||
|
投稿日時: 2006-07-05 23:59
mod_proxy(mod_proxy_ajp) の retry パラメータの値をちっちゃくしたらどうでしょ?
パフォーマンスに対する影響など、保証の限りではありませんけど。 あとは、コネクションプーリングを全くしなければ、よいのですかね? http://httpd.apache.org/docs/2.1/mod/mod_proxy.html | ||||||||
|
投稿日時: 2006-07-06 00:46
加納正和さん、せんさん、返信ありがとうございます。
> なぜにTomcatをというよりサーブレットコンテナを再起動する必要があるのでしょうか。 > そっちを何とかしたほうがいいような気が。。。 アプリをリリース(差し替え)する際にできるだけ影響を少なくするためにWebサーバの 静的なページはそのまま見れる状態でサーブレットだけ置き換えれればと思ったのですが、 TomcatがContextをリロードしていれば再起動の必要はないような気がしてきました。 > pr_socket_send()関数では、接続した後の実装でしょうから、 > tomcatを再起動をしたら、ソケットが死んでるのでエラーになってそのままなのでしょう。 書店でJakartaの本を手当たり次第チェックしてやっと原因がわかりました。 Tomcat 5.0以降では通信上のオーバーヘッドを減らすために AJP1.3プロトコルがソケット を常にオープンした状態で動作するため、Tomcatを再起動した場合はApacheも再起動する 必要があるということだそうです。 加納正和さん、せんさん、ありがとうございました。 以上 |
1