PHP笔记网

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2013-08-07 14:40:12  修改时间:2024-12-14 07:54:40  分类:Apache/Nginx  编辑

Apache两种常用工作模式:prefork和worker。

prefork MPM

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

可通过了解prefork的配置认识prefork,配置位置:apache/conf/extra/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,使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只处理一个连接,内存使用较低,但一个线程崩溃,就会影响同一个进程下的所有线程。

同样通过配置认识worker

<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

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

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

4.重新启动服务

/usr/local/apache2/bin/apachectl restart

即可换成worker方式启动apache2

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

 

网友评论:

for redhat
在 /etc/sysconfig/httpd 打开 #HTTPD=/usr/sbin/httpd.worker 的注释

请教 .mpm_worker +mod_php 有在用到生产么?

worker mpm一般不会跟mod_php搭配,worker mpm一般都是跟apache的mod_fcgid 搭配,然后PHP要安装php-cgi 来跑PHP的。

 


 

海哥CentOS博客的LAMP一键安装包写到:

++++++++++++++++++++++++++++++++++++++++++++++++
echo "select the mpm of apache"
echo "1) prefork (Recommend)"
echo "2) worker (Multi-threaded)"
echo "3) event (Multi-threaded,not support ssl.)"
++++++++++++++++++++++++++++++++++++++++++++++++

 

 

延伸阅读:

Apache prefork 模块指令分析