在生产中,Apache + mod_wsgi 还是 Nginx + mod_wsgi?
Posted
技术标签:
【中文标题】在生产中,Apache + mod_wsgi 还是 Nginx + mod_wsgi?【英文标题】:In production, Apache + mod_wsgi or Nginx + mod_wsgi? 【发布时间】:2010-09-16 18:27:11 【问题描述】:对于大中型 python WSGI 应用程序,Apache + mod_wsgi 或 nginx + mod_wsgi 使用什么? 哪种组合需要更多的内存和 CPU 时间? 哪个更快? 哪个以比另一个更稳定而闻名? 我也在考虑使用 CherryPy 的 WSGI 服务器,但我听说它不太适合负载非常高的应用程序,您对此了解多少? 注意:我没有使用任何 Python Web 框架,我只是从头开始编写整个东西。注意':也欢迎提出其他建议。
【问题讨论】:
【参考方案1】:对于 nginx/mod_wsgi,请务必阅读:
http://blog.dscpl.com.au/2009/05/blocking-requests-and-nginx-version-of.html
由于 nginx 在底层是一个事件驱动系统,它具有不利于阻塞应用程序的行为特征,例如基于 WSGI 的应用程序。更糟糕的情况是,使用多进程 nginx 配置,即使某些 nginx 工作进程可能处于空闲状态,您也可以看到用户请求被阻止。 Apache/mod_wsgi 没有这个问题,因为 Apache 进程只有在它拥有实际处理请求的资源时才会接受请求。 Apache/mod_wsgi 将因此提供更可预测和更可靠的行为。
【讨论】:
能否请您添加一些关于 Apache 2.4 新基于事件的 mpm 的新输入? Apache 的基于事件的 MPM 与 nginx 非常不同。 nginx 是完全异步的。使用 Apache 中基于事件的 MPM,async 主要仅用于在保持活动模式下处理套接字以及其他一些我不记得的事情。即使使用事件 MPM,请求仍然由线程池中的单独线程处理,因此资源仍然有限。由于现在由 async 维护保持活动套接字,因此有可能过度提交资源,但有办法解决这个问题,情况不会像 async 那样糟糕。无论如何,现在不记得具体是如何工作的了。 嗨,我们现在可以用了吗? user3526 可能的意思是,在你的博文已经过去几年之后,nginx 是否还有这些“问题”? 这与 Nginx 无关,它是如何工作的。在 nginx 进程中嵌入阻塞 WSGI 应用程序的想法很糟糕。这没有改变。据我所知,用于 nginx 的 mod_wsgi 克隆很久以前就死了。【参考方案2】:nginx mod_wsgi 的作者解释了与 Apache mod_wsgi in this mailing list message 的一些区别。
【讨论】:
【参考方案3】:主要区别在于 nginx 是为在更小的内存空间中处理大量连接而构建的。这使得它非常适合执行类似彗星的连接的应用程序,这些连接可以有许多空闲的打开连接。这也使它的内存占用空间更小。
从原始性能的角度来看,nginx 更快,但并没有那么快,我会将其作为决定因素。
Apache 在可用模块方面具有优势,而且它几乎是标准的。您使用的任何网络主机都会安装它,并且大多数技术人员都会非常熟悉它。
另外,如果你使用 mod_wsgi,它就是你的 wsgi 服务器,所以你甚至不需要cherrypy。
除此之外,我能给出的最佳建议是尝试在两者下设置您的应用并进行一些基准测试,因为无论任何人告诉您什么,您的里程都可能会有所不同。
【讨论】:
【参考方案4】:CherryPy 的网络服务器要做的一件事是它是一个纯 Python 网络服务器 (AFAIK),它可能会或可能不会使您的部署更容易。另外,如果您只是将服务器用于 WSGI 和静态内容,我可以看到使用它的好处。
(无耻插件警告:我写了我要提到的WSGI代码)
Kamaelia 将在下一个版本中支持 WSGI。很酷的一点是,您可能既可以使用预制的,也可以使用现有的 HTTP 和 WSGI 代码构建自己的。
(结束无耻插件)
话虽如此,考虑到当前的选择,我个人可能会选择 CherryPy,因为它似乎是最简单的配置,而且我对 python 代码的理解比对 C 代码的理解要多。
您最好尝试每一种方法,看看每种方法对您的特定应用的优缺点。
【讨论】:
以上是关于在生产中,Apache + mod_wsgi 还是 Nginx + mod_wsgi?的主要内容,如果未能解决你的问题,请参考以下文章
Apache Commons DBCP 2.x 在生产中的稳定性