httpd三种MPM模块比较

1、httpdlinux

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

    httpd支持许多特性,大部分特性都是经过编译模块实现,所以httpd是以核心加模块组成的方式工做。httpd的模块分两种,一种叫做动态可装载模块(DSO),另外一种叫做多道处理模块(MPM)。DSO动态可装模块每一个模块对应httpd的某项功能,也就是咱们普遍意义上理解的功能模块。可是,MPM多道处理模块和DSO不同,它并非指一种模块,它表明的是httpd的一种工做特性,经常使用的MPM有,prefork、worker、event。apache


2、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。ide

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

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



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


3、httpd的MPM模块的相关说明开放源代码


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

wKioL1Mu77Czx7GqAAB6PmOhOkc086.jpg


二、在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


三、咱们能够看到上面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服务器的访问量并非一成不变的,因此有的时候咱们可能须要修改相关参数来应对各类访问量,熟悉各个模块的特性及参数配置是颇有必要的!

相关文章
相关标签/搜索