По умолчанию для Apache / mod_wsgi загружать код приложения только по первому запросу в процесс, который требует, чтобы приложения. Итак, первый шаг - настроить mod_wsgi для предварительной загрузки кода при запуске процесса, а не только с первым запросом. Это можно сделать в mod_wsgi 2.X с использованием директивы WSGIImportScript.
Предполагается, что режим демона, который в любом случае является лучшим вариантом, означает, что у вас будет что-то вроде:
# 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>
Когда вы внесли изменение в код, вместо того чтобы прикасаться к файлу сценария WSGI, который проверяется только при следующем запросе, вместо этого отправьте сигнал SIGINT процессам в группе процессов демона.
С помощью опции 'display-name' для WSGIDaemonProcess вы можете определить, какие процессы, с помощью программы BSD в стиле BSD. Если для параметра display-name установлено значение «% {GROUP}», в выводе «ps» в качестве имени процесса должно отображаться «(wsgi: django)». Определите идентификатор процесса и выполните:
kill -SIGINT pid
Поменять 'pid' на фактический идентификатор процесса. Если в группе процессов-демонов более одного процесса, отправьте сигнал всем им.
Не уверен, можно ли использовать killall, чтобы сделать это за один шаг. У меня были проблемы с этим на MacOS X.
В mod_wsgi 3.X конфигурация может быть проще и может использоваться вместо:
# 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>
То есть, нет необходимости использовать отдельную директиву WSGIImportScript, так как конкретная группа процессов и группа приложений могут использоваться в качестве аргументов для WSGIScriptAlias, а не с побочным эффектом предварительной загрузки приложения.