apache-2.2 – Apache产生了大量的httpd进程
我正在运行CentOS 6.7机器(16 GB vRAM,8个vCPU),带有简单的Web服务器设置(Apache / 2.2.15, PHP / 5.3.3,MySQL / 5.1.66),托管一个中等数量的在线商店页面展示次数(每天约2,000~4,000).服务器在过去3年中运行平稳,无需更改其配置.现在,从上周开始 – 不知何故一夜之间 – 在短时间内(约30分钟),Apache / HTTP反复出现无法访问.我检查了一些参数,发现有很多httpd进程正在运行. ps axf | grep httpd | wc显示如下:
387 2344 18354
而负载不是很令人兴奋. top看起来像这样:
只有极少数的httpd进程会不时发布,但总数几乎不断增加.如果我运行服务httpd reload,进程数会回落到0并在接下来的几分钟到几小时内再次开始增加.过了一会儿,Apache的日志告诉我:
[error] server reached MaxClients setting, consider raising the MaxClients setting
我做了这个,我也调整了不同的进一步配置参数,但它没有帮助.无论MaxClients和ServerLimit设置为什么值,Apache都不会停止生成新的httpd进程达到这些限制.在此之后,该网站不再可访问.
根据AWStats,页面点击率没有增加.此外,PHP应用程序中没有任何变化.除了在30分钟后阻止所有请求的故障,网站像往常一样快速执行.作为一个肮脏的临时解决方案,Cron每半小时不断重新加载Apache.
在过去3年中,Prefork / Worker设置如下:
<IfModule prefork.c> StartServers 4 MinSpareServers 5 MaxSpareServers 10 ServerLimit 128 MaxClients 128 MaxRequestsPerChild 600 </IfModule> <IfModule worker.c> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
我把他们提升到:
<IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 10 ServerLimit 640 MaxClients 640 MaxRequestsPerChild 1000 </IfModule> <IfModule worker.c> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
在此更改后,Apache / HTTP在大约1小时后变得不可用.
这怎么可能突然发生,我还有什么选择可以进一步调查这种奇怪行为的起源?
拳头,增加prefork参数只会恶化你的情况.因此,恢复以前的配置.要排除任何prefork问题/配置错误,请尝试禁用它.情况会发生重大变化吗?如果是这样,你会发现你的问题.
如果没有,问题与外部因素有关:例如,某些机器人/脚本可能针对您的网站,打开许多连接(使用相对的httpd进程).如果是这种情况,您应该能够从Apache日志文件中看到它.
如果这还不够,您可以启用mod_status模块以显示详细的统计信息.然后,发出apachectl fullstatus以访问这些统计信息.有关详细信息,请参见here和here.