现在的位置: 首页 > 综合 > 正文

关于Apache 的timeout 误解

2014年12月11日 ⁄ 综合 ⁄ 共 1469字 ⁄ 字号 评论关闭

近期,web服务器上经常apache的线程数会跑到maxclients(500),从而影响了正常服务。正常情况下,apache线程数不会超过100,而却跑到了500,所以肯定是由于某些请求执行脚本的时间太长了。于是设置apache的LogFormat (参考http://mylinux.5d6d.com/thread-936-1-1.html), 从而追踪到某些请求的时间是多少。有个别请求时间长达60s甚至更长。这些访问肯定是有问题的,不能一直让他们占用apache的资源,所以想到设定超时时间,如果指定时间内请求没有完成,则断开该次请求。虽然这样做不太人性化,但是为了顾全大局只好牺牲某些用户了。

起初,因为对Timeout 参数认识不够深刻,觉得把apache httpd.conf中的 timeout 参数设置小点就会限制了时间长的请求。但是实践证明,那是错的。查了资料,后来发现在官方文档中,对apache的timeout的解释是这样的:
The TimeOut directive currently defines the amount of time Apache will wait for three things:
?The total amount of time it takes to receive a GET request. 
?The amount of time between receipt of TCP packets on a POST or PUT request. 
?The amount of time between ACKs on transmissions of TCP packets in responses
大概意思是:
1. 接收GET请求的所花费的时间总和
2. POST或者PUT请求时发送TCP包给服务器的间隔(不是间隔时间之和)
3. 发送响应时发送TCP包的间隔(不是间隔之和) 
这里我们更关心第3点.
也就是说, 就算timeout设置了1s, 服务器处理请求的时间完全可以超过1s, 只要服务器每隔不超过1s的时间就发送一点数据到客户端即可.
现在想想也是,服务器跟客户端的交互并不是一气呵成的,需要
连接通信--间隔若干时间--继续通信--间隔若干时间...  这样反反复复

所以咱们timeout参数限制的是这个间隔时间,而不是整个通信的时间总和,故而,即使有的请求超过了TimeOut的值,也依旧没有断开连接。
而我的问题依然如故,如何解决呢?因为web服务器上跑的php程序,所以想到通过在php的配置上去限制。这就涉及到了php.ini 中的 max_execution_time .

默认安装的apache2.0.59,正常使用一点问题没有。前两天无聊用sss扫描,结果扫描到http那段,突然发现ie打不开页面了...在服务器上通过netstat看,有很多我的本机到服务器的80端口链接,服务器这时候的状态很正常,cpu/ping延迟都不高,但是就是浏览器打不开页面。
Timeout 15
KeepAlive On
MaxKeepAliveRequests 500
KeepAliveTimeout 15

看了以下默认的这四个参数,发现
Timeout=300
MaxKeepAliveRequests=100

怀疑是这个问题,将他改为了以上的设置,再次扫描,果然打开页面正常了。

apache配置中的Timeout和KeepAliveTimeout的解释(未完待续)

zh-CN → zh
apache配置

抱歉!评论已关闭.