Nginx/tengine裏的那些timeout時間

   老早用nginx時就零零散散的接觸這些時間,一直沒靜下心繫統的梳理一遍,其實理解了這些時間的做用和設置,對配置tengine(nginx)線上業務的優化有不可小覷的做用,對nginx的工做流程也會有更深的理解,目前我線上配置是服務http小文件(非視頻和下載類)的,具體參數配置以下,由於沒有看過nginx的源碼,純從運維角度理解:前端


 client_header_timeout 10s;nginx

 client_body_timeout 10s;後端

 proxy_connect_timeout 10s;緩存

 proxy_send_timeout 55s;服務器

 proxy_read_timeout 60s;網絡

 keepalive_timeout  65s;負載均衡

注:我這些參數所有配在了http中。運維


   線上的環境是用tengine2.1.2作負載,配置了upstream,在配這些時間參數的時候特地對順序作了調整,你會發現這個順序就是整個服務流轉的邏輯順序,第一步請求頭過來,第二步鏈接upstream的server,第三步將請求發送給upstream的server,第四步接收upstream的server數據,第五步是服務結束後是否採用長鏈接,理清楚過程就好理解了。tcp


 client_header_timeout 10s;ide

 默認:60s

 配在:http中、server中、location中

 client_body_timeout 10s;

 默認:60s

 配在:http中、server中

 都跟請求相關,就一塊兒理解了說了,這兩個參數是對請求頭和請求體(想了解請求頭和請求體的概念本身百度)的超時時間,就是從三次握手到第一次讀取請求頭和請求體失敗的時間。好比當前服務器負載大、網絡卡,剛好在第一次讀取請求頭或請求提時沒有獲得且時間超過10s了,tengine就會超時報錯,對於我當前應用而言,60s顯而是太長了,優化到10s。


 proxy_connect_timeout 10s;

 默認:60s

 配在:http中、server中、location中

  在收到請求頭後,會將請求轉發到upstream裏面的server,這個呢就是與對應的server鏈接的超時時間,設置時最大值不能超過75s,我這裏的server和tengine是放在同一個交換機上的內網,因此將鏈接時間優化到10s,超過10s鏈接不上,說明業務有問題了。


 proxy_send_timeout 55s;

 默認:60s

 配在:http中、server中、location中

  在與upstream的server創建鏈接後,就會把請求往server發送,這個時間是兩次數據的發送時間差,不是整個發送過程的。好比說負載大、網絡卡,在tengine向server發送請求時忽然卡了一下,而後繼續發送,而這兩次的時間差(其實就是兩次write的時間差)超過了我設置的55s,tengine就會超時報錯,對於這個參數,我當前優化的是55s。


 proxy_read_timeout 60s;

 默認:60s

 配在:http中、server中、location中

  在將請求發送給upstream的server後,後端server就會回傳數據,這個時間是兩次收取數據的時間差,不是整個的接收時間。好比說負載大、網絡卡,在第1次收到請求的數據時斷了,而後過了60s後才收到後面的數據,這兩個時間差(其實就是兩次read的時間差)超過了設置的60s,tengine(nginx)就會超時報錯,我當前走的是默認設置60s。


 keepalive_timeout  65s;

 默認:75s

 配在:http中、server中、location中

  http是無狀態的協議,當服務結束後,就面臨着是否斷開tcp鏈接的問題,當客戶端或者服務器端須要時,能夠在建鏈的時候採用長鏈接方式,即服務結束後在一段時間內不斷開鏈接,當再有請求過來時省掉了建鏈的資源消耗,超時後tengine(nginx)會主動斷開鏈接,固然配置裏還有另一個參數 keepalive_requests 600;,這個參數是說即便長鏈接沒到過時時間,但服務的http總數量超過指定值後也是要斷開鏈接,我目前設置的是600。


    好了,目前主要總結這些,由於線上tengine(nginx)的主要應用仍是負載均衡,全部暫時沒有考慮到fastcgi這些時間的配置,之後在遇到其餘時間的參數會繼續補充,在此多謝開發謝兄的啓發。


後續添加補充:

resolver_timeout 10s;

默認:30s

配在:http中、server中、location中

這個是dns解析超時時間,若是用做正向代理時就有用了,同時能夠用resolver 127.0.0.1 valid=10m;指令來指定dns,後面是解析後緩存的有效時間。


server 127.0.0.1:9999 max_fails=20 fail_timeout=10s;

這個是指某一個upstream的server若是失敗20次後,不能夠操做的時間,默認就是10s,其實能夠另外的寫法配在http中,我習慣直接配在server的後端。


keepalive_timeout  65 70;

這是前端keepalive_timeout的一個延伸配置,前面65是告訴客戶端我給你保持多久,後面一個是多久我就給斷開鏈接了。

自建我的原創站運維網咖社(www.net-add.com),新的博文會在網咖社更新,歡迎瀏覽

相關文章
相關標籤/搜索