溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Nginx中HTTP的keepalive怎么配置

發(fā)布時間:2022-04-29 16:31:50 來源:億速云 閱讀:207 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Nginx中HTTP的keepalive怎么配置”,在日常操作中,相信很多人在Nginx中HTTP的keepalive怎么配置問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Nginx中HTTP的keepalive怎么配置”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

http keepalive
在http早期 ,每個http請求都要求打開一個tpc socket連接,并且使用一次之后就斷開這個tcp連接。使用keep-alive可以改善這種狀態(tài),即在一次tcp連接中可以持續(xù)發(fā)送多份數(shù)據(jù)而不會 斷開連接。通過使用keep-alive機制,可以減少tcp連接建立次數(shù),也意味著可以減少time_wait狀態(tài)連接,以此提高性能和提高h(yuǎn)ttpd 服務(wù)器的吞吐率(更少的tcp連接意味著更少的系統(tǒng)內(nèi)核調(diào)用,socket的accept()和close()調(diào)用)。但是,keep-alive并不是 免費的午餐,長時間的tcp連接容易導(dǎo)致系統(tǒng)資源無效占用。配置不當(dāng)?shù)膋eep-alive,有時比重復(fù)利用連接帶來的損失還更大。所以,正確地設(shè)置 keep-alive timeout時間非常重要。
keepalvie timeout
httpd守護(hù)進(jìn)程,一般都提供了keep-alive timeout時間設(shè)置參數(shù)。比如nginx的keepalive_timeout,和apache的keepalivetimeout。這個 keepalive_timout時間值意味著:一個http產(chǎn)生的tcp連接在傳送完最后一個響應(yīng)后,還需要hold住 keepalive_timeout秒后,才開始關(guān)閉這個連接。當(dāng)httpd守護(hù)進(jìn)程發(fā)送完一個響應(yīng)后,理應(yīng)馬上主動關(guān)閉相應(yīng)的tcp連接,設(shè)置 keepalive_timeout后,httpd守護(hù)進(jìn)程會想說:”再等等吧,看看瀏覽器還有沒有請求過來”,這一等,便是 keepalive_timeout時間。如果守護(hù)進(jìn)程在這個等待的時間里,一直沒有收到瀏覽發(fā)過來http請求,則關(guān)閉這個http連接。
我寫了一個腳本,方便測試

<?php
sleep(60); //為了便于分析測試,會根據(jù)測試進(jìn)行調(diào)整
echo "www.jb51.net";
?>

1.當(dāng)keepalive_timeout時間為0時,即不啟用keep-alive時,一個tcp連接的生命周期

#tcpdump -n host 218.1.57.236 and port 80
20:36:50.792731 ip 218.1.57.236.43052 > 222.73.211.215.http: s 1520902589:1520902589(0) win 65535
20:36:50.792798 ip 222.73.211.215.http > 218.1.57.236.43052: s 290378256:290378256(0) ack 1520902590 win 5840
20:36:50.801629 ip 218.1.57.236.43052 > 222.73.211.215.http: . ack 1 win 3276820:36:50.801838 ip 218.1.57.236.43052 > 222.73.211.215.http: p 1:797(796) ack 1 win 32768
20:36:50.801843 ip 222.73.211.215.http > 218.1.57.236.43052: . ack 797 win 5920:37:50.803230 ip 222.73.211.215.http > 218.1.57.236.43052: p 1:287(286) ack 797 win 59
20:37:50.803289 ip 222.73.211.215.http > 218.1.57.236.43052: f 287:287(0) ack 797 win 59
20:37:50.893396 ip 218.1.57.236.43052 > 222.73.211.215.http: . ack 288 win 32625
20:37:50.894249 ip 218.1.57.236.43052 > 222.73.211.215.http: f 797:797(0) ack 288 win 32625
20:37:50.894252 ip 222.73.211.215.http > 218.1.57.236.43052: . ack 798 win 59

第1~3行建立tcp三次握手,建立連接。用時8898μs
第4~5行通過建立的連接發(fā)送第一個http請求,服務(wù)端確認(rèn)收到請求。用時5μs
第5~6行,可以知道腳本執(zhí)行用時60s1387μs,與php腳本相符。
第6、8行服務(wù)端發(fā)送http響應(yīng)。發(fā)送響應(yīng)用時90166μs。
第7行,表明由服務(wù)端守護(hù)進(jìn)程主動關(guān)閉連接。結(jié)合第6、8行,說明http響應(yīng)一旦發(fā)送完畢,服務(wù)端馬上關(guān)閉這個tcp連接
第7、9、10說明tcp連接順序關(guān)閉,用時90963μs。需要注意,這里socket資源并沒有立即釋放,需要等待2msl時間(60s)后才被真正釋放。
由此可見,在沒有設(shè)置 keepalive_timeout情況下,一個socket資源從建立到真正釋放需要經(jīng)過的時間是:建立tcp連接 + 傳送http請求 + php腳本執(zhí)行 + 傳送http響應(yīng) + 關(guān)閉tcp連接 + 2msl 。(注:這里的時間只能做參考,具體的時間主要由網(wǎng)絡(luò)帶寬,和響應(yīng)大小而定)
2.當(dāng)keepalive_timeout時間大于0時,即啟用keep-alive時,一個tcp連接的生命周期。為了便于分析,我們將keepalive_timeout設(shè)置為300s

#tcpdump -n host 218.1.57.236 and port 80
21:38:05.471129 ip 218.1.57.236.54049 > 222.73.211.215.http: s 1669618600:1669618600(0) win 65535
21:38:05.471140 ip 222.73.211.215.http > 218.1.57.236.54049: s 4166993862:4166993862(0) ack 1669618601 win 5840
21:38:05.481731 ip 218.1.57.236.54049 > 222.73.211.215.http: . ack 1 win 32768
21:38:05.481976 ip 218.1.57.236.54049 > 222.73.211.215.http: p 1:797(796) ack 1 win 32768
21:38:05.481985 ip 222.73.211.215.http > 218.1.57.236.54049: . ack 797 win 59
21:38:07.483626 ip 222.73.211.215.http > 218.1.57.236.54049: p 1:326(325) ack 797 win 59
21:38:07.747614 ip 218.1.57.236.54049 > 222.73.211.215.http: . ack 326 win 32605
21:43:07.448454 ip 222.73.211.215.http > 218.1.57.236.54049: f 326:326(0) ack 797 win 59
21:43:07.560316 ip 218.1.57.236.54049 > 222.73.211.215.http: . ack 327 win 32605
21:43:11.759102 ip 218.1.57.236.54049 > 222.73.211.215.http: f 797:797(0) ack 327 win 32605
21:43:11.759111 ip 222.73.211.215.http > 218.1.57.236.54049: . ack 798 win 59

我們先看一下,第6~8行,跟上次示例不一樣的是,服務(wù)端httpd守護(hù)進(jìn)程發(fā)完響應(yīng)后,沒有立即主動關(guān)閉tcp連接。
第8行,結(jié)合第6行,我們可以看到,5分鐘(300s)后,服務(wù)端主動關(guān)閉這個tcp連接。這個時間,正是我們設(shè)置的keepalive_timeout的時間。
由此可見,設(shè)置了keepalive_timout時間情況下,一個socket建立到釋放需要的時間是多了keepalive_timeout時間。
3.當(dāng)keepalive_timeout時間大于0,并且在同一個tcp連接發(fā)送多個http響應(yīng)。這里為了便于分析,我們將keepalive_timeout設(shè)置為180s
通過這個測試,我們想弄清楚,keepalive_timeout是從第一個響應(yīng)結(jié)束開啟計時,還是最后一個響應(yīng)結(jié)束開啟計時。測試結(jié)果證實是后者,這里,我們每隔120s發(fā)一次請求,通過一個tcp連接發(fā)送了3個請求。

# tcpdump -n host 218.1.57.236 and port 80
22:43:57.102448 ip 218.1.57.236.49955 > 222.73.211.215.http: s 4009392741:4009392741(0) win 65535
22:43:57.102527 ip 222.73.211.215.http > 218.1.57.236.49955: s 4036426778:4036426778(0) ack 4009392742 win 5840
22:43:57.111337 ip 218.1.57.236.49955 > 222.73.211.215.http: . ack 1 win 3276822:43:57.111522 ip 218.1.57.236.49955 > 222.73.211.215.http: p 1:797(796) ack 1 win 32768
22:43:57.111530 ip 222.73.211.215.http > 218.1.57.236.49955: . ack 797 win 59
22:43:59.114663 ip 222.73.211.215.http > 218.1.57.236.49955: p 1:326(325) ack 797 win 59
22:43:59.350143 ip 218.1.57.236.49955 > 222.73.211.215.http: . ack 326 win 3260522:45:59.226102 ip 218.1.57.236.49955 > 222.73.211.215.http: p 1593:2389(796) ack 650 win 32443
22:45:59.226109 ip 222.73.211.215.http > 218.1.57.236.49955: . ack 2389 win 83
22:46:01.227187 ip 222.73.211.215.http > 218.1.57.236.49955: p 650:974(324) ack 2389 win 83
22:46:01.450364 ip 218.1.57.236.49955 > 222.73.211.215.http: . ack 974 win 3228122:47:57.377707 ip 218.1.57.236.49955 > 222.73.211.215.http: p 3185:3981(796) ack 1298 win 32119
22:47:57.377714 ip 222.73.211.215.http > 218.1.57.236.49955: . ack 3981 win 108
22:47:59.379496 ip 222.73.211.215.http > 218.1.57.236.49955: p 1298:1622(324) ack 3981 win 108
22:47:59.628964 ip 218.1.57.236.49955 > 222.73.211.215.http: . ack 1622 win 3276822:50:59.358537 ip 222.73.211.215.http > 218.1.57.236.49955: f 1622:1622(0) ack 3981 win 108
22:50:59.367911 ip 218.1.57.236.49955 > 222.73.211.215.http: . ack 1623 win 32768
22:50:59.686527 ip 218.1.57.236.49955 > 222.73.211.215.http: f 3981:3981(0) ack 1623 win 32768
22:50:59.686531 ip 222.73.211.215.http > 218.1.57.236.49955: . ack 3982 win 108

第一組,三個ip包表示tcp三次握手建立連接,由瀏覽器建立。
第二組,發(fā)送第一次http請求并且得到響應(yīng),服務(wù)端守護(hù)進(jìn)程輸出響應(yīng)之后,并沒馬上主動關(guān)閉tcp連接。而是啟動keepalive_timout計時。
第三組,2分鐘后,發(fā)送第二次http請求并且得到響應(yīng),同樣服務(wù)端守護(hù)進(jìn)程也沒有馬上主動關(guān)閉tcp連接,重新啟動keepalive_timout計時。
第四組,又2分鐘后,發(fā)送了第三次http請求并且得到響應(yīng)。服務(wù)器守護(hù)進(jìn)程依然沒有主動關(guān)地閉tcp連接(距第一次http響應(yīng)有4分鐘了,大于keepalive_timeout值),而是重新啟動了keepalive_timout計時。
第五組,跟最后一個響應(yīng)keepalive_timeout(180s)內(nèi),守護(hù)進(jìn)程再沒有收到請求。計時結(jié)束,服務(wù)端守護(hù)進(jìn)程主動關(guān)閉連接。4次揮手后,服務(wù)端進(jìn)入time_wait狀態(tài)。
這說明,當(dāng)設(shè)定了keepalive_timeout,一個socket由建立到釋放,需要時間是:tcp建立 + (最后一個響應(yīng)時間 – 第一個請求時間) + tcp關(guān)閉 + 2msl。紅色加粗表示每一次請求發(fā)送時間、每一次請求腳本執(zhí)行時間、每一次響應(yīng)發(fā)送時間,還有兩兩請求相隔時間。進(jìn)一步測試,正在關(guān)閉或者 time_wait狀態(tài)的tcp連接,不能傳輸http請求和響應(yīng)。即,當(dāng)一個連接結(jié)束keepalive_timeout計時,服務(wù)端守護(hù)進(jìn)程發(fā)送第一 個fin標(biāo)志ip包后,該連接不能再使用了。
http keep-alive與tcp keep-alive
http keep-alive與tcp keep-alive,不是同一回事,意圖不一樣。http keep-alive是為了讓tcp活得更久一點,以便在同一個連接上傳送多個http,提高socket的效率。而tcp keep-alive是tcp的一種檢測tcp連接狀況的保鮮機制。tcp keep-alive保鮮定時器,支持三個系統(tǒng)內(nèi)核配置參數(shù):

echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes

keepalive是tcp保鮮定時器,當(dāng)網(wǎng)絡(luò)兩端建立了tcp連接之后,閑置idle(雙方?jīng)]有任何數(shù)據(jù)流發(fā)送往來)了 tcp_keepalive_time后,服務(wù)器內(nèi)核就會嘗試向客戶端發(fā) 送偵測包,來判斷tcp連接狀況(有可能客戶端崩潰、強制關(guān)閉了應(yīng)用、主機不可達(dá)等等)。如果沒有收到對方的回答(ack包),則會在 tcp_keepalive_intvl后再次嘗試發(fā)送偵測包,直到收到對對方的ack,如果一直沒有收到對方的ack,一共會嘗試 tcp_keepalive_probes次,每次的間隔時間在這里分別是15s, 30s, 45s, 60s, 75s。如果嘗試tcp_keepalive_probes,依然沒有收到對方的ack包,則會丟棄該tcp連接。tcp連接默認(rèn)閑置時間是2小時,一般 設(shè)置為30分鐘足夠了。也就是說,僅當(dāng)nginx的keepalive_timeout值設(shè)置高于tcp_keepalive_time,并且距此tcp連接傳輸?shù)淖詈笠?個http響應(yīng),經(jīng)過了tcp_keepalive_time時間之后,操作系統(tǒng)才會發(fā)送偵測包來決定是否要丟棄這個tcp連接。一般不會出現(xiàn)這種情況, 除非你需要這樣做。
keep-alive與time_wait
使用http keep-alvie,可以減少服務(wù)端time_wait數(shù)量(因為由服務(wù)端httpd守護(hù)進(jìn)程主動關(guān)閉連接)。道理很簡單,相較而言,啟用keep-alive,建立的tcp連接更少了,自然要被關(guān)閉的tcp連接也相應(yīng)更少了。

到此,關(guān)于“Nginx中HTTP的keepalive怎么配置”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI