生产环境下,是选择 Apache + mod_wsgi 还是 Nginx + mod_wsgi?

69

在中型到大型Python WSGI应用程序中使用什么,Apache + mod_wsgi还是Nginx + mod_wsgi?

哪种组合需要更多的内存和CPU时间?
哪一种更快?
有哪一种被认为比另一种更稳定?

我还考虑使用CherryPy的WSGI服务器,但我听说它不太适合非常高负载的应用程序,请问您对此了解多少?

:我没有使用任何Python Web Framework,我只是从头开始编写了整个应用程序。
注':其他建议也欢迎。

4个回答

78

对于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 的最新输入? - regilero
2
Apache的基于事件的MPM与nginx非常不同。nginx是完全异步的。在Apache的基于事件的MPM中,异步仅在处理保持连接模式下的套接字和一些我无法记住的其他事情时使用。即使使用了事件MPM,请求仍然会被移交给从线程池中处理的单独线程处理,因此仍然存在有限的资源。由于异步现在维护了保持连接的套接字,因此存在过度使用资源的可能性,但是有方法来解决这个问题,并且情况不会像异步那样糟糕。反正,现在记不清具体是如何工作的了。 - Graham Dumpleton
你好,现在可以使用吗? - Max
用户3526可能的意思是,现在距离您的博客文章已经过去了几年,nginx是否仍然存在这些“问题”? - Toby
2
这与nginx无关,它按照自己的方式工作。将阻塞WSGI应用程序嵌入到nginx进程中的想法是错误的。这一点并没有改变。据我所知,那个针对nginx的mod_wsgi克隆版本早已消失。 - Graham Dumpleton

15

nginx mod_wsgi的作者在这封邮件列表信息中解释了与Apache mod_wsgi的一些区别


2
这个链接已经失效。 - scrollout
这是一个完美的例子,说明为什么仅提供链接的答案不好。 - Akaisteph7

14
主要区别在于nginx被设计为在更小的内存空间中处理大量连接,这使其非常适用于具有许多空闲打开连接的comet连接应用程序。这也使得它具有相对较小的内存占用。
从原始性能的角度来看,nginx更快,但不至于快到我会将其列为决定性因素。
Apache在可用模块方面具有优势,并且实际上是标准的。无论您选择哪个Web主机,都将安装它,并且大多数技术人员都非常熟悉它。
此外,如果使用mod_wsgi,则它是您的wsgi服务器,因此您甚至不需要cherrypy。
除此之外,我能给出的最好建议就是尝试在两者下设置您的应用程序并进行一些基准测试,因为无论任何人告诉您什么,您的结果可能会有所不同。

7
CherryPy的Web服务器有一个优点,那就是它是一个纯Python Web服务器(据我所知),这可能会使部署变得更容易。此外,如果您只是使用服务器进行WSGI和静态内容,我可以看到使用它的好处。
(无耻的自插警告:我编写了即将提到的WSGI代码) Kamaelia将在下一个版本中支持WSGI。很酷的是,您很可能可以使用预先制作的代码或使用现有的HTTP和WSGI代码构建自己的代码。
(结束无耻的自插)
话虽如此,鉴于当前的选择,我个人可能会选择CherryPy,因为它似乎是最简单配置的,并且我可以更容易理解Python代码而不是C代码。
但是,您最好尝试每个选项,看看每个选项在特定应用程序中的优缺点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接