Apache Prefork vs Worker MPM

时间:2012-12-14 17:38:24

标签: apache

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

7 个答案:

答案 0 :(得分:116)

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

答案 1 :(得分:19)

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

他们与任何其他Apache模块一样,只是 只需要一个,只需要一个MPM 。在配置期间选择MPM,并使用带有配置脚本的--with-mpm=NAME参数将 编译到服务器 ,其中NAME是所需MPM的名称

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

  • BeOS beos
  • Netware mpm_netware
  • OS / 2 mpmt_os2
  • Unix / Linux preforkupdate for Apache version ≥ 2.4preforkworkerevent,具体取决于平台功能)
  • Windows mpm_winnt

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

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

从版本2.2开始,这是list of available core features and MPM modules

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

现在,preforkworker之间存在差异。

prefork MPM

  

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

worker MPM实现了混合多进程多线程服务器并提供了更好的性能,因此除非使用包含非线程安全库的其他模块,否则它应该是首选的(另请参阅{{3}或Serverfault上的this discussion

答案 2 :(得分:8)

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

答案 3 :(得分:5)

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

sudo httpd -V

这将显示配置了哪些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

答案 4 :(得分:3)

您可以通过发出以下命令来判断Apache是​​否正在使用preform或worker

apache2ctl -l

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

答案 5 :(得分:2)

在RHEL7上的Apache 2.4中,很容易在prefork或worker mpm之间切换

执行

检查MPM类型
sudo httpd -V

Server version: Apache/2.4.6 (Red Hat Enterprise Linux)
Server built:   Jul 26 2017 04:45:44
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

现在更改文件后的MPM编辑并取消注释所需的MPM

 /etc/httpd/conf.modules.d/00-mpm.conf 

# 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

答案 6 :(得分:0)

Apache定义了两种类型的MPM(多处理模块):

1:前叉 2:工人

默认情况下,Apacke被配置为预分支模式,即非线程预分支Web服务器。这意味着每个Apache子进程包含一个线程并一次处理一个请求。因此,它消耗了更多资源。

Apache还具有工作程序MPM,该工作程序将Apache变成了多进程,多线程的Web服务器。 Worker MPM使用具有多个线程的多个子进程。