降低nginx代理websocket延迟的关键是确保长连接低延迟模式运行:配齐proxy_http_version 1.1、upgrade和connection三要素,关闭缓冲与超时干扰,启用tcp_nodelay,减少链路跳数并禁用tcp_nopush。

降低 Nginx 代理 WebSocket 的传输网络延迟,关键不是“调快某个参数”,而是让整个链路真正按长连接、低延迟模式运行。很多延迟问题其实来自配置错位或默认行为干扰,比如 Nginx 把 WebSocket 当成普通 HTTP 处理,或者 TCP 层在攒小包。
确保协议升级真正生效
这是所有优化的前提——如果握手失败或没升级成功,后续所有调优都无效。
-
必须同时配齐三要素:在 location 块里写全
proxy_http_version 1.1;、proxy_set_header Upgrade $http_upgrade;、proxy_set_header Connection "upgrade";;漏掉任一,Nginx 就不会触发 WebSocket 升级逻辑 -
别硬编码 Upgrade 值:用
$http_upgrade变量,兼容不同客户端(如发Upgrade: mqtt的设备),写死"websocket"会截断非标准请求 -
验证是否返回 101:用 curl 或浏览器 Network 面板检查响应头,确认有
HTTP/1.1 101 Switching Protocols,否则说明代理层已失败
关闭缓冲与超时干扰
Nginx 默认行为是为短连接设计的,对 WebSocket 来说反而是延迟源头。
-
关掉响应缓冲:加
proxy_buffering off;,否则后端发来的多个 TEXT 帧会被 Nginx 暂存、合并再吐出,造成明显卡顿 -
延长空闲容忍时间:设
proxy_read_timeout 86400;(24 小时),避免静默期被误杀;若后端每 30 秒发一次 ping,可设为 45 秒,但必须严格大于心跳间隔 -
同步调大发送超时:大消息分片发送时可能超时,补上
proxy_send_timeout 86400;,防止中途断连
绕过 Nagle 算法,小包立即发出
WebSocket 高频推送(如行情、光标位置)多是几十字节的小帧,Nagle 算法会攒包等 ACK,引入 20–200ms 不确定延迟。
-
只在 WebSocket 路径启用:在 location 块中加
tcp_nodelay on;,全局开启无效且可能影响其他业务 -
确认它真起作用:用
ss -i dst :查连接,输出含nodelay才算生效;浏览器 Frames 面板看单帧延迟是否稳定在 10–50ms -
前后端需协同关闭:Node.js 后端要调
socket.setNoDelay(true);客户端 JS 虽无法直接控制 TCP,但确保不发超大 JSON 包(如整份快照),否则 Nagle 本就不介入
减少链路跳数与运营商干扰
即使 Nginx 配得再好,跨网访问(如电信用户连联通机房)也会因 BGP 绕行导致 RTT 翻倍、抖动剧烈。
-
前端主动选线:预置多个 endpoint,例如
wss://ws-telcom.example.com(电信专线)、wss://ws-unicom.example.com(联通专线) - 用 HEAD 探测选最快:fetch 每个地址并记录耗时,优先连接响应最快且返回 200 的那个;2.5 秒内未触发 onopen 就 fallback
-
禁用 tcp_nopush:在 location 块中加
tcp_nopush off;,避免零拷贝机制延迟小包发送











