Nginx的socket轉(zhuǎn)發(fā)端口如何配置

nginx 轉(zhuǎn)發(fā) socket 端口常見場景:在線學(xué)習(xí)應(yīng)用,在常規(guī)功能之外,增加一個聊天室功能,后端選擇 swoole 提供服務(wù)提供者,同時不想前端直接 ip:port 方式鏈接到服務(wù),需要使用 nginx 進(jìn)行轉(zhuǎn)發(fā)。

常規(guī)情況,我們可以在用戶頁面,直接建立 socket 鏈接,但這樣的操作會暴露端口,帶來一定的安全隱患,使用 nginx 進(jìn)行轉(zhuǎn)發(fā),可以隱藏端口。額外的問題就是一些 header 參數(shù)也需要在轉(zhuǎn)發(fā)過程中帶給 socket 服務(wù)提供者,其他只需要 nginx 處理一下從常規(guī)協(xié)議轉(zhuǎn)換到 websocket 就可以。

其中,”upgrade” 是 逐跳(hop-by-hop) 頭,無法從客戶端轉(zhuǎn)發(fā)到代理服務(wù)器,通過轉(zhuǎn)發(fā)代理,客戶端可以使用 connect 方法來規(guī)避此問題。但是,這不適用于反向代理,因為客戶端不知道任何代理服務(wù)器,并且需要在代理服務(wù)器上進(jìn)行特殊處理。同時逐跳頭包含 “upgrade” 和 “connection” 都無法傳遞,則需要在轉(zhuǎn)換為 websocket 的時候帶上這兩個參數(shù):例如:

location?/chat/?{ ??proxy_pass?http://backend; ??proxy_http_version?1.1; ??proxy_set_header?upgrade?$http_upgrade; ??proxy_set_header?connection?"upgrade"; }

進(jìn)階:讓轉(zhuǎn)發(fā)到代理服務(wù)器的 “connection” 頭字段的值,取決于客戶端請求頭的 “upgrade” 字段值。例如:

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; ????} ??}

注意:示例中的 http://backend 為一組負(fù)載均衡的服務(wù)器,只有單臺服務(wù)器的,可以寫成 proxy_pass http://127.0.0.1:9501; 這樣的。此外,默認(rèn)情況下,在 60 秒內(nèi)未傳送任何數(shù)據(jù)的鏈接將被關(guān)閉,時間可以使用 proxy_read_timeout 指令來延長?;蛘叽矸?wù)器可以配置定時發(fā)送 ping 幀來重置超時及檢查鏈接是否可用。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊13 分享