要让 nginx 稳定支撑高并发 websocket 连接,关键在于正确识别协议并释放系统资源:需透传 upgrade 和 connection 头、禁用缓冲与缓存、延长 read/send 超时、调大文件描述符及内核参数。

要让 Nginx 稳定支撑高并发 WebSocket 连接,关键不是堆配置,而是让 Nginx “真正认出”这是 WebSocket 流量,并配合系统资源释放其承载潜力。很多连接断开、握手失败、TIME_WAIT 泛滥的问题,根源都在协议识别和超时管理没对上。
确保协议升级头正确透传
WebSocket 握手依赖 Upgrade 和 Connection 两个请求头,Nginx 默认会过滤它们。若缺失,后端收不到升级信号,返回 200 而非 101,前端就报“Unexpected response code: 200”。必须在 location 块中明确设置:
- proxy_http_version 1.1;(WebSocket 必须基于 HTTP/1.1)
- proxy_set_header Upgrade $http_upgrade;(注意变量写法,不能写死为 "websocket")
- proxy_set_header Connection "upgrade";(值必须是小写 upgrade,不能加空格或引号错误)
关闭缓冲与缓存,避免消息滞留
WebSocket 是实时双向流,不适用 HTTP 的响应缓存逻辑。缓冲区可能截断帧、延迟发送,甚至丢消息:
- proxy_buffering off;(禁用代理响应缓冲)
- proxy_cache off;(防止 Upgrade 请求被缓存命中)
- 可选但推荐:proxy_buffer_size 16k; 和 proxy_buffers 8 16k;,避免大帧被截断
延长超时并匹配心跳节奏
Nginx 默认 60 秒的 proxy_read_timeout 是 WebSocket 断连最常见原因——它不是等“响应”,而是在等后端发来的下一个数据帧。空闲心跳期间若超时,连接就被静默关闭:
- proxy_read_timeout 86400;(设为 24 小时,或略大于客户端心跳间隔,如心跳 30 秒,设为 45 秒以上)
- proxy_send_timeout 86400;(防止大消息分片发送中途被中断)
- proxy_connect_timeout 10;(保持较短,仅控制建连阶段)
系统级资源必须同步扩容
Nginx 配置再好,也跑不过系统限制。每个 WebSocket 连接至少占用 1 个文件描述符(fd),默认 ulimit -n=1024,撑不过千连就会报 Too many open files:
- 修改 /etc/security/limits.conf:添加
* soft nofile 1048576和* hard nofile 1048576 - 调整内核参数(/etc/sysctl.conf):
net.core.somaxconn = 65535net.ipv4.ip_local_port_range = 1024 65535net.ipv4.tcp_tw_reuse = 1
执行sysctl -p生效 - Nginx 主配置中启用:
worker_rlimit_nofile 1048576;events { worker_connections 65535; }











