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
将“pid”替换为实际进程 ID。如果守护进程组中有多个进程,则向所有进程发送信号。
不确定是否可以使用“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 的参数,而不是预加载应用程序的副作用。