9

私は次のようにWSGIを介してdjangoを実行しています:

<VirtualHost *:80>
    WSGIScriptAlias / /home/ptarjan/django/django.wsgi
    WSGIDaemonProcess ptarjan processes=2 threads=15 display-name=%{GROUP}
    WSGIProcessGroup ptarjan
    Alias /media /home/ptarjan/django/mysite/media/
</VirtualHost>

しかし、Pythonで私が行う場合:

def handler(request) :
    data = urllib2.urlopen("http://example.com/really/unresponsive/url").read()

Apache サーバー全体がハングし、このバックトレースで応答しません

#0  0x00007ffe3602a570 in __read_nocancel () from /lib/libpthread.so.0
#1  0x00007ffe36251d1c in apr_file_read () from /usr/lib/libapr-1.so.0
#2  0x00007ffe364778b5 in ?? () from /usr/lib/libaprutil-1.so.0
#3  0x0000000000440ec2 in ?? ()
#4  0x00000000004412ae in ap_scan_script_header_err_core ()
#5  0x00007ffe2a2fe512 in ?? () from /usr/lib/apache2/modules/mod_wsgi.so
#6  0x00007ffe2a2f9bdd in ?? () from /usr/lib/apache2/modules/mod_wsgi.so
#7  0x000000000043b623 in ap_run_handler ()
#8  0x000000000043eb4f in ap_invoke_handler ()
#9  0x000000000044bbd8 in ap_process_request ()
#10 0x0000000000448cd8 in ?? ()
#11 0x0000000000442a13 in ap_run_process_connection ()
#12 0x000000000045017d in ?? ()
#13 0x00000000004504d4 in ?? ()
#14 0x00000000004510f6 in ap_mpm_run ()
#15 0x0000000000428425 in main ()

Debian Apache 2.2.11-7 で。

同様に、以下から保護できますか?

def handler(request) :
    while (1) :
        pass

PHP では、時間とメモリの制限を設定します。

4

2 に答える 2

13

他の人が指定した「デッドロックタイムアウト」ではありません。これは、この場合には役に立たない非常に特別な目的のためです。

mod_wsgi 機能を使用しようとする限り、代わりに WSGIDaemonProcess ディレクティブの「inactivity-timeout」オプションが必要です。

それでも、これは完全な解決策ではありません。これは、'inactivity-timeout' オプションが特に、デーモン プロセスによるすべての要求処理が停止したかどうかを検出するためのものであり、要求ごとのタイムアウトではないためです。デーモン プロセスがシングル スレッドの場合にのみ、要求ごとのタイムアウトに相当します。このオプションは、プロセスの固定を解除するのに役立つだけでなく、その間にリクエストがまったく到着しない場合、デーモン プロセスを再起動するという副作用もあります。

つまり、mod_wsgi レベルで要求ごとのタイムアウトを設定する方法はありません。これは、Python で要求またはスレッドを中断する実際の方法がないためです。

実際に実装する必要があるのは、アプリケーション コードでの HTTP 要求のタイムアウトです。それがどこにあるのか、すでに利用可能かどうかはわかりませんが、「urllib2 socket timeout」を Google 検索してください。

于 2009-08-03T22:49:06.197 に答える
3

私が質問をよく理解していれば、人々からランダムなスクリプトを実行するときにapacheがロックしないようにしたいでしょう。信頼できないコードを実行している場合は、apache 以外にも心配すべきことがあると思います。

とはいえ、いくつかの構成ディレクティブを使用して、より安全な環境を調整できます。以下の 2 つは非常に便利です。

  • WSGIApplicationGroup - WSGI アプリケーションが属するアプリケーション グループを設定します。ユーザーごとに設定を分けることができます - 同じアプリケーション グループ内のすべての WSGI アプリケーションは、リクエストを処理するプロセスの同じ Python サブ インタープリターのコンテキスト内で実行されます。

  • WSGIDaemonProcess - アプリケーションを実行するための個別のデーモン プロセスを構成します。デーモン プロセスは、Apache 子プロセスが通常実行されるユーザーとは異なるユーザーとして実行できます。このディレクティブは多くの便利なオプションを受け入れます。それらのいくつかをリストします:

    • user=name | user=#uidgroup=name | group=#gid:

      デーモン プロセスを実行するユーザー/グループの UNIX ユーザーとグループ名、数値のユーザー uid またはグループ gid を定義します。

    • stack-size=nnn

      デーモン プロセスで mod_wsgi によって作成された各スレッドに対応するスタックに割り当てられる仮想メモリの量 (バイト単位)。

    • deadlock-timeout=sss

      Python GIL でデッドロックの可能性が検出された後、デーモン プロセスがシャットダウンされて再起動されるまでの最大許容秒数を定義します。デフォルトは 300 秒です。

設定ディレクティブの詳細については、こちらを参照してください。

于 2009-08-03T19:03:55.887 に答える