2009-08-27 14 views
6

Próbuję uruchomić aplikację Python w Apache (prefork) z WSGI w taki sposób, że zostanie użyty pojedynczy interpreter Pythona. Jest to konieczne, ponieważ aplikacja używa synchronizacji wątków, aby zapobiec występowaniu warunków wyścigu. Ponieważ prefekt Apache spawnuje wiele procesów, kod nie jest dzielony między interpreterami, a zatem synchronizacja nici jest nieistotna (tj. Każdy wątek widzi tylko własne blokady, które nie mają wpływu na inne procesy).Python Interpreter Share w Apache Prefork/WSGI

Oto konfiguracji:

  • Apache 2.0 (prefork)
  • WSGI
  • Pythona 2,5

Tutaj odpowiedni konfiguracyjne apache'a:

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> 

tutaj jest to, co próbowałem do tej pory (żaden z whi CH pracował)

  1. Dodawanie WSGIApplicationGroup %{GLOBAL}
  2. Określanie WSGIDaemonProcess i WSGIProcessGroup w wirtualnego hosta:

    WSGIDaemonProcess osvm nici = 50
    WSGIProcessGroup osvm

Is nie ma sposobu zmusić Apache Prefork do korzystania z jednego interpretera Pythona z WSGI? Dokumenty sugerują, że możesz z opcjami WSGIDaemonProcess i WSGIApplicationGroup, ale Apache nadal tworzy osobny interpreter języka Python dla każdego procesu.

Odpowiedz

9

Nie można uruchomić aplikacji WSGI w trybie osadzonym w systemach UNIX, bez względu na to, czy jest to prefektor, czy pracownik MPM, ponieważ rzeczywiście będzie wiele procesów. Zobacz:

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

Tworzenie grupy procesów demon składający się z jednego procesu i przekazanie wniosku do WSGI, który powinien osiągnąć to, co chcesz. Nie powinieneś nawet używać WSGIApplicationGroup, jeśli jest to tylko jedna zainstalowana aplikacja WSGI, o której mówisz. Jeśli chcesz być absolutnie pewien, możesz go również ustawić.

Zatem konfiguracja ciągu VirtualHost będzie:

WSGIDaemonProcess osvm 
WSGIProcessGroup osvm 
WSGIApplicationGroup %{GLOBAL} 

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

Chociaż „procesów = 1” dla WSGIDaemonProcess czyni to wyraźnie zaznaczyć, że jeden proces jest tworzony, nie przewidują opcji choć i po prostu niech to domyślnie jeden proces . Każde użycie opcji "procesów", nawet jeśli dla jednego procesu wartość "wsgi.multiprocess" ustawiona jest na True.

Zamiast używać rzeczywistej aplikacji WSGI, sugeruję testowanie za pomocą poniższego prostego programu testowego.

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

W danych wyjściowych wartość PID powinna być zawsze taka sama. Flaga wsgi.multiprocess powinna być fałszywa. Mod_wsgi.wartość_procesu process_group powinna być tym, co kiedykolwiek nazwałeś grupą procesów demona. A grupa mod_wsgi.application_group powinna być pustym ciągiem.

Jeśli to nie jest to, co widzisz, upewnij się, że ponownie uruchomiłeś Apache po wprowadzeniu zmian w konfiguracji. Dodaj także:

LogLevel debug 

do konfiguracji Apache dla VirtualHost. Spowoduje to, że mod_wsgi będzie rejestrować dużo więcej wiadomości w dzienniku błędów Apache'a o tworzeniu procesu i ładowaniu skryptu, w tym o szczegółach dotyczących grupy procesów i grupy aplikacji, dla których dzieje się coś.

Dla innych informacji na temat debugowania, zobacz:

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

Jeśli nadal występują problemy, proponuję udać się do listy mailingowej mod_wsgi na Google Groups.

+0

Dziękuję, twoja odpowiedź była idealna. Miałem kilka problemów, które pojawiły się po skonfigurowaniu grupy demona; oba zostały rozwiązane dzięki informacjom podanym w grupach Google. W szczególności musiałem wcześniej wprowadzić dyrektywy użytkownika i grupy w konfiguracji Apache (http://code.google.com/p/modwsgi/issues/detail?id=40) i ustawić WSGISocketPrefix. Dziękuję za pomoc. –