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