这是一个典型问题关于选择正确的 Apache httpd MPM。
我对 Apache 提供的不同 MPM(‘worker’、‘event’、‘prefork’等)有点困惑。
它们之间的主要区别是什么?我如何决定哪一个最适合给定的部署?
答案1
有许多MPM 模块(多处理模块),但目前为止使用最广泛的(至少在 *nix 平台上)是三个主要模块:prefork
、worker
和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。
如果出现以下情况,请勿使用:你确实不会出错,除非你需要 prefork 来实现兼容性。
但请注意,踏板连接到連接并不是要求- 这意味着保持活动连接始终保持线程直到关闭(这可能需要很长时间,具体取决于您的配置)。这就是为什么我们有...
event
mpm_event
从结构上讲,它与 worker 非常相似;在 Apache 2.4 中,它刚刚从“实验”状态变为“稳定”状态。两者最大的区别在于,它使用专用线程来处理保持活动的连接,并且仅在实际发出请求时才将请求交给子线程(允许这些线程在请求完成后立即释放)。这对于并发客户端非常有用,这些客户端不一定同时处于活动状态,但偶尔会发出请求,并且客户端的保持活动超时时间可能很长。
这里的例外是 SSL 连接;在这种情况下,它的行为与工作者相同(将给定的连接粘合到给定的线程直到连接关闭)。
使用条件:您使用的是 Apache 2.4,并且喜欢线程,但您不喜欢线程等待空闲连接。每个人都喜欢线程!
如果出现以下情况,请勿使用:您没有使用 Apache 2.4,或者您需要 prefork 来实现兼容性。
在当今世界懒猴、AJAX 和喜欢将 6 个 TCP 连接(当然,具有保持活动状态)多路复用到您的服务器的浏览器,并发性是使服务器扩展并良好扩展的重要因素。Apache 的历史已经将它束缚在这方面,虽然它在资源使用或规模方面仍然无法与 nginx 或 lighttpd 等相提并论,但很明显,开发团队正在努力构建一个在当今高请求并发世界中仍然相关的 Web 服务器。
答案2
这里很好地解释了它如何与 gif 配合使用:
https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/
简而言之:如果你2.4你需要 httpd 作为反向代理(调度员)所以你的选择是事件 MPM
答案3
截至 2018 年 2 月,Apache 2.4 Event MPM 文档指出,使用 Apache 作为代理将使自 2.4.24 以来的“改进的连接处理”无法按设计运行。请参阅限制部分。
问题是,作为代理,工作者无法分辨响应的结束位置,并且将被迫等到看到整个响应后才能将控制权返回给侦听器。
因此,在使用 apache 作为代理时,似乎最好使用 Worker 模型。我不太清楚在代理环境中事件模型是否有优势,但也许有。
答案4
主要取决于您要使用哪个 Apache 模块。我认为 worker 通常是默认选择,但某些(较旧的)模块需要 fork 并依赖于 prefork。
如果您没有偏好,我建议您使用操作系统发行版中首选的依赖项。例如,当您安装 Apache2 时,Ubuntu 将默认安装 mpm-worker。