La valeur par défaut pour Apache/mod_wsgi est seulement le code d'application de la charge sur la première demande à un processus qui exige que les applications. Donc, la première étape est de configurer mod_wsgi pour précharger votre code lorsque le processus démarre et pas seulement la première requête. Cela peut être fait dans mod_wsgi 2.X en utilisant la directive WSGIImportScript.
présumant mode démon, qui est meilleure option de toute façon, cela signifie que vous auriez quelque chose comme:
# Define process group.
WSGIDaemonProcess django display-name=%{GROUP}
# Mount application.
WSGIScriptAlias//usr/local/django/mysite/apache/django.wsgi
# Ensure application preloaded on process start. Must specify the
# process group and application group (Python interpreter) to use.
WSGIImportScript /usr/local/django/mysite/apache/django.wsgi \
process-group=django application-group=%{GLOBAL}
<Directory /usr/local/django/mysite/apache>
# Ensure application runs in same process group and application
# group as was preloaded into on process start.
WSGIProcessGroup django
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
Lorsque vous avez fait un changement de code, au lieu de toucher le fichier script WSGI, qui est seulement vérifié sur À la demande suivante, envoyez un signal SIGINT aux processus du groupe de processus démon à la place. Avec l'option 'nom d'affichage' de WSGIDaemonProcess, vous pouvez identifier les processus en utilisant le programme 'ps' de style BSD. Avec 'display-name' défini sur '% {GROUP}', la sortie 'ps' doit afficher '(wsgi: django)' comme nom de processus. Identifiez l'ID de processus et faites:
kill -SIGINT pid
Échangez 'pid' avec l'ID de processus réel. Si plus d'un processus dans le groupe de processus daemon, envoie un signal à tous.
Vous ne savez pas si 'killall' peut être utilisé pour faire cela en une seule fois. J'ai eu un problème de le faire sur Mac OS X.
Dans mod_wsgi 3.X la configuration peut être plus simple et peut utiliser à la place:
# Define process group.
WSGIDaemonProcess django display-name=%{GROUP}
# Mount application and designate which process group and
# application group (Python interpreter) to run it in. As
# process group and application group named, this will have
# side effect of preloading application on process start.
WSGIScriptAlias//usr/local/django/mysite/apache/django.wsgi \
process-group=django application-group=%{GLOBAL}
<Directory /usr/local/django/mysite/apache>
Order deny,allow
Allow from all
</Directory>
C'est pas nécessaire d'utiliser la directive de WSGIImportScript séparée comme processus spécifique peut groupe et le groupe d'applications en tant qu'arguments à WSGIScriptAlias à la place avec effet secondaire qu'il va précharger l'application.
En fait, écrire un script de redémarrage qui redémarre apache et exécute 'wget' 5 fois me semble une approche raisonnable. –
Bien que vous deviez faire attention à ce que chacun de ces appels à 'wget' soit traité par un processus différent - vous devrez probablement le charger un bon nombre de fois pour être sûr. –
Je l'ai testé et la configuration apache à webfaction (où l'application est hébergée) fait défiler les instances de sorte que 5 'wget' fait l'affaire – Jiaaro