我想在此前言说我已经阅读了至less10个相关的Serverfault问题,然后才决定自己做…
我目前正在运行带有2GB内存的Ubuntu 14.04.3服务器,以及大约5个有效的WordPress安装,全部在Vesta CP控制面板下进行pipe理。
通常情况下,它消耗了大约700MB的2GB。 但是每个星期左右,所有的RAM都会被神奇地消耗掉,服务器的速度几乎停顿下来。
如果我SSH进入并重新启动Apache,以及清除内存( echo 3 > /proc/sys/vm/drop_caches ),它再次开始正常工作。
这里是我的prefork模块设置,我觉得是非常合理的:
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 1 MaxSpareServers 5 ServerLimit 10 MaxClients 10 MaxRequestsPerChild 1000 </IfModule>
我甚至启用了mod_status,并试图查看哪些PHP文件花了太长时间,但没有发现任何可疑的东西。 当然,当我查看服务器停机的日志时,由于大量的内存消耗而无法运行,因此至less有200个PHP文件被淹没。
我甚至启用了一个8GB的SWAP文件,但似乎只是推迟了不可避免的。
以下是free -m命令每次提取的内容:
root@apache2-ps7881:/home/dhc-user# free -m total used free shared buffers cached Mem: 2001 1943 57 35 1 59 -/+ buffers/cache: 1883 118 Swap: 8191 4083 4108
重新启动apache之后:
root@apache2-ps7881:/etc/apache2# free -m total used free shared buffers cached Mem: 2001 744 1257 65 36 204 -/+ buffers/cache: 503 1498 Swap: 8191 140 8051
这里是/var/log/apache2/error.log :
[Fri Feb 12 08:22:33.063204 2016] [mpm_prefork:error] [pid 2081] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting [Fri Feb 12 13:12:59.819680 2016] [core:warn] [pid 2081] AH00045: child process 6334 still did not exit, sending a SIGTERM
那“儿童进程仍然没有退出”的错误进行了数百多行。
我得到server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting消息,每次下降。
另一个error.log显示以下内容:
[Fri Feb 12 08:19:55.781598 2016] [:error] [pid 20686] [client 10.10.10.9:54559] PHP Warning: mysqli_connect(): (08004/1040): Too many connections in /[censored]/$ [Fri Feb 12 08:19:55.896491 2016] [:error] [pid 20686] [client 10.10.10.9:54559] Too many connections, referer: http://[censored]
难道有没有closures的连接? 但会导致内存泄漏?
下面是图表在崩溃期间显示的一个例子:
我有一个类似的问题,一个Wordpress网站将开始使用大量的资源到服务器基本上没有响应的地步。 调查日志,我看到了几百次访问xmlrpc.php权利,同时内存占用会膨胀。 使用system.multicall方法可以将xmlrpc.php的函数用作蛮力攻击中的强制乘数。
这篇文章是如何工作的更清晰的描述: https : //blog.sucuri.net/2015/10/brute-force-amplification-attacks-against-wordpress-xmlrpc.html
更重要的是,这篇文章中有一些缓解策略:
保护自己
我曾经build议人们阻止所有访问xmlrpc.php,但它打破了一些插件的function(主要是JetPack)。 考虑到这一点,如果您不使用JetPack或其他任何需要XML-RPC的插件,完全禁止直接访问它可能是一个好主意。
如果您不能阻止XML-RPC,并且您正在使用WAF(Web应用程序防火墙),我强烈build议阻止system.multicall请求。 它几乎没有在野外使用,并会保护您免受这些放大方法。
我不使用任何需要访问xmlrpc.php的插件,所以我修改了.htaccess来拒绝访问。 从那以后,没有更多的恶意演员成功粉碎该网站。 如果您想试试这个代码:
使用您select的文本编辑器,修改/var/www/html/.htaccess包括:
<Files "xmlrpc.php"> Order Allow,Deny deny from all </Files>
WordPress的强化访问您的网站的其他指导方针在这里find: http : //codex.wordpress.org/Hardening_WordPress
WordPress的login安全解决scheme插件可能也有帮助。 我会张贴链接,但我缺乏声誉。 抱歉!
看起来这个网站很忙,但你说过的不是这样。 它耗尽了服务器资源,因此您可能需要在耗尽资源之前限制资源。
我也看看Wordpress正在使用的插件和小部件。 删除所有不是100%必需的东西,以进行testing。 我已经看到插件和小部件对WordPress的网站做可怕的事情。 至less你应该使用一个caching插件,W3总caching是最好的,从内存。
如果这是我的服务器,我会改变服务器的底层架构,以使用Nginx和HHVM,包括页面caching。 我有四个Wordpress安装和一个运行在aws t2.micro上的中等繁忙的网站,这是一个Xeon核心的10%(突发到一个完整核心)和1GB内存,尽pipe我也使用Amazon RDS(关系数据库服务)。 我的网站加载非常快。 请注意,这种更改是不必要的,你可以修复你的configuration,它应该可以正常工作,但我不知道如何。
我已经写了一个关于使用Nginx,HHVM等在AWS上设置Wordpress的重要教程。您可以在这里阅读 。 你可以很容易地把它设置在当前的基础设施上,在不同的端口上运行Nginx,甚至使用相同的webroot和数据库 – 但是我在testing时创build了一个只读数据库用户。 一旦你感到高兴,它只是交换端口,你会运行nginx,hhvm,它应该更可靠。 如果没有,至less你可能会得到一些社区支持,因为我build议的configuration是相当标准的。
如果你的网站有许多匿名访问者,你可以从nginx页面caching中服务器发出大量的请求,这个请求几乎不需要CPU,也不会碰到PHP。 我的小实例每秒可以提供1000个caching页面,有时甚至更多,不能确定瓶颈是什么,但是它在2%的CPU上执行caching。 它只能做到每秒11页,如果它碰到PHP,一个巨大的差异,显示执行代码是多么慢。 这将使您的网站更快。 它应该使所有访问者更快,HHVM比PHP5快得多。
您向我们展示的configuration与您对“至less200个PHP文件”的描述和top的输出(显然包含10个以上的实例)明确相抵触。 清除vfscaching似乎删除的症状有些令人担忧 – 唯一的影响应该是减慢服务器的速度。
所有这些进程都被阻塞了 – 而且它们不能用于数据库。 看起来这里也有一些丑陋的文件争用。
它看起来像允许太多的连接与阻塞文件locking相结合。 后者可能是DOS攻击,特别是如果您使用默认会话处理程序。 如果是这种情况,则应该从访问日志中明显看出。
这里没有快速修复,但是你的下一步应该是修复configuration,所以它实际上工作,并禁用所有的WordPress插件。 这些插件的质量差别很大。
真的我们应该投票把这个过于宽泛地closures了。