查看Apache配置文件,我看到Prefork和Worker MPM已定义。有什么区别,Apache使用的是哪一种?
erhoui1w1#
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
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的列表:
--with-mpm=NAME
NAME
mpm_winnt
beos
mpm_netware
mpmt_os2
prefork
worker
event
使用命令行选项-l(here是文档)检查哪些模块被编译到服务器中。例如,在Windows安装中,您可能会得到如下内容:
-l
> httpd -lCompiled in modules: core.c mod_win32.c mpm_winnt.c http_core.c mod_so.c
> 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
mpm_common
prefork和worker的区别。prefork MPM实现了一个非线程的、预分叉的Web服务器,以类似于Apache 1.3的方式处理请求。它适用于需要避免线程以兼容非线程安全库的站点。它也是隔离每个请求的最佳MPM,因此单个请求的问题不会影响任何其他请求。worker MPM实现了一个混合的多进程多线程服务器,并提供了更好的性能,因此它应该是首选,除非使用包含非线程安全库的其他模块(参见Serverfault上的this discussion或this)。
lzfw57am3#
查看this以了解更多详细信息。它指的是Apache如何处理多个请求。Preforking是默认的,它会启动多个Apache进程(这里默认为2个,不过我相信可以通过httpd.conf进行配置)。Worker MPM将为每个请求启动一个新线程,我猜这会更有效地利用内存。从历史上看,Apache一直使用prefork,所以它是一个经过更好测试的模型。线程是在2.0中才添加的。
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
# 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
2w2cym1i5#
您可以通过发出以下命令来判断Apache使用的是preform还是worker
apache2ctl -l
在结果输出中,查找是否提到了prefork. c或worker. c
jdg4fx2g6#
在RHEL7上的Apache 2.4中很容易在prefork或worker mpm之间切换通过执行以下命令检查MPM类型
sudo httpd -VServer version: Apache/2.4.6 (Red Hat Enterprise Linux)Server built: Jul 26 2017 04:45:44Server's Module Magic Number: 20120211:24Server loaded: APR 1.4.8, APR-UTIL 1.5.2Compiled using: APR 1.4.8, APR-UTIL 1.5.2Architecture: 64-bitServer 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"
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.htmlLoadModule 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
/etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#
ne5o7dgx7#
Apache定义了两种类型的MPM(多处理模块):1:Prefork 2:工人默认情况下,Apacke配置为预分叉模式,即非线程预分叉Web服务器。这意味着每个Apache子进程都包含一个线程,一次处理一个请求。正因为如此,它消耗了更多的资源。Apache还有一个worker MPM,它可以将Apache变成一个多进程、多线程的Web服务器。Worker MPM使用多个子进程,每个子进程有许多线程。
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.confuncomment 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
8条答案
按热度按时间erhoui1w1#
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
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
mpm_netware
mpmt_os2
prefork
(***更新***适用于Apache版本≥ 2.4:prefork
、worker
或event
,具体取决于平台功能)mpm_winnt
使用命令行选项
-l
(here是文档)检查哪些模块被编译到服务器中。例如,在Windows安装中,您可能会得到如下内容:从版本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的混合多进程、多线程MPMprefork
实现非线程、预分叉的Web服务器mpm_winnt
-此多处理模块针对Windows NT进行了优化。worker
-实现混合多线程多进程Web服务器的多处理模块prefork
和worker
的区别。prefork
MPM实现了一个非线程的、预分叉的Web服务器,以类似于Apache 1.3的方式处理请求。它适用于需要避免线程以兼容非线程安全库的站点。它也是隔离每个请求的最佳MPM,因此单个请求的问题不会影响任何其他请求。
worker
MPM实现了一个混合的多进程多线程服务器,并提供了更好的性能,因此它应该是首选,除非使用包含非线程安全库的其他模块(参见Serverfault上的this discussion或this)。lzfw57am3#
查看this以了解更多详细信息。它指的是Apache如何处理多个请求。Preforking是默认的,它会启动多个Apache进程(这里默认为2个,不过我相信可以通过httpd.conf进行配置)。Worker MPM将为每个请求启动一个新线程,我猜这会更有效地利用内存。从历史上看,Apache一直使用prefork,所以它是一个经过更好测试的模型。线程是在2.0中才添加的。
mdfafbf14#
对于CentOS 6.x和7.x(包括Amazon Linux),请用途:
这将显示配置了哪些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)中设置。
2w2cym1i5#
您可以通过发出以下命令来判断Apache使用的是preform还是worker
在结果输出中,查找是否提到了prefork. c或worker. c
jdg4fx2g6#
在RHEL7上的Apache 2.4中很容易在prefork或worker mpm之间切换
通过执行以下命令检查MPM类型
现在要更改MPM,请编辑以下文件并取消注解所需的MPM
ne5o7dgx7#
Apache定义了两种类型的MPM(多处理模块):
1:Prefork 2:工人
默认情况下,Apacke配置为预分叉模式,即非线程预分叉Web服务器。这意味着每个Apache子进程都包含一个线程,一次处理一个请求。正因为如此,它消耗了更多的资源。
Apache还有一个worker MPM,它可以将Apache变成一个多进程、多线程的Web服务器。Worker MPM使用多个子进程,每个子进程有许多线程。
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