Nginx/tengine裏的那些timeout時間

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


 client_header_timeout 10s;

 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數據,第五步是服務結束後是否採用長連接,理清楚過程就好理解了。


 client_header_timeout 10s;

 默認: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),新的博文會在網咖社更新,歡迎瀏覽


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章