vps 负载过高,博客无法访问

最近晚上要整理整理博客, 发现博客经常无法打开。 查看 vps 进程发现 php5-fpm 进程占用了 CPU 的大部分时间,于是去网上搜了一圈,改了改配置文件,现在 CPU 使用率基本在 20% 以下,各服务都算正常,顺手做一个总结。

  1. 首先查看 /var/log/php5-fpm.log 文件,判断大概是什么问题。我的日志当时一直报这个 warning:

    WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 10 total children
    WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 11 total children
    WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 12 total children
  2. 在 stackoverflow 上找到了一个帖子。推测是 php5-fpm 配置不当引起的。修改 php5-fpm 配置 /etc/php5/fpm/pool.d/www.conf:

    listen = /dev/shm/php5-fpm.sock
    ;用内存文件作 unix socket, 对应的 /etc/nginx/sites-available/wordpress
    ;文件也要配置:fastcgi_pass unix:/dev/shm/php5-fpm.sock;
    prefix = /var ;这个是日志文件的路径前缀,以前没配置~
    pm = dynamic
    pm.max_children = 20
    pm.start_servers = 5
    pm.min_spare_servers = 3
    pm.max_spare_servers = 7
    pm.max_requests = 100
    request_slowlog_timeout = 5s
    access.log = /var/log/$pool.access.log
    access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
    slowlog = log/$pool.log.slow
    request_terminate_timeout = 60 ; 默认单位是 seconds

    配置完记得重启 php5-fpm 服务。
    中间几个数值的配置可以参考上面说的那篇帖子,其它的配置看配置文件中的说明就好了。这些数值的配置可能需要不断尝试才能达到理想的效果,后面有机会再优化一下吧。

更新
这几天发现vps的CPU使用率又升到 90% 以上了,感觉并不是 php5-fpm 配置的问题。查看 nginx 日志发现有世界各地的 ip 在对我的 wordpress 发动 xmlrpc 攻击。去网上搜了一下解决办法,要么把xmlrpc.php 文件删除或者改名,要么在 wordpress 主题的 functions.php 中添加代码:

/* turn off ping back */
all_filter('xmlrpc_methods', 'remove_xmlrpc_pingback_ping');
function remove_xmlrpc_pingback_ping( $methods ) {
    unset( $methods['pingback.ping']);
    return $methods;
}

或者

/* turn off xmlrpc */
add_filter('xmlrpc_enabled', '__return_false');

但是,我这样做后并没有什么效果。而且我用第三方 wordpress 客户端进行写作,关闭 xmlrpc 会导致第三方客户端无法连接到 wordpress,也就无法用客户端发布文章,所以我并没有采用上面的方法。后面尝试安装了 Login Security SolutionminiOrange Login Security 插件,配置好后 vps 的 CPU 使用率降到了1%以下。问题暂时解决了,后面有问题再更。

第二次更新
后来发现 vps cpu占用率过高其实是 post xmlrpc ddos 引起的,上面的方法其实不一定有用,最简单也最有效的办法是屏蔽IP。通过查看 /var/log/nginx/access.log 文件发现异常IP,然后用 iptables 直接屏蔽即可。

发表评论

邮箱地址不会被公开。 必填项已用*标注