Apache的三种工作模式分别是:prefork、worker、event。

1. prefork模式(默认模式)

profork模式实现了一种非线程、预派生的Web服务器,用的是进程去处理请求,所以比较容易消耗内存,但是稳定性好,某个进程出现问题不会影响到其他请求。

2. worker模式

worker模式使用多个子进程,每个子进程有多个线程、由于使用的是线程去处理请求,消耗内存小,适合高流量的请求,但是如果某个进程出现问题,那么这个进程下的线程都会出现问题,即稳定性不是很好。

3. event模式

event模式为了解决keep-alive保持长连接出现的一种工作模式,使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等到超时才会被释放,所以这个时候就出现了event的工作模式。

prefork与worker模式比较

  1. prefork模式使用多个子进程,每个子进程只有一个线程,每个进程在某个确定的时间只能维持一个连接;
  2. worker模式使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接,适用于高流量的HTTP服务器上;

总的来说,prefork方式速度要稍高于worker,但是prefork所需要的CPU和Memory资源也稍高于worker。

如何配置模块?

以下主要介绍prefork模式和worker模式

一、prefork模式

1. 编译安装时指定工作模式:

./configure \
--prefix=/usr/local/httpd \
--enable-deflate \
--with-mpm=prefork \ #选用prefork模式
--enable-expires \
--enable-so \
--enable-rewrite \
--enable-charset-lite \
--enable-cgi

2. 使用httpd -l命令查看当前工作模式

[root@localhost ~]# httpd -l

Compiled in modules:
core.c
mod_so.c
http_core.c
prefork.c #代表当前为prefork模式

3. 使用lsof命令可以查看Apache进程的运行情况

[root@localhost ~]# lsof -i:80

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 31239 root 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31240 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31241 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31242 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31243 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31244 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31491 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31508 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31511 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31543 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)

解释如下:有1个root用户运行的主进程,10个daemon用户运行的子进程。这里使用了prefork模式,采用了预派发的方式,10个子进程就是服务器启动时预先创建的,当有用户请求时,将直接使用已经创建好的子进程进行处理,可以减少创建子进程的时间,增加响应速度,预先创建多少个子进程由prefork的参数进行设置。

4. 启动prefork模块,并配置其参数

vim /etc/httpd.conf

Apache三种工作模式_第1张图片

#切换到软件目录下
cd /usr/local/httpd/conf/extra/

#编辑配置文件
vim httpd-mpm.conf

Apache三种工作模式_第2张图片

prefork参数说明:

  • ServerLimit:最大进程数
  • StartServers:启动的时候创建的进程数量
  • MinSpareServers:最少空闲进程
  • MaxSpareServers:最多空闲进程
  • MaxClients:最多创建多少个子进程用来处理请求
  • MaxRequestsPerChild:每个进程处理的最大请求数,如果达到请求数,进程即被销毁,如果设置为0,子进程永远呢不会结束

5. 再次使用lsof命令可以查看Apache进程的运行情况

[root@localhost extra]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 31588 root 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31589 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31590 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31591 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31592 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31593 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31594 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31595 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31596 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31597 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31598 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31599 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31600 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31601 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31602 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31603 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31604 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31605 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31606 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31607 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31608 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)

这样启动Apache服务器时便创建了20个进程,说明配置成功了。

二、worker模式

1. 编译安装时指定工作模式:

./configure \
--prefix=/usr/local/httpd \
--enable-deflate \
--with-mpm=worker \ #worker工作模式
--enable-expires \
--enable-so \
--enable-rewrite \
--enable-charset-lite \
--enable-cgi

2. 使用httpd -l命令查看当前工作模式

[root@localhost httpd-2.4.2]# httpd -l

Compiled in modules:
core.c
mod_so.c
http_core.c
worker.c #代表当前为worker模式

3. 启动worker模块,并配置其参数

vim /etc/httpd.conf

Apache三种工作模式_第3张图片

#切换到软件目录下
cd /usr/local/httpd/conf/extra/

#编辑配置文件
vim httpd-mpm.conf

Apache三种工作模式_第4张图片

4. 使用lsof命令可以查看Apache进程的运行情况

 [root@localhost httpd-2.4.2]# lsof -i :80

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 47560 root 3u IPv4 50706 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 47561 daemon 3u IPv4 50706 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 47562 daemon 3u IPv4 50706 0t0 TCP localhost.localdomain:http (LISTEN)

worker参数说明:

  • ServerLimit:最大进程数
  • ThreadLimit:每个子进程的最大线程数
  • StartServers:服务器启动时建立的子进程数
  • MaxClients:允许同时接受的最大接入请求数量
  • MinSpareThreads:最小空闲线程数
  • MaxSpareThreads:最大空闲线程数
  • ThreadsPerChild:每个子进程建立的常驻线程数
  • MaxRequestsChild:设置每个子进程在其生存期内允许服务的最大请求数,设置为0,子进程将永远不会结束

具体参数调优这需要对服务器进行负载压力测试后才能确保服务器稳定的基础上实现最高的性能。

常用的性能测试工具有以下几种:ab、http_load、webbench、siege。ab是Apache自带的压力测试工具,非常实用,可以模拟多线程并发请求,测试服务器的负载压力。

在性能调整优化过程中,优化前先使用ab进行压力测试,优化后再进行压力了测试,对比两次测试的结果,看优化效果是否明显,再决定是否启用优化方案。