如何选择要使用的Apache MPM?

Modified on: Tue, 12 Nov 2019 22:40:03 +0800
  

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

我对Apache提供的不同MPM - '工人','事件','prefork'等感到困惑。

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

最佳答案

有许多MPM模块(多处理模块),但到目前为止,使用最广泛的(至少在* nix平台上)是三个主要的:preforkworkerevent。从本质上讲,它们代表了Apache Web服务器的发展,以及构建服务器的不同方式,可以在长时间(以软件术语)历史记录的时间内处理HTTP请求。


prefork

mpm_prefork是......好吧..它与一切兼容。它会循环使用许多子进程来提供请求,子进程一次只能处理一个请求。因为它有服务器进程坐在那里,准备采取行动,而不需要处理线程编组,它实际上比更现代的线程MPM 更快当你只处理一个请求时时间 - 但并发请求受到影响,因为他们被排队等待直到服务器进程空闲。此外,尝试扩展prefork子进程的数量,你很容易吸收一些严重的RAM。

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

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

请勿使用if:您的模块不会在线程中断。

worker

mpm_worker使用线程 - 这对并发性有很大帮助。工作者将一些子进程旋转,这反过来又会剥离子线程;类似于prefork,如果可能的话,一些备用线程会保持就绪,以便为传入的连接提供服务。这种方法在RAM上更加友好,因为线程计数与内存使用没有直接关系,就像prefork中的服务器计数一样。它还更容易处理并发,因为连接只需要等待一个空闲线程(通常是可用的)而不是prefork中的备用服务器。

使用if:您使用的是Apache 2.2或2.4,而您主要使用的是SSL。

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

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

event

mpm_event在结构上非常类似于worker;它刚刚在Apache 2.4中从“实验”状态转移到“稳定”状态。最大的区别在于它使用专用线程来处理保持活动的连接,并且只有在实际发出请求时才将请求发送到子线程(允许这些线程在请求​​完成后立即自由备份)。这对于客户端的并发性来说非常有用,这些客户端一次不一定都是活动的,但偶尔会发出请求,并且当客户端可能有一个很长的保持活动超时时。

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

使用if:您使用的是Apache 2.4并且喜欢线程,但您不希望让线程等待空闲连接。每个人都喜欢线程!

请勿使用if:您不在Apache 2.4上,或者您需要prefork才能兼容。


在今天的slowloris世界中, AJAX和浏览器喜欢将6个TCP连接(当然还有keep-alive)复用到服务器,并发性是使服务器扩展和扩展的重要因素。 Apache的历史在这方面已经把它降低了,虽然它在资源使用或规模方面仍然不能与nginx或lighttpd相提并论,但显然开发团队正在努力构建一个仍然相关的Web服务器在今天的高要求并发世界中。


相关问答

添加新评论