nginx反向代理下的長連接實(shí)現(xiàn)
一、nginx使用場景
大型應(yīng)用架構(gòu)中,一般會(huì)使用nginx反向代理,分為三層:
1.調(diào)用層,瀏覽器或APP;
2.中間層,反向代理nginx;
3.服務(wù)層,server一般是apche、tomcat
請求調(diào)用過程:
1.瀏覽器/app發(fā)起請求
2.DNS解析網(wǎng)址為ip地址
3.通過外網(wǎng)ip訪問nginx
4.nginx發(fā)送請求給內(nèi)網(wǎng)ip的server
上面架構(gòu),要想支持全鏈路的長連接,需要做到兩點(diǎn):
1.從client到nginx的連接是長連接;
2.從nginx到server的連接是長連接;
二、長連接設(shè)置
1.client到nginx的長連接:
由于目前瀏覽器默認(rèn)使用HTTP/1.1,請求header中默認(rèn)設(shè)置Connection:keep-alive,所以只需在nginx配置中做如下配置:
http { keepalive_timeount 120s 120s; keepalive_requests 10000; }
#語法
keepalive_timeout timeout [header_timeout]
第一個(gè)參數(shù)(timeout):設(shè)置keep_alive客戶端(瀏覽器)連接在服務(wù)端(nginx端)保持開啟的超時(shí)值(默認(rèn)75s);值為0會(huì)禁用keep_alive客戶端連接;
第二個(gè)參數(shù)(header_timeout):可選,在響應(yīng)的header中設(shè)置值“Keep-Alive:timeout=time”;通??梢圆挥迷O(shè)置;
keepalive_requests這個(gè)配置項(xiàng)用于設(shè)置一個(gè)keep-alive連接上可以服務(wù)的請求最大數(shù)量,當(dāng)達(dá)到配置的最大請求數(shù)時(shí),連接會(huì)被關(guān)閉,默認(rèn)值為100.具體過程時(shí)指一個(gè)keep-alive連接建立之后,nginx會(huì)為這個(gè)連接設(shè)置一個(gè)計(jì)數(shù)器,記錄這個(gè)長連接上已經(jīng)接收并處理的客戶端請求的數(shù)量,一旦達(dá)到設(shè)置的最大值時(shí),nginx會(huì)強(qiáng)行關(guān)閉這個(gè)長連接,此時(shí)如果客戶端有新請求,就需要重新建立新的長連接。
注:在QPS較高的場景下,服務(wù)端需要將keepalive_requests設(shè)置大一些,默認(rèn)數(shù)值就不夠了,否則服務(wù)端可能會(huì)出現(xiàn)大量的TIME_WAIT狀態(tài)的TCP連接數(shù)異常!另外nginx(version 1.15.3)在Upstream內(nèi)增加了keepalive_requests配置項(xiàng),默認(rèn)值也是100,也是需要手動(dòng)設(shè)置,而且這兩個(gè)數(shù)量可以不一致,一般服務(wù)端要設(shè)置的大些,因?yàn)槎鄶?shù)情況是一個(gè)nginx代理對(duì)應(yīng)多個(gè)服務(wù)端。
2.nginx和server的長連接
默認(rèn)情況下,nginx訪問后端都是用的短連接(HTTP/1.0)一個(gè)請求來了,nginx會(huì)新開一個(gè)端口和后端建立連接,后端執(zhí)行完畢后主動(dòng)關(guān)閉該tcp連接。為了讓nginx和后端server(nginx稱之為upstream)之間保持長連接,典型設(shè)置如下:
http { upstream http_backend { server 192.168.2.154:8080; server 192.168.2.109:8080; keepalive 32; # 長連接緩存池大小為32 keepalive_timeout 120s; # 長連接失效時(shí)間 keepalive_requests 2000; # 每條長連接最大復(fù)用請求數(shù)為2000 } server { location /http/ { proxy_pass http://http_backend; proxy_http_version 1.1; # 啟用HTTP/1.1版本與被代理服務(wù)器建立連接 proxy_set_header Connection "Keep-Alive"; # 設(shè)置發(fā)送被代理服務(wù)器請求頭屬性字段Connection } }
nginx 與被代理服務(wù)器間建立的長連接是通過啟用 HTTP/1.1 版本協(xié)議實(shí)現(xiàn)的。由于 HTTP 代理模塊默認(rèn)會(huì)將發(fā)往被代理服務(wù)器的請求頭屬性字段 Connection 的值設(shè)置為 Close,因此需要通過配置指令設(shè)置請求頭屬性字段 Connection 的內(nèi)容為“Keep-Alive”或者空值。
另外upstream中的keepalive_timeout和keepalive_requests參數(shù)與上面的含義一樣,不做過多解析,需要重點(diǎn)關(guān)注keepalive參數(shù),他的含義是指設(shè)置到upstream服務(wù)器的空閑keepalive連接的最大數(shù),當(dāng)這個(gè)數(shù)量被突破時(shí),最近最少使用的連接將被關(guān)閉,另外這個(gè)參數(shù)不會(huì)限制一個(gè)nginx worker進(jìn)程到upstream服務(wù)器連接的總數(shù)量,有點(diǎn)像線程池中的核心線程數(shù)。
注:keepalive參數(shù)設(shè)置一定要合理,尤其對(duì)于QPS比較高的場景,推薦做一下估算,根據(jù)QPS和平均響應(yīng)時(shí)間大概計(jì)算出需要長連接的數(shù)量,盡量避免系統(tǒng)運(yùn)行時(shí)產(chǎn)生連接數(shù)量的反復(fù)震蕩,比如keepalive設(shè)置為10,前一秒系統(tǒng)qps較低,只需50個(gè)長連接,用完立馬關(guān)閉其中50-10=40個(gè)連接,而后一秒系統(tǒng)qps突增,需要150個(gè)連接,空缺了150-10=140個(gè)連接,此時(shí)nginx不得不新建140個(gè)新連接來滿足要求。
三、問題總結(jié)
綜上所述,nginx反向代理的情況下,tcp長連接設(shè)置完成。在實(shí)際系統(tǒng)應(yīng)用長連接的場景中,可能會(huì)出現(xiàn)大量TIME_WAIT的情況,這里簡單做個(gè)總結(jié):
1.導(dǎo)致nginx端出現(xiàn)大量TIME_WAIT的情況有兩種:
a.keepalive_requests設(shè)置比較小,高并發(fā)下超過此值后nginx會(huì)強(qiáng)制關(guān)閉和客戶端的長連接;(主動(dòng)關(guān)閉連接后導(dǎo)致nginx出現(xiàn)TIME_WAIT)
b.keepalive設(shè)置比較?。臻e數(shù)太小),導(dǎo)致高并發(fā)下nginx會(huì)頻繁出現(xiàn)連接數(shù)震蕩,不停的關(guān)閉、開啟和后端server的長連接;
2.導(dǎo)致后端server端出現(xiàn)大量TIME_WAIT的情況:
nginx沒有打開和后端的長連接,即:沒有設(shè)置proxy_http_version 1.1和proxy_set_header Connection "Keep-Alive",從而導(dǎo)致后端server每次請求后就關(guān)閉連接,高并發(fā)下就會(huì)出現(xiàn)server端的大量TIME_WAIT.
到此這篇關(guān)于nginx反向代理下的長連接實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)nginx反向代理長連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx日志導(dǎo)入elasticsearch的方法示例
這篇文章主要介紹了nginx日志導(dǎo)入elasticsearch的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Nginx結(jié)合keepalived實(shí)現(xiàn)集群
本文主要介紹了Nginx結(jié)合keepalived實(shí)現(xiàn)集群,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05Nginx配合php實(shí)現(xiàn)生成實(shí)時(shí)縮略圖功能
這篇文章主要介紹了Nginx配合php實(shí)現(xiàn)生成實(shí)時(shí)縮略圖功能,這在一些特殊場合可能會(huì)要用到,需要的朋友可以參考下2014-10-10