Nginx 轉發 socket 端口配置

原文連接:何曉東 博客html

Nginx 轉發 socket 端口常見場景:在線學習應用,在常規功能以外,增長一個聊天室功能,後端選擇 swoole 提供服務提供者,同時不想前端直接 ip:port 方式連接到服務,須要使用 Nginx 進行轉發。

常規狀況,咱們能夠在用戶頁面,直接創建 socket 連接,但這樣的操做會暴露端口,帶來必定的安全隱患,使用 Nginx 進行轉發,能夠隱藏端口。額外的問題就是一些 header 參數也須要在轉發過程當中帶給 socket 服務提供者,其餘只須要 Nginx 處理一下從常規協議轉換到 Websocket 就能夠。前端

其中,"Upgrade" 是 逐跳(hop-by-hop) 頭,沒法從客戶端轉發到代理服務器,經過轉發代理,客戶端可使用 CONNECT 方法來規避此問題。可是,這不適用於反向代理,由於客戶端不知道任何代理服務器,而且須要在代理服務器上進行特殊處理。同時逐跳頭包含 "Upgrade" 和 "Connection" 都沒法傳遞,則須要在轉換爲 Websocket 的時候帶上這兩個參數:例如:nginx

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

進階:讓轉發到代理服務器的 "Connection" 頭字段的值,取決於客戶端請求頭的 "Upgrade" 字段值。例如:git

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 爲一組負載均衡的服務器,只有單臺服務器的,能夠寫成 proxy_pass http://127.0.0.1:9501; 這樣的。github

此外,默認狀況下,在 60 秒內未傳送任何數據的連接將被關閉,時間可使用 proxy_read_timeout 指令來延長。或者代理服務器能夠配置定時發送 ping 幀來重置超時及檢查連接是否可用。web

參考連接: Nginx Websocket proxyingsegmentfault

來點更多力量嗎? 固然來 買吧,要吃飯的鴨後端

相關文章
相關標籤/搜索