【发布时间】:2012-12-02 17:56:42
【问题描述】:
查看 Apache 配置文件,我看到定义了 Prefork 和 Worker MPM。有什么区别,Apache 使用的是哪一个?
【问题讨论】:
标签: apache
查看 Apache 配置文件,我看到定义了 Prefork 和 Worker MPM。有什么区别,Apache 使用的是哪一个?
【问题讨论】:
标签: apache
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,并编译到服务器中,方法是使用参数 --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 适用于 OS/2 的混合多进程、多线程 MPMprefork 实现一个非线程的预分叉网络服务器mpm_winnt - 这个多处理模块针对 Windows NT 进行了优化。worker - 实现混合多线程多进程 Web 服务器的多处理模块现在,prefork 和 worker 之间的区别。
实现了一个非线程的、预分叉的网络服务器来处理 以类似于 Apache 1.3 的方式请求。它适用于 需要避免线程以兼容的站点 非线程安全的库。它也是隔离每个的最佳 MPM 请求,因此单个请求的问题不会影响任何 其他。
worker MPM 实现了一个混合多进程多线程服务器并提供了更好的性能,因此除非使用包含非线程安全库的其他模块(另请参阅 this discussion 或 @987654328 @ on Serverfault)。
【讨论】:
查看this 了解更多详情。它指的是 Apache 如何处理多个请求。 Preforking 是默认设置,它启动了许多 Apache 进程(这里默认为 2 个,尽管我相信可以通过 httpd.conf 配置它)。 Worker MPM 将为每个请求启动一个新线程,我猜这会更节省内存。从历史上看,Apache 使用过 prefork,因此它是一个经过更好测试的模型。线程仅在 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
【讨论】:
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 定义了 2 种类型的 MPM(多处理模块):
1:前叉 2:工人
默认情况下,Apacke 配置为预分叉模式,即非线程预分叉 Web 服务器。这意味着每个 Apache 子进程都包含一个线程并一次处理一个请求。因此,它会消耗更多资源。
Apache 还具有将 Apache 转变为多进程、多线程 Web 服务器的 worker MPM。 Worker MPM 使用多个子进程,每个子进程有很多线程。
【讨论】: