新聞中心
這篇文章主要介紹“nginx代理socket.io服務(wù)的坑怎么解決”,在日常操作中,相信很多人在nginx代理socket.io服務(wù)的坑怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”nginx代理socket.io服務(wù)的坑怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè),網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十余年品質(zhì),值得信賴!
nginx代理了兩臺socket.io服務(wù)器。socket.io的工作模式是polling升級到websocket
現(xiàn)象
通過nginx請求服務(wù)時,出現(xiàn)了大量的400錯誤,有時候能升級到websocket,有時候會一直報錯。但是直接通過 ip+端口
訪問時,100%能成功。
分析
sid
sid是我們這個問題的關(guān)鍵。在初始創(chuàng)建連接時(polling模式就是在模擬一個長連接),客戶端會發(fā)起這樣的請求:
https://***/?eio=3&transport=polling&t=1540820717277-0
服務(wù)端收到后會創(chuàng)建一個對象,綁定在這個連接上,同時返回一個sid(session id),來標(biāo)記這個會話。會話指什么呢,會話是一連串的交互,這些交互之間是有聯(lián)系的,在我們這個場景下就是,下一次的http請求到來,我需要找到之前綁定在理論上的長連接(這里還沒有websocket,所以是理論上的)上的那個對象。我們知道http請求是無狀態(tài)的,每個請求之間獨(dú)立,所以socket.io引入了sid來做這件事。服務(wù)端收到請求后會生成一個sid,看下response:
復(fù)制代碼 代碼如下:
{"sid":"eogal3frqlptoalp5est","upgrades":["websocket"],"pinginterval":8000,"pingtimeout":10000}
之后每次請求都需要帶上這個sid,建立websocket請求的連接也不例外。所以說,sid是polling,以及polling升級到websocket的關(guān)鍵。這之后的請求類似于:
https://***/?eio=3&transport=polling&t=1540820717314-1&sid=eogal3frqlptoalp5est or wss://***/?eio=3&transport=websocket&t=1540820717314-1&sid=eogal3frqlptoalp5est
那么問題來了,如果請求是帶上的sid不是服務(wù)端生成的會怎樣呢?服務(wù)端會不認(rèn)識,給你返回一個400,并告訴你
invalid sid
我們遇到的便是這個問題,nginx默認(rèn)的負(fù)載均衡策略是輪詢,所以請求有可能會打到不是生成這個sid的機(jī)器上去,這時候我們就會收到一個400,如果運(yùn)氣好,可能也會打到原來的機(jī)器上,運(yùn)氣更好一點,甚至能堅持到websocket連接建立。
解決
這里提出兩種方案
nginx的負(fù)載均衡采用ip_hash,這樣能保證一個客戶端的請求都走到一臺服務(wù)器上
不使用polling模式,只使用websocket
這兩種方案各有利弊。第二種顯而易見,不支持websocket的古老瀏覽器和客戶端將沒法工作。第一種的問題隱藏得比較深,試想,如果你增減了機(jī)器會怎樣,這時候ip_hash策略的模將變化,之前的連接將全部失效,而對于微服務(wù),擴(kuò)縮容是很頻繁的操作(特別是產(chǎn)品處于發(fā)展期),這種有損的擴(kuò)縮容很大概率是不能接受的。
到此,關(guān)于“nginx代理socket.io服務(wù)的坑怎么解決”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
新聞名稱:nginx代理socket.io服務(wù)的坑怎么解決
網(wǎng)站網(wǎng)址:http://fisionsoft.com.cn/article/jjioid.html