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

来点更多力量吗? 固然来 买吧,要吃饭的鸭后端

相关文章
相关标签/搜索