提升 nginx websocket 吞吐量需启用 upstream keepalive 复用长连接、调大 proxy_read/send_timeout 至 24 小时级、禁用 proxy_buffering、使用 ip_hash 保证连接亲和性,并精简头部与无关模块。

要提升 Nginx 代理 WebSocket 的消息吞吐量,核心在于减少连接中断、降低协议开销、优化长连接维持能力,并合理分发流量。单纯增加硬件资源效果有限,关键在配置精准适配 WebSocket 的全双工、长连接特性。
启用并复用 HTTP/1.1 长连接池
Nginx 默认对每个请求新建后端连接,而 WebSocket 要求稳定持久通道。通过 upstream 块启用连接复用,可显著减少握手和 TCP 建连开销:
- 在
upstream中添加keepalive 32(数字建议为后端并发连接数的 1/4~1/2),表示每个 worker 进程最多缓存 32 个空闲长连接 - 后端服务需支持 HTTP/1.1 keep-alive,且不主动关闭空闲连接
- 配合
proxy_http_version 1.1和Connection: keep-alive头传递(Nginx 默认已设,无需额外写)
调优超时参数,避免误断连接
默认 60 秒的 proxy_read_timeout 对 WebSocket 极易触发断连,尤其在心跳间隔较长或网络波动时:
-
proxy_read_timeout和proxy_send_timeout建议设为业务最大空闲时长的 1.5 倍,常见设为86400(24 小时)或按实际心跳周期 ×3 -
proxy_connect_timeout保持较短(如5s),仅控制建连阶段,不影响已建立的长连接 - 禁用
proxy_buffering on—— WebSocket 消息需实时透传,缓冲会引入延迟甚至丢帧
使用 ip_hash 实现连接亲和性
WebSocket 连接一旦建立,应尽量固定到同一台后端节点,避免因轮询导致连接被重定向、状态丢失或重复鉴权:
- 在
upstream块中启用ip_hash;,使同一客户端 IP 始终路由到相同后端 - 若使用 CDN 或 LB 在前,需确保
X-Forwarded-For正确,或改用hash $remote_addr consistent;提升一致性哈希稳定性 - 注意:该策略牺牲部分负载均衡均匀性,但对吞吐量和连接稳定性提升明显,适用于状态敏感型场景(如聊天、协作编辑)
精简头部与禁用无关模块
减少非必要处理环节,释放 CPU 和内存资源:
- 移除未使用的
gzip、sub_filter或第三方模块(如 Lua 脚本),它们在 WebSocket 流量路径中无意义且增加延迟 - 确保
proxy_set_header只保留必需项:Upgrade、Connection、Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto - 避免在
location /ws块中启用access_log off或log_not_found off,降低 I/O 压力











