文档首页> 技术教程> Nginx 反代 WebSocket 的配置要点

Nginx 反代 WebSocket 的配置要点

发布时间:2026-07-15 14:39        更新时间:2026-07-16 01:44
WebSocket 连接在握手后要保持长活,这给反向代理出了两道题:握手时的协议升级头要原样传给后端;Nginx 默认六十秒的读超时会把空闲连接掐断。配置就围绕这两点展开。 一、标准配置块 ``` location /ws/ { proxy_pass http://127.0.0.1:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 3600s; proxy_send_timeout 3600s; } ``` 逐行解释:WebSocket 走 HTTP/1.1 的 Upgrade 机制握手,必须显式写 proxy_http_version 1.1——Nginx 反代默认用 1.0,不带 Upgrade 头,握手必失败;Upgrade 和 Connection 两行把升级头透传给后端;读与写超时拉长,避免空闲即断。要理解 read_timeout 的真实含义:它是相邻两次数据到达的最大间隔,不是连接的保活时长。 二、更通用的头写法 同一个 location 既服务普通请求又服务 WebSocket 时,用 map 按条件切换: ``` map $http_upgrade $connection_upgrade { default upgrade; '' close; } # location 内改用 proxy_set_header Connection $connection_upgrade; ``` 普通请求自动带 close,WebSocket 自动 upgrade,一处配置两头兼顾。 三、心跳保活别省 超时调到一小时也未必稳:中间的负载均衡、云防火墙常会静默回收几分钟没流量的连接。所以应用层心跳是必需品——服务端每 30 秒发一个 ping 帧,客户端回 pong,或者前端定时发业务心跳。心跳一来保住连接不被中间设备掐,二来死连接能被及时发现清理。正因为心跳间隔必须小于沿途最小的那个超时,Nginx、后端框架、中间设备三处的空闲超时要逐段核对,缺一处就是"连上后几十秒准点断开"的经典故障。 四、验证与集群注意 握手成功与否看状态码:浏览器开发者工具的网络面板里,WebSocket 连接显示 101 Switching Protocols 才算握手成功,WS 标签页能逐条看消息收发。Socket.IO 这类框架有约定的路径与心跳参数,代理里匹配的路径要和框架对齐,默认 /ws 还是 /socket.io 先确认再排查。上线前先绕开 Nginx 用客户端直连后端测通,再过一遍代理,分两步定位问题。多台后端做集群时还要配 ip_hash 这类会话保持,长连接必须粘在同一台后端上,换台机器连接就断了。