nginx代理proxy_pass與WebSocket結(jié)合

除以下事項外,仍有一點需要注意:nginx 連接時長默認為60S 超過時間后自動斷開websocket,可在前臺進行輪詢(心跳)配合websocket實現(xiàn)長連接

要將客戶端和服務(wù)器之間的連接從HTTP / 1.1轉(zhuǎn)換為WebSocket,請使用HTTP / 1.1中提供的協(xié)議交換機制。

然而,有一個微妙之處:由于“升級”是?逐跳?標(biāo)頭,因此它不會從客戶端傳遞到代理服務(wù)器。通過轉(zhuǎn)發(fā)代理,客戶端可以使用該CONNECT?方法來規(guī)避此問題。但是,這不適用于反向代理,因為客戶端不知道任何代理服務(wù)器,并且需要在代理服務(wù)器上進行特殊處理。

從版本1.3.13開始,nginx實現(xiàn)了特殊的操作模式,如果代理服務(wù)器返回帶有代碼101(交換協(xié)議)的響應(yīng),則允許在客戶端和代理服務(wù)器之間建立隧道,并且客戶端要求通過請求中的“升級”標(biāo)頭。

如上所述,包括“升級”和“連接”的逐跳報頭不會從客戶端傳遞到代理服務(wù)器,因此為了讓代理服務(wù)器知道客戶端將協(xié)議切換到WebSocket的意圖,這些報頭必須明確傳遞:

location /chat/ {

? ? proxy_pass http://backend;

? ? proxy_http_version 1.1;

? ? proxy_set_header Upgrade $http_upgrade;

? ? proxy_set_header Connection "upgrade";

}

一個更復(fù)雜的示例,其中對代理服務(wù)器的請求中的“連接”標(biāo)頭字段的值取決于客戶端請求標(biāo)頭中是否存在“升級”字段:

http {

? ? map $http_upgrade $connection_upgrade {

? ? ? ? default upgrade;

? ? ? ? ''? ? ? close;

? ? }

? ? server {

? ? ? ? ...

? ? ? ? location /chat/ {

? ? ? ? ? ? proxy_pass http://backend;

? ? ? ? ? ? proxy_http_version 1.1;

? ? ? ? ? ? proxy_set_header Upgrade $http_upgrade;

? ? ? ? ? ? proxy_set_header Connection $connection_upgrade;

? ? ? ? }

? ? }

默認情況下,如果代理服務(wù)器在60秒內(nèi)未傳輸任何數(shù)據(jù),則將關(guān)閉連接。使用proxy_read_timeout指令可以增加此超時??;蛘撸矸?wù)器可以配置為定期發(fā)送WebSocket ping幀以重置超時并檢查連接是否仍然存在。

引自官網(wǎng)nginx代理websocket

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容