最近公司服务器经常出现网站及系统无法访问的情况,服务器环境为Apache+PHP+Mysql,版本都比较老。服务器是云主机,在云主机的管理界面看到出现问题的这段时间,每天CPU利用率到了50%以上,之前平均为10%左右。因此认为,问题是CPU占用率过高的原因,然后就一直在排查Apache的配置,Mysql的配置,但都没有发现大的问题,修改Apache的prefork值(/www/wdlinux/apache/conf/extra/httpd-mpm.conf)也无果。
同时发现每当出现问题时,TOP命令显示出现了很多标识为R的httpd进程,running进程有时能达到300多个,load值也能彪到很高。
通过ps -aux | grep httpd命令查询到有很多的httpd进程,服务器又轻微的卡顿。
然后由于启用了apache的全部访问日志,在出现问题的时间段内分析访问日志,发现了端倪:
出故障的时间段,出现了很多:
218.94.52.131 - 我的域名 - [18/Aug/2015:08:54:25 +0800] "GET /search.php?chid=4&ccid17=167&ccid12=3&zxcd=3&hxs=3&ccid18=195&letter=W&caid=2&ccid1=219 HTTP/1.1" 200 328 "-"
这样的记录,通过查询前一天的访问记录,发现该IP地址,一天之内有12000多条访问记录,而且访问的都是search.php这个文件。
搜索了下IP地址,江苏南京的,果断把这个地址加到防火墙上 (/etc/sysconfig/iptables)
-I INPUT -s 218.94.52.131 -j DROP
测试了一上午,CPU利用率恢复到10%左右,初步认为,问题基本解决