AH00161:服务器达到 MaxRequestWorkers 设置,考虑提高 MaxRequestWorkers 设置

AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting

我有一个非常繁忙的服务器:PHP (Wordpress) 使用 W3TotalCache APC、Varnish for Apache 和 Cloudflare 来处理所有流量。 Ubuntu 14.04.4 LTS

只有一个网站,平均约 60k hits/day。

我时常收到这条消息,一天几次。与暂时的流量高峰无关,我们将时间与 Google 分析进行了比较。

Thu Apr 28 14:14:42.938075 2016] [mpm_prefork:error] [pid 19137] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting
[Thu Apr 28 15:43:25.594147 2016] [core:notice] [pid 19137] AH00051: child pid 19866 exit signal Segmentation fault (11), possible coredump in /etc/apache2
[Thu Apr 28 15:43:25.594313 2016] [core:notice] [pid 19137] AH00051: child pid 20386 exit signal Segmentation fault (11), possible coredump in /etc/apache2
[Thu Apr 28 15:43:25.594407 2016] [core:notice] [pid 19137] AH00051: child pid 19143 exit signal Segmentation fault (11), possible coredump in /etc/apache2
[Thu Apr 28 15:43:25.594498 2016] [core:notice] [pid 19137] AH00051: child pid 19144 exit signal Segmentation fault (11), possible coredump in /etc/apache2
[Thu Apr 28 15:43:25.594572 2016] [core:notice] [pid 19137] AH00051: child pid 20597 exit signal Segmentation fault (11), possible coredump in /etc/apache2
[Thu Apr 28 15:43:25.594642 2016] [core:notice] [pid 19137] AH00051: child pid 20395 exit signal Segmentation fault (11), possible coredump in /etc/apache2
[Thu Apr 28 15:43:25.594704 2016] [core:notice] [pid 19137] AH00051: child pid 20424 exit signal Segmentation fault (11), possible coredump in /etc/apache2
[Thu Apr 28 15:43:25.594785 2016] [core:notice] [pid 19137] AH00051: child pid 20598 exit signal Segmentation fault (11), possible coredump in /etc/apache2
[Thu Apr 28 15:43:25.594870 2016] [core:notice] [pid 19137] AH00051: child pid 19861 exit signal Segmentation fault (11), possible coredump in /etc/apache2
[Thu Apr 28 15:43:25.594957 2016] [core:notice] [pid 19137] AH00051: child pid 19782 exit signal Segmentation fault (11), possible coredump in /etc/apache2
....
....

所以我首先将 MaxRequestWorkers 增加到 100,然后是 500,现在是 1024。但仍在发生。

这是我现在的 apache2.conf。 代码:

<IfModule mpm_worker_module>
StartServers 256
MinSpareThreads 256
MaxSpareThreads 256
MaxClients 256
ServerLimit 256
ThreadLimit 256
ThreadsPerChild 256
MaxRequestWorkers 1024
MaxConnectionsPerChild 0
MaxRequestPerChild 1000
</IfModule>

有很多空闲 RAM,平均负载约为 0.5,有时超过 1。但从未见过高于 2 的。因此服务器似乎可以正常处理流量。

top - 16:07:47 up 3 days, 18:18,  2 users,  load average: 0.57, 0.46, 0.55
Tasks: 113 total,   1 running, 112 sleeping,   0 stopped,   0 zombie
%Cpu(s): 10.5 us,  2.0 sy,  0.0 ni, 87.4 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   8176816 total,  2372560 used,  5804256 free,   189684 buffers
KiB Swap:        0 total,        0 used,        0 free.  1286692 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                              
21930 www-data  20   0  337212  83308  60072 S  24.9  1.0   0:52.89 apache2                                                                                                                                              
21945 www-data  20   0  327640  72684  58816 S  24.3  0.9   0:48.37 apache2                                                                                                                                              
 1182 nobody    20   0  702868 442268  83496 S   0.7  5.4  42:41.32 varnishd

知道 Apache 中断的原因吗?

//j

基本上配置被覆盖了: /etc/apache2/mods-available/mpm_prefork.conf

我将新设置放入该文件中,Apache 现在似乎可以正常工作。

希望这对其他人有帮助,不要将您的配置直接放在 apache2.conf 或 httpd.conf 中。确保更改所有加载的配置文件。

您可能需要检查您的网络服务器访问日志。如果日志中充斥着 xml-rpc 个帖子(例如 "POST /xmlrpc.php HTTP/1.1" 200 403),您可能会成为 xml-rpc 攻击的目标。有多种方法可以防止它发生,但 Wordpress 很容易出现这种情况。

您修改了错误的文件。您的日志显示 "mpm_prefork" 错误。所以你需要修改 mpm_prefork.conf 而不是 mpm_worker.conf.

您还可以使用"apachectl -M" 来查看您使用的是什么模块。 例如我的apache2使用的是mpm_event_module,所以我需要修改mpm_event.conf

$ apache2ctl -M
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 **mpm_event_module (shared)**
 negotiation_module (shared)
 setenvif_module (shared)
 status_module (shared)
 wsgi_module (shared)

你应该编辑 mpm_prefork

<IfModule mpm_prefork_module>
      StartServers                     10
      MinSpareServers               10
      MaxSpareServers              20
      ServerLimit                      2000
      MaxRequestWorkers         1500
      MaxConnectionsPerChild    10000
</IfModule>

我也尝试在我的服务器上增加 MaxRequestWorkers,但没有看到任何效果。当我从命令行 运行 "httpd" 时,我意识到发生了什么,它给了我这个警告:

AH00180: WARNING: MaxRequestWorkers of 512 exceeds ServerLimit value of
 256 servers, decreasing MaxRequestWorkers to 256.
 To increase, please see the ServerLimit directive.

在您的配置中,ServerLimit 仍然是 256,因此 MaxRequestWorkers 也受此值限制。

就我而言,我找不到任何解决方案,所以我将在此处留下这个答案,以帮助遇到此问题的其他人。在我们的例子中,增加 MaxRequestWorkers 没有帮助。

我们有一台服务器至少可以正常工作一年。突然间,它开始出现连接 https 的问题。在 apache 错误日志中,我们发现了“Server reached MaxRequestWorkers”错误,但是流量很慢(30 - 40 个访问者活跃)。

在深入查看日志和一些研究后,我发现问题是 Slowloris DoS attack

这种攻击很容易缓解。你可以看看 this post.

在我的例子中,在响应速度较慢之后,首先我将 MaxRequestWorkers 从 150 增加到 500。但是在 apache error.log 中的警告,我意识到我也应该增加 ServerLimit因为它的默认值是256。此外,我在mpm_prefork.conf中没有找到ServerLimit 256,所以我在其中添加了ServerLimit 512作为新行,问题就解决了。