这是有关选择正确的Apache httpd MPM 的规范问题。
我对Apache提供的不同MPM之间有些困惑,例如'worker','event','prefork'等。
它们之间的主要区别是什么,我如何确定哪一个最适合给定的部署?
这是有关选择正确的Apache httpd MPM 的规范问题。
我对Apache提供的不同MPM之间有些困惑,例如'worker','event','prefork'等。
它们之间的主要区别是什么,我如何确定哪一个最适合给定的部署?
Answers:
有许多的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。
如果没有,请不要使用:除非您需要兼容性的预叉,否则您真的不会出错。
但是,请注意,踏板是连接到连接的,而不是请求的连接 -这意味着,保持活动连接始终保持线程的保持状态,直到关闭为止(这可能要花很长时间,具体取决于您的配置)。这就是为什么我们有..
event
mpm_event
在结构上与工人非常相似;在Apache 2.4中,它刚刚从“实验”状态变为“稳定”状态。最大的区别在于,它使用专用线程来处理保持活动的连接,并且仅在实际发出请求时才将请求移交给子线程(允许这些线程在请求完成后立即释放备份)。这对于并发性客户端非常有用,这些并发性客户端不一定同时处于活动状态,而是偶尔发出请求,并且客户端的保持活动超时时间很长。
SSL连接是一个例外。在这种情况下,它的行为与worker相同(将给定连接粘合到给定线程,直到连接关闭)。
在以下情况下使用:如果您使用的是Apache 2.4且喜欢线程,但是您不喜欢让线程等待空闲连接。每个人都喜欢线程!
如果没有,请不要使用:您不在Apache 2.4上,或者需要prefork以获得兼容性。
在当今的lololoris,AJAX和喜欢将6 TCP连接(当然还有保持活动)多路复用的浏览器中,并发是确保服务器扩展和扩展的重要因素。Apache的历史在这方面一直束手无策,尽管就资源使用或规模而言,它实际上仍未与nginx或lighttpd之类的东西相提并论,但很明显,开发团队正在努力构建仍然重要的Web服务器。在当今高要求并发的世界中。
The improved connection handling does not yet work for certain connection filters, in particular SSL. For SSL connections, this MPM will fall back to the behaviour of the worker MPM and reserve one worker thread per connection.