Apache Prefork vs Worker MPM

查看Apacheconfiguration文件,我看到了Prefork和Worker MPM的定义。 有什么区别,哪一个是Apache使用?

Prefork和Worker是MPM apache提供的两种types。 两者都有其优点和缺点。

默认情况下,mpm是线程安全的prefork。

Prefork MPM使用多个subprocess,每个进程使用一个线程,每个进程一次处理一个连接。

工人MPM使用多个subprocess,每个进程都有多个线程。 每个线程一次处理一个连接。

有关更多详细信息,请访问https://httpd.apache.org/docs/2.4/mpm.html和https://httpd.apache.org/docs/2.4/mod/prefork.html

Apache的多处理模块(MPM)负责绑定到机器上的networking端口,接受请求,并派遣孩子处理请求( http://httpd.apache.org/docs/2.2/mpm.html )。

它们就像任何其他Apache模块一样,除了只有一个MPM必须随时加载到服务器上 。 在configuration过程中selectMPM,并使用参数--with-mpm=NAME和configure脚本将其编译到服务器中 ,其中NAME是所需MPM的名称。

Apache将为每个操作系统使用默认的MPM,除非在编译时select不同的默认MPM(例如,在Windows mpm_winnt默认使用mpm_winnt )。 以下是操作系统及其默认MPM列表:

  • BeOS beos
  • Netware mpm_netware
  • OS / 2 mpmt_os2
  • Unix / Linux prefork ( 针对Apache版本 prefork 更新preforkworkerevent ,具体取决于平台function)
  • Windows mpm_winnt

要检查哪些模块被编译到服务器中,使用命令行选项-l ( 这里是文档)。 例如在Windows安装中,您可能会得到如下所示的内容:

 > httpd -l Compiled in modules: core.c mod_win32.c mpm_winnt.c http_core.c mod_so.c 

从版本2.2开始,这是可用核心function和MPM模块的列表 :

  • core – 始终可用的核心Apache HTTP服务器function
  • mpm_common – 一个由多个多处理模块(MPM)实现的指令集合,
  • beos – 这个多处理模块针对BeOS进行了优化。
  • event – 标准工人MPM的实验变体
  • mpm_netware多处理模块实现专门针对Novell NetWare优化的线程化Web服务器
  • mpmt_os2用于OS / 2的混合多进程multithreadingMPM
  • prefork实现一个非线程的预分叉web服务器
  • mpm_winnt – 此多处理模块针对Windows NT进行了优化。
  • worker – 多处理模块,实现混合multithreading多进程Web服务器

现在,对preforkworker之间的区别。

prefork MPM

实现了一个非线程化的预分叉web服务器,以类似于Apache 1.3的方式处理请求。 对于需要避免与非线程安全库兼容的线程的站点来说,这是适当的。 它也是隔离每个请求的最好的MPM,所以单个请求的问题不会影响任何其他请求。

worker MPM实现一个混合的多进程multithreading服务器,并提供更好的性能,因此它应该是首选的,除非使用包含非线程安全库的其他模块(另请参阅此讨论或在Serverfault上)。

看看这个更多的细节。 它指的是Apache如何处理多个请求。 默认情况下,Preforking启动了许多Apache进程(这里默认是2个,不过我相信可以通过httpd.confconfiguration)。 工作人员MPM将为每个请求启动一个新的线程,我猜想,这是更高效的内存。 从历史上看,Apache已经使用了prefork,所以它是一个更好的testing模型。 线程仅在2.0中添加。

对于CentOS 6.x和7.x(包括Amazon Linux),请使用:

 sudo httpd -V 

这将显示您configuration了哪些MPM。 无论是prefork,工人还是事件。 Prefork是较早的线程安全模型。 Worker是multithreading的,事件支持php-mpm,这应该是一个更好的处理线程和请求的系统。

但是,根据configuration,您的结果可能会有所不同。 我在php-mpm中看到了很多不稳定的情况,而且速度没有提高。 一个咄咄逼人的蜘蛛可以很容易地耗尽php-mpm中的最大subprocess。

prefork,worker或event的设置在sudo nano /etc/httpd/conf.modules.d/00-mpm.conf(CentOS 6.x / 7.x / Apache 2.4)中设置。

 # Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines: # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html #LoadModule mpm_worker_module modules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html #LoadModule mpm_event_module modules/mod_mpm_event.so 

您可以通过发出以下命令来判断Apache是​​使用瓶坯还是工人

 apache2ctl -l 

在结果输出中,查找prefork.c或worker.c的提及