中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Nginx中HTTP的keepalive怎么配置

發布時間:2022-04-29 16:31:50 來源:億速云 閱讀:208 作者:iii 欄目:大數據

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

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

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

1.當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行通過建立的連接發送第一個http請求,服務端確認收到請求。用時5μs
第5~6行,可以知道腳本執行用時60s1387μs,與php腳本相符。
第6、8行服務端發送http響應。發送響應用時90166μs。
第7行,表明由服務端守護進程主動關閉連接。結合第6、8行,說明http響應一旦發送完畢,服務端馬上關閉這個tcp連接
第7、9、10說明tcp連接順序關閉,用時90963μs。需要注意,這里socket資源并沒有立即釋放,需要等待2msl時間(60s)后才被真正釋放。
由此可見,在沒有設置 keepalive_timeout情況下,一個socket資源從建立到真正釋放需要經過的時間是:建立tcp連接 + 傳送http請求 + php腳本執行 + 傳送http響應 + 關閉tcp連接 + 2msl 。(注:這里的時間只能做參考,具體的時間主要由網絡帶寬,和響應大小而定)
2.當keepalive_timeout時間大于0時,即啟用keep-alive時,一個tcp連接的生命周期。為了便于分析,我們將keepalive_timeout設置為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行,跟上次示例不一樣的是,服務端httpd守護進程發完響應后,沒有立即主動關閉tcp連接。
第8行,結合第6行,我們可以看到,5分鐘(300s)后,服務端主動關閉這個tcp連接。這個時間,正是我們設置的keepalive_timeout的時間。
由此可見,設置了keepalive_timout時間情況下,一個socket建立到釋放需要的時間是多了keepalive_timeout時間。
3.當keepalive_timeout時間大于0,并且在同一個tcp連接發送多個http響應。這里為了便于分析,我們將keepalive_timeout設置為180s
通過這個測試,我們想弄清楚,keepalive_timeout是從第一個響應結束開啟計時,還是最后一個響應結束開啟計時。測試結果證實是后者,這里,我們每隔120s發一次請求,通過一個tcp連接發送了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三次握手建立連接,由瀏覽器建立。
第二組,發送第一次http請求并且得到響應,服務端守護進程輸出響應之后,并沒馬上主動關閉tcp連接。而是啟動keepalive_timout計時。
第三組,2分鐘后,發送第二次http請求并且得到響應,同樣服務端守護進程也沒有馬上主動關閉tcp連接,重新啟動keepalive_timout計時。
第四組,又2分鐘后,發送了第三次http請求并且得到響應。服務器守護進程依然沒有主動關地閉tcp連接(距第一次http響應有4分鐘了,大于keepalive_timeout值),而是重新啟動了keepalive_timout計時。
第五組,跟最后一個響應keepalive_timeout(180s)內,守護進程再沒有收到請求。計時結束,服務端守護進程主動關閉連接。4次揮手后,服務端進入time_wait狀態。
這說明,當設定了keepalive_timeout,一個socket由建立到釋放,需要時間是:tcp建立 + (最后一個響應時間 – 第一個請求時間) + tcp關閉 + 2msl。紅色加粗表示每一次請求發送時間、每一次請求腳本執行時間、每一次響應發送時間,還有兩兩請求相隔時間。進一步測試,正在關閉或者 time_wait狀態的tcp連接,不能傳輸http請求和響應。即,當一個連接結束keepalive_timeout計時,服務端守護進程發送第一 個fin標志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保鮮定時器,支持三個系統內核配置參數:

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

到此,關于“Nginx中HTTP的keepalive怎么配置”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

财经| 曲松县| 沂水县| 武冈市| 罗平县| 治多县| 靖远县| 保山市| 邳州市| 炉霍县| 泌阳县| 保定市| 贵定县| 武安市| 蒙山县| 莎车县| 邓州市| 丹棱县| 仁化县| 南部县| 龙州县| 苍梧县| 茌平县| 卢氏县| 大名县| 合阳县| 潼关县| 许昌市| 宿州市| 和田市| 黔江区| 辽阳县| 南涧| 洛阳市| 凉山| 恩施市| 如东县| 云阳县| 中宁县| 东辽县| 无棣县|