三种模式

prefork(2.4前默认)/worker/event(2.4默认)

 

配置建议

在Linux下,一般采用的MPM是perfork模式,给大家一个合理的建议配置,对在部分网站,中型网站,配置:

<IfModule mpm_prefork_module>
 StartServers         5        //预先起5个进程
 MinSpareServers      5       //最小空闲进程
 MaxSpareServers      10      //最大空闲进程
 ServerLimit          1500     // 控制apache的进程总数
 MaxClients           1000      //并发连接数
 MaxRequestsPerChild  4000      //未防止内存泄露,需设置非零
</IfModule>

如果你的网站pv值百万,可以这样设置:

ServerLimit          2500     // 用于修改apache编程参数
MaxClients          2000      //并发连接数

******实操中可参考此建议配置,如果对其中参数感兴趣,可以继续往下看******

 

查看当前模式

查看当前服务器使用的是哪一种模式,可通过httpd -l 或者 httpd -V进行查看,如果有 prefork.c,则表示为 prefork模式,同理,如果有 worker.c,则为worker模式,如果有 event.c,则为 event.

其中event模式可以说是 worker的升级版本,解决了worker模式中keep-alive场景下,长期占用线程的资源浪费问题(某些线程因为被keep-alive,空挂在那等待,中间几乎没有请求过来,甚至等到超时)

 

prefork模式

效率比较高,但要比 worker使用内存更大,这个多路处理模块(MPM)实现了一个非线程型的,预派生的web服务器,工作类似于 apache1.3。它适用于没有线程安全库,需要避免线程兼容性问题的系统.prefork模式下每个请求互相独立,这样一个请求出现问题就不会影响到其他请求。
prefork模式具有很强的自我调节能力,只需要很少的配置指定调整。最重要的是将 MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时,又不能太大,以避免需要使用的内存超过物理内存的大小

配置文件:httpd.conf

<IfModule prefork.c>ServerLimit 256
StartServers 5
MinSpareServers 10
MaxSpareServers 15
MaxClients 256
MaxRequestsPerChild 4000</IfModule>

 

StartServers 5             #指定服务器在启动时建立的子进程数量,默认为 5
MinSpareServers 5    #指定空闲子进程的最小数量,默认为5,假如当前空闲子进程数少于MinSpareServers,那么apache将以最大每秒一个速度产生新的子进程。此参数不宜过大
举个例子就明白了:

apache在没有用户访问时候有5个闲置的进程,如果有一个用户访问网站。则闲置的进程就只有4个,这个值小于MinSpareServers,所以apache就以第一秒1个进程,第二秒2个进程,第三秒4个进程的速度新建空闲进程,即2的N次方产

MaxSpareServers 20     #配置空闲子进程的最大数量,默认为20,假如当前有超过 MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数不宜过大
例如:

apache在没有用户访问时候有5个闲置的进程,如果有5个用户同时访问网站。则闲置的进程就只有0个,这个值小于MinSpareServers,所以apache就以第一秒1个进程,第二秒2个进程,第三秒4个进程的速度新建空闲进程。
直到大于等于MinSpareServers个空闲进程才结束。在这个例子中直到第三秒,一共生成1+2+4个进程才能满足大于等于MinSpareServers的要求。后来这5个用户访问完apache,访问结束,关闭浏览器。
所以apache就有了5+7个空闲的进程。这时空闲的进程比较多,apache就开始关闭一些进程,直到满足小于MaxSpareServers个空闲进程才结束。如果该值小于MinSpareServers则apache默认将该值设置成MinSpareServers+1。

ServerLimit

这个参数是控制apache的进程总数的,那为什么会有两个参数控制apache的进程总数呢?这个参数在apache1的时代是没有的,因为那个时候有个256M内存的服务器就很厉害了。后来apache2的时代到来,服务器的硬件也得到升级。很多服务器都是4G内存,还有很多比4G内存大的服务器出现。apache1的时代只有一个MaxClients参数控制进程总数就够了,而这个参数最大值是256,定死了。但是到了apache2的时代必须调整ServerLimit值大于256才能使MaxClient支持大于256的值。

MaxClients

apache最大的进程数。apache1的时代只有一个MaxClients参数控制进程总数就够了,而这个参数最大值是256定死了。但是到了apache2的时代必须调整ServerLimit值大于256才能使MaxClient支持大于256的值。

MaxRequestsPerChild

例如:

apache在没有用户访问的时候有5个空闲进程。当一个用户访问网站,访问完又离开。则apache的第一个进程就处理了一个请求,从新进入闲置状态。再有一个用户访问网站,访问完后离开。则apache的第一个进程就处理了1+1个请求。
这样继续访问3998个用户,这个进程就处理了4000个请求,之后就自动关闭这个进程。这个时候apache就只有4个限制的进程,小于MinSpareServers值所以apache从今建立一个空闲进程。

至于为什么处理完4000个请求就要关闭这个进程呢?

答案之一:为了防止内存的泄露。

设置为大于0有好处:
1.能防止内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

调整

通过 ps -ef | grep httpd | wc -l 可以了解当前系统中 apache进程数,从而可以根据实际情况修改以上参数

配置文件中:
KeepAlive On/Off
指保持连接活跃,类似于mysql永久连接。如果设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。

KeepAliveTimeOut number
如果第二次和第一次请求间隙时间超过了这个值,第一次连接就会中断,再新建第二个连接。一般设置了10秒可以了MaxKeepAliveRequests 100一次连接可以进行的HTTP请求的最大次数。将其值设置为0,将支持一次连接内进行无限次的传输请求。事实上,没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成了连接了

原文地址:http://httpd.apache.org/docs/2.4/mod/prefork.html                                    

Logo

更多推荐