我在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
指令中指定进程/应用程序组来摆脱“重新加载暂停” :
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}的应用程序组很好,因为它在各个进程组中强制使用主解释器上下文。它不会在过程组之间共享。
请注意,如果在站点负载沉重的情况下进行重新启动,则预加载并不一定会带来太大帮助,因为事情仍然需要等待进程启动并加载应用程序。
线程数= 50似乎太过分了。您得到什么,您的平均响应时间是多少。通过每个进程使用3-5个线程并使用多个进程来获得最佳性能。使用多个进程显然意味着要使用更多的内存,因为应用程序将有多个副本。
最后,是的,除非您有充分的理由,否则建议您将HTTP和HTTPS版本的网站都委派给同一守护进程组。在第一个VirtualHost中指定WSGIDaemonProcess,如Apache为该ServerName所见。在80/443对中的第二对中,没有WSGIDaemonProcess,而是在另一个VirtualHost上下文中引用命名的进程组。如果ServerName相同,则允许跨范围访问。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句