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 信号。
使用 WSGIDaemonProcess 的 'display-name' 选项,您可以使用 BSD 风格的 'ps' 程序识别哪些进程。将 'display-name' 设置为 '%{GROUP}','ps' 输出应该显示 '(wsgi:django)' 作为进程名称。识别进程 ID 并执行以下操作:
kill -SIGINT pid
用实际进程 ID 交换“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 的参数,而是会产生预加载应用程序的副作用。