我目前在 GoDaddy 的一台专用机器上运行着 125 个 Django 网站。这些网站的流量相对较低,我想知道如何才能优化 apache 配置中的内存使用情况。在我将 prefork 指令调整为较低的 MaxServer 和 MaxrequestsPerChild 之前,该机器会在运行大约 5 小时后挂起。
我一直在谷歌上寻找答案,但我无法找到以下任何明确的答案:
- 在多站点 django 安装中,mod_python 与 mod_wsgi 是否有任何参数
- 有没有办法优化静态文件服务以节省 apache 虚拟主机中的内存?(/site_media/ vs media.domain.com)
- 在多 VirtualNameHost 环境中,prefork 与 worker 以及内存使用的争论是什么?
当前配置文件包括如下:
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/projectroot/django/chat/static
ServerName domain.com
ServerAlias www.domain.com
Alias /media /usr/lib/python2.5/site-packages/django/contrib/admin/media
ErrorLog logs/www.domain.com-error_log
CustomLog logs/www.domain.com-access_log common
<Location "/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
PythonPath "['/var/www/domain/django'] + sys.path"
SetEnv DJANGO_SETTINGS_MODULE chat.settings_domain1 #chat is the name of the project all the sites reside in
PythonDebug Off
</Location>
<Location "/media">
SetHandler None
</Location>
<Location "/site_media">
SetHandler None
</Location>
</VirtualHost>
谢谢!-汤姆
答案1
我肯定会选择 mod_wsgi。它允许您根据每个应用程序定义用户、线程/进程的数量。
我不太清楚内存要求,但几乎在您看到的每个常见问题解答或提示中,mod_python 都被认为不如 mod_wsgi。WSGIDaemon进程允许您配置很多选项,堆栈大小、进程数和不同的超时可能会让您感兴趣。
我没有使用过 GoDaddy,所以我无法告诉您可以如何配置一切。
对于 apache 部分,我肯定会使用具有正确数字的 prefork(取决于您预期的用户数量以及您想要允许的子数量)
对于静态托管,您可以禁用所有处理程序,甚至强制使用特定的 MIME 类型,以便配置能够正常工作。
如果内存是您的瓶颈,您可能需要根据我的经验检查 ngninx(不是那么多),使用 nginx 比使用 apache 可以更好地预测内存使用情况,但我对 mod-wsgi + ngninx 一无所知。
答案2
避免使用 mod_python 绝对是明智之举。话虽如此,也不要使用 mod_wsgi 嵌入模式。嵌入模式不好的原因详述如下:
http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html
这可能是您遇到的问题。
您可以使用 mod_wsgi 守护进程模式。不过,最好让您的 Django 站点是线程安全的,因为这样可以让您最大程度地减少守护进程的数量。
声称 mod_wsgi 守护进程模式与 Apache prefork 不兼容是错误的。您可以将 mod_wsgi 守护进程模式与任何 Apache MPM 一起使用。问题在于底层 Apache 运行时库是否内置了线程功能,而不是是否使用了 prefork 或 worker MPM。通常情况如此,唯一没有这种情况的系统是较旧的 BSD 系统,这些系统具有糟糕的线程实现。无论哪种方式,您最好使用 worker MPM,因为它可以减少所需的 Apache 服务器子进程数量。
无论如何,使用 mod_wsgi 守护进程模式应该相对简单。问题在于确定你的 Django 站点是否是线程安全的。