要降低 nginx 中 websocket 代理的并发延迟,需关闭 proxy_buffering 和 proxy_cache、调大缓冲区、延长超时时间、透传 upgrade/connection 头、配置 keepalive 与 sticky session,并优化前后端序列化与运行时。

要降低 Nginx 中 WebSocket 代理的并发延迟,关键不是单纯提升带宽或换硬件,而是让 Nginx 正确“识别并尊重”WebSocket 的长连接本质。默认配置把它当普通 HTTP 请求处理,缓冲、超时、头过滤等机制反而成了延迟源头。
关闭缓冲与禁用缓存
proxy_buffering 默认开启会把消息攒在内存里等满再发,导致毫秒级消息卡顿数秒;proxy_cache 可能误缓存 Upgrade 请求,直接返回 200 而非 101。必须显式关闭:
- proxy_buffering off; —— 放在 location 块内,确保消息逐帧透传
- proxy_cache off; —— 防止握手阶段被缓存干扰
- 若使用 Nginx Proxy Manager,还需调大 proxy_buffer_size(建议 16k)和 proxy_buffers(如 8×16k),避免小包频繁拷贝
延长超时并透传协议升级头
WebSocket 连接空闲时没有数据流,Nginx 默认 60 秒 proxy_read_timeout 会主动断开,引发重连延迟。同时,Upgrade 和 Connection 头若未透传,握手就失败:
- proxy_read_timeout 86400; —— 设为 24 小时,或略大于客户端心跳间隔(如心跳 30 秒,则设为 45 秒)
- proxy_send_timeout 86400; —— 避免大消息分片发送中途超时
- proxy_http_version 1.1; —— WebSocket 升级必须基于 HTTP/1.1
-
proxy_set_header Upgrade $http_upgrade; 和 proxy_set_header Connection "upgrade"; —— 缺一不可,不能写成
Connection ""
保障连接稳定性与负载均衡一致性
看似延迟,实则是连接反复中断重建。高频断连常见于心跳缺失、多节点路由漂移:
- 后端需主动发 ping/pong 帧(如每 25 秒一次),且间隔严格小于 Nginx 的 read_timeout
- 多实例部署时启用 sticky session:用
ip_hash或sticky cookie,防止消息发到无会话状态的节点 - upstream 中配置 keepalive 32; 复用到后端的连接,减少 TCP 握手开销
精简传输与后端运行时适配
即使代理层通畅,消息仍可能卡在序列化、线程阻塞或网络栈上:
- 启用 WebSocket permessage-deflate 扩展压缩 JSON 类文本,减小帧体积
- 前端用
binaryType = 'arraybuffer'接收,避免字符串解析开销 - PHP 后端弃用 FPM,改用 Swoole;Python 后端用 Uvicorn + 异步 handler,不阻塞事件循环











