您的位置:首页 > 运维架构 > Apache

apache常用的两种工作模式prefork和worker

2017-06-19 10:07 525 查看
成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。



apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多种,目前主要有两种模式:prefork模式和worker模式

prefork MPM

prefork是一个非线程型的、预派生的MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高,但内存使用比较大。

首次接触这句话,有个小问题,什么是MPM?

MPM(Multi -Processing Modules,多路处理模块)是Apache2.x中影响性能的最核心特性。是Apache 2.x才支持的一个可插入的并发模型,在编译的时候,我们只可以选择一个并发模型。

配置文件:/usr/local/apache2/conf/extra/httpd-mpm.conf 如果apache是默认安装的可能配置在httpd.conf文件中。根据实际情况查找配置。

我本地的配置是这样的,打开httpd.conf

484 # Server-pool management (MPM specific)
485 Include conf/extra/httpd-mpm.conf
486 Include conf/extra/httpd-php-fcgid56.conf
487
488 # Multi-language error messages


根据路径找到httpd-mpm.conf,并打开看一下:

<IfModule mpm_prefork_module>
StartServers            5
MinSpareServers         5
MaxSpareServers         10
MaxClients              150
MaxRequestsPerChild     0
</IfModule>


我们先看一下这些参数都代表什么意思:

–StartServer:服务器启动时一次建立的子进程数量

–MinSpareServers:设置空闲子进程的最小数量。如果当前空闲子进程数少于这个值,那么Apache会从一秒创建一个进程,第二秒继续创建两个…直到满足MinSpareServers设置的值为止。不需要设的太大。

–MaxSpareServers:设置空闲子进程的最大数量。如果空闲子进程数量超过MaxSpareServers,apache则会kill掉多余空闲子进程。

–MaxClients:设定apache同一时间处理的最大请求数量。任何超过MaxClients的请求都将进入等候对列。默认最大为256,要设置大于256时,必须同时设置ServerLimit(保持ServerLimit大于或等于MaxClient)。如果发现请求处理很慢但系统资源使用少,就需要调高这个参数。

–MaxRequestsPerChild:每个子进程最多处理的请求数量,到达这个值,子进程将会自动结束,这样可以避免内存泄漏。设为0则永远不结束。

–ServerLimit:用于限制MaxClient,最大值为20000,超过了就需要修改apache内核重新编译。注意此参数必须放在其他参数之前。

最重要的值是MaxClients允许足够多的工作进程,同时又不会导致服务器当机。

可通过查看httpd进程数:#ps -ef | grep httpd | wc -l,选择高峰期,结合当时服务器资源使用情况,来设置MaxClients。

worker MPM

worker是支持混合的多线程多进程的多路处理的MPM,使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只处理一个连接,内存使用较低,但一个线程崩溃,就会影响同一个进程下的所有线程。

<IfModule mpm_worker_module>
StartServers            2
MaxClients              150
MinSpareThreads         25
MaxSpareThreads         75
ThreadsPerChild         25
MaxRequestsPerChild     0
</IfModule>


我们先看一下这些参数都代表什么意思:

–StartServer:服务器启动时一次建立的子进程数量

–MaxClients:设定apache同一时间处理的最大请求数量,这里是指最大线程数量,大小仍受ServerLimit限制且必须是ThreadsPerChild的倍数。

–MinSpareThreads:设置最少的空闲线程数

–MaxSpareServers:设置最大的空闲线程数,必须大于等于MinSpareThreads加上ThreadsPerChild的和(因为每个子进程拥有的线程数是固定的)

–ThreadsPerChild:每个子进程建立的常驻线程,之后不会再创建新的线程。大小受ThreadLimit限制。

–MaxRequestsPerChild:每个子进程最多处理的请求数量,同prefork的一样

–ServerLimit:服务器允许配置的进程数上限,和ThreadLimit共同限制MaxClients(MaxClients <= ServerLimit * ThreadsPerChild)。

–ThreadLimit:TreadsPerChild可以配置的线程数上限,默认为64。

根据网友一些测试数据,实际情况下还是选prefork工作模式较好。

默认情况下,Linux下的Apache是prefork模式

切换成worker模式步骤如下:

prefork和worker模式的切换

1.将当前的prefork模式启动文件改名

mv httpd httpd.prefork


2.将worker模式的启动文件改名

mv httpd.worker httpd


3.修改Apache配置文件

vim /usr/local/apache2/conf/extra/httpd-mpm.conf


找到里边的如下一段,可适当修改负载等参数:

4.重新启动服务

/usr/local/apache2/bin/apachectl restart


即可换成worker方式启动apache2

处于稳定性和安全性考虑,不建议更换apache2的运行方式,使用系统默认prefork即可。另外很多PHP模块不能工作在worker模式下,例如redhat Linux自带的PHP也不能支持线程安全。所以最好不要切换工作模式。

总结:

区别来说,worker模式可以应对高流量,但是安全性不太好;prefork模式安全性比较好,但是性能会差一点,各位可以根据自己服务器的类别选取不同的模式,更好的使用apache。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息