在 nginx 后面的 Apache 上运行 Django - 我可以进行哪些 Apache 优化
Posted
技术标签:
【中文标题】在 nginx 后面的 Apache 上运行 Django - 我可以进行哪些 Apache 优化【英文标题】:Running Django on Apache Behind nginx - What Apache optimizations can I make 【发布时间】:2011-10-24 18:08:59 【问题描述】:我有一个已配置并正在运行的设置,我希望对其进行优化。在这个阶段,我不想将 Apache 换成 gunicorn 或其他选项。
我的设置是这样的:
Ubuntu 11.04 来自 apt-get 的默认 nginx 来自 apt-get 的默认 apache
Nginx 提供静态文件,并将应用程序请求传递给 Apache。 Apache 将有 5-8 个 Django 项目(即不同的网站)。中小流量。 Apache 只有 django 项目(通过 mod_wsgi 提供服务)——我不需要 php 或 Django 不需要的任何东西。
在默认的 Ubuntu/Apache 中,我可以禁用哪些模块,以及我可以做任何其他配置调整以更优化地使用我机器上的资源。
【问题讨论】:
【参考方案1】:一个配置调整是,如果您不需要 apache 来提供除 django 站点之外的任何其他服务,请完全放弃 apache。
使用专用的 WSGI 服务器,例如 uwsgi (http://projects.unbit.it/uwsgi/) 或 gunicorn (http://gunicorn.org/)。它们有据可查,并且如此资源使用率很低。
【讨论】:
使用专用的 WSGI 服务器,您还可以更好地平衡机器可用性,因为您为每个应用程序分配特定数量的工作人员,因此在 DOS 情况下没有单个应用程序可以关闭其他应用程序。 您还可以分别重启每个应用,并通过操作系统信号提高/降低工作人员的可用性(使用 gunicorn,您分别发送 TTIN 或 TTOU) 问题表明我不想用 gunicorn 或不同的 wsgi 服务器替换 apache。我正在寻求更多关于让 apache 最适合我的场景的具体技巧。 抱歉,我忽略了那句话 :(。当我将我的 django 大型站点系统(30 多个站点,450 个工作人员,在一台机器上每秒约 900 个请求)从 apache 切换到 gunicorn 时,这是一个bless。如果您在任何时候考虑切换,为什么不现在呢? mod_wsgi 的守护程序模式允许您为每个站点轻松指定不同数量的进程和线程。守护程序模式还允许您通过触摸 WSGI 文件轻松地重新启动站点。您也可以使用信号来重新启动,但没有增加/减少进程数量的方法。有一些复杂的方法,您可以通过使用备用进程并将站点映射到其他进程来实现相同的目标,但通常不值得麻烦,您最好适当地更改配置。【参考方案2】:您可以使用WSGIOptimize 选项将所有 .py 文件转换为 .pyo。您也可以使用Memcached 来启用缓存。 This 博客描述了如何在一个守护进程中运行多个 django 站点。据说它在您需要为大量站点提供服务的情况下很有用,每个站点的流量都很低。 This 包含来自 Jacob Kaplan-Moss 的提示。
【讨论】:
博客链接很有用,谢谢。 Jacob 的帖子有点老了,但还是有一些有用的东西。 WSGIOptimize 实际上几乎没有什么区别,而且实际上可能很危险,因为它可以从可能依赖的程序中删除文档字符串。它没有区别的部分原因是优化部分仅适用于启动,但如果以合理的方式设置,mod_wsgi 进程将在内存中持久存在。所以除了进程的初始启动之外不做任何事情。以上是关于在 nginx 后面的 Apache 上运行 Django - 我可以进行哪些 Apache 优化的主要内容,如果未能解决你的问题,请参考以下文章
Angular App 在 nginx 上运行并在附加的 nginx 反向代理后面
在 Docker 后面运行的 Nginx 上出现随机 502/503 错误(在 ECS 集群 + ALB 上)
Django 可以单独在 Gunicorn 上运行(没有 Apache 或 nginx)吗?
如何在负载均衡器 Laravel 后面的 nginx 中将远程 IP 地址列入白名单