Apache Prefork对比Worker MPM


113

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

Answers:


120

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


11
另请参见“如何选择要使用的Apache MPM?” serverfault.com/a/383634
Nazariy 2013年

@arvind //每个线程一次处理一个连接//这里的连接意味着单个用户还是单个请求?请解释
-user1844933

21

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

它们就像任何其他Apache模块一样,只是在任何时候都只能将一个MPM加载到服务器中。在配置过程中选择MPM,然后通过使用带有configure脚本的参数将MPM 编译到服务器中--with-mpm=NAME其中NAME所需的MPM的名称。

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

  • 操作系统 beos
  • 网络软件 mpm_netware
  • OS / 2 mpmt_os2
  • 在Unix / Linux prefork更新为Apache的版本≥2.4preforkworkerevent,取决于平台功能)
  • 视窗 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版开始,以下是可用的核心功能和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服务器的多进程模块

现在,prefork和之间的区别worker

preforkMPM

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

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


1
Apache 2.4.7的ubuntu-trusty-64的默认安装正在使用事件MPM
Federico'1

9

看看更多的细节。它指的是Apache如何处理多个请求。默认情况下,预分支启动了许多Apache进程(此处默认为2个进程,尽管我相信可以通过httpd.conf进行配置)。Worker MPM将为每个请求启动一个新线程,我想这会提高内存效率。从历史上看,Apache曾使用过prefork,因此它是一个经过更好测试的模型。仅在2.0中添加了线程。


3
事件MPM呢?
文斯·克朗莱恩

6

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

sudo httpd -V

这将向您显示配置了哪些MPM。前叉,工作程序或事件。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

3

您可以通过发出以下命令来判断Apache是​​使用预制件还是使用工作器

apache2ctl -l

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


8
Apache可以使用两个MPM模块进行编译,因此这并不总是可靠的。如果它列出了两个MPM模块,请尝试apachectl -V查看旁边的输出Server MPM。也可以检查ps aux并查找httpdhttpd.worker
reflexiv

2
就我而言,apache2ctl -l这没有用;不得不使用apachectl -l
Vacilando

2
他们中没有一个为我列出,但是apache可以正常工作,Apache / 2.4.7(Ubuntu)
karatedog 2016年

2
在运行Apache 2.4.6的centos 7.x中,httpd -V将显示以下内容:Server MPM: worker
runamok 2016年

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

为什么当我尝试使用mpm_worker或mpm_event时,它不起作用我的页面
Leoh

0

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

1:前叉2:工人

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.