我如何select使用哪个Apache MPM?

这是关于select正确的Apache httpd MPM的典型问题 。

我对Apache提供的不同MPM(“worker”,“event”,“prefork”等)有些困惑。

他们之间的主要区别是什么?我怎样才能决定哪一个最适合给定的部署?

    有许多MPM模块 (多处理模块),但到目前为止,使用最广泛的(至less在nix平台上)是三个主要模块: preforkworkerevent 。 从本质上讲,它们代表了Apache Web服务器的发展,以及服务器构build的不同方式,以便在其历史悠久(以软件方式)的历史时间的计算限制内处理HTTP请求。


    prefork

    mpm_prefork是.. mpm_prefork ..它与一切都兼容。 它分离了许多用于服务请求的subprocess,而subprocess一次只能提供一个请求。 因为服务器进程已经准备就绪,不需要处理线程编组,所以当你只处理一个请求时,它实际上比现代线程化的MPM 更快 – 但是并发请求会受到影响,因为他们被排队等待,直到服务器进程是免费的。 此外,试图扩大preforksubprocess的计数,你会很容易吸取一些严重的内存。

    除非你需要一个不是线程安全的模块,否则不build议使用prefork。

    在以下情况下使用:您需要在使用线程时断开的模块,如mod_php 。 即便如此,考虑使用FastCGI和php-fpm

    不要使用,如果:你的模块不会中断线程。

    worker

    mpm_worker使用线程 – 这对于并发是一个很大的帮助。 工作人员将一些subprocess分离出来,然后再分离子线程; 类似于prefork,如果可能的话,一些备用线程保持准备就绪,以服务传入的连接。 这种方法对RAM更友善,因为线程数并不直接影响内存使用,例如prefork中的服务器数量。 它也更容易处理并发,因为连接只需要等待一个空闲线程(通常是可用的),而不是prefork中的备用服务器。

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

    不要使用,如果:你真的不能出错,除非你需要prefork的兼容性。

    但是,请注意,踏板连接到连接而不是请求 – 这意味着保持连接的连接始终保持一个线程直到它closures(这可能是一个很长的时间,取决于您的configuration)。 这就是为什么我们有..

    event

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

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

    在以下情况下使用:您处于Apache 2.4之类的线程,但您不希望线程等待空闲连接。 大家都喜欢线程!

    不要使用,如果:你不在Apache 2.4上,或者你需要prefork的兼容性。


    在当今世界的slowloris ,AJAX以及喜欢将6个TCP连接(当然还有保持活动)的浏览器连接到服务器的情况下,并发性是使服务器的规模和扩展能力达到最佳水平的重要因素。 Apache在这方面的历史已经把它束缚住了,虽然在资源使用和规模方面还没有达到与nginx或者lighttpd类似的水平,但显然开发团队正在努力构build一个依然相关的web服务器在当今高要求并发的世界里。

    主要取决于你想使用哪个Apache模块。 我认为工人通常是默认的select,但是一些(旧的)模块需要分叉并依赖于prefork。

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

    这是一个很好的解释,它如何与gifs工作:

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

    简单地说:如果你在2.4 ,你需要httpd作为反向代理 (调度),所以你的select是一个事件MPM