Nginx與Upstream之間產(chǎn)生大量TIME_WAIT連接的解決辦法

1. 現(xiàn)象

Nginx反向代理了一個Java服務伟葫,QPS大概是200,問題發(fā)生時的Nginx配置:

location / {
    proxy_pass http://192.168.3.4:18600;
}

在上游Java服務器上可以觀察到大量(約2000個)的TIME_WAIT狀態(tài)的網(wǎng)絡連接


image.png

從Nginx的error日志中還發(fā)現(xiàn)與Java服務器建立連接偶發(fā)失敗的情況:


 [error] 9208#0: *32907 connect() failed (111: Connection refused) while connecting to upstream, client: **.**.**.**, server: localhost, request: "POST /api HTTP/1.1", upstream: "http://**.**.**.**:18600/api", host: "**.**.**.**:8080"

2. 原因

由于QPS較高怖现,Nginx與上游Java服務器建立的都是Http短連接冻晤,需要不停的創(chuàng)建和關(guān)閉TCP連接。而主動關(guān)閉TCP連接的一方需要等2MSL之后才會真正釋放TCP連接感局,在2MSL之前連接的狀態(tài)都是TIME_WAIT胚想。

參考:TIME_WAIT狀態(tài)產(chǎn)生的原因琐凭、過多的危害_愛吃芝麻球的博客-CSDN博客_time_wait連接過多的原因

由于每次上游Java服務在發(fā)送完響應報文后主動關(guān)閉了連接,所以作為主動關(guān)閉連接的一方浊服,當并發(fā)量較高時就會產(chǎn)生大量的TIME_WAIT狀態(tài)的連接统屈。

3. 解決辦法

解決的辦法就是讓Nginx與上游Java服務器之間通過Http 1.1的 Keepalive協(xié)議重用TCP連接,減少TCP連接數(shù)量
第一步: 修改location模塊牙躺,添加http 1.1 協(xié)議頭

location / {
    proxy_pass http://192.168.3.4:18600;
    
    # 添加http 1.1 協(xié)議頭愁憔,這樣上游Java服務就會啟用keepalive,不會主動關(guān)閉TCP連接了
   proxy_http_version 1.1;
   proxy_set_header Connection "";
}

修改nginx配置重新生效后孽拷,發(fā)現(xiàn)上游Java服務器上的TIME_WAIT連接少了吨掌,但是Nginx服務器到上游Java服務器的TIME_WAIT連接卻變多了。

原因在于Nginx自身沒有復用到上游Java服務器的TCP連接乓搬,每次收到完整的響應報文之后就關(guān)閉連接了思犁。

而這一次Nginx服務作為主動關(guān)閉TCP連接的一方代虾,所以從Nginx服務器上TIME_WAIT的連接變多了进肯。

第二步: 讓Nginx主動重用TCP連接
Nginx的upstream模塊中也有一個keepalive參數(shù),但是這個參數(shù)與http協(xié)議中的keepalive參數(shù)的意義完全不同棉磨,upstream中的keepalive參數(shù)表示與上游服務建立的連接可以空閑的最大數(shù)量江掩。

即如果在upstream模塊中配置了keepalive參數(shù),那么Nginx與上游服務之間建立的TCP連接就有了一個緩沖的池子,不再是用完立即釋放了环形,而是可以有一個緩沖的池子可以放進去策泣。keepalive參數(shù)的含義就是這個緩沖池子的最大值
參考:長連接 · Nginx 學習筆記 (gitbooks.io)

所以單獨提取出一個upstream模塊,并設(shè)置keepalive參數(shù)

upstream java_server {
    server 192.168.3.4:18600;
    
    # 設(shè)置可復用的tcp連接的空閑數(shù)量的最大值
    keepalive 50;
}

location / {
    proxy_pass http://java_server;
    
    # 添加http 1.1 協(xié)議頭抬吟,這樣上游Java服務就會啟用keepalive萨咕,不會主動關(guān)閉TCP連接了
   proxy_http_version 1.1;
   proxy_set_header Connection "";
}

經(jīng)過以上兩步操作之后,Nginx與上游服務器之間的連接數(shù)就降下來了火本,直接降到了20個左右危队。。钙畔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茫陆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子擎析,更是在濱河造成了極大的恐慌簿盅,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揍魂,死亡現(xiàn)場離奇詭異桨醋,居然都是意外死亡,警方通過查閱死者的電腦和手機愉烙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進店門讨盒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人步责,你說我怎么就攤上這事返顺。” “怎么了蔓肯?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵遂鹊,是天一觀的道長。 經(jīng)常有香客問我蔗包,道長秉扑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任调限,我火速辦了婚禮舟陆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耻矮。我一直安慰自己秦躯,他們只是感情好,可當我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布裆装。 她就那樣靜靜地躺著踱承,像睡著了一般倡缠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茎活,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天昙沦,我揣著相機與錄音,去河邊找鬼载荔。 笑死盾饮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的懒熙。 我是一名探鬼主播丐谋,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼煌珊!你這毒婦竟也來了号俐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤定庵,失蹤者是張志新(化名)和其女友劉穎吏饿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔬浙,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡猪落,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了畴博。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笨忌。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俱病,靈堂內(nèi)的尸體忽然破棺而出官疲,到底是詐尸還是另有隱情,我是刑警寧澤亮隙,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布途凫,位于F島的核電站,受9級特大地震影響溢吻,放射性物質(zhì)發(fā)生泄漏维费。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一促王、第九天 我趴在偏房一處隱蔽的房頂上張望犀盟。 院中可真熱鬧,春花似錦蝇狼、人聲如沸阅畴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恶阴。三九已至,卻和暖如春豹障,著一層夾襖步出監(jiān)牢的瞬間冯事,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工血公, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昵仅,地道東北人。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓累魔,卻偏偏與公主長得像摔笤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子垦写,可洞房花燭夜當晚...
    茶點故事閱讀 43,580評論 2 349