Nginx重要概念之keepalive
什么是keepalive?
keepalive是長連接的意思。客戶端發(fā)起http請求前需要先與服務(wù)端建立TCP連接,每次TCP連接都需要三次握手來確定,三次交互不僅會增加消費時間,還會增加網(wǎng)絡(luò)流量。http請求是請求應(yīng)答式,如果能知道每個請求頭與響應(yīng)體的長度,就可以在一個連接上執(zhí)行多個請求,這個就是所謂的長連接。
如何確定請求頭和響應(yīng)體的長度?
1、請求頭長度:如果當(dāng)前請求有body,Nginx需要客戶端在請求頭中指定content-length來表明body的大小,否則返回400。
2、響應(yīng)體長度:在http協(xié)議中響應(yīng)body長度的確定
http1.0:①響應(yīng)頭中有content-length,content-length即為body長度。客服端依照這個長度接收數(shù)據(jù),接收完了就表示請求完成。②響應(yīng)頭中沒有content-length,客戶端會一直接收數(shù)據(jù),知道服務(wù)端主動斷開,才表示body接收完了。
http1.1:①chunked傳輸,響應(yīng)頭中有Transfer-encoding,body為流式輸出,body被分成多個塊,每塊的開始會標(biāo)識出當(dāng)前塊的長度,此時body不需要通過長度指定。②非chunked傳輸,響應(yīng)頭中有content-length則按照content-length來接收數(shù)據(jù),沒有content-length,則客戶端接收數(shù)據(jù),知道服務(wù)器主動斷開。
除了以上綠色字的情況,響應(yīng)體長度都是可知的。
是否可使用長連接的條件是什么?
可知響應(yīng)體長度的情況下,當(dāng)服務(wù)器輸出完body后可以考慮使用長連接。長連接的條件限制如下
客服端的請求頭中的connection為close,則客戶端要求不使用長連接。
客戶端的請求頭中的connection為keep-alive,則客戶端要求使用長連接。
客戶端的請求頭中沒有connection這個頭,如果是http1.0協(xié)議默認為close,如果是http1.1協(xié)議默認為keep-alive。
keepalive時Nginx的等待時長是多少?
長連接時,Nginx在輸出完響應(yīng)體后,會設(shè)置當(dāng)前連接的keepalive屬性,然后等待客戶端的下一次請求,同時也設(shè)置了一個最大等待時間,這個時間通過keepalive_timeout來配置,如果是0,則表示關(guān)掉長連接,此時不管客戶端的connection值是什么都會強制設(shè)為close。
keepalive的優(yōu)勢是什么?
服務(wù)端確定是keepalive打開時,在響應(yīng)的http頭中也會有connection=Keep-Alive,否則為Close。如果connection值為colse,Nginx在響應(yīng)完數(shù)據(jù)后就會關(guān)掉連接。所以對于請求量較大的Nginx來說,關(guān)掉keepalive最后會產(chǎn)生較多的time-wait狀態(tài)的socket。當(dāng)客戶端的一次訪問需要多次訪問同一個server時,keepalive會大量減少time-wait的數(shù)量,
以上總結(jié)參考https://mp.weixin.qq.com/s/bXtI45d7M-XjkJH3ARZiMQ
總結(jié)
以上是生活随笔為你收集整理的Nginx重要概念之keepalive的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apache ignite系列(四):持
- 下一篇: Penetration Test