- PR -

Apacheのtomcat連携について

1
投稿者投稿内容
to
会議室デビュー日: 2006/07/05
投稿数: 2
投稿日時: 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

加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-07-05 23:29
引用:

toさんの書き込み (2006-07-05 19:12) より:

成功するのですが、Apacheを起動させた状態でTomcatを再起動して、
再度同様のサーブレットを実行するとブラウザに以下のようなエラー
がでます。



なぜにTomcatをというよりサーブレットコンテナを再起動する必要があるのでしょうか。
そっちを何とかしたほうがいいような気が。。。

「連携」とは微妙に関係ない気がしますが。。。
たしかに、意味合いとしては分からなくはありませんが、、

ajp_ilink_send();は以下のようになっています。

コード:
apr_status_t ajp_ilink_send(apr_socket_t *sock, ajp_msg_t *msg)
{
    char         *buf;
    apr_status_t status;
    apr_size_t   length;

    if (sock == NULL) {
        ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,
                      "ajp_ilink_send(): NULL socket provided");
        return AJP_EINVAL;
    }

    ajp_msg_end(msg);

    length = msg->len;
    buf    = (char *)msg->buf;

    do {
        apr_size_t written = length;

        status = apr_socket_send(sock, buf, &written);
        if (status != APR_SUCCESS) {
            ap_log_error(APLOG_MARK, APLOG_ERR, status, NULL,
                          "ajp_ilink_send(): send failed");
            return status;
        }
        length -= written;
        buf    += written;
    } while (length);

    return APR_SUCCESS;
}



apr_socket_send()関数では、接続した後の実装でしょうから、
tomcatを再起動をしたら、ソケットが死んでるのでエラーになってそのままなのでしょう。

それをしたかったら上記の対象ソースを実装しなおすとか、、、

オープンソースだから、やってやれなくはない(苦笑)
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2006-07-05 23:59
mod_proxy(mod_proxy_ajp) の retry パラメータの値をちっちゃくしたらどうでしょ?

パフォーマンスに対する影響など、保証の限りではありませんけど。

あとは、コネクションプーリングを全くしなければ、よいのですかね?

http://httpd.apache.org/docs/2.1/mod/mod_proxy.html
to
会議室デビュー日: 2006/07/05
投稿数: 2
投稿日時: 2006-07-06 00:46
加納正和さん、せんさん、返信ありがとうございます。

> なぜにTomcatをというよりサーブレットコンテナを再起動する必要があるのでしょうか。
> そっちを何とかしたほうがいいような気が。。。

アプリをリリース(差し替え)する際にできるだけ影響を少なくするためにWebサーバの
静的なページはそのまま見れる状態でサーブレットだけ置き換えれればと思ったのですが、
TomcatがContextをリロードしていれば再起動の必要はないような気がしてきました。


> pr_socket_send()関数では、接続した後の実装でしょうから、
> tomcatを再起動をしたら、ソケットが死んでるのでエラーになってそのままなのでしょう。

書店でJakartaの本を手当たり次第チェックしてやっと原因がわかりました。
Tomcat 5.0以降では通信上のオーバーヘッドを減らすために AJP1.3プロトコルがソケット
を常にオープンした状態で動作するため、Tomcatを再起動した場合はApacheも再起動する
必要があるということだそうです。

加納正和さん、せんさん、ありがとうございました。

以上
1

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