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

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

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

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

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

1.當(dāng)keepalive_timeout時(shí)間為0時(shí),即不啟用Keep-Alive時(shí),一個(gè)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三次握手,建立連接。用時(shí)8898μs
第4~5行通過(guò)建立的連接發(fā)送第一個(gè)http請(qǐng)求,服務(wù)端確認(rèn)收到請(qǐng)求。用時(shí)5μs
第5~6行,可以知道腳本執(zhí)行用時(shí)60s1387μs,與php腳本相符。
第6、8行服務(wù)端發(fā)送http響應(yīng)。發(fā)送響應(yīng)用時(shí)90166μs。
第7行,表明由服務(wù)端守護(hù)進(jìn)程主動(dòng)關(guān)閉連接。結(jié)合第6、8行,說(shuō)明http響應(yīng)一旦發(fā)送完畢,服務(wù)端馬上關(guān)閉這個(gè)tcp連接
第7、9、10說(shuō)明tcp連接順序關(guān)閉,用時(shí)90963μs。需要注意,這里socket資源并沒(méi)有立即釋放,需要等待2MSL時(shí)間(60s)后才被真正釋放。
由此可見(jiàn),在沒(méi)有設(shè)置 keepalive_timeout情況下,一個(gè)socket資源從建立到真正釋放需要經(jīng)過(guò)的時(shí)間是:建立tcp連接 + 傳送http請(qǐng)求 + php腳本執(zhí)行 + 傳送http響應(yīng) + 關(guān)閉tcp連接 + 2MSL 。(注:這里的時(shí)間只能做參考,具體的時(shí)間主要由網(wǎng)絡(luò)帶寬,和響應(yīng)大小而定)
2.當(dāng)keepalive_timeout時(shí)間大于0時(shí),即啟用Keep-Alive時(shí),一個(gè)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)后,沒(méi)有立即主動(dòng)關(guān)閉tcp連接。
第8行,結(jié)合第6行,我們可以看到,5分鐘(300s)后,服務(wù)端主動(dòng)關(guān)閉這個(gè)tcp連接。這個(gè)時(shí)間,正是我們?cè)O(shè)置的keepalive_timeout的時(shí)間。
由此可見(jiàn),設(shè)置了keepalive_timout時(shí)間情況下,一個(gè)socket建立到釋放需要的時(shí)間是多了keepalive_timeout時(shí)間。
3.當(dāng)keepalive_timeout時(shí)間大于0,并且在同一個(gè)tcp連接發(fā)送多個(gè)http響應(yīng)。這里為了便于分析,我們將keepalive_timeout設(shè)置為180s
通過(guò)這個(gè)測(cè)試,我們想弄清楚,keepalive_timeout是從第一個(gè)響應(yīng)結(jié)束開(kāi)啟計(jì)時(shí),還是最后一個(gè)響應(yīng)結(jié)束開(kāi)啟計(jì)時(shí)。測(cè)試結(jié)果證實(shí)是后者,這里,我們每隔120s發(fā)一次請(qǐng)求,通過(guò)一個(gè)tcp連接發(fā)送了3個(gè)請(qǐng)求。

# 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

第一組,三個(gè)ip包表示tcp三次握手建立連接,由瀏覽器建立。
第二組,發(fā)送第一次http請(qǐng)求并且得到響應(yīng),服務(wù)端守護(hù)進(jìn)程輸出響應(yīng)之后,并沒(méi)馬上主動(dòng)關(guān)閉tcp連接。而是啟動(dòng)keepalive_timout計(jì)時(shí)。
第三組,2分鐘后,發(fā)送第二次http請(qǐng)求并且得到響應(yīng),同樣服務(wù)端守護(hù)進(jìn)程也沒(méi)有馬上主動(dòng)關(guān)閉tcp連接,重新啟動(dòng)keepalive_timout計(jì)時(shí)。
第四組,又2分鐘后,發(fā)送了第三次http請(qǐng)求并且得到響應(yīng)。服務(wù)器守護(hù)進(jìn)程依然沒(méi)有主動(dòng)關(guān)地閉tcp連接(距第一次http響應(yīng)有4分鐘了,大于keepalive_timeout值),而是重新啟動(dòng)了keepalive_timout計(jì)時(shí)。
第五組,跟最后一個(gè)響應(yīng)keepalive_timeout(180s)內(nèi),守護(hù)進(jìn)程再?zèng)]有收到請(qǐng)求。計(jì)時(shí)結(jié)束,服務(wù)端守護(hù)進(jìn)程主動(dòng)關(guān)閉連接。4次揮手后,服務(wù)端進(jìn)入TIME_WAIT狀態(tài)。
這說(shuō)明,當(dāng)設(shè)定了keepalive_timeout,一個(gè)socket由建立到釋放,需要時(shí)間是:tcp建立 + (最后一個(gè)響應(yīng)時(shí)間 – 第一個(gè)請(qǐng)求時(shí)間) + tcp關(guān)閉 + 2MSL。紅色加粗表示每一次請(qǐng)求發(fā)送時(shí)間、每一次請(qǐng)求腳本執(zhí)行時(shí)間、每一次響應(yīng)發(fā)送時(shí)間,還有兩兩請(qǐng)求相隔時(shí)間。進(jìn)一步測(cè)試,正在關(guān)閉或者 TIME_WAIT狀態(tài)的tcp連接,不能傳輸http請(qǐng)求和響應(yīng)。即,當(dāng)一個(gè)連接結(jié)束keepalive_timeout計(jì)時(shí),服務(wù)端守護(hù)進(jìn)程發(fā)送第一 個(gè)FIN標(biāo)志ip包后,該連接不能再使用了。
http keep-alive與tcp keep-alive
http keep-alive與tcp keep-alive,不是同一回事,意圖不一樣。http keep-alive是為了讓tcp活得更久一點(diǎn),以便在同一個(gè)連接上傳送多個(gè)http,提高socket的效率。而tcp keep-alive是TCP的一種檢測(cè)TCP連接狀況的保鮮機(jī)制。tcp keep-alive保鮮定時(shí)器,支持三個(gè)系統(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保鮮定時(shí)器,當(dāng)網(wǎng)絡(luò)兩端建立了TCP連接之后,閑置idle(雙方?jīng)]有任何數(shù)據(jù)流發(fā)送往來(lái))了 tcp_keepalive_time后,服務(wù)器內(nèi)核就會(huì)嘗試向客戶端發(fā) 送偵測(cè)包,來(lái)判斷TCP連接狀況(有可能客戶端崩潰、強(qiáng)制關(guān)閉了應(yīng)用、主機(jī)不可達(dá)等等)。如果沒(méi)有收到對(duì)方的回答(ack包),則會(huì)在 tcp_keepalive_intvl后再次嘗試發(fā)送偵測(cè)包,直到收到對(duì)對(duì)方的ack,如果一直沒(méi)有收到對(duì)方的ack,一共會(huì)嘗試 tcp_keepalive_probes次,每次的間隔時(shí)間在這里分別是15s, 30s, 45s, 60s, 75s。如果嘗試tcp_keepalive_probes,依然沒(méi)有收到對(duì)方的ack包,則會(huì)丟棄該TCP連接。TCP連接默認(rèn)閑置時(shí)間是2小時(shí),一般 設(shè)置為30分鐘足夠了。也就是說(shuō),僅當(dāng)nginx的keepalive_timeout值設(shè)置高于tcp_keepalive_time,并且距此tcp連接傳輸?shù)淖詈笠?個(gè)http響應(yīng),經(jīng)過(guò)了tcp_keepalive_time時(shí)間之后,操作系統(tǒng)才會(huì)發(fā)送偵測(cè)包來(lái)決定是否要丟棄這個(gè)TCP連接。一般不會(huì)出現(xiàn)這種情況, 除非你需要這樣做。
keep-alive與TIME_WAIT
使用http keep-alvie,可以減少服務(wù)端TIME_WAIT數(shù)量(因?yàn)橛煞?wù)端httpd守護(hù)進(jìn)程主動(dòng)關(guān)閉連接)。道理很簡(jiǎn)單,相較而言,啟用keep-alive,建立的tcp連接更少了,自然要被關(guān)閉的tcp連接也相應(yīng)更少了。
最后
我想用一張示意圖片來(lái)說(shuō)明使用啟用keepalive的不同。另外,http keepalive是客戶端瀏覽器與服務(wù)端httpd守護(hù)進(jìn)程協(xié)作的結(jié)果,所以,我們另外安排篇幅介紹不同瀏覽器的各種情況對(duì)keepalive的利用。

201616153500660.png (1000×622)

相關(guān)文章

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

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

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

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

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

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

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

    nginx打印請(qǐng)求頭日志方法(親測(cè)可用)

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

    詳解nginx websocket配置

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

    nginx開(kāi)啟https配置之后網(wǎng)頁(yè)無(wú)法訪問(wèn)的問(wèn)題處理解決

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

    借用nginx.vim工具進(jìn)行語(yǔ)法高亮和格式化配置nginx.conf文件

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

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

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

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

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

    nginx各種代理配置大全

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

最新評(píng)論