Apache Prefork vs Worker MPM

webghufk  于 2023-06-30  发布在  Apache
关注(0)|答案(8)|浏览(136)

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

erhoui1w

erhoui1w1#

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

9gm1akwq

9gm1akwq2#

Apache的多处理模块(Multi-Processing Modules,MPM)负责绑定到机器上的网络端口,接受请求,并分派子节点来处理请求(http://httpd.apache.org/docs/2.2/mpm.html)。
它们就像任何其他Apache模块一样,只是 * 在任何时候都必须向服务器加载一个且只有一个MPM 。MPM是在配置过程中选择的,并通过使用参数--with-mpm=NAME和configure脚本编译到服务器*中,其中NAME是所需MPM的名称。
Apache将为每个操作系统使用默认的MPM,除非在编译时选择不同的MPM(例如在Windows上默认使用mpm_winnt)。以下是操作系统及其默认MPM的列表:

  • BeOS beos
  • Netware mpm_netware
  • OS/2 mpmt_os2
  • Unix/Linux prefork(***更新***适用于Apache版本≥ 2.4:preforkworkerevent,具体取决于平台功能)
  • Windows mpm_winnt

使用命令行选项-lhere是文档)检查哪些模块被编译到服务器中。例如,在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服务器功能
  • mpm_common-由多个多处理模块(MPM)实现的指令集合
  • beos-此多处理模块针对BeOS进行了优化。
  • event-标准worker MPM的实验性变体
  • mpm_netware多处理模块,实现专为Novell NetWare优化的线程Web服务器
  • mpmt_os2用于OS/2的混合多进程、多线程MPM
  • prefork实现非线程、预分叉的Web服务器
  • mpm_winnt-此多处理模块针对Windows NT进行了优化。
  • worker-实现混合多线程多进程Web服务器的多处理模块

preforkworker的区别。
prefork MPM
实现了一个非线程的、预分叉的Web服务器,以类似于Apache 1.3的方式处理请求。它适用于需要避免线程以兼容非线程安全库的站点。它也是隔离每个请求的最佳MPM,因此单个请求的问题不会影响任何其他请求。
worker MPM实现了一个混合的多进程多线程服务器,并提供了更好的性能,因此它应该是首选,除非使用包含非线程安全库的其他模块(参见Serverfault上的this discussionthis)。

lzfw57am

lzfw57am3#

查看this以了解更多详细信息。它指的是Apache如何处理多个请求。Preforking是默认的,它会启动多个Apache进程(这里默认为2个,不过我相信可以通过httpd.conf进行配置)。Worker MPM将为每个请求启动一个新线程,我猜这会更有效地利用内存。从历史上看,Apache一直使用prefork,所以它是一个经过更好测试的模型。线程是在2.0中才添加的。

mdfafbf1

mdfafbf14#

对于CentOS 6.x和7.x(包括Amazon Linux),请用途:

sudo httpd -V

这将显示配置了哪些MPM。prefork、worker或event。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
2w2cym1i

2w2cym1i5#

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

apache2ctl -l

在结果输出中,查找是否提到了prefork. c或worker. c

jdg4fx2g

jdg4fx2g6#

在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
ne5o7dgx

ne5o7dgx7#

Apache定义了两种类型的MPM(多处理模块):
1:Prefork 2:工人
默认情况下,Apacke配置为预分叉模式,即非线程预分叉Web服务器。这意味着每个Apache子进程都包含一个线程,一次处理一个请求。正因为如此,它消耗了更多的资源。
Apache还有一个worker MPM,它可以将Apache变成一个多进程、多线程的Web服务器。Worker MPM使用多个子进程,每个子进程有许多线程。

yr9zkbsy

yr9zkbsy8#

首先检查哪个模块正在运行:-
如果你是在ubuntu/debian上配置:-
sudo apachectl -M| grep 'mpm'
vi /etc/apache2/mods-available/mpm_prefork.conf
..
.. StartServers 8
.. MinSpareServers 20
.. MaxSpareServers 40
.. MaxRequestWorkers 200
.. MaxConnectionsPerChild 4500
..
apachectl -t用于语法检查或apachectl configtest
如果你想在worker或event中更改,则:
/etc/apache2/mods-available/mpm_event.conf
在不同的模块中更改后,您需要切换模块如果您正在使用事件模块并希望更改为Prefork模块:-
禁用事件模块:-
a2dismod mpm_event
启用Prefork模块:-
a2enmod mpm_event
重启Apache:
服务apache 2重启
如果httpd(configure on redhat,centos,..)
首先检查哪个模块正在运行:-
httpd -V| grep -i 'mpm'
vi /etc/httpd/conf.modules.d/00-mpm.conf
uncomment prefork Module line(LoadModule mpm_prefork_module modules/mod_mpm_prefork.so):-
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
如果您想更改其他模块,然后取消注解该模块行(事件或工作者)和其他注解,也是一样的
httpd -t用于语法检查
现在启动Apache服务:- systemctl restart httpd
但有时它给你错误的php模块之前改变mpm模块然后所有完整的教程和计算:-
https://www.youtube.com/watch?v=8V4TFgFvurU&list=PL5gKsZrSyQQIBNOTLGedvzlKLD9hKoTmS&index=10

相关问题