当前位置: 首页 > 图文教程 > 服务器 > Linux服务器 > 网站故障处理记实:apache引起的麻烦

Linux服务器
linux下用cron定时执行任务的方法
.htaccess绑定域名到子目录的方法
linux apache下虚拟主机配置方法
apache 局域网访问配置方案
linux Apache服务器系统安全设置与优化
linux中mac地址绑定方法
linux托盘不断闪烁之解决方法
Apache配置 虚拟转向实例
Apache No space left on device的解决办法
Apache rewrite的重写相关的参数说明
LINUX入门级常用命令20条整理
Ubuntu设置开机自动挂载所有格式硬盘分区
5个可能被你忽略的Linux安全设置方法
学习Apache的mod rewrite、access写法
改版时保留原链接,创建新的URL的方法
rsync中文手册之使用rsync实现网站镜像和备份linux
rsync 数据同步使用详解
linux URL的301重定向代码分析
eclipse3.2.2 + MyEclipse5.5 + Tomcat5.5.27 配置数据库连接池
Apache服务器二级域名的完美实现

Linux服务器 中的 网站故障处理记实:apache引起的麻烦


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-18   浏览: 90 ::
收藏到网摘: n/a

春节还没过完就接到同事的电话,说论坛访问速度慢,遭致用户强烈的投诉,要求我马上处理。这个bbs是运行在RedhatAS5上,由apache、mysql、php和discuz组成,有129550位注册会员,同时在线的最高人数11128,按照当前的硬件条件,应该满足访问需求(新上线的HP服务器)。在浏览器输入论坛的url,果然很慢,再联系朋友帮忙测试,打开网络还是很慢。

恶意攻击?mysql瘫痪?

先不管这么多,登录到服务器上去看看再做下一步打算。还好,登录比较顺利。运行命令uptime看系统负载,很低呀,再运行命令top,跟uptime得出的结论基本吻合,于是得出结论:系统负载不大。

是否被恶意攻击呢?基于这个想法,察看系统帐号—打开文件/etc/passwd,没看见任何异常;运行命令iptables–L–n发现防火墙规则仍按我当初设定的策略执行,这些迹象表明,系统不存在安全问题。

那会不会是mysql的性能问题呢?用mysql客户端连接数据库,察看负载,其情况如下:
mysql>showprocesslist;
+---------+-----------+-----------+--------+---------+------+-------+------------------+
|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|
+---------+-----------+-----------+--------+---------+------+-------+------------------+
19rowsinset(0.00sec)

从输出结果看,连接数和保持时间也在正常范围内。以前曾经有过mysql数据库连接数过多(达到设定的最大连接数)及会话保持时间(Time)过长的事故,从而导致网站访问速度变慢,以至于无法忍受。由此分析,这个故障不是由mysql数据库所引起的。

现在还剩下apache了,看来该怀疑一下它了。我们先看看有多少个httpd进程,其过程如下:
[root@web1~]#psaux|grephttpd|grep-vgrep|wc-l
256
结果刚好是apache默认设置的最大连接数,再执行[root@web1~]#netstat-n|awk'/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}'其运行结果如下所示:
LAST_ACK3
SYN_RECV628
…………省略若干…………
TIME_WAIT524

apache引起的麻烦?

这个结果表明请求数比较大但却没有得到适时的响应,再看一下这些请求都是发往那些服务端口,只需运行netstat–anp|grep–vunix,发现绝大部分请求是针对80端口的。由这个现象基本可以断定是apache引起的麻烦。那好,我就从这里着手。关apache服务再启用,这时察看httpd进程,马上就是256.既然这样,我就在配置文件httpd.conf加入下面的代码块:
<IfModuleprefork.c>
StartServers10
MinSpareServers10
MaxSpareServers15
MaxClients1500
ServerLimit2000
MaxRequestsPerChild10000
</IfModule>

执行apachectl–t,报错,警告说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.confMaxClients的值为1500,运行apachectl–t检查语法是否正确,无误后启用apache服务apachectlstart.现在,我们再回过头来察看apache的进程数,基本上在170-400这个范围,并且在不停的变化,隔设定的1500这个值还差得远;另外那些等待的请求值也降低了,这意味apache能正常响应用户的请求。在浏览器输入论坛的url,速度正常,再请其他朋友帮着测试,一切正常。

上一页[1][2]