人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

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

發(fā)布日期:2022-03-24 09:01 | 文章來源:腳本之家

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)的,每個請求之間獨立,所以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ù)端會不認識,給你返回一個400,并告訴你

invalid sid

我們遇到的便是這個問題,nginx默認的負載均衡策略是輪詢,所以請求有可能會打到不是生成這個sid的機器上去,這時候我們就會收到一個400,如果運氣好,可能也會打到原來的機器上,運氣更好一點,甚至能堅持到websocket連接建立。

解決

這里提出兩種方案

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

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

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

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

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部