Ответ 1
По умолчанию для 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 script файла, который проверяется только при следующем запросе, отправьте сигнал SIGINT в процессы в группе процессов демона.
С помощью опции "display-name" для WSGIDaemonProcess вы можете определить, какие процессы используются с помощью программы "ps" в стиле 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 вместо этого с побочным эффектом, что он будет предварительно загружать приложение.