nginx 不参与 websocket 业务层分发,仅透传帧数据;优化核心是消除其默认行为对长连接的干扰:必须透传 upgrade 和 connection 头、禁用 proxy_buffering 与 proxy_cache、设 proxy_read_timeout 和 proxy_send_timeout 为 86400、启用 tcp_nodelay on 并关闭 tcp_nopush,同时协同后端心跳及系统资源调优。

WebSocket 消息分发在 Nginx 代理中本身不参与业务层转发,它只负责透传帧数据;真正影响“分发效率”的,是 Nginx 如何避免干扰长连接、保障帧实时抵达后端,以及后端如何承接和广播。优化重点不在“Nginx 分发逻辑”,而在消除其默认行为对 WebSocket 流的阻断。
确保协议升级完整且不可缓存
消息无法到达后端,往往卡在握手阶段。Nginx 必须让 Upgrade 请求原样抵达:
- 强制 HTTP/1.1:
proxy_http_version 1.1;——WebSocket 升级依赖该版本 - 动态透传 Upgrade 头:
proxy_set_header Upgrade $http_upgrade;——变量写法不能写死为 "websocket" - 显式设置 Connection 头:
proxy_set_header Connection "upgrade";——引号必需,空字符串或省略均失效 - 禁用缓存:
proxy_cache off;——否则 101 响应可能被缓存,后续请求直接返回 200,握手静默失败
关闭缓冲与超时干扰,保持连接通透
Nginx 默认的缓冲和短超时会截断、延迟甚至中断 WebSocket 数据流:
- 关掉响应缓冲:
proxy_buffering off;——防止小消息(如心跳、指令)积压在缓冲区,等满才发 - 延长读写超时:
proxy_read_timeout 86400;和proxy_send_timeout 86400;——匹配长连接生命周期,避免空闲时被断开 - 配合后端定时 ping/pong:
每 30 秒一次,且间隔严格小于 Nginx 超时值,维持连接活跃状态
启用 TCP 层低延迟优化
对高频小帧(如行情更新、实时指令),Nagle 算法会造成毫秒级攒包延迟:
- 开启无延迟模式:
tcp_nodelay on;——禁用 Nagle,小包立即发出 - 关闭零拷贝推送:
tcp_nopush off;——避免内核等待更多数据合并发送 - 该配置仅对已成功升级的连接生效,前提是 Upgrade/Connection 头已正确透传
协同后端与系统资源支撑分发能力
Nginx 是管道,不是调度器;消息能否高效广播,取决于后端处理能力和系统承载力:
- 后端启用 permessage-deflate 压缩,减少传输体积,尤其适合 JSON 类文本消息
- 使用二进制帧(
binaryType = 'arraybuffer')替代字符串,降低序列化开销 - 扩容文件描述符:为 Nginx 用户设
nofile ≥ 1048576,应对海量并发连接 - 调优内核参数:
net.core.somaxconn、net.ipv4.tcp_tw_reuse,缓解 TIME_WAIT 泛滥与连接耗尽











