日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Nginx >内容正文

Nginx

Nginx的keeplive

發(fā)布時(shí)間:2023/12/10 Nginx 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nginx的keeplive 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

keepalive

當(dāng)然,在nginx中,對(duì)于http1.0與http1.1也是支持長(zhǎng)連接的。

什么是長(zhǎng)連接呢?我們知道,http請(qǐng)求是基于TCP協(xié)議之上的,那么,當(dāng)客戶(hù)端在發(fā)起請(qǐng)求前,需要先與服務(wù)端建立TCP連接,而每一次的TCP連接是需要三次握手來(lái)確定的,如果客戶(hù)端與服務(wù)端之間網(wǎng)絡(luò)差一點(diǎn),這三次交互消費(fèi)的時(shí)間會(huì)比較多,而且三次交互也會(huì)帶來(lái)網(wǎng)絡(luò)流量。當(dāng)然,當(dāng)連接斷開(kāi)后,也會(huì)有四次的交互,當(dāng)然對(duì)用戶(hù)體驗(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就需要客戶(hù)端在請(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)度的確定:

  • 對(duì)于http1.0協(xié)議來(lái)說(shuō),如果響應(yīng)頭中有content-length頭,則以content-length的長(zhǎng)度就可以知道body的長(zhǎng)度了,客戶(hù)端在接收body時(shí),就可以依照這個(gè)長(zhǎng)度來(lái)接收數(shù)據(jù),接收完后,就表示這個(gè)請(qǐng)求完成了。而如果沒(méi)有content-length頭,則客戶(hù)端會(huì)一直接收數(shù)據(jù),直到服務(wù)端主動(dòng)斷開(kāi)連接,才表示body接收完了。
  • 而對(duì)于http1.1協(xié)議來(lái)說(shuō),如果響應(yīng)頭中的Transfer-encoding為chunked傳輸,則表示body是流式輸出,body會(huì)被分成多個(gè)塊,每塊的開(kāi)始會(huì)標(biāo)識(shí)出當(dāng)前塊的長(zhǎng)度,此時(shí),body不需要通過(guò)長(zhǎng)度來(lái)指定。如果是非chunked傳輸,而且有content-length,則按照content-length來(lái)接收數(shù)據(jù)。否則,如果是非chunked,并且沒(méi)有content-length,則客戶(hù)端接收數(shù)據(jù),直到服務(wù)端主動(dòng)斷開(kāi)連接。
  • 從上面,我們可以看到,除了http1.0不帶content-length以及http1.1非chunked不帶content-length外,body的長(zhǎng)度是可知的。此時(shí),當(dāng)服務(wù)端在輸出完body之后,會(huì)可以考慮使用長(zhǎng)連接。能否使用長(zhǎng)連接,也是有條件限制的。如果客戶(hù)端的請(qǐng)求頭中的connection為close,則表示客戶(hù)端需要關(guān)掉長(zhǎng)連接,如果為keep-alive,則客戶(hù)端需要打開(kāi)長(zhǎng)連接,如果客戶(hù)端的請(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屬性,然后等待客戶(hù)端下一次請(qǐng)求。

    當(dāng)然,nginx不可能一直等待下去,如果客戶(hù)端一直不發(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,客戶(hù)端的connection不管是close還是keepalive,都會(huì)強(qiáng)制為close。

    如果服務(wù)端最后的決定是keepalive打開(kāi),那么在響應(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)客戶(hù)端的一次訪問(wèn),需要多次訪問(wèn)同一個(gè)server時(shí),打開(kāi)keepalive的優(yōu)勢(shì)非常大,比如圖片服務(wù)器,通常一個(gè)網(wǎng)頁(yè)會(huì)包含很多個(gè)圖片。打開(kāi)keepalive也會(huì)大量減少time-wait的數(shù)量。



    作者:JokerW
    鏈接:https://www.jianshu.com/p/630e2e1ca57f
    來(lái)源:簡(jiǎn)書(shū)
    簡(jiǎn)書(shū)著作權(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。