Apache Prefork vs Worker MPM

Looking at the Apache config file, I see Prefork and Worker MPM defined. What is the difference and which one is Apache using?

218504 次浏览

看看 这个的更多细节。它指的是 Apache 如何处理多个请求。Preforking 是默认的,它启动了许多 Apache 进程(这里默认是2个,不过我相信可以通过 httpd.conf 配置它)。WorkerMPM 将为每个请求启动一个新线程,我猜测这样做更有效地提高了内存效率。从历史上看,Apache 使用 prefork,所以它是一个经过更好测试的模型。线程只是在2.0中添加的。

Prefork 和 worker 是 MPM apache 提供的两种类型,各有优缺点。

默认情况下,mpm 是 prefork,它是线程安全的。

Prefork MPM 使用多个子进程,每个子进程有一个线程,每个进程一次处理一个连接。

WorkerMPM 使用多个子进程,每个子进程有多个线程,每个线程一次处理一个连接。

详情请访问 https://httpd.apache.org/docs/2.4/mpm.htmlhttps://httpd.apache.org/docs/2.4/mod/prefork.html

您可以通过发出以下命令来判断 Apache 是使用 preform 还是 worker

apache2ctl -l

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

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

他们就像其他阿帕奇模块,除了 任何时候只能有一个 MPM 加载到服务器。在配置过程中,通过使用参数 --with-mpm=NAME和配置脚本来选择 MPM,其中 NAME是所需的 MPM 的名称。

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

  • 贝奥斯 beos
  • Netware mpm_netware
  • 操作系统/2 mpmt_os2
  • Unix/Linux prefork(update for Apache version ≥ 2.4: preforkworkerevent,取决于平台功能)
  • 视窗 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 - Core Apache HTTP Server features that are always available
  • mpm_common-由多个多处理模块(MPM)实现的指令集合
  • beos - This Multi-Processing Module is optimized for BeOS.
  • event - An experimental variant of the standard worker MPM
  • mpm_netware多处理模块实现了专门为 Novell NetWare 优化的线程 Web 服务器
  • 面向 OS/2的 mpmt_os2混合多进程、多线程 MPM
  • prefork实现了一个非线程的、预分叉的 Web 服务器
  • mpm_winnt-此多处理模块针对 Windows NT 进行了优化。
  • 多进程模块实现一个混合多线程多进程 Web 服务器

现在,来看看 preforkworker之间的区别。

prefork MPM

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

worker MPM实现了一个混合的多进程多线程服务器,并提供了更好的性能,因此它应该是首选,除非使用其他模块,包含非线程安全的库(也参见 这个讨论这个对 Serverfault)。

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

sudo httpd -V

这将显示配置了哪些 MPM。不是 prefork,worker,就是 event。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

在 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 has 2 types of MPM (Multi-Processing Modules) defined:

第1集: Prefork 2: Worker

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

Apache 还有一个工作者 MPM,可以将 Apache 变成一个多进程、多线程的 Web 服务器。WorkerMPM 使用多个子进程,每个子进程具有多个线程。