查看 Apache 配置文件,我看到 Prefork 和 Worker MPM 已定义。有什么区别,Apache 使用的是哪一个?
7 回答
Prefork 和 worker 是 apache 提供的两种类型的 MPM。两者都有其优点和缺点。
默认情况下,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 在配置期间被选择,并通过使用带有配置脚本的参数编译到服务器中,其中是所需 MPM 的名称。--with-mpm=NAME
NAME
Apache 将为每个操作系统使用默认的 MPM,除非在编译时选择了不同的 MPM(例如在 Windowsmpm_winnt
上默认使用)。以下是操作系统及其默认 MPM 的列表:
- 操作系统
beos
- 网络软件
mpm_netware
- 操作系统/2
mpmt_os2
- Unix/Linux
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 优化的线程网络服务器mpmt_os2
用于 OS/2 的混合多进程、多线程 MPMprefork
实现一个非线程的、预分叉的 Web 服务器mpm_winnt
- 这个多处理模块针对 Windows NT 进行了优化。worker
- 实现混合多线程多进程 Web 服务器的多处理模块
prefork
现在,到和之间的区别worker
。
实现了一个非线程的、预分叉的 Web 服务器,它以类似于 Apache 1.3 的方式处理请求。它适用于需要避免线程以与非线程安全库兼容的站点。它也是隔离每个请求的最佳 MPM,这样单个请求的问题不会影响到任何其他请求。
worker
MPM实现了一个混合多进程多线程服务器并提供了更好的性能,因此它应该是首选,除非使用包含非线程安全库的其他模块(另请参阅此讨论或有关 Serverfault 的此讨论)。
Take a look at this for more detail. It refers to how Apache handles multiple requests. Preforking, which is the default, starts a number of Apache processes (2 by default here, though I believe one can configure this through httpd.conf). Worker MPM will start a new thread per request, which I would guess, is more memory efficient. Historically, Apache has used prefork, so it's a better-tested model. Threading was only added in 2.0.
对于 CentOS 6.x 和 7.x(包括 Amazon Linux),请使用:
sudo httpd -V
这将显示哪些 MPM 已配置。prefork、worker 或事件。Prefork 是较早的线程安全模型。Worker 是多线程的,并且 event 支持 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 使用的是 preform 还是 worker
apache2ctl -l
在结果输出中,查找提及 prefork.c 或 worker.c
它很容易在 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 定义了 2 种类型的 MPM(多处理模块):
1:Prefork 2:工人
默认情况下,Apacke 配置为预分叉模式,即非线程预分叉 Web 服务器。这意味着每个 Apache 子进程都包含一个线程并一次处理一个请求。因此,它消耗更多的资源。
Apache 还拥有将 Apache 转变为多进程、多线程 Web 服务器的 worker MPM。Worker MPM 使用多个子进程,每个子进程有很多线程。