apache 关闭,因为 MaxClients 已达到

apache 关闭,因为 MaxClients 已达到

有一个严重的问题。我有一个运行 Apache 的虚拟服务器和两个有大量访问者(每秒约 5 次点击)的 Web 项目。我的服务器开始自行关闭。在错误日志中我发现了这个问题

[error] server reached MaxClients setting, consider raising the MaxClients setting
[notice] caught SIGTERM, shutting down

所以我寻找解决方案来提高这些数字。我发现这个数字在 Apache 配置中的两个部分中。使用

/usr/sbin/httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c

我发现我的服务器正在使用 prefork。所以我再次搜索合适的值并尝试了这些

<IfModule prefork.c>
    StartServers       8
    MinSpareServers    5
    MaxSpareServers   20
    ServerLimit     1024
    MaxClients      1024
    MaxRequestsPerChild  4000
</IfModule>

但即使使用这些值,服务器仍然会关闭。有人能指导我去哪里查看、阅读什么或设置什么才能使服务器正常稳定运行吗?我将不胜感激大家的帮助。

服务器运行Linux CentOS 5.4

谢谢贝尼

答案1

由于您的服务器正在运行 prefork 模式,这意味着每个连接都有自己的进程 - 因此首先检查系统上是否有 1024 个左右的 httpd 进程在运行。

为了更好地了解服务器正在做什么,您可能需要启用服务器状态页面。

加载模块 status_module 模块/mod_status.so

扩展状态开启

<位置 /服务器状态>
    SetHandler 服务器状态
    命令拒绝、允许
    全部拒绝
    允许来自 .example.com
</位置>

然后,您就可以查看服务器的连接状态,并尝试找出导致所有连接被消耗的原因。

我怀疑可能存在某种恶意代理或重写语句,导致服务器不断地在其自身内循环连接,直到所有连接都被消耗为止。

答案2

也许您的服务器已打开 KeepAlive 功能并且 KeepAliveTimeOut 的值非常高?

这可能会导致大量不活动的连接等待太长时间才能关闭,最终导致服务器崩溃。

检查您的 apache 配置和/或虚拟主机定义。

答案3

在再次增加该数量之前,您可以做一些事情来降低 Apache 产生的进程数量。

启用 keepalive 并为其设置一个极低的超时时间:

KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 5

来自同一客户端的所有请求都将通过与服务器的单个 TCP 连接进行处理。较低的 KeepAliveTimeout 值意味着 Apache 将快速终止 KeepAlive 连接,因此只要客户端的通信暂停时间不超过 5 秒,客户端就可以在整个页面加载过程中仅使用单个连接。

另外,将每个子进程的最大请求数降低到 1000 左右。Apache 进程的内存使用量通常会随着每个请求而增加,因此降低最大请求数最终会降低一定数量的 httpd 进程的总体内存使用量。

最后,如前所述,您应该使用 TOP 或 ps 命令在服务器最繁忙时观察服务器。找出正在生成的 apache 进程数以及每个进程消耗的内存量。然后,您可以根据服务器可用内存和每个进程的内存使用情况计算适当的最大客户端数。

如果在进行这些调整后仍然遇到问题,您可能需要考虑放弃 Apache 的默认 prefork 模块,而改用 worker mpm 模块。这将需要使用 fastcgi 或类似的东西来处理 php 请求;但最终这本身就是一个好主意。

咳嗽nginx咳嗽;)

相关内容