Apache / mod_wsgiのデフォルトは、そのアプリケーションを必要とするプロセスへの最初のリクエストでのみアプリケーションコードをロードすることです。したがって、最初のステップは、最初のリクエストだけでなく、プロセスの開始時にコードをプリロードするようにmod_wsgiを構成することです。これは、WSGIImportScriptディレクティブを使用してmod_wsgi2.Xで実行できます。
とにかくより良いオプションであるデーモンモードを想定すると、これは次のようなものになることを意味します。
# 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シグナルを送信します。
WSGIDaemonProcessの「display-name」オプションを使用すると、BSDスタイルの「ps」プログラムを使用してどのプロセスを識別できます。'display-name'を'%{GROUP}'に設定すると、'ps'出力にプロセス名として'(wsgi:django)'が表示されます。プロセスIDを特定し、次のことを行います。
kill -SIGINT pid
'pid'を実際のプロセスIDと交換します。デーモンプロセスグループに複数のプロセスがある場合は、それらすべてにシグナルを送信します。
'killall'を使用してこれを1つのステップで実行できるかどうかはわかりません。MacOSXで問題が発生しました。
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>
つまり、特定のプロセスグループとアプリケーショングループをWSGIScriptAliasの引数として使用できるように、個別のWSGIImportScriptディレクティブを使用する必要はなく、アプリケーションをプリロードするという副作用があります。