我有一个非常繁忙的服务器:PHP (Wordpress) 使用 W3TotalCache APC、Varnish for Apache 和 Cloudflare 来处理所有流量。 Ubuntu 14.04.4 LTS
只有一个网站,平均每天点击量约为 6 万次。
我不时收到此消息,一天几次。与暂时的流量高峰无关,我们将时间与 Google Analytics 进行了比较。
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
你应该编辑
mpm_prefork
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 20
ServerLimit 2000
MaxRequestWorkers 1500
MaxConnectionsPerChild 10000
</IfModule>
基本上配置被覆盖了: /etc/apache2/mods-available/mpm_prefork.conf
我将新设置放入该文件中,Apache 现在似乎可以正常工作了。
希望这对其他人有帮助,不要将您的配置直接放在 apache2.conf 或 httpd.conf 中。确保更改所有加载的配置文件。
你修改了错误的文件。您的日志显示“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)
就我而言,我找不到任何解决方案,所以我将把这个答案留在这里以帮助其他遇到此问题的人。在我们的例子中,增加 MaxRequestWorkers 没有帮助。
我们有一台服务器至少可以正常工作一年。突然间,它开始出现连接 https 的问题。在 apache 错误日志中,我们发现了“Server reached MaxRequestWorkers”错误,但是流量非常慢(30 - 40 个访问者活跃)。
深入查看日志和一些研究后,我发现问题是Slowloris DoS 攻击.
攻击易于缓解。你可以看看这篇文章.
我也尝试在我的服务器上增加
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
也被这个值限制了。
您可能需要检查您的网络服务器访问日志。如果日志中充斥着 xml-rpc 帖子(例如“POST /xmlrpc.php HTTP/1.1”200 403),您可能成为 xml-rpc 攻击的目标。有多种方法可以防止它发生,但 Wordpress 很容易出现这种情况。
在我的例子中,在低响应速度之后,首先我将
MaxRequestWorkers
从 150 增加到 500。但是在 apache error.log
的警告中,我意识到我也应该增加 ServerLimit
因为它的默认值是 256。此外,我没有在ServerLimit 256
中找到mpm_prefork.conf
所以我在其中添加了ServerLimit 512
作为新行并且问题解决了。
我有 4 个 CPU 和 16GB 内存,所以这个配置适合 mpm_worker
启动服务器 10 MinSpareServers 10 最大备用服务器数 20 服务器限制 2000 最大请求工人数 1500 MaxConnectionsPerChild 10000