2009-08-27 5 views
6

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

セットアップある:ここ

  • アパッチ2.0(preforkの)
  • 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> 

私がこれまでに試したことです(whiのどれもCH)働い:

  1. は、仮想ホスト内WSGIDaemonProcessWSGIProcessGroupを指定WSGIApplicationGroup %{GLOBAL}
  2. の追加:

    WSGIDaemonProcess OSVMスレッド= 50
    WSGIProcessGroupのOSVM

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

答えて

9

UNIXシステムでは、WSGIアプリケーションを組み込みモードで実行することはできません。プレフォークかワーカーMPMかに関係なく、複数のプロセスが存在するためです。参照:

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ための「= 1のプロセスは」それが明示的に一つのプロセスが作成されることになりますが、しかしオプションを提供し、ちょうどそれが一つのプロセスにデフォルト設定させてはいけません。 1つのプロセスに対して 'wsgi.multiprocess'がTrueに設定されている場合でも、 'processes'オプションを使用すると、

実際の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メーリングリストに行きます。

+0

ありがとう、あなたの応答は完璧でした。デーモンプロセスグループを設定したら、私はいくつかの問題が発生しました。どちらもGoogleグループで提供した情報で解決されました。 具体的には、Apacheの設定(http://code.google.com/p/modwsgi/issues/detail?id=40)でUserとGroupのディレクティブを先に配置し、WSGISocketPrefixを設定する必要がありました。 ご協力いただきありがとうございます。 –

関連する問題