摘要
在高并發(fā)環(huán)境下 keepalive
參數(shù)配置不當(dāng)容易產(chǎn)生大量 TIME_WAIT琢岩,導(dǎo)致端口耗盡,服務(wù)異常。
keepalive
值應(yīng)該大于等于 upstream 中 server 的數(shù)量。(建議是 server 數(shù)的 2 倍)
詳細(xì)說明
keepalive
用于設(shè)置保留在每個 nginx worker 緩存中『已經(jīng)與上游服務(wù)器建立的空閑連接』的最大連接數(shù)余爆,如果超過這個值,最近最少使用的連接將被關(guān)閉夸盟。
Nginx 官方建議這個值應(yīng)該盡可能小蛾方,以便讓上游服務(wù)器也能處理新進(jìn)入的連接。但是『盡可能小』有些太模糊,如果配置不當(dāng)會降低性能以及產(chǎn)生其他問題转捕。
在大量短鏈接(或者大量分散用戶)的請求場景下,同時 upstream 為輪詢模式時唆垃,因為 keepalive
值小于 upstream server 數(shù)五芝,upstream 新的空閑連接會從緩存中擠出老的空閑鏈接,導(dǎo)致 keepalive
在某種意義上失效辕万。
根據(jù)下面配置枢步,以單個 nginx worker 處理請求為例,這里做個更詳細(xì)的解釋:
upstream http_backend {
server 10.0.0.1;
server 10.0.0.2;
server 10.0.0.3;
keepalive 2;
}
server {
...
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}
第一個請求進(jìn)來渐尿,nginx 與 10.0.0.1 建立連接醉途,請求處理完成后,nginx 與 10.0.0.1 的空閑連接被放入空閑連接池砖茸;
第二個請求進(jìn)來隘擎,nginx 與 10.0.0.2 建立連接,請求處理完成后凉夯,nginx 與 10.0.0.2 的空閑連接被放入空閑連接池货葬;
第三個請求進(jìn)來,nginx 與 10.0.0.3 建立連接劲够,請求處理完成后震桶,因為最大空閑連接數(shù)為 2,連接數(shù)已滿征绎,所以 nginx 與 10.0.0.1 的空閑連接被 close蹲姐,nginx 與 10.0.0.3 的空閑連接被放入空閑連接池;
第四個請求進(jìn)來人柿,nginx 再次與 10.0.0.1 建立連接柴墩,請求處理完成后,因為最大空閑連接數(shù)為 2凫岖,連接數(shù)已滿拐邪,所以 nginx 與 10.0.0.2 的空閑連接被 close,nginx 與 10.0.0.1 的空閑連接被放入空閑連接池
隘截。扎阶。。以此類推
這種效果就像沒有配置 keepalive
挖個坑:以上內(nèi)容根據(jù)實踐經(jīng)驗以及推測而得出婶芭,待我用源碼來證明 :)
參考文檔:
nginx 官方文檔: https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive