一次网站故障处理过程

 

一次网站故障处理过程
作者:田逸( [email protected] from [url]http://netsecurity.51cto.com/art/200802/65683.htm[/url]
 
春节还没过完就接到同事的电话,说论坛访问速度慢,遭致用户强烈的投诉,要求我马上处理。这个 bbs 是运行在 Redhat AS 5 上,由 apache mysql php discuz 组成,有 129550 位注册会员,同时在线的最高人数 11128 ,按照当前的硬件条件,应该满足访问需求(新上线的HP 服务器)。在浏览器输入论坛的url,  果然很慢,再联系朋友帮忙测试,打开网络还是很慢。
 
先不管这么多,登录到服务器上去看看再做下一步打算。还好,登录比较顺利。运行命令uptime 看系统负载,很低呀,再运行命令top, uptime 得出的结论基本吻合,于是得出结论:系统负载不大。
 
是否被恶意攻击呢?基于这个想法,察看系统帐号 打开文件 /etc/passwd ,没看见任何异常;运行命令 iptables �CL �Cn 发现防火墙规则仍按我当初设定的策略执行,这些迹象表明,系统不存在安全问题。
 
那会不会是mysql 的性能问题呢?用mysql 客户端连接数据库,察看负载,其情况如下:
mysql> show processlist;
+---------+-----------+-----------+--------+---------+------+-------+------------------+
| Id      | User     | Host   | db    | Command | Time | State | Info           |
+---------+-----------+-----------+--------+---------+------+-------+------------------+
| 1917230 | bbsdiscuz | localhost | discuz | Sleep   |  284 |       | NULL             |
| 1917412 | bbsdiscuz | localhost | discuz | Sleep   |  223 |       | NULL             |
| 1917442 | bbsdiscuz | localhost | discuz | Sleep   |  222 |       | NULL             |
| 1917554 | bbsdiscuz | localhost | discuz | Sleep   |  205 |       | NULL             |
| ………………….. 省略若干 ………………………..
| 1918404 | bbsdiscuz | localhost | discuz | Sleep   |    0 |       | NULL             |
+---------+-----------+-----------+--------+---------+------+-------+------------------+
19 rows in set (0.00 sec)
从输出结果看,连接数和保持时间也在正常范围内。以前曾经有过 mysql 数据库连接数过多(达到设定的最大连接数)及会话保持时间 (Time) 过长的事故,从而导致网站访问速度变慢,以至于无法忍受。由此分析,这个故障不是由 mysql 数据库所引起的。
 
现在还剩下 apache 了,看来该怀疑一下它了。我们先看看有多少个 httpd 进程,其过程如下:
[root@web1 ~]# ps aux | grep httpd | grep -v grep | wc -l
256
结果刚好是 apache 默认设置的最大连接数,再执行 [root@web1 ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  其运行结果如下所示:
LAST_ACK 3
SYN_RECV 628
………… 省略若干 …………
TIME_WAIT 524
这个结果表明请求数比较大但却没有得到适时的响应,再看一下这些请求都是发往那些服务端口,只需运行 netstat �Canp | grep �Cv unix ,发现绝大部分请求是针对 80 端口的。由这个现象基本可以断定是 apache 引起的麻烦。那好,我就从这里着手。关 apache 服务再启用,这时察看 httpd 进程,马上就是 256. 既然这样,我就在配置文件 httpd.conf 加入下面的代码块:
<IfModule prefork.c> 
StartServers 10
MinSpareServers 10
MaxSpareServers 15 
MaxClients 1500
ServerLimit 2000
MaxRequestsPerChild 10000 
</IfModule> 
执行 apachectl �Ct ,报错,警告说 MaxClients 超过 256, 以至于 apache 服务不能正常运行,该小一点呢?好,改成 150 ,运行后,查 httpd 进程数,刚好 150 。用浏览器访问论坛,还是十分的缓慢。看来得朝大的方向改,否则瞬间 apache 达到最大连接数,就不再响应新的请求。从前面的操作(把 MaxClients 的值改大超过 256 )可以知道,必须重新编译和安装 apache 才可以达到目的。当时曾经尝试把 apache 置于 worker 模式,但在编译时涉及到 php, 不想再节外生枝,就不再继续。我用的 apache 版本是 httpd- 2.2.6 , 进安装包所在的目录(如我的目录是 /root/httpd-2.2.6, 即解压 httpd-2.2.6.tgz 后生成的目录),修改文件 server/mpm/prefork/prefork.c, 把第 77 行的值改成 1500 ,如下图所示:
然后再编译,运行和安装。再使配置文件 httpd.conf MaxClients 的值为 1500 ,运行 apachectl �Ct 检查语法是否正确,无误后启用 apache 服务 apachectl start . 现在,我们再回过头来察看 apache 的进程数,基本上在 170-400 这个范围,并且在不停的变化,隔设定的 1500 这个值还差得远;另外那些等待的请求值也降低了,这意味 apache 能正常响应用户的请求。在浏览器输入论坛的 url, 速度正常,再请其他朋友帮着测试,一切正常。
 
 
                                             
本文出自 “ sery ” 博客,出处 [url]http://sery.blog.51cto.com/10037/62376[/url]

你可能感兴趣的:(网站,过程,处理,故障,休闲)