0

それで、時間がかかりすぎるサーバープロセスがあるとしましょう。クライアントは「タイムアウト」と文句を言います。

私が間違っている場合は訂正してください。ただし、この特定のタイムアウトは、apacheのタイムアウト設定に関係している可能性がありますが、必ずしもそうとは限りません。問題のページをテストするときに、確実にタイムアウトすることができなかったため、これが当てはまると思います。ほとんどの場合、ブラウザは必要な時間だけ回転します。

ドキュメントで説明されているように、クライアントへの接続に問題があった場合、タイムアウト設定が有効になります。しかし、接続が正常であれば、接続を閉じるのはクライアント次第です(私は信じています)。

これは、クライアントがブラウザを閉じた場合、Apacheがタイムアウト制限(私の場合は300秒)に達し、プロセスを強制終了することも意味すると思いました。これは当てはまらないようです。

テスト方法は次のとおり
です。サーバー上のコードにwhileループを追加しました。

too_long = 2000
tstart = time.time()
f = open('/tmp/timeout_test.txt', 'w')
while True:
    time.sleep(100)
    elapsed = time.time() - tstart
    f.write('Loop, %s elapsed\n' % elapsed)
    if elapsed > too_long:
        break

次に、Webページを開いてそのループを起動し、サーバーでnetstatを実行しました。

~$ netstat -np | grep ESTAB | grep apache
tcp        0      0 10.102.123.6:443        10.102.119.101:53519    ESTABLISHED 16534/apache2
tcp        0      0 127.0.0.1:60299         127.0.0.1:5432          ESTABLISHED 16534/apache2

(これは10.102.119.101にあり、サーバーは10.102.123.6にあります)
次に、ブラウザーを閉じて、そのnetstat行を再実行しました。

~% netstat -np | grep ESTAB | grep apache
tcp        0      0 127.0.0.1:60299         127.0.0.1:5432          ESTABLISHED 16534/apache2

接続が失われましたが、サーバーはまだループ状態でした。次のコマンドを実行して確認できました。

~% lsof | grep timeout
apache2   16534   www-data   14w      REG        8,1        0     536533 /tmp/timeout_test.txt 

つまり、apacheプロセスではまだそのファイルが開いていました。次の2000秒間、私が走ったとき:

~% cat /tmp/timeout_test.txt

何も得られませんでした。2000秒後、netcat行は何も生成せず、tmpファイルにwhileループからの出力が入力されました。

では、Apacheプロセスは、クライアント接続に関係なく、要求されたことを実行しているように見えますか?そして、そのループバック接続は何についてですか?

4

1 に答える 1

1

正しい。C apacheモジュールでは、次のようなチェックを追加できます。

/* r is the 'request_rec' object from apache */
if (r->connection->aborted) {
    /* stop processing and return */
}

クライアントがまだ接続されていることを確認します。おそらく、Pythonインターフェースにも似たようなものがあります。

ループバック接続に関しては、そのループが実行されている限り開いたままのpostgresqlデータベースへの接続です。

于 2009-11-09T23:51:35.113 に答える