Nginx 支持 keep-alive 長(zhǎng)連接
概念
Persistent HTTP connections have a number of advantages
HTTP?協(xié)議采用請(qǐng)求-應(yīng)答模式,當(dāng)使用普通模式,即非?KeepAlive?模式時(shí),每個(gè)請(qǐng)求/應(yīng)答客戶和服務(wù)器都要新建一個(gè)連接,完成之后立即斷開(kāi)連接(HTTP?協(xié)議為無(wú)連接的協(xié)議);當(dāng)使用?Keep-Alive?模式(又稱(chēng)持久連接/連接重用)時(shí),Keep-Alive?功能使客戶端到服務(wù)器端的連接持續(xù)有效,當(dāng)出現(xiàn)對(duì)服務(wù)器的后繼請(qǐng)求時(shí),Keep-Alive?功能避免了建立或者重新建立連接。
支持?keep alive
當(dāng)使用?nginx?作為反向代理時(shí),為了支持長(zhǎng)連接,需要做到兩點(diǎn)
從?
client?到?nginx?的連接是長(zhǎng)連接從?
nginx?到?server?的連接是長(zhǎng)連接
保持和?client?的長(zhǎng)連接
client?發(fā)送的?HTTP?請(qǐng)求要求?keep alivenginx?設(shè)置上支持?keep alive
HTTP?配置
keepalive_timeout
默認(rèn)?
75s,一般情況下也夠用,對(duì)于一些請(qǐng)求比較大的內(nèi)部服務(wù)器通訊的場(chǎng)景,適當(dāng)加大為?120s?或者?300s。第二個(gè)參數(shù)通常可以不用設(shè)置
第一個(gè)參數(shù)設(shè)置?keep-alive?客戶端連接在服務(wù)器端保持開(kāi)啟的超時(shí)值。值為?0?會(huì)禁用?keep-alive?客戶端連接。可選的第二個(gè)參數(shù)在響應(yīng)的?header?域中設(shè)置一個(gè)值?Keep-Alive: timeout=time。這兩個(gè)參數(shù)可以不一樣
keepalive_requests
默認(rèn)?
100,對(duì)于?QPS?較高的場(chǎng)景,非常有必要加大這個(gè)參數(shù),以避免出現(xiàn)大量連接被生成再拋棄的情況,減少?TIME_WAIT。這個(gè)參數(shù)的真實(shí)含義是指一個(gè)?keep alive?建立之后,nginx?就會(huì)為這個(gè)連接設(shè)置一個(gè)計(jì)數(shù)器,記錄這個(gè)?keep alive?的長(zhǎng)連接上已經(jīng)接收并處理的客戶端請(qǐng)求的數(shù)量。如果達(dá)到這個(gè)參數(shù)設(shè)置的最大值時(shí),則?nginx?會(huì)強(qiáng)行關(guān)閉這個(gè)長(zhǎng)連接,逼迫客戶端不得不重新建立新的長(zhǎng)連接
用于設(shè)置一個(gè)?keep-alive?連接上可以服務(wù)的請(qǐng)求的最大數(shù)量。當(dāng)最大請(qǐng)求數(shù)量達(dá)到時(shí),連接被關(guān)閉
保持和?server?的長(zhǎng)連接
http {keepalive_timeout 100s;keepalive_requests 1000;upstream dev.proxy.com {server 192.168.10.11:8081 weight=1 max_fails=2 fail_timeout=30s;server 192.168.10.10:8081 weight=1 max_fails=2 fail_timeout=30s;keepalive 300;}server {listen 80 default_server;listen [::]:80 ipv6only=on;server_name dev.proxy.com;charset utf-8;location / {index index.php index.html index.htm;proxy_pass http://dev.proxy.com/;proxy_set_header Host $Host;proxy_set_header x-forwarded-for $remote_addr;proxy_set_header X-Real-IP $remote_addr;add_header Cache-Control no-store;add_header Pragma no-cache;proxy_http_version 1.1;proxy_set_header Connection "";client_max_body_size 3072k;client_body_buffer_size 128k;}}}
合理的設(shè)置?keep-alive?值可以非常有效的緩沖請(qǐng)求和應(yīng)答不均勻,緩解連接數(shù)量的反復(fù)震蕩
連接數(shù)量震蕩的兩個(gè)表現(xiàn)
連接不夠用,造成新建連接
連接空閑,造成關(guān)閉連接
統(tǒng)計(jì)在一臺(tái)前端機(jī)上高峰時(shí)間 TCP 連接的情況
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'導(dǎo)致?nginx?端出現(xiàn)大量?TIME_WAIT?的兩種情況
keepalive_requests?設(shè)置比較小,高并發(fā)下超過(guò)此值后?nginx?會(huì)強(qiáng)制關(guān)閉和客戶端保持的keepalive?長(zhǎng)連接(主動(dòng)關(guān)閉連接后導(dǎo)致?nginx?出現(xiàn)?TIME_WAIT)keepalive?設(shè)置的比較小(空閑數(shù)太小),導(dǎo)致高并發(fā)下?nginx?會(huì)頻繁出現(xiàn)連接數(shù)震蕩(超過(guò)該值會(huì)關(guān)閉連接),不停的關(guān)閉開(kāi)啟和后端?server?保持的?keep-alive?長(zhǎng)連接
導(dǎo)致后端?server?端出現(xiàn)大量?TIME_WAIT?的情況
nginx?沒(méi)有打開(kāi)和后端的長(zhǎng)連接,即:沒(méi)有設(shè)置?proxy_http_version 1.1;?和proxy_set_header Connection "";?從而導(dǎo)致后端?server?每次關(guān)閉連接,高并發(fā)下就會(huì)出現(xiàn)?server?端出現(xiàn)大量?TIME_WAIT
