2009-08-27 13 views
6

Sto tentando di eseguire un'applicazione Python in Apache (prefork) con WSGI in modo tale che venga utilizzato un solo interprete Python. Ciò è necessario poiché l'applicazione utilizza la sincronizzazione dei thread per impedire che si verifichino condizioni di competizione. Poiché il prefork di Apache genera più processi, il codice finisce per non essere condiviso tra gli interpreti e quindi la sincronizzazione dei thread è irrilevante (cioè ogni thread vede solo i propri blocchi che non hanno alcun rapporto con gli altri processi).Interprete Python in Apache Prefork/WSGI

Qui è la messa a punto:

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

Ecco la configurazione di Apache rilevanti:

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> 

Qui è quello che ho provato finora (nessuno dei quali ch lavorato):

  1. calcolata WSGIApplicationGroup %{GLOBAL}
  2. Specifica WSGIDaemonProcess e WSGIProcessGroup all'interno dell'ospite virtuale:

    discussioni WSGIDaemonProcess osvm = 50
    WSGIProcessGroup osvm

Is non c'è modo di forzare il prefork di Apache per utilizzare un singolo interprete Python con WSGI? I documenti sembrano implicare la possibilità con le opzioni WSGIDaemonProcess e WSGIApplicationGroup, ma Apache crea comunque un interprete Python separato per ogni processo.

risposta

9

Non è possibile eseguire l'applicazione WSGI in modalità incorporata su sistemi UNIX, che si tratti di prefork o worker MPM, poiché ci saranno effettivamente più processi. Vedi:

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

Creazione di un gruppo processo demone che consiste di singolo processo e delegando applicazione WSGI a che dovrebbe ottenere quello che vuoi. Non è nemmeno necessario utilizzare WSGIApplicationGroup se si tratta solo di un'applicazione WSGI montata di cui si sta parlando. Se vuoi essere assolutamente sicuro, puoi anche impostarlo.

Così configurazione all'interno VirtualHost sarebbe:

WSGIDaemonProcess osvm 
WSGIProcessGroup osvm 
WSGIApplicationGroup %{GLOBAL} 

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

Anche se 'processi = 1' per WSGIDaemonProcess rende esplicito che è stato creato un unico processo, non forniscono l'opzione se e lasciare che di default di un unico processo . Qualsiasi utilizzo dell'opzione 'processi', anche se per un processo verrà visualizzato 'wsgi.multiprocess' impostato su Vero.

Piuttosto che usare la tua attuale applicazione WSGI, ti suggerirei di provare con il seguente semplice programma di test.

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

Nell'uscita di questo, il valore PID dovrebbe essere sempre lo stesso. La flag wsgi.multiprocess dovrebbe essere False. Il mod_wsgi.Il valore di process_group dovrebbe essere quello che hai mai chiamato il gruppo di processi demone. E il mod_wsgi.application_group dovrebbe essere una stringa vuota.

Se questo non è quello che si sta vedendo, assicurarsi di riavviare Apache dopo aver apportato le modifiche di configurazione. Aggiungi anche:

LogLevel debug 

in configurazione Apache per VirtualHost. Ciò farà sì che mod_wsgi registri molti più messaggi nel log degli errori di Apache sulla creazione dei processi e sul caricamento degli script, compresi i dettagli del gruppo di processi e del gruppo di applicazioni per cui stanno accadendo cose.

Per altre informazioni sul debug, vedere:

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

Se ancora problemi, suggerire di andare alla mailing list mod_wsgi su Google Gruppi.

+0

Grazie, la tua risposta è stata perfetta. Ho avuto un paio di problemi che sono emersi una volta che ho creato il gruppo di processi demone; entrambi sono stati risolti con le informazioni che hai fornito sui gruppi di Google. In particolare, ho dovuto inserire le direttive Utente e Gruppo in precedenza nella configurazione di Apache (http://code.google.com/p/modwsgi/issues/detail?id=40) e impostare il WSGISocketPrefix. Grazie per il vostro aiuto. –