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是告訴客戶端我給你保持多久,后面一個是多久我就給斷開連接了。
from:https://blog.51cto.com/benpaozhe/1761697