Nginx 透传 WebSocket 需配置:强制 HTTP/1.1、透传 Upgrade 和 Connection 头(用 map 动态设置)、调大 read/send 超时至 86400、禁用 proxy_buffering。

Nginx 本身不“启用”双向数据流,它只是透传——只要 WebSocket 握手成功,后续所有双向数据(客户端发、服务端回、心跳、推送)都会自动在已建立的 TCP 连接上原样转发。关键不是开启功能,而是确保连接不被中断、不被降级、不被缓冲截断。
必须透传升级头,否则连不上
WebSocket 握手依赖两个核心请求头:Upgrade 和 Connection。Nginx 默认不转发它们,必须显式配置:
- proxy_http_version 1.1:强制使用 HTTP/1.1(HTTP/1.0 不支持 Upgrade)
- proxy_set_header Upgrade $http_upgrade:把客户端原始的 Upgrade 头(如 websocket)原样传给后端
- proxy_set_header Connection $connection_upgrade:推荐用 map 动态设置(见下文),避免硬写 "upgrade" 导致非 WebSocket 请求出错
要用 map 动态构造 Connection 值
直接写 proxy_set_header Connection "upgrade" 有风险:当非 WebSocket 请求(比如普通 GET)经过同一 location 时,Nginx 会错误地向后端发送 Connection: upgrade,可能引发协议冲突或 502。
更健壮的做法是在 http 块顶部添加:
default upgrade;
"" close;
}
然后在 location 中写:
proxy_set_header Connection $connection_upgrade
这样,只有客户端带了 Upgrade 头,Nginx 才传 upgrade;否则传 close,兼容普通 HTTP 流量。
超时必须调大,否则连接秒断
WebSocket 是长连接,Nginx 默认 60 秒就关闭空闲连接。必须延长以下三项:
- proxy_read_timeout 86400:服务端长时间不发数据(如心跳间隔 30 秒),Nginx 不会主动断开
- proxy_send_timeout 86400:客户端发包间隔稍长(如批量消息延迟发送),也不触发中断
- proxy_connect_timeout 30:仅控制初始建连耗时,保持默认或略增即可
禁用缓冲,保证实时性
WebSocket 数据讲究低延迟,尤其心跳和指令类消息。若开启 proxy_buffering(默认 on),Nginx 可能攒包再发,破坏实时性:
- proxy_buffering off:彻底禁用响应缓冲,数据到达即转发
- 可选加 proxy_buffer_size 128k 和 proxy_buffers 4 256k 防大帧溢出,但通常默认值已够用











