Nginx的keeplive
keepalive
當(dāng)然,在nginx中,對(duì)于http1.0與http1.1也是支持長(zhǎng)連接的。
什么是長(zhǎng)連接呢?我們知道,http請(qǐng)求是基于TCP協(xié)議之上的,那么,當(dāng)客戶端在發(fā)起請(qǐng)求前,需要先與服務(wù)端建立TCP連接,而每一次的TCP連接是需要三次握手來(lái)確定的,如果客戶端與服務(wù)端之間網(wǎng)絡(luò)差一點(diǎn),這三次交互消費(fèi)的時(shí)間會(huì)比較多,而且三次交互也會(huì)帶來(lái)網(wǎng)絡(luò)流量。當(dāng)然,當(dāng)連接斷開后,也會(huì)有四次的交互,當(dāng)然對(duì)用戶體驗(yàn)來(lái)說(shuō)就不重要了。而http請(qǐng)求是請(qǐng)求應(yīng)答式的,如果我們能知道每個(gè)請(qǐng)求頭與響應(yīng)體的長(zhǎng)度,那么我們是可以在一個(gè)連接上面執(zhí)行多個(gè)請(qǐng)求的,這就是所謂的長(zhǎng)連接,但前提條件是我們先得確定請(qǐng)求頭與響應(yīng)體的長(zhǎng)度。
對(duì)于請(qǐng)求來(lái)說(shuō),如果當(dāng)前請(qǐng)求需要有body,如POST請(qǐng)求,那么nginx就需要客戶端在請(qǐng)求頭中指定content-length來(lái)表明body的大小,否則返回400錯(cuò)誤。也就是說(shuō),請(qǐng)求體的長(zhǎng)度是確定的,那么響應(yīng)體的長(zhǎng)度呢?先來(lái)看看http協(xié)議中關(guān)于響應(yīng)body長(zhǎng)度的確定:
從上面,我們可以看到,除了http1.0不帶content-length以及http1.1非chunked不帶content-length外,body的長(zhǎng)度是可知的。此時(shí),當(dāng)服務(wù)端在輸出完body之后,會(huì)可以考慮使用長(zhǎng)連接。能否使用長(zhǎng)連接,也是有條件限制的。如果客戶端的請(qǐng)求頭中的connection為close,則表示客戶端需要關(guān)掉長(zhǎng)連接,如果為keep-alive,則客戶端需要打開長(zhǎng)連接,如果客戶端的請(qǐng)求中沒(méi)有connection這個(gè)頭,那么根據(jù)協(xié)議,如果是http1.0,則默認(rèn)為close,如果是http1.1,則默認(rèn)為keep-alive。如果結(jié)果為keepalive,那么,nginx在輸出完響應(yīng)體后,會(huì)設(shè)置當(dāng)前連接的keepalive屬性,然后等待客戶端下一次請(qǐng)求。
當(dāng)然,nginx不可能一直等待下去,如果客戶端一直不發(fā)數(shù)據(jù)過(guò)來(lái),豈不是一直占用這個(gè)連接?所以當(dāng)nginx設(shè)置了keepalive等待下一次的請(qǐng)求時(shí),同時(shí)也會(huì)設(shè)置一個(gè)最大等待時(shí)間,這個(gè)時(shí)間是通過(guò)選項(xiàng)keepalive_timeout來(lái)配置的,如果配置為0,則表示關(guān)掉keepalive,此時(shí),http版本無(wú)論是1.1還是1.0,客戶端的connection不管是close還是keepalive,都會(huì)強(qiáng)制為close。
如果服務(wù)端最后的決定是keepalive打開,那么在響應(yīng)的http頭里面,也會(huì)包含有connection頭域,其值是”Keep-Alive”,否則就是”Close”。如果connection值為close,那么在nginx響應(yīng)完數(shù)據(jù)后,會(huì)主動(dòng)關(guān)掉連接。所以,對(duì)于請(qǐng)求量比較大的nginx來(lái)說(shuō),關(guān)掉keepalive最后會(huì)產(chǎn)生比較多的time-wait狀態(tài)的socket。一般來(lái)說(shuō),當(dāng)客戶端的一次訪問(wèn),需要多次訪問(wèn)同一個(gè)server時(shí),打開keepalive的優(yōu)勢(shì)非常大,比如圖片服務(wù)器,通常一個(gè)網(wǎng)頁(yè)會(huì)包含很多個(gè)圖片。打開keepalive也會(huì)大量減少time-wait的數(shù)量。
作者:JokerW
鏈接:https://www.jianshu.com/p/630e2e1ca57f
來(lái)源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。
轉(zhuǎn)載于:https://www.cnblogs.com/AKUN-FYK/p/11129230.html
總結(jié)
以上是生活随笔為你收集整理的Nginx的keeplive的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Git实践
- 下一篇: 【数据结构与算法】复杂度分析