最近晚上要整理整理博客, 发现博客经常无法打开。 查看 vps 进程发现 php5-fpm 进程占用了 CPU 的大部分时间,于是去网上搜了一圈,改了改配置文件,现在 CPU 使用率基本在 20% 以下,各服务都算正常,顺手做一个总结。
- 首先查看
/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
- 在 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 Solution
和 miniOrange Login Security
插件,配置好后 vps 的 CPU 使用率降到了1%以下。问题暂时解决了,后面有问题再更。
第二次更新
后来发现 vps cpu占用率过高其实是 post xmlrpc ddos
引起的,上面的方法其实不一定有用,最简单也最有效的办法是屏蔽IP。通过查看 /var/log/nginx/access.log
文件发现异常IP,然后用 iptables 直接屏蔽即可。