当前位置: > Linux服务器 > apache >

apache prefork模式切换为worker模式的方法详解

时间:2014-08-12 22:32来源:linux.it.net.cn 作者:it

apache默认安装的模式是prefork。

服务器流量不大却经常因为apache吃满内存而当机,在升级完linux核心,并加上防火墙后发现不是程序或是恶意攻击造成,而是因为debian在默认安装apache使用的是prefork模式。

先分析下prefork的工作原理。

一个典型的prefork配置:
 

复制代码代码示例:
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>

其中StartServers设置为5,意味着当apache服务开启时就启动5个进程。MinSpareServers则开启后需要备用的进程数,这里是5。
Max就是最大可以备用的进程数,这里是10。
当现有的进程数大于这个值并且处于sleeping状态时系统会自动进行回收,直到变为Min的值。
MaxClients是允许用户最大的并发数,默认最高为256,需要超过时在头上加一条:
ServerLimit

MaxClients数值不能超过ServerLimit。
其实这个ServerLimit就是prefork模式的瓶颈所在了,当这个值调整到1500以上时每当到达网站流量高峰时就会发现apache进程数量持续在一个很高的值上面,一旦硬件满足不了这个要求的时 候就会出现网站无法访问或是速度很慢的情况。

虽然说可以写一份shell定时查看apache所占用的进程数,发现内存吃紧时就自动restart ,但这毕竟是下下策,在apache已经升级到2.2时其实可以考虑使用采用进程和线程混用的 worker模式来获得更好的性能,减少对硬件的消耗。

切换到mpm-worker模式

原本这应该是相当简单的事情,直接在Ubuntu里输入:
 

复制代码代码示例:
#apt-get install apache2-mpm-worker

但事实上如果这么执行就会导致php无法工作。一旦你再次安装php就让默认重新改变回prefork模式

在Google之后找到一个比较好的方法,就是使用fcgid模块来启用php。

具体操作

首先,安装模块:
 

复制代码代码示例:
#apt-get install libapache2-mod-fcgid

找到模块的设置文件,其位置在 /etc/apache2/mods-avaliable/fcgid.conf,修改为:
 

复制代码代码示例:
<IfModule mod_fcgid.c>
AddHandler fcgid-script .php .py .pl .fcgi
SocketPath /var/lib/apache2/fcgid/sock
IPCConnectTimeout 20
</IfModule>
 

这样即可识别这些后缀的文件。

然后,安装php5-cgi:
 

复制代码代码示例:
#apt-get install php5-cgi

再修改apache的全局设置文件,/etc/apache2/apache2.conf:
 

复制代码代码示例:
<Directory />
FCGIWrapper /usr/bin/php5-cgi .php
Options ExecCGI SymLinksIfOwnerMatch
</Directory>
 

最后安装worker模块:
 

复制代码代码示例:
#apt-get install apache2-mpm-worker

debian会自动删除原来的php5-gd,php5-mysql,再重新装一次即可。
注意:
这样操作后,原先的php.ini文件位置就改成到/etc/php5/cgi中了。

到这里apache就安全过渡到work模式了,从此apache就能提供海量的线程服务了。

希望以上的介绍,对大家有所帮助。

(责任编辑:IT)
------分隔线----------------------------