要提升Nginx代理WebSocket的连接吞吐能级,核心是保障长连接稳定性、降低握手开销、减少数据拷贝、避免代理拖慢后端:1.启用TCP keepalive并调优内核参数;2.复用后端连接池并合理设keepalive数量;3.关闭缓冲且控制响应体大小上限;4.使用HTTP/2 over TLS启用stream multiplexing。

要提升 Nginx 代理 WebSocket 的连接吞吐能级,核心不是堆并发数,而是保障每个长连接的稳定性、降低协议握手开销、减少内核与用户态间的数据拷贝,并让后端资源不被代理层拖慢。以下四点是生产环境中最直接有效的优化方向:
1. 启用 TCP keepalive 并调优内核参数
Nginx 默认不主动发送 TCP 心跳包,空闲连接易被中间设备(如云厂商 SLB、防火墙)静默断连。需显式开启并缩短探测间隔:
- proxy_socket_keepalive on; —— 启用 socket 级 keepalive
- proxy_socket_keepalive 30s:10:3; —— (Nginx 1.19.1+)表示空闲 30 秒后开始探测,间隔 10 秒,连续 3 次失败才断连
- 同步调优宿主机内核:
net.ipv4.tcp_keepalive_time=600、net.ipv4.tcp_keepalive_intvl=30、net.ipv4.tcp_keepalive_probes=3,与 Nginx 配置对齐
2. 复用后端连接池 + 合理设置 keepalive 数量
避免每次 WebSocket 握手都新建到后端的 TCP 连接,显著降低 TIME_WAIT 和系统调用开销:
- 在
upstream块中配置:keepalive 64;(建议值:32–128,视后端单机承载能力而定) - 搭配 keepalive_requests 1000; 和 keepalive_timeout 60s;,防止连接池老化
- 确保后端服务也启用连接复用(如 Node.js 的
http.Agent、Spring Boot 的Connection: keep-alive支持)
3. 关闭缓冲 + 控制响应体大小上限
WebSocket 数据帧是流式传输,缓冲会引入延迟甚至阻塞;同时大消息可能触发临时文件写入,消耗磁盘 I/O:
- proxy_buffering off; —— 强制流式透传,禁用响应缓冲
- client_max_body_size 10M; —— 限制单帧最大载荷(根据业务调整,避免恶意大数据包耗尽内存)
- proxy_buffer_size 4k; 和 proxy_buffers 8 4k; —— 仅保留最小必要缓冲用于 header 解析,不用于 body
4. 使用 HTTP/2 over TLS 并启用 stream multiplexing(仅限 wss)
当 WebSocket 走 wss(即 TLS 终止在 Nginx),启用 HTTP/2 可让多个 WebSocket 子连接共享同一 TLS 连接,大幅减少 TLS 握手和 TCP 建连开销:
- server 块监听时加 http2;(需 OpenSSL ≥ 1.0.2 且编译支持)
- 确保 SSL 配置启用 ssl_session_cache shared:SSL:10m; 和 ssl_session_timeout 4h;
- 注意:HTTP/2 不改变 WebSocket 协议行为,但能提升多连接场景下的整体连接建立效率
这些配置叠加后,单台 Nginx 实例在合理硬件下可稳定支撑数万级活跃 WebSocket 连接,吞吐瓶颈通常会从代理层转移到后端业务逻辑或网络带宽。关键在于每一项都针对 WebSocket 的长连接、低延迟、流式特性做了精准适配,而非套用常规 HTTP 优化模板。


















