【发布时间】:2015-03-07 12:26:26
【问题描述】:
Event MPM 与 Nginx 的设计并不完全相同,但显然是为了让 keepalives 更稳定并更快地发送静态文件而设计的。我的理解是 Event MPM 有点用词不当,因为:
- 虽然连接传递给kqueue/epoll,
- 某些非常重要的模块,例如 mod_gzip 和 mod_ssl 会阻塞/消耗一个线程,直到响应完成,
- 这对于大文件来说是个问题,但对于 PHP 生成的 HTML 文档等可能不是问题。
不幸的是,Apache 不断失去市场份额,大多数基准测试都对 MPM 事件不利。基准测试是否存在缺陷,或者事件 MPM 对 Nginx 的表现真的很差?即使有这些限制,在正常流量(非恶意)和较小文件下,它应该与 Nginx 有一定的竞争力。例如,通过 php-fpm 在慢速连接上提供 PHP 生成的文档应该具有竞争力,因为文档将被缓冲(即使是 ssl'd 和 gzip'd)并异步发送。使用压缩或不使用压缩的 SSL 和非 SSL 连接的工作方式与 Nginx 在此类工作负载上的工作方式没有明显不同。
那么为什么它没有在各种基准测试中大放异彩呢?它出什么问题了?或者基准有什么问题?大型网站是否将其用作对权威的诉求?
【问题讨论】:
-
如果您引用了您所引用的基准,这将是一个更好的问题。如果您只是想要快速安装,那么 pre-fork Apache + mod_php 在中低负载下将始终优于 Nginx - 在重负载下会有很大差异。但是,如果您想要容量和性能,那么您应该考虑不同的架构 - 在您的网络服务器前使用 ATS/nginx/varnish。
-
@symcbean 可能是真的。我还没有找到一个看起来不错的(Apache 发布的除外)。我也认为你过于笼统了。 ATS 或 Varnish 对无法缓存的动态内容几乎没有作用(或有害)。
-
相反。在 pre-fork 网络服务器前运行基于事件的服务器将提供针对 sloloris 攻击的保护,并卸载静态内容服务,节省内存并增加容量。动态内容的额外延迟应该是几毫秒的数量级——几乎不会惊天动地。事实上,如果您可以将反向代理移动到更靠近客户端的位置,您应该会看到性能的显着提升。
-
@symcbean 我只是指动态内容。请参阅“...关于无法缓存的动态内容”。它可能会对 mod_reqtimeout 或 mod_security 上的慢读和慢读做一些事情,但会以管道上的另一个副本为代价。我想你可以说 Nginx + Apache+mod_php 在技术上与 Nginx + php-fpm 没有太大区别。但是为什么会有人使用 php-fpm 呢? php-fpm 和 FastCGI 到 localhost 是否比 HTTP over localhost 快得多?无论如何,正如另一个答案所说,Event MPM 大致相当于您描述 Nginx 的方式——前面的基于事件的服务器。
标签: apache asynchronous nginx php event-based-programming