主頁 > 知識(shí)庫 > 詳解nginx代理socket.io服務(wù)踩坑

詳解nginx代理socket.io服務(wù)踩坑

熱門標(biāo)簽:400電話申請(qǐng)要什么條件 北京人工外呼系統(tǒng)廠家 哈爾濱400電話去哪辦理 西柏坡地圖標(biāo)注 燃?xì)夤芫€地圖標(biāo)注顏色 話術(shù)外呼系統(tǒng) 寧波400電話辦理對(duì)企業(yè)的意義 廣東如何申請(qǐng)400電話 i智能電話機(jī)器人yeta

nginx代理了兩臺(tái)socket.io服務(wù)器。socket.io的工作模式是polling升級(jí)到websocket

現(xiàn)象

通過nginx請(qǐng)求服務(wù)時(shí),出現(xiàn)了大量的400錯(cuò)誤,有時(shí)候能升級(jí)到websocket,有時(shí)候會(huì)一直報(bào)錯(cuò)。但是直接通過 ip+端口 訪問時(shí),100%能成功。

分析

sid

sid是我們這個(gè)問題的關(guān)鍵。在初始創(chuàng)建連接時(shí)(polling模式就是在模擬一個(gè)長連接),客戶端會(huì)發(fā)起這樣的請(qǐng)求:

https://***/?EIO=3&transport=polling&t=1540820717277-0

服務(wù)端收到后會(huì)創(chuàng)建一個(gè)對(duì)象,綁定在這個(gè)連接上,同時(shí)返回一個(gè)sid(session id),來標(biāo)記這個(gè)會(huì)話。會(huì)話指什么呢,會(huì)話是一連串的交互,這些交互之間是有聯(lián)系的,在我們這個(gè)場(chǎng)景下就是,下一次的http請(qǐng)求到來,我需要找到之前綁定在理論上的長連接(這里還沒有websocket,所以是理論上的)上的那個(gè)對(duì)象。我們知道http請(qǐng)求是無狀態(tài)的,每個(gè)請(qǐng)求之間獨(dú)立,所以socket.io引入了sid來做這件事。服務(wù)端收到請(qǐng)求后會(huì)生成一個(gè)sid,看下response:

復(fù)制代碼 代碼如下:
{"sid":"EoGaL3fRQlpTOaLp5eST","upgrades":["websocket"],"pingInterval":8000,"pingTimeout":10000}

之后每次請(qǐng)求都需要帶上這個(gè)sid,建立websocket請(qǐng)求的連接也不例外。所以說,sid是polling,以及polling升級(jí)到websocket的關(guān)鍵。這之后的請(qǐng)求類似于:

https://***/?EIO=3&transport=polling&t=1540820717314-1&sid=EoGaL3fRQlpTOaLp5eST

or

wss://***/?EIO=3&transport=websocket&t=1540820717314-1&sid=EoGaL3fRQlpTOaLp5eST

那么問題來了,如果請(qǐng)求是帶上的sid不是服務(wù)端生成的會(huì)怎樣呢?服務(wù)端會(huì)不認(rèn)識(shí),給你返回一個(gè)400,并告訴你

invalid sid

我們遇到的便是這個(gè)問題,nginx默認(rèn)的負(fù)載均衡策略是輪詢,所以請(qǐng)求有可能會(huì)打到不是生成這個(gè)sid的機(jī)器上去,這時(shí)候我們就會(huì)收到一個(gè)400,如果運(yùn)氣好,可能也會(huì)打到原來的機(jī)器上,運(yùn)氣更好一點(diǎn),甚至能堅(jiān)持到websocket連接建立。

解決

這里提出兩種方案

  1. nginx的負(fù)載均衡采用ip_hash,這樣能保證一個(gè)客戶端的請(qǐng)求都走到一臺(tái)服務(wù)器上
  2. 不使用polling模式,只使用websocket

這兩種方案各有利弊。第二種顯而易見,不支持websocket的古老瀏覽器和客戶端將沒法工作。第一種的問題隱藏得比較深,試想,如果你增減了機(jī)器會(huì)怎樣,這時(shí)候ip_hash策略的模將變化,之前的連接將全部失效,而對(duì)于微服務(wù),擴(kuò)縮容是很頻繁的操作(特別是產(chǎn)品處于發(fā)展期),這種有損的擴(kuò)縮容很大概率是不能接受的。

綜上,建議直接使用websocket,畢竟不支持websocket的老版本占比很少,而且相對(duì)于先polling,耗時(shí)也會(huì)減少。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:珠海 襄陽 西藏 阜陽 巴中 張家口 開封 湘潭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解nginx代理socket.io服務(wù)踩坑》,本文關(guān)鍵詞  詳解,nginx,代理,socket.io,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解nginx代理socket.io服務(wù)踩坑》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解nginx代理socket.io服務(wù)踩坑的相關(guān)信息資訊供網(wǎng)民參考!
  • 企业400电话

    智能AI客服机器人
    15000

    在线订购

    合计11份范本:公司章程+合伙协议+出资协议+合作协议+股权转让协议+增资扩股协议+股权激励+股东会决议+董事会决议

    推薦文章