Tif*_*ker 289 httpd mpm-worker mpm-prefork apache-2.2
这是一个关于选择正确的 Apache httpd MPM的规范问题。
我对 Apache 提供的不同 MPM 有点困惑——'worker'、'event'、'prefork' 等。
它们之间的主要区别是什么,我如何确定哪一个最适合给定的部署?
Sha*_*den 441
有许多的MPM模块(多道处理模块),但迄今为止最广泛使用的(至少在* nix平台)是三种主要的:prefork,worker,和event。从本质上讲,它们代表了 Apache Web 服务器的演变,以及该服务器在其漫长的(软件术语)历史中在计算限制内处理 HTTP 请求的不同方式。
preforkmpm_prefork是……嗯……它与所有东西都兼容。它分离出许多子进程来处理请求,并且子进程一次只处理一个请求。因为它让服务器进程坐在那里,准备好采取行动,并且不需要处理线程封送处理,当您一次只处理一个请求时,它实际上比更现代的线程 MPM更快- 但并发请求会受到影响,因为它们必须排队等待直到服务器进程空闲。此外,尝试增加 prefork 子进程的数量,您将很容易占用一些严重的 RAM。
除非您需要一个不是线程安全的模块,否则可能不建议使用 prefork。
使用条件:您需要在使用线程时中断的模块,例如mod_php. 即便如此,请考虑使用 FastCGI 和php-fpm.
不要在以下情况下使用:您的模块不会在线程中中断。
workermpm_worker使用线程 - 这对并发有很大帮助。Worker 剥离一些子进程,这些子进程又剥离子线程;与 prefork 类似,如果可能,一些备用线程会保持准备就绪,以服务传入的连接。这种方法在 RAM 上更友好,因为线程数与内存使用没有直接关系,就像服务器计数在 prefork 中所做的那样。它还可以更轻松地处理并发,因为连接只需要等待一个空闲线程(通常可用)而不是 prefork 中的备用服务器。
在以下情况下使用:您使用的是 Apache 2.2 或 2.4,并且主要运行 SSL。
不要使用 if:你真的不会出错,除非你需要 prefork 来兼容。
但是,请注意,踏板附加到连接而不是请求- 这意味着保持活动的连接始终保持线程的状态,直到它关闭(这可能需要很长时间,取决于您的配置)。这就是为什么我们有..
eventmpm_event在结构上与工人非常相似;它刚刚在 Apache 2.4 中从“实验”状态变为“稳定”状态。最大的区别在于它使用专用线程来处理保持活动的连接,并且仅在实际发出请求时才将请求传递给子线程(允许这些线程在请求完成后立即释放备份)。这对于不一定一次全部处于活动状态的客户端的并发性非常有用,但偶尔会发出请求,并且当客户端可能有很长的保持活动超时时。
这里的例外是 SSL 连接;在这种情况下,它的行为与 worker 相同(将给定的连接粘合到给定的线程,直到连接关闭)。
在以下情况下使用:您使用的是 Apache 2.4 并且喜欢线程,但您不喜欢让线程等待空闲连接。每个人都喜欢线程!
在以下情况下不要使用:您不在 Apache 2.4 上,或者您需要 prefork 以实现兼容性。
在当今的slowloris、AJAX 和浏览器喜欢将 6 个 TCP 连接(当然还有保持连接)多路复用到您的服务器的世界中,并发性是使您的服务器扩展和扩展良好的重要因素。Apache 的历史在这方面将其束缚住了,虽然它在资源使用或规模方面仍然无法与 nginx 或 lighttpd 之类的同类产品相提并论,但很明显,开发团队正在努力构建一个仍然相关的 Web 服务器在当今高请求并发的世界中。
小智 13
这是它如何与 gif 一起使用的一个很好的解释:
https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/
简而言之:如果您使用2.4并且需要 httpd 作为反向代理(调度程序),那么您的选择是事件 MPM
主要取决于您要使用哪些 Apache 模块。我认为 worker 通常是默认选择,但一些(较旧的)模块需要分叉并依赖于预分叉。
如果您没有偏好,我建议您使用操作系统发行版中的首选依赖项。例如,Ubuntu 将在您安装 Apache2 时默认安装 mpm-worker。
| 归档时间: |
|
| 查看次数: |
173040 次 |
| 最近记录: |