一、httpd

    httpd是由apache软件基金会开发的一款著名的web服务器软件。由于其开放源代码,并且拥有跨平台、功能强大、安全稳定等特性,而被广泛使用。早期httpd是在修修补补的基础上成长起来的,所以早期也叫作a pachey server,由于开发httpd的组织叫作apache,因此httpd也被称作apache。httpd有三个长线维护版本,分别是httpd2.0、httpd2.2和httpd2.4。使用最为广泛的还是2.2和2.4的版本,虽然两个版本看起来数字相差不大,但是这两个版本改变还是挺大。

    httpd支持许多特性,大部分特性都是通过编译模块实现,因此httpd是以核心加模块组成的方式工作。httpd的模块分两种,一种叫作动态可装载模块(DSO),另一种叫作多道处理模块(MPM)。DSO动态可装模块每个模块对应httpd的某项功能,也就是我们广泛意义上理解的功能模块。但是,MPM多道处理模块和DSO不一样,它并不是指一种模块,它代表的是httpd的一种工作特性,常用的MPM有,prefork、worker、event。


二、httpd中prefork、worker、event比较

    首先,我们知道httpd是一个web服务器,基于http协议工作。httpd的工作原理用一句话描述你可以理解为,客户端经过TCP/IP的三次握手与服务器端建立连接后,向服务器端的httpd发起一次通话,httpd此时调用一个进程去响应工作,进程取得结果后httpd在结果上包装一个http响应首部,然后把结果返回给客户端,连接断开,通话结束。

    客户端发起一次通话,服务器端就得生成一个进程响应,客户端发起一百个通话,服务器端就得生成一百个进程,一个进程如果占用的资源1M,一百个进程就须100M。这中间进程在CPU上执行时,CPU要负责进程之间的切换,多次切换平白的消耗CPU的执行时间,每个进程对数据的I/O操作并不可能是一次就能完成,一次不能完成工作时,进程就得等待结果,于是进程之间就会产生进程阻塞。进程的这一系列工作下来,可以想象一个进程对应一个客户端通信,效率并不是很高,在httpd中,这种工作模式,我们叫作prerork。

    那么如果我们想提高一下效率,让每个进程不是处理一条响应而是处理多个响应。于是之前我们需要100个进程完成的工作,现在变成50个了,这样下来,明显资源占用更小了,工作效率也提高了。像这样的工作模式,在httpd中,我们叫作worker。

    在httpd中,为了更大的提高效率,我们不光可以像worker这样让一个进程产生多个线程,每个线程处理一条客户端响应,还有一种更高效的工作模式是,一个进程产生多个线程,每个线程处理多个客户端响应。像这样的,在httpd中的工作模式,我们叫作event。

    httpd的三种MPM模式,prerork、worker、event,三种模式可以看出,event模式的工作效率是最高的,但效率高换来的结果是,只要一条进程的通信出现了故障,进程僵死,那么出现的结果将是,那条进程对应的下面多个客户端通信集体崩溃。从理论上看,prerork和worker比效,worker的效率要比prerork要高,但实际应用时,在linux操作系统中,httpd的prerork和worker是不分上下的,所以在选择httpd的MPM模块时,应结合自身的实际情况进行选择。



prefork(默认)workerevent
工作特性一个进程响应一个请求一个进程产生多个线程,一个线程响应一个请求一个进程产生多个线程,一个线程响应多个请求
版本支持httpd2.2、httpd2.4httpd2.2httpd2.4httpd2.4


三、httpd的MPM模块的相关说明


1、在httpd查中看MPM,可以使用httpd -l命令可以查看httpd当前加载的MPM模块。

wKioL1Mu77Czx7GqAAB6PmOhOkc086.jpg


2、在httpd2.2中修改/etc/sysconfig/httpd配置文件可以改变当前服务器所使用的模块。在编译安装httpd2.4时,构建MPM模块,通常有两种选择,一种是把MPM编译成静态模块,还有一种是把MPM编译成动态模块。如果把MPM编译成了静态模块,那么要改变MPM,只能通过重新编译安装httpd修改。如果在编译安装httpd时,把MPM编译成了动态模块,那么改变MPM,可以在/etc/httpd/httpd.conf配置文件中编辑LoadModule指令选择不同的MPM重新载入即可。


例如,当前我们在Centos6.4操作系统中使用yum源安装的httpd2.2,我们把默认的prefork模块修改成worker模块的操作如下。

(1)、通过使用httpd -l命令我们知道当前的MPM模块是prefork,使用 ps aux 查看httpd进程。

wKioL1Mu8v7xCgMRAAJUB9pfudQ087.jpg


(2)、编辑/etc/sysconfig/httpd文件,修改当前MPM模块。

wKiom1Mu8-ewp-7lAAIeRh6vceU975.jpg


(3)、重新启动httpd服务,使用 ps aux 命令查看当前进程,可以看到修改已经生效了。

wKioL1Mu9COQ5_gxAAGkiz-z7vM724.jpg


3、我们可以看到上面prefork的进程数明显比worker的进程数要多,这些进程的数量是可以在配置文件中设置的。在httpd2.4中MPM模块的配置文件为/etc/httpd/extra/httpd-mpm.conf。httpd2.2只支持prefork和worker模块,所以在其配置文件/etc/httpd/conf/httpd.conf中,我们可以看到以下两项。

wKiom1Mu9ZXSuby0AACILUMAlgE306.jpgwKiom1Mu9Z-CU5LeAACIa7yBV2M354.jpg


<IFModule></IFModule>这个标签表示的是,如果加载了指定的那个模块,则标签内定义的参数生效。

httpd2.2中prefork和worker各参数说明如下:

<IfModule prefork.c>  如果prefork.c模块存在,则定义在标签内的参数有效
    StartServers:     服务开启时默认启动的工作进程数,不包括主进程
    MinSpareServers:  最少空闲进程数;
    MaxSpareServers:  最大空闲进程数;
    ServerLimit:      最大活动进程数;
    MaxClients:       并发请求的最大数,一条进程最多能处理多少个请求
    MaxRequestsPerClient: 每个子进程在生命周期内所能够服务的最多请求个数
</IfModule>


<IfModule worker.c>  如果worker.c模块存在,则定义在标签内的参数有效
    StartServers:   服务器开启时,启动的子进程的个数
    MaxClients:      并发请求的最大数;
    MinSpareThreads:最小空闲线程数;
    MaxSpareThreads:最大空闲线程数;
    ThreadsPerChild:每个子进程可生成的线程数;
    MaxRequestsPerChild:每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定;
</IfModule>



httpd2.4中event参数说明如下:

<IfModule mpm_event_module>
    StartServers             默认进程数
    MinSpareThreads          最小空闲线程数
    MaxSpareThreads          最大空闲线程数
    ThreadsPerChild          每个子进程可以生成的线程数
    MaxRequestWorkers        最大线程数量
    MaxConnectionsPerChild   子进程的最大连接数,当达到设置值以后,APACHE就会结束当前的子进程
</IfModule>


结语:httpd的MPM模块通常用来应对各种生产环境的情况,在生产环境中web服务器的访问量并不是一成不变的,所以有的时候我们可能需要修改相关参数来应对各种访问量,熟悉各个模块的特性及参数配置是很有必要的!