提升nginx中websocket代理并发消息能力的关键在于确保协议升级头透传准确无误,必须配置proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade、proxy_set_header connection "upgrade",并关闭proxy_buffering和proxy_cache,调大proxy_read_timeout与proxy_send_timeout至86400,同时扩容系统文件描述符及内核参数。

提升 Nginx 中 WebSocket 代理的并发消息能力,关键不在“压测吞吐量”,而在于让每一条连接真正稳定、低延迟、不丢帧地跑满带宽。很多场景下,瓶颈不是 CPU 或网络,而是配置错位导致连接频繁重建、消息缓冲堆积或路由错乱。
确保协议升级头透传准确无误
这是所有后续优化的前提。Nginx 默认把 WebSocket 当普通 HTTP 处理,若 Upgrade 和 Connection 头没正确转发,握手直接失败(返回 200 而非 101),根本谈不上并发。
-
必须显式写这三行:
proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;(注意变量名是小写$http_upgrade)proxy_set_header Connection "upgrade";(值必须是字面量"upgrade",不能用变量) - 避免常见错误:写成
$HTTP_UPGRADE、proxy_set_header Connection ""、漏掉proxy_http_version—— 这些都会导致 90% 的“连不上”问题 - 后端如果是 Node.js(ws 库)、Spring Boot(@MessageMapping)或 Python(websockets),对这几个头极其敏感,缺一不可
关闭缓冲与缓存,保证消息实时透传
WebSocket 是流式通信,不是等响应体攒够再发。Nginx 默认开启响应缓冲和缓存,会截断帧、延迟发送,甚至把 Upgrade 请求当成普通 GET 缓存命中。
-
proxy_buffering off;—— 关闭响应体缓冲,避免消息积压在 Nginx 内存中 -
proxy_cache off;—— 显式禁用缓存,防止握手请求被缓存策略拦截 - 不要设置
proxy_buffer_size或proxy_buffers,这些对 WebSocket 无意义且可能引入延迟
调优超时与连接保活参数
WebSocket 连接空闲时,Nginx 默认 60 秒就断开;大消息分片传输时,也可能因发送超时中断。需按业务心跳周期设定合理上限。
-
proxy_read_timeout 86400;—— 设为略大于客户端最大心跳间隔(如心跳 30s,设为 45–60s 更稳妥) -
proxy_send_timeout 86400;—— 避免长消息或批量推送中途断连 -
proxy_connect_timeout 60;—— 后端建连阶段超时,一般保持默认即可 - 不建议盲目设成无限(0),会导致异常连接长期滞留,消耗 fd 资源
配合系统级资源扩容与连接复用
Nginx 配置再好,也受限于操作系统能打开多少文件描述符、内核如何管理 TIME_WAIT 连接。单机万级并发必须调系统参数。
- 修改
/etc/security/limits.conf:* soft nofile 1048576* hard nofile 1048576并确认 Nginx 启动用户(如 www-data)生效 - Nginx 主配置加:
worker_rlimit_nofile 1048576;,events 块中:worker_connections 65535; - 优化内核:
net.core.somaxconn = 65535、net.ipv4.tcp_tw_reuse = 1、net.ipv4.ip_local_port_range = 1024 65535 - Upstream 中启用
keepalive 32;(或更高),复用到后端的连接池,降低 handshake 开销











