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.