2009-08-27 9 views
6

Ich versuche, eine Python-Anwendung in Apache (Prefork) mit WSGI in einer solchen Weise auszuführen, dass ein einzelner Python-Interpreter verwendet wird. Dies ist erforderlich, da die Anwendung eine Thread-Synchronisierung verwendet, um zu verhindern, dass Racebedingungen auftreten. Da Apache Prefork mehrere Prozesse erzeugt, wird der Code nicht zwischen den Interpretern geteilt, und somit ist die Thread-Synchronisation irrelevant (d. H. Jeder Thread sieht nur seine eigenen Sperren, die keinen Einfluss auf die anderen Prozesse haben). HierShare Python Interpreter in Apache Prefork/WSGI

ist die Setup:

  • Apache 2.0 (Prefork)
  • WSGI
  • Python 2,5

Hier ist der relevante Apache Konfiguration:

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> 

Hier ist das was ich bisher probiert habe (keines von denen ch gearbeitet):

  1. WSGIApplicationGroup %{GLOBAL}
  2. Angeben WSGIDaemonProcess und WSGIProcessGroup Hinzufügen innerhalb des virtuellen Host:

    WSGIDaemonProcess OSVM threads = 50
    WSGIProcessGroup OSVM

Ist Es gibt keinen Weg dazu Erzwingen Apache Prefork, um einen einzelnen Python-Interpreter mit WSGI zu verwenden? Die Dokumente scheinen zu implizieren, dass Sie mit den WSGIDaemonProcess- und WSGIApplicationGroup-Optionen arbeiten können, aber Apache erstellt immer noch einen separaten Python-Interpreter für jeden Prozess.

Antwort

9

Die WSGI-Anwendung kann nicht auf UNIX-Systemen im Embedded-Modus ausgeführt werden, unabhängig davon, ob es sich um Prefork- oder Worker-MPM handelt, da es tatsächlich mehrere Prozesse gibt. Siehe:

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

einen Daemon Prozessgruppe anlegen, bestehend aus einzelnen Prozess und Delegieren WSGI Anwendung um das erreichen sollten, was Sie wollen. Sie sollten nicht einmal WSGIApplicationGroup verwenden müssen, wenn es sich nur um eine bereitgestellte WSGI-Anwendung handelt, von der Sie sprechen. Wenn Sie jedoch absolut sicher sein wollen, können Sie es auch einstellen.

So Konfiguration innerhalb Virtualhost wäre:

WSGIDaemonProcess osvm 
WSGIProcessGroup osvm 
WSGIApplicationGroup %{GLOBAL} 

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

Obwohl die Prozesse = 1 'für WSGIDaemonProcess es, dass man explizit macht Prozess erstellt wird, kann jedoch nicht die Möglichkeit bieten, und es nur zu einem Prozess Standard lassen . Jede Verwendung der Option "processes", auch wenn für einen Prozess "wsgi.multiprocess" auf True gesetzt ist.

Anstatt Ihre eigentliche WSGI-Anwendung zu verwenden, würde ich vorschlagen, dass Sie mit dem folgenden einfachen Testprogramm testen.

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()] 

In diesem Fall sollte der PID-Wert immer gleich sein. Das wsgi.multiprocess Flag sollte False sein. Das mod_wsgi.process_group-Wert sollte wie immer die Daemon-Prozessgruppe sein. Und die mod_wsgi.application_group sollte eine leere Zeichenfolge sein.

Wenn dies nicht das ist, was Sie sehen, stellen Sie sicher, dass Sie Apache nach Konfigurationsänderungen tatsächlich neu gestartet haben. Fügen Sie außerdem hinzu:

LogLevel debug 

zu Apache-Konfiguration für VirtualHost. Das führt dazu, dass mod_wsgi viel mehr Meldungen im Apache-Fehlerprotokoll über die Erstellung von Prozessen und das Laden von Skripten protokolliert, einschließlich Details zur Prozessgruppe und Anwendungsgruppen, für die Dinge passieren.

Für weitere Informationen zum Debuggen finden Sie unter:

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

Wenn immer noch Probleme, deuten darauf hin, gehen Sie auf die mod_wsgi Mailingliste in Google Groups.

+0

Vielen Dank, Ihre Antwort war perfekt. Ich hatte ein paar Probleme, die auftraten, sobald ich die Daemon-Prozessgruppe eingerichtet hatte. Beide wurden mit Informationen gelöst, die Sie in Google-Gruppen angegeben haben. Insbesondere musste ich die Benutzer- und Gruppendirektiven früher in die Apache-Konfiguration (http://code.google.com/p/modwsgi/issues/detail?id=40) und setzen Sie das WSGISocketPrefix. Vielen Dank für Ihre Hilfe. –