Answers:
Prefork和worker是MPM Apache提供的两种类型。两者都有其优点和缺点。
默认情况下,mpm是prefork,它是线程安全的。
Prefork MPM使用多个子进程,每个子进程都有一个线程,并且每个进程一次处理一个连接。
Worker MPM使用具有多个线程的多个子进程。每个线程一次处理一个连接。
有关更多详细信息,您可以访问https://httpd.apache.org/docs/2.4/mpm.html和https://httpd.apache.org/docs/2.4/mod/prefork.html
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
mpmt_os2
prefork
(更新为Apache的版本≥2.4:prefork
,worker
或event
,取决于平台功能)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的混合多进程,多线程MPMprefork
实现非线程,预分支的Web服务器mpm_winnt
-此多处理模块针对Windows NT进行了优化。worker
-实现混合多线程多进程Web服务器的多进程模块现在,prefork
和之间的区别worker
。
实现一个非线程的,预分支的Web服务器,该服务器以类似于Apache 1.3的方式处理请求。它适用于需要避免使用线程以与非线程安全库兼容的站点。这也是隔离每个请求的最佳MPM,因此单个请求的问题不会影响其他任何请求。
所述worker
MPM器具的混合多进程多线程服务器和提供更好的性能,因此它应该除非人在使用含有非线程安全库(也见其他模块是优选的这一讨论或此上Serverfault)。
对于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
您可以通过发出以下命令来判断Apache是使用预制件还是使用工作器
apache2ctl -l
在结果输出中,查找对prefork.c或worker.c的提及
apachectl -V
查看旁边的输出Server MPM
。也可以检查ps aux
并查找httpd
或httpd.worker
。
apache2ctl -l
这没有用;不得不使用apachectl -l
。
httpd -V
将显示以下内容:Server MPM: worker
在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
Apache定义了两种类型的MPM(多处理模块):
1:前叉2:工人
默认情况下,Apacke被配置为预分支模式,即非线程预分支Web服务器。这意味着每个Apache子进程包含一个线程并一次处理一个请求。因此,它消耗更多的资源。
Apache还具有工作程序MPM,该工作程序将Apache变成了多进程,多线程的Web服务器。Worker MPM使用具有多个线程的多个子进程。