预派生(prefork)和工作线程(worker)是Apache提供的两种多进程模块(MPM),各有其优点和缺点。
默认情况下,Apache使用线程安全的预派生(Prefork) MPM。
预派生(Prefork) MPM使用多个具有一个线程的子进程,每个进程一次只能处理一个连接。
工作线程(Worker) MPM使用多个具有多个线程的子进程,每个线程一次只能处理一个连接。
有关更多详细信息,请访问https://httpd.apache.org/docs/2.4/mpm.html和https://httpd.apache.org/docs/2.4/mod/prefork.html。
Apache的多进程模块(MPMs)负责绑定机器上的网络端口,接受请求并分派子进程来处理请求(http://httpd.apache.org/docs/2.2/mpm.html)。
它们就像其他任何Apache模块一样,但是只能在服务器中加载一个且仅有一个MPM。MPMs在配置期间被选择并通过使用configure脚本的参数--with-mpm=NAME
编译到服务器中,其中NAME
是所需MPM的名称。
除非在编译时选择不同的MPM(例如在Windows上默认使用mpm_winnt
),否则Apache将为每个操作系统使用默认的MPM。以下是操作系统及其默认MPM的列表:
beos
mpm_netware
mpmt_os2
prefork
(更新适用于Apache版本≥2.4:根据平台能力,使用prefork
、worker
或event
)mpm_winnt
要检查编译到服务器中的模块,请使用命令行选项-l
(此处是文档)。例如,在Windows安装上,您可能会得到以下内容:
> httpd -l
Compiled in modules:
core.c
mod_win32.c
mpm_winnt.c
http_core.c
mod_so.c
core
- 始终可用的Apache HTTP Server核心功能mpm_common
- 由多个多处理模块(MPM)实现的指令集合beos
- 这个多处理模块针对BeOS进行了优化。event
- 标准工作进程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,因此单个请求的问题不会影响其他请求。请注意,保留了HTML标签。
worker
MPM实现了一个混合的多进程多线程服务器,性能更好,因此应该优先使用,除非使用其他包含非线程安全库的模块(也请参见这个讨论或这个在Serverfault上)。
对于CentOS 6.x和7.x(包括Amazon Linux),请使用:
sudo httpd -V
# 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
apache2ctl -l
apachectl -V
命令,并查看Server MPM
旁边的输出。您还可以使用ps aux
命令,并查找httpd
或httpd.worker
。 - reflexivapache2ctl -l
不起作用;必须使用 apachectl -l
。 - Vacilandohttpd -V
命令将会返回类似以下内容:Server MPM: worker
。 - runamok在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"
/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有两种MPM(多处理模块):
1:Prefork 2:Worker
默认情况下,Apacke以预派生的模式进行配置,即非线程化的预派生Web服务器。这意味着每个Apache子进程包含单个线程并一次处理一个请求。因此,它消耗更多资源。
Apache还有worker MPM,它将Apache转换为多进程、多线程的Web服务器。Worker MPM使用多个带有多个线程的子进程。
..
.. 启动服务器数量 8
.. 最小空闲服务器数量 20
.. 最大空闲服务器数量 40
.. 最大请求工作进程数量 200
.. 每个子进程最大连接数 4500
..
使用apachectl -t进行语法检查或apachectl configtest
如果你想在worker或event中进行相同的更改,则:-
/etc/apache2/mods-available/mpm_event.conf
在不同的模块中进行更改后,您需要切换模块。 如果您正在使用事件模块并希望更改为Prefork模块:-https://www.youtube.com/watch?v=8V4TFgFvurU&list=PL5gKsZrSyQQIBNOTLGedvzlKLD9hKoTmS&index=10