运行 多个 Django 虚拟主机时 WSGIApplicationGroup 的值是多少?
Which value for WSGIApplicationGroup when running multiple Django virtual hosts?
我 运行 在 mod_wsgi 下的同一个 Apache 实例上连接多个 Django 站点。目前我的 apache.conf 文件包含以下指令(未指定 WSGIApplicationGroup
):
WSGIDaemonProcess mysite \
display-name=mysite \
threads=50 \
maximum-requests=10000 \
umask=0002 \
home=/srv/www/mysite \
python-path=/srv/www:/srv/src:/srv/venv/prod/lib/python2.7/site-packages \
python-eggs=/srv/.python-eggs
WSGIProcessGroup mysite
WSGIScriptAlias / /srv/www/mysite/wsgi.py
我 touch /srv/www/mysite/wsgi.py
每当我需要重新加载站点时,它会导致所有客户端明显冻结。
阅读 https://groups.google.com/forum/#!topic/modwsgi/QJkt5UWYpss 后,听起来我可以通过在 WSGIScriptAlias
指令中指定 process/application 组来摆脱 "reload pause":
WSGIDaemonProcess mysite \
display-name=mysite \
threads=50 \
maximum-requests=10000 \
umask=0002 \
home=/srv/www/mysite \
python-path=/srv/www:/srv/src:/srv/venv/prod/lib/python2.7/site-packages \
python-eggs=/srv/.python-eggs
WSGIScriptAlias / /srv/www/mysite/wsgi.py \
process-group=mysite \
application-group=mysite
IIUC,我需要同时提供 process-group=
和 application-group=
才能进行预加载。
到目前为止我发现的所有文档都使用 application-group=%{GLOBAL}
,但对于我的用例来说这似乎是错误的,每个虚拟主机都应该 运行 基于单个站点的代码 settings.py
文件(正确?)。
我应该使用预定义的 %{RESOURCE}
变量而不是 mysite
。
我可以在同一站点的 http 和 https 版本之间共享同一个应用程序组吗? (我知道我不能对进程组这样做)。
每个虚拟主机 Django 站点都应该使用一个单独的守护进程组,因此 %{GLOBAL} 的应用程序组很好,因为它强制在各个进程组中使用主解释器上下文。它不跨进程组共享。
请注意,如果您在网站负载过重时重新启动,预加载不一定会有太大帮助,因为仍然需要等待进程启动和加载应用程序。
threads=50 看起来有点过分了。你得到了什么,你的平均响应时间是多少。每个进程使用 3-5 个线程并使用多个进程可实现最佳性能。使用多个进程显然意味着使用更多内存,因为您的应用程序将有多个副本。
最后,是的,除非您有充分的理由,否则建议将网站的 HTTP 和 HTTPS 版本委托给同一个守护进程组。在第一个 VirtualHost 中指定 WSGIDaemonProcess,如 Apache 为该 ServerName 看到的那样。在 80/443 对中的第二个中,没有 WSGIDaemonProcess 并引用另一个 VirtualHost 上下文中的命名进程组。在 ServerName 相同的情况下,允许这种跨越。
我 运行 在 mod_wsgi 下的同一个 Apache 实例上连接多个 Django 站点。目前我的 apache.conf 文件包含以下指令(未指定 WSGIApplicationGroup
):
WSGIDaemonProcess mysite \
display-name=mysite \
threads=50 \
maximum-requests=10000 \
umask=0002 \
home=/srv/www/mysite \
python-path=/srv/www:/srv/src:/srv/venv/prod/lib/python2.7/site-packages \
python-eggs=/srv/.python-eggs
WSGIProcessGroup mysite
WSGIScriptAlias / /srv/www/mysite/wsgi.py
我 touch /srv/www/mysite/wsgi.py
每当我需要重新加载站点时,它会导致所有客户端明显冻结。
阅读 https://groups.google.com/forum/#!topic/modwsgi/QJkt5UWYpss 后,听起来我可以通过在 WSGIScriptAlias
指令中指定 process/application 组来摆脱 "reload pause":
WSGIDaemonProcess mysite \
display-name=mysite \
threads=50 \
maximum-requests=10000 \
umask=0002 \
home=/srv/www/mysite \
python-path=/srv/www:/srv/src:/srv/venv/prod/lib/python2.7/site-packages \
python-eggs=/srv/.python-eggs
WSGIScriptAlias / /srv/www/mysite/wsgi.py \
process-group=mysite \
application-group=mysite
IIUC,我需要同时提供 process-group=
和 application-group=
才能进行预加载。
到目前为止我发现的所有文档都使用 application-group=%{GLOBAL}
,但对于我的用例来说这似乎是错误的,每个虚拟主机都应该 运行 基于单个站点的代码 settings.py
文件(正确?)。
我应该使用预定义的 %{RESOURCE}
变量而不是 mysite
。
我可以在同一站点的 http 和 https 版本之间共享同一个应用程序组吗? (我知道我不能对进程组这样做)。
每个虚拟主机 Django 站点都应该使用一个单独的守护进程组,因此 %{GLOBAL} 的应用程序组很好,因为它强制在各个进程组中使用主解释器上下文。它不跨进程组共享。
请注意,如果您在网站负载过重时重新启动,预加载不一定会有太大帮助,因为仍然需要等待进程启动和加载应用程序。
threads=50 看起来有点过分了。你得到了什么,你的平均响应时间是多少。每个进程使用 3-5 个线程并使用多个进程可实现最佳性能。使用多个进程显然意味着使用更多内存,因为您的应用程序将有多个副本。
最后,是的,除非您有充分的理由,否则建议将网站的 HTTP 和 HTTPS 版本委托给同一个守护进程组。在第一个 VirtualHost 中指定 WSGIDaemonProcess,如 Apache 为该 ServerName 看到的那样。在 80/443 对中的第二个中,没有 WSGIDaemonProcess 并引用另一个 VirtualHost 上下文中的命名进程组。在 ServerName 相同的情况下,允许这种跨越。