Apache Prefork vs Worker MPM

Cor*_*ory 110 apache

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

小智 117

Prefork和worker是两种类型的MPM apache提供的.两者都有其优点和缺点.

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

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

Worker MPM使用多个子进程,每个进程有多个线程.每个线程一次处理一个连接.

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

  • 另请参阅"如何选择要使用的Apache MPM?" http://serverfault.com/a/383634 (11认同)

use*_*737 21

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

它们与任何其他Apache模块一样,只是必须在任何时候只将一个且只有一个MPM加载到服务器中.在配置期间选择MPM并通过使用带有configure脚本的参数将其编译到服务器中,--with-mpm=NAME其中NAME是所需MPM的名称.

Apache将为每个操作系统使用默认MPM,除非在编译时选择不同的MPM(例如mpm_winnt,默认情况下在Windows 上使用).这是操作系统列表及其默认MPM:

  • BeOS的 beos
  • Netware的 mpm_netware
  • OS/2 mpmt_os2
  • 在Unix/Linux prefork(更新为Apache的版本≥2.4:prefork,workerevent,取决于平台功能)
  • 视窗 mpm_winnt

要检查编译到服务器中的模块,请使用命令行选项-l(此处为文档).例如,在Windows安装上,您可能会得到类似的内容:

> httpd -l
Compiled in modules:
  core.c
  mod_win32.c
  mpm_winnt.c
  http_core.c
  mod_so.c
Run Code Online (Sandbox Code Playgroud)

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

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

现在,之间的差异preforkworker.

preforkMPM

实现一个非线程的预分叉Web服务器,以类似于Apache 1.3的方式处理请求.它适用于需要避免线程与非线程安全库兼容的站点.它也是隔离每个请求的最佳MPM,因此单个请求的问题不会影响任何其他请求.

所述workerMPM实现混合多进程多线程服务器和提供更好的性能,因此它应该除非人在使用含有非线程安全库(也见其他模块是优选的这一讨论上Serverfault).


hd1*_*hd1 9

请查看此内容以获取更多详细信息.它指的是Apache如何处理多个请求.默认情况下,Preforking会启动许多Apache进程(默认情况下为2个,但我相信可以通过httpd.conf进行配置).工作者MPM将为每个请求启动一个新线程,我猜,它的内存效率更高.从历史上看,Apache已经使用了prefork,因此它是一个经过更好测试的模型.线程仅在2.0中添加.

  • Event MPM怎么样? (3认同)

jef*_*ill 6

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

sudo httpd -V
Run Code Online (Sandbox Code Playgroud)

这将显示哪些MPM已配置.无论是prefork,工作者还是事件.Prefork是早期的线程安全模型.Worker是多线程的,事件支持php-mpm,它应该是一个更好的系统来处理线程和请求.

但是,根据配置,您的结果可能会有所不同.我在php-mpm中看到了很多不稳定因素而且没有任何速度提升.攻击性蜘蛛可以很容易地耗尽php-mpm中的最大子进程.

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
Run Code Online (Sandbox Code Playgroud)