近期,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的解釋(未完待續) http://hi.baidu.com/bmrs/blog/item/1dbf79fff24cd33b5c6008db.html
zh-CN → zh apache配置