apache三种工作模式: prefork(2.4前默认)/worker/event(2.4默认)
内容整理来自以下网站
http://m.blog.csdn.net/article/details?id=40738507
http://blog.chinaunix.net/uid-20773865-id-113915.html

查看是哪一个模式,可通过
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。它适用于没有线程安全库,
需要避免线程兼容性问题的系统.它要求将每个请求互相独立的情况下最好的MPM,这样一个请求出现问题就不会影响到其他请求。
这个MPM具有很强的自我调节能力,只需要很少的配置指定调整。最重要的是将 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次方产生个数,最大为32个,直到大于等于MinSpareServers个空闲进程才结束。

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,将支持一次
连接内进行无限次的传输请求。事实上,没有客户程序在一次连接中请求太多的页面,
通常达不到这个上限就完成了连接了

worker模式:(支持混合的多线程多进程的多路处理模块)
使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,
一个高流量的HTTP服务器上,worker MPM是个比较好的选择,因为worker MPM的内存使用比Prefork MPM要低得多。
但是worker MPM也有缺点,如,一个线程崩溃了,整个进程就会连同其任何线程一起“挂了”,
由于线程是共享内存空间,所以一个程式在运行时必须被系统识别为“每个线程是安全的”

Worker的工作原理及配置
worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,
而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,
以获得基于进程服务器的稳定性。

如下为缺省的worker配置段:
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

Worker的工作原理:
由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,
各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads
设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。
如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。

Worker conf指令分析:
StartServers
服务器启动时建立的子进程数
MaxClients
允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候队列。
默认值是”400″,16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加ServerLimit的值
MaxSpareThreads
设置最大空闲线程数。默认值是”250″。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。
ThreadsPerChild
每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。
MaxRequestsPerChild
设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。
如果MaxRequestsPerChild为”0″,子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:
可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
4.ServerLimit指令解释:

对于preforkMPM,这个指令设置了MaxClients最大允许配置的数值。
对于workerMPM,这个指令和ThreadLimit结合使用设置了MaxClients最大允许配置的数值。

对于preforkMPM,只有在你需要将MaxClients设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients一样。
对于workerMPM,只有在你需要将MaxClients和ThreadsPerChild设置成需要超过默认值16个子进程的时候才需要使用这个指令。
不要将该指令的值设置的比MaxClients 和ThreadsPerChild需要的子进程数量高。如果显式声明了ServerLimit,
那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,
否则Apache将会自动调节到一个相应值(可能是个非期望值)。
注意:
Apache在编译时内部有一个硬限制"ServerLimit 20000"(对于preforkMPM为"ServerLimit 200000")。你不能超越这个限制。

Maxclient指令解释:

对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请求的最大子进程数量,默认值是256。
要增大这个值,你必须同时增大ServerLimit 。

对于线程型或者混合型的MPM(也就是beos或worker),MaxClients表示可以用于伺服客户端请求的最大线程数量。
线程型的beos的默认值是50。对于混合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。
因此要将MaxClients增加到超过16个进程才能提供的时候,你必须同时增加ServerLimit的值。

Apache是基于模块化的设计,而Apache 2.0更扩展了模块化设计到Web服务器的最基本功能。
服务器装载了一种多道处理模块,负责绑定本机网络端口、接受请求,并调度子进程来处理请求
在用户级,MPM看起来和其它Apache模块非常类似。主要区别是在任意时刻只能有一种MPM被装载到服务器中
指定MPM的方法:
#./configure --help|grep mpm
--with-mpm=MPM Choose the process model for Apache to use.
MPM={beos|event|worker|prefork|mpmt_os2| perchild|leader|threadpool}

apache配置安装参数
./configure --prefix=/usr/local/apache2
--enable-rewrite --enable-so --enable-headers
--enable-expires --with-mpm=worker
--enable-modules=most --enable-deflate

--prefix=/usr/local/apache2表示指定apache的安装路径,默认安装路径为/usr/local/apache2

--enable-rewrite提供URL规则的重写

--enable-so激活apache服务的DSO(Dynamic Shared Objects动态共享目标),即在以后可以以DSO的方式编译安装共享模块,这个模块本身不能以DSO方式编译。

--enable-headers提供允许对HTTP请求头的控制。

--enable-expires激活通过配置文件控制HTTP的“Expires:”和“Cache-Control:”头内容,即对网站图片、js、css等内容,提供客户端浏览器缓存的设置。这个是apache调优的一个重要选项之一。

--with-mpm=worker选择apache mpm的模式为worker模式。为worker模式原理是更多的使用线程来处理请求,所以可以处理更多的并发请求。而系统 资源的开销小玉基于进程的MPM prefork。如果不指定此参数,默认的模式是prefork进程模式。也可以指定 event模式.这个是apache调优的一个重要选项之一。

--enable-deflate提供对内容的压缩传输编码支持,一般是html、js、css等内容的站点。使用此参数会打打提高传输速度,提升访问者访问的体验。在生产环境中,这是apache调优的一个重要选项之一

event模式是worker升级版本

05-11 19:40