优化 Nginx WebSocket 代理的关键是让其正确识别长连接本质,需关闭 proxy_buffering 和 proxy_cache、透传 Upgrade/Connection 头、设 proxy_read_timeout/proxy_send_timeout 为 86400、启用 tcp_nodelay 并禁用 tcp_nopush、后端加心跳、集群启粘性会话、启用 permessage-deflate 压缩及二进制帧。

优化 Nginx WebSocket 代理的网络延迟与吞吐量,关键不是堆参数,而是让 Nginx 停止用“短连接思维”处理长连接。默认配置下,它会缓存、超时、压缩、合并小包——这些对 HTTP 很友好,对 WebSocket 就是卡顿源头。
必须关闭缓冲并透传协议升级头
这是所有优化的前提,缺一不可:
-
强制启用 HTTP/1.1:在 location 块中写
proxy_http_version 1.1;,WebSocket 升级机制只在该版本下有效; -
完整透传 Upgrade 头:用
proxy_set_header Upgrade $http_upgrade;,不能写死为 "websocket",否则移动端或代理链路可能丢失原始值; -
显式设置 Connection 头:写
proxy_set_header Connection "upgrade";,引号不能省,也不能设为空或 keep-alive; -
立即关闭响应缓冲:加
proxy_buffering off;,否则后端发的 ping、状态更新、行情帧全被攒在内存里,等填满才发,延迟从毫秒变秒级。
延长超时并启用 TCP_NODELAY
空闲连接被杀、小包被合并,是用户感知“卡顿”的两大主因:
-
读写超时设为 24 小时:
proxy_read_timeout 86400;和proxy_send_timeout 86400;,匹配 WebSocket 长连接本质; -
开启 tcp_nodelay:在 location 块中加
tcp_nodelay on;,专治 Nagle 算法导致的小帧延迟(如每秒多次的 pong 或控制指令); -
同步关闭 tcp_nopush:加
tcp_nopush off;,避免零拷贝机制反而拖慢小包发出; -
验证是否生效:运行
ss -i dst your-server-ip:port,输出含nodelay字样即成功启用。
禁用干扰项并保障连接稳定性
缓存、压缩、非粘性路由,会让 WebSocket 连接看似通了实则脆弱:
-
彻底禁用缓存:
proxy_cache off;,防止 Upgrade 请求被缓存返回 200,跳过 101 升级; -
关闭 gzip 压缩:
gzip off;,WebSocket 帧自带 permessage-deflate,Nginx 层压缩会破坏帧结构; -
后端主动发 ping 帧:间隔建议 25–30 秒,且必须严格小于
proxy_read_timeout,形成双向心跳; -
多节点部署启用粘性会话:upstream 中用
ip_hash;或基于 cookie 的 sticky session,避免消息推送到无状态节点。
精简传输与后端处理路径
链路通畅后,瓶颈常转移到序列化、线程模型和格式选择上:
- 启用 permessage-deflate:在 WebSocket 握手阶段协商开启,压缩 JSON 类文本消息,减小带宽与解析开销;
-
前端用二进制接收:设
ws.binaryType = 'arraybuffer',避开字符串序列化瓶颈; - 后端避免 onOpen 同步阻塞:禁止同步查 DB、读文件、调外部 HTTP 接口,改用异步驱动(Uvicorn + async DB)或协程(Swoole);
-
系统级调优配合:提升 Nginx 用户的
nofile限制至 ≥1048576,调大net.core.somaxconn防止连接队列溢出。


















