查看Apache配置文件,我看到了Prefork和Worker MPM的定义。有什么区别,哪个是Apache使用的?
答案 0 :(得分:116)
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
答案 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
mpm_netware
mpmt_os2
prefork
(update for Apache version ≥ 2.4:prefork
,worker
或event
,具体取决于平台功能)mpm_winnt
要检查编译到服务器中的模块,请使用命令行选项-l
(here是文档)。例如,在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服务器的多处理模块现在,prefork
和worker
之间存在差异。
实现了一个处理的非线程,预分叉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使用具有多个线程的多个子进程。