欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Nginx中HTTP的keepalive相關(guān)配置

 更新時間:2016年01月06日 15:42:37   作者:moon  
這篇文章主要介紹了Nginx中HTTP的keepalive相關(guān)配置,以及Nginx的Httpd守護進程相關(guān)的keepalive timeout配置,需要的朋友可以參考下

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

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

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行通過建立的連接發(fā)送第一個http請求,服務(wù)端確認收到請求。用時5μs
第5~6行,可以知道腳本執(zhí)行用時60s1387μs,與php腳本相符。
第6、8行服務(wù)端發(fā)送http響應(yīng)。發(fā)送響應(yīng)用時90166μs。
第7行,表明由服務(wù)端守護進程主動關(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.當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守護進程發(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.當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ù)端守護進程輸出響應(yīng)之后,并沒馬上主動關(guān)閉tcp連接。而是啟動keepalive_timout計時。
第三組,2分鐘后,發(fā)送第二次http請求并且得到響應(yīng),同樣服務(wù)端守護進程也沒有馬上主動關(guān)閉tcp連接,重新啟動keepalive_timout計時。
第四組,又2分鐘后,發(fā)送了第三次http請求并且得到響應(yīng)。服務(wù)器守護進程依然沒有主動關(guān)地閉tcp連接(距第一次http響應(yīng)有4分鐘了,大于keepalive_timeout值),而是重新啟動了keepalive_timout計時。
第五組,跟最后一個響應(yīng)keepalive_timeout(180s)內(nèi),守護進程再沒有收到請求。計時結(jié)束,服務(wù)端守護進程主動關(guān)閉連接。4次揮手后,服務(wù)端進入TIME_WAIT狀態(tài)。
這說明,當設(shè)定了keepalive_timeout,一個socket由建立到釋放,需要時間是:tcp建立 + (最后一個響應(yīng)時間 – 第一個請求時間) + tcp關(guān)閉 + 2MSL。紅色加粗表示每一次請求發(fā)送時間、每一次請求腳本執(zhí)行時間、每一次響應(yīng)發(fā)送時間,還有兩兩請求相隔時間。進一步測試,正在關(guān)閉或者 TIME_WAIT狀態(tài)的tcp連接,不能傳輸http請求和響應(yīng)。即,當一個連接結(jié)束keepalive_timeout計時,服務(wù)端守護進程發(fā)送第一 個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保鮮定時器,支持三個系統(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保鮮定時器,當網(wǎng)絡(luò)兩端建立了TCP連接之后,閑置idle(雙方?jīng)]有任何數(shù)據(jù)流發(fā)送往來)了 tcp_keepalive_time后,服務(wù)器內(nèi)核就會嘗試向客戶端發(fā) 送偵測包,來判斷TCP連接狀況(有可能客戶端崩潰、強制關(guān)閉了應(yīng)用、主機不可達等等)。如果沒有收到對方的回答(ack包),則會在 tcp_keepalive_intvl后再次嘗試發(fā)送偵測包,直到收到對對方的ack,如果一直沒有收到對方的ack,一共會嘗試 tcp_keepalive_probes次,每次的間隔時間在這里分別是15s, 30s, 45s, 60s, 75s。如果嘗試tcp_keepalive_probes,依然沒有收到對方的ack包,則會丟棄該TCP連接。TCP連接默認閑置時間是2小時,一般 設(shè)置為30分鐘足夠了。也就是說,僅當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守護進程主動關(guān)閉連接)。道理很簡單,相較而言,啟用keep-alive,建立的tcp連接更少了,自然要被關(guān)閉的tcp連接也相應(yīng)更少了。
最后
我想用一張示意圖片來說明使用啟用keepalive的不同。另外,http keepalive是客戶端瀏覽器與服務(wù)端httpd守護進程協(xié)作的結(jié)果,所以,我們另外安排篇幅介紹不同瀏覽器的各種情況對keepalive的利用。

201616153500660.png (1000×622)

相關(guān)文章

  • Apache Nginx 禁止目錄執(zhí)行PHP腳本文件的方法

    Apache Nginx 禁止目錄執(zhí)行PHP腳本文件的方法

    這篇文章主要介紹了Apache Nginx 禁止目錄執(zhí)行PHP腳本文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • nginx反向代理踩坑實戰(zhàn)記錄(容器方式)

    nginx反向代理踩坑實戰(zhàn)記錄(容器方式)

    Nginx是一個高性能的HTTP和反向代理web服務(wù)器,同時也提供了IMAP/POP3/SMTP服務(wù),下面這篇文章主要給大家介紹了關(guān)于nginx反向代理踩坑(容器方式)的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Nginx轉(zhuǎn)發(fā)404問題的排查和思考

    Nginx轉(zhuǎn)發(fā)404問題的排查和思考

    本篇文章原自當前業(yè)務(wù)遇到的一個實際問題,因為受到所在網(wǎng)絡(luò)環(huán)境的因素影響,所以整體排查下來耗費了很大精力,記錄一下Nginx 轉(zhuǎn)發(fā) 404 問題的排查和思考,需要的朋友可以參考下
    2023-09-09
  • nginx打印請求頭日志方法(親測可用)

    nginx打印請求頭日志方法(親測可用)

    之前想用nginx打印收到的請求的請求頭,但是只找到打印請求體的,沒有打印請求頭的,本文就來介紹一下nginx打印請求頭日志方法,感興趣的可以了解一下
    2023-11-11
  • 詳解nginx websocket配置

    詳解nginx websocket配置

    這篇文章主要介紹了詳解nginx websocket配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • nginx開啟https配置之后網(wǎng)頁無法訪問的問題處理解決

    nginx開啟https配置之后網(wǎng)頁無法訪問的問題處理解決

    最近新購服務(wù)器部署nginx之后按照之前的方式部署前端項目并配置https之后訪問頁面無法顯示,本文主要介紹了nginx開啟https配置之后網(wǎng)頁無法訪問的問題處理解決,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • 借用nginx.vim工具進行語法高亮和格式化配置nginx.conf文件

    借用nginx.vim工具進行語法高亮和格式化配置nginx.conf文件

    今天小編就為大家分享一篇關(guān)于借用nginx.vim工具進行語法高亮和格式化配置nginx.conf文件,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 使用nginx部署前端項目的實現(xiàn)

    使用nginx部署前端項目的實現(xiàn)

    前端項目的部署以前一直是把靜態(tài)資源放到后端工程中,隨后端部署一起部署,本文主要介紹了使用nginx部署前端項目的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 基于Nginx的衍生版服務(wù)器Tengine簡介

    基于Nginx的衍生版服務(wù)器Tengine簡介

    這篇文章主要介紹了基于Nginx的衍生版服務(wù)器Tengine簡介,本文講解了Nginx的特性、Tengine的特性、架構(gòu)和擴展性等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • nginx各種代理配置大全

    nginx各種代理配置大全

    本文主要介紹了nginx各種代理配置大全,主要包括了路徑配置,http跳轉(zhuǎn)https,微信支付的校驗等,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09

最新評論