如何选择要使用的 Apache MPM?

Tif*_*ker 289 httpd mpm-worker mpm-prefork apache-2.2

这是一个关于选择正确的 Apache httpd MPM的规范问题

我对 Apache 提供的不同 MPM 有点困惑——'worker'、'event'、'prefork' 等。

它们之间的主要区别是什么,我如何确定哪一个最适合给定的部署?

Sha*_*den 441

有许多的MPM模块(多道处理模块),但迄今为止最广泛使用的(至少在* nix平台)是三种主要的:preforkworker,和event。从本质上讲,它们代表了 Apache Web 服务器的演变,以及该服务器在其漫长的(软件术语)历史中在计算限制内处理 HTTP 请求的不同方式。


prefork

mpm_prefork是……嗯……它与所有东西都兼容。它分离出许多子进程来处理请求,并且子进程一次只处理一个请求。因为它让服务器进程坐在那里,准备好采取行动,并且不需要处理线程封送处理,当您一次只处理一个请求时,它实际上比更现代的线程 MPM更快- 但并发请求会受到影响,因为它们必须排队等待直到服务器进程空闲。此外,尝试增加 prefork 子进程的数量,您将很容易占用一些严重的 RAM。

除非您需要一个不是线程安全的模块,否则可能不建议使用 prefork。

使用条件:您需要在使用线程时中断的模块,例如mod_php. 即便如此,请考虑使用 FastCGI 和php-fpm.

不要在以下情况下使用:您的模块不会在线程中中断。

worker

mpm_worker使用线程 - 这对并发有很大帮助。Worker 剥离一些子进程,这些子进程又剥离子线程;与 prefork 类似,如果可能,一些备用线程会保持准备就绪,以服务传入的连接。这种方法在 RAM 上更友好,因为线程数与内存使用没有直接关系,就像服务器计数在 prefork 中所做的那样。它还可以更轻松地处理并发,因为连接只需要等待一个空闲线程(通常可用)而不是 prefork 中的备用服务器。

在以下情况下使用:使用的是 Apache 2.2 或 2.4,并且主要运行 SSL。

不要使用 if:你真的不会出错,除非你需要 prefork 来兼容。

但是,请注意,踏板附加到连接而不是请求- 这意味着保持活动的连接始终保持线程的状态,直到它关闭(这可能需要很长时间,取决于您的配置)。这就是为什么我们有..

event

mpm_event在结构上与工人非常相似;它刚刚在 Apache 2.4 中从“实验”状态变为“稳定”状态。最大的区别在于它使用专用线程来处理保持活动的连接,并且仅在实际发出请求时才将请求传递给子线程(允许这些线程在请求​​完成后立即释放备份)。这对于不一定一次全部处于活动状态的客户端的并发性非常有用,但偶尔会发出请求,并且当客户端可能有很长的保持活动超时时。

这里的例外是 SSL 连接;在这种情况下,它的行为与 worker 相同(将给定的连接粘合到给定的线程,直到连接关闭)。

在以下情况下使用:使用的是 Apache 2.4 并且喜欢线程,但您不喜欢让线程等待空闲连接。每个人都喜欢线程!

在以下情况下不要使用:您不在 Apache 2.4 上,或者您需要 prefork 以实现兼容性。


在当今的slowloris、AJAX 和浏览器喜欢将 6 个 TCP 连接(当然还有保持连接)多路复用到您的服务器的世界中,并发性是使您的服务器扩展和扩展良好的重要因素。Apache 的历史在这方面将其束缚住了,虽然它在资源使用或规模方面仍然无法与 nginx 或 lighttpd 之类的同类产品相提并论,但很明显,开发团队正在努力构建一个仍然相关的 Web 服务器在当今高请求并发的世界中。

  • @symcbean 所以你是说 15% 的 RAM 使用率并不重要?那很好,但我的意见不是这样。并发性能声明不是我自己的。见[这里](http://people.apache.org/~jim/presos/ACNA11/Apache_httpd_cloud.pdf)。事件 MPM 的文档中清楚地说明了 SSL 差异:`改进的连接处理尚不适用于某些连接过滤器,尤其是 SSL。对于 SSL 连接,此 MPM 将回退到工作 MPM 的行为,并为每个连接保留一个工作线程。` (10认同)
  • -1:IME,worker 仅将 httpd 占用空间的大小减少了 15%(IIRC Linux 在 RSS 中报告 COW,这使得 pre-fork 看起来好像它使用的内存比实际使用的内存多得多)。进程和 NPTL 线程的内核占用空间之间的差异可以忽略不计。距离惊天动地还有很长的路要走。我不明白为什么您认为等待和分配线程在调度方面比等待/调度(预分叉)进程更有效。你认为 SSL 对整个社会的影响也不大。 (3认同)
  • @ShaneMadden ` 虽然它在资源使用或规模方面确实仍然无法与 nginx 或 lighttpd 之类的产品相提并论,但我已经对这两个系统进行了 apache floor。 (3认同)
  • 使用 SSL 连接时`event` MPM 的限制似乎不再成立。手册 https://httpd.apache.org/docs/2.4/mod/event.html 现在说:“这些改进对 HTTP/HTTPS 连接都有效。” 因此,在 Apache 2.4 上,`event` 现在似乎总是可取的,而 `worker` 从 2.2 次开始仍然存在。 (2认同)

小智 13

这是它如何与 gif 一起使用的一个很好的解释:

https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/

简而言之:如果您使用2.4并且需要 httpd 作为反向代理(调度程序),那么您的选择是事件 MPM


小智 9

截至 2018 年 2 月,事件 MPM 的 Apache 2.4 文档指出,使用 Apache 作为代理将使自 2.4.24 以来的“改进的连接处理”无法按设计工作。请参阅限制部分。

问题在于,作为代理,worker 无法知道响应的结束位置,并且将被迫等待直到看到整个响应,然后再将控制权返回给侦听器。

出于这个原因,当使用 apache 作为代理时,似乎使用 Worker 模型可能是最好的。我不太清楚代理环境中的事件模型是否有优势,但也许有。


Jer*_*oen 6

主要取决于您要使用哪些 Apache 模块。我认为 worker 通常是默认选择,但一些(较旧的)模块需要分叉并依赖于预分叉。

如果您没有偏好,我建议您使用操作系统发行版中的首选依赖项。例如,Ubuntu 将在您安装 Apache2 时默认安装 mpm-worker。