有一个严重的问题。 我有虚拟服务器运行Apache和两个网站项目与大量的访问者(每秒大约5点)。 我的服务器开始自行closures。 在错误日志中,我发现这个问题
[error] server reached MaxClients setting, consider raising the MaxClients setting [notice] caught SIGTERM, shutting down
所以我寻找解决scheme来提高这些数字。 我发现这个数字是在apache confinguration中的两个部分。 同
/usr/sbin/httpd -l Compiled in modules: core.c prefork.c http_core.c mod_so.c
我发现我的服务器正在使用prefork。 所以我再次search适当的价值,并尝试这些
<IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 1024 MaxClients 1024 MaxRequestsPerChild 4000 </IfModule>
但即使使用这些值,服务器仍然closures。 任何人都可以指导我在哪里看,阅读什么,或者什么设置适当的稳定运行的服务器? 我会感谢任何帮助,伙计们。
服务器运行Linux CentOS 5.4
Thx beny
由于您的服务器正在运行prefork模式,这意味着每个连接都有自己的进程 – 所以首先检查系统上是否有1024个左右的httpd进程。
为了更好地处理你的服务器在做什么,你可能需要启用服务器状态页面。
LoadModule status_module modules / mod_status.so
ExtendedStatus On
<位置/服务器状态>
SetHandler服务器状态
命令否认,允许
全部否认
从.example.com允许
</位置>
这将允许您查看连接到您的服务器的状态,并试图找出是什么导致所有的连接消耗。
我的怀疑是某种stream氓代理或重写语句的可能性,导致服务器不断循环其内部连接,直到所有这些消耗完。
也许你的服务器KeepAlivefunction打开,疯狂高价值KeepAliveTimeOut?
这可能会产生一堆不活动的连接,等待太多时间closures,最终导致服务器崩溃。
检查你的Apacheconfiguration和/或虚拟主机定义。
中号
再次使用这个数字之前,可以做一些事情来降低Apache产生的进程数量。
启用keepalive并为其设置一个极低的超时值:
KeepAlive On MaxKeepAliveRequests 200 KeepAliveTimeout 5
来自同一个客户端的所有请求将通过一个到服务器的TCP连接来处理。 低的KeepAliveTimeout值意味着Apache会快速closuresKeepAlive连接,所以只要客户端没有超过5秒钟的通信暂停时间,客户端就可以在整个页面加载时只使用一个连接。
另外,将每个子项的最大请求量降低到1000. Apache进程在每次请求时都会随着内存的使用而增长,因此,降低最大请求量将最终降低给定数量的httpd进程的总体内存使用量。
最后,如前所述,您应该使用TOP或ps命令在最繁忙时间观察服务器。 找出有多lessapache进程正在产生,每个进程消耗多less内存。 然后,您可以根据服务器可用RAM和每个进程内存使用情况计算出适当的最大客户端数。
如果在这些调整之后继续看到问题,您可能需要考虑离开Apache的默认prefork模块,而不是使用worker mpm模块。 这将需要使用fastcgi或类似的东西来处理PHP的请求; 最终虽然这本身就是一个好主意。
咳嗽 nginx 咳嗽 ;)