6

単一の Python インタープリターが使用されるように、WSGI を使用して Apache (prefork) 内で Python アプリケーションを実行しようとしています。これは、アプリケーションがスレッド同期を使用して競合状態の発生を防ぐために必要です。Apache prefork は複数のプロセスを生成するため、コードはインタープリター間で共有されず、スレッド同期は無関係になります (つまり、各スレッドは、他のプロセスに関係のない独自のロックのみを認識します)。

セットアップは次のとおりです。

  • Apache 2.0 (プリフォーク)
  • WSGI
  • パイソン2.5

関連するApache構成は次のとおりです。

WSGIApplicationGroup %{GLOBAL}
<VirtualHost _default_:80>

WSGIScriptAlias / /var/convergedsecurity/apache/osvm.wsgi

Alias /admin_media/ /var/www/html/admin_media/

<Directory /var/www/html/admin_media>
Order deny,allow
Allow from all
</Directory>

Alias /media/ /var/www/html/media/

<Directory /var/www/html/media>
Order deny,allow
Allow from all
</Directory>

</VirtualHost>

これが私がこれまでに試したことです(どれもうまくいきませんでした):

  1. WSGIApplicationGroup %{GLOBAL}を追加しています
  2. 仮想ホスト内でWSGIDaemonProcessおよびWSGIProcessGroupを指定する:

    WSGIDaemonProcess osvm スレッド=50
    WSGIProcessGroup osvm

WSGI で単一の Python インタープリターを使用するように Apache prefork に強制する方法はありませんか? ドキュメントは、WSGIDaemonProcess および WSGIApplicationGroup オプションを使用できることを暗示しているようですが、Apache は依然としてプロセスごとに個別の Python インタープリターを作成します。

4

1 に答える 1

9

実際には複数のプロセスが存在するため、WSGI アプリケーションを UNIX システムで組み込みモードで実行することはできません。見る:

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

単一のプロセスで構成されるデーモン プロセス グループを作成し、それに WSGI アプリケーションを委譲することで、目的が達成されるはずです。マウントされている WSGI アプリケーションが 1 つしかない場合は、WSGIApplicationGroup を使用する必要さえありません。ただし、絶対に確実にしたい場合は、設定することもできます。

したがって、VirtualHost 内の構成は次のようになります。

WSGIDaemonProcess osvm
WSGIProcessGroup osvm
WSGIApplicationGroup %{GLOBAL}

WSGIScriptAlias / /var/convergedsecurity/apache/osvm.wsgi

WSGIDaemonProcess の 'processes=1' は、1 つのプロセスが作成されることを明示しますが、オプションを提供せず、デフォルトで 1 つのプロセスにします。'processes' オプションを使用すると、1 つのプロセスで 'wsgi.multiprocess' が True に設定されていることがわかります。

実際の WSGI アプリケーションを使用するよりも、次の簡単なテスト プログラムでテストすることをお勧めします。

import cStringIO
import os

def application(environ, start_response):
    headers = []
    headers.append(('Content-Type', 'text/plain'))
    write = start_response('200 OK', headers)

    input = environ['wsgi.input']
    output = cStringIO.StringIO()

    print >> output, "PID: %s" % os.getpid()
    print >> output

    keys = environ.keys()
    keys.sort()
    for key in keys:
        print >> output, '%s: %s' % (key, repr(environ[key]))
    print >> output

    output.write(input.read(int(environ.get('CONTENT_LENGTH', '0'))))

    return [output.getvalue()]

その出力では、PID 値は常に同じである必要があります。wsgi.multiprocess フラグは False にする必要があります。mod_wsgi.process_group の値は、デーモン プロセス グループと呼ばれるものでなければなりません。mod_wsgi.application_group は空の文字列にする必要があります。

これが表示されていない場合は、構成を変更した後に実際に Apache を再起動したことを確認してください。また、次を追加します。

LogLevel debug

VirtualHost の Apache 構成に。これを行うと、mod_wsgi は、プロセスの作成とスクリプトの読み込みに関する Apache エラー ログに、プロセス グループとアプリケーション グループの詳細を含む、より多くのメッセージを記録します。

デバッグに関するその他の情報については、次を参照してください。

http://code.google.com/p/modwsgi/wiki/DebuggingTechniques

それでも問題が解決しない場合は、Google グループの mod_wsgi メーリング リストにアクセスすることをお勧めします。

于 2009-08-27T06:07:17.697 に答える