120

查看 Apache 配置文件,我看到 Prefork 和 Worker MPM 已定义。有什么区别,Apache 使用的是哪一个?

4

7 回答 7

122

Prefork 和 worker 是 apache 提供的两种类型的 MPM。两者都有其优点和缺点。

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

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

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

有关更多详细信息,您可以访问https://httpd.apache.org/docs/2.4/mpm.htmlhttps://httpd.apache.org/docs/2.4/mod/prefork.html

于 2012-12-20T08:38:46.730 回答
22

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

它们与任何其他 Apache 模块一样,只是在任何时候都必须将一个且只有一个 MPM 加载到服务器中。MPM 在配置期间被选择,并通过使用带有配置脚本的参数编译到服务器中,其中是所需 MPM 的名称。--with-mpm=NAMENAME

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

  • 操作系统beos
  • 网络软件 mpm_netware
  • 操作系统/2mpmt_os2
  • Unix/Linux preforkApache 版本 ≥ 2.4 的更新prefork、、workerevent,取决于平台功能)
  • 视窗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 的混合多进程、多线程 MPM
  • prefork实现一个非线程的、预分叉的 Web 服务器
  • mpm_winnt- 这个多处理模块针对 Windows NT 进行了优化。
  • worker- 实现混合多线程多进程 Web 服务器的多处理模块

prefork现在,到和之间的区别worker

MPM _prefork

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

workerMPM实现了一个混合多进程多线程服务器并提供了更好的性能,因此它应该是首选,除非使用包含非线程安全库的其他模块(另请参阅讨论或有关 Serverfault 的此讨论)。

于 2015-06-15T08:14:50.487 回答
9

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.

于 2012-12-14T18:29:37.073 回答
6

对于 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
于 2016-11-24T06:16:02.920 回答
3

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

apache2ctl -l

在结果输出中,查找提及 prefork.c 或 worker.c

于 2014-06-05T04:59:13.057 回答
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
于 2018-03-09T13:46:38.187 回答
1

Apache 定义了 2 种类型的 MPM(多处理模块):

1:Prefork 2:工人

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

Apache 还拥有将 Apache 转变为多进程、多线程 Web 服务器的 worker MPM。Worker MPM 使用多个子进程,每个子进程有很多线程。

于 2020-05-14T19:28:44.320 回答