为~125 个 django 站点配置 apache 以优化内存使用的方法(mod_python v mod_wsgi;worker vs prefork;静态文件)

为~125 个 django 站点配置 apache 以优化内存使用的方法(mod_python v mod_wsgi;worker vs prefork;静态文件)

我目前在 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 站点是否是线程安全的。

答案3

编辑:忽略第一段。请参阅 Graham 的评论和回答。

Apache prefork 与 wsgi 守护进程模式不兼容。根据文档,守护进程模式需要线程。因此,如果您想要守护进程模式的灵活性,则需要使用 Apache mpm worker。

基于此博客邮政,我不会使用nginx的mod_wsgi。

因此,我首选的设置是使用 nginx 作为轻量级的前端/静态文件服务器,并使用 Apache mpm worker 和 mod_wsgi 以守护进程模式提供 Django 内容服务。

相关内容