nginx 稳定支撑高并发 websocket 的核心是正确透传协议头、关闭缓冲与缓存、合理设置超时及系统级调优。需配置 proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade 和 connection "upgrade",禁用 proxy_buffering 和 proxy_cache,proxy_read_timeout 至少为心跳间隔两倍,同步调优系统文件描述符、网络参数及 nginx worker_connections。

要让 Nginx 稳定支撑高并发 WebSocket 服务,核心不是堆参数,而是让 Nginx 正确识别、不干扰、不截断、不 prematurely 关闭连接。90% 的连接失败、502、心跳断连、TIME_WAIT 泛滥问题,都源于协议头透传缺失或超时与心跳不匹配。
必须透传 WebSocket 升级头
WebSocket 握手依赖 HTTP/1.1 的 Upgrade 机制,Nginx 默认会过滤关键头字段,导致后端收不到升级信号,返回 200 而非 101,前端报 “Unexpected response code: 200”:
- proxy_http_version 1.1:显式声明,HTTP/1.0 不支持 Upgrade
- proxy_set_header Upgrade $http_upgrade:用变量,不是固定字符串 "websocket"
- proxy_set_header Connection "upgrade":值必须是小写 upgrade,带英文双引号,不能为空或 $connection
关闭缓冲与缓存逻辑
WebSocket 是实时双向流,HTTP 缓存和响应缓冲会截断帧、延迟发送、甚至丢弃心跳包:
- proxy_buffering off:禁用响应缓冲,确保消息逐帧透传
- proxy_cache off:显式关闭缓存,防止 Upgrade 请求被缓存命中返回 200
- 可选增强:proxy_cache_bypass $http_upgrade,进一步绕过缓存判断
超时设置需匹配心跳节奏
proxy_read_timeout 不是“连接总时长”,而是“允许的最大空闲读时间”。它必须大于客户端心跳间隔,并预留网络抖动余量:
- 若心跳设为 30 秒,proxy_read_timeout 至少设为 60 秒,推荐 300–86400(5 分钟至 24 小时)
- proxy_send_timeout 86400:避免大消息分片发送中途被中断
- proxy_connect_timeout 10:保持较短,仅控制建连阶段
- 避免设 keepalive_timeout 或 keepalive_requests,它们对 WebSocket 无效且可能干扰
系统级资源必须同步扩容
Nginx 配置再合理,也受限于操作系统能力。每个 WebSocket 连接至少占用 1 个文件描述符(fd):
-
/etc/security/limits.conf 添加:
* soft nofile 1048576
* hard nofile 1048576
并确认 Nginx 启动用户(如 www-data)已生效 -
/etc/sysctl.conf 调优:
net.core.somaxconn = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30 - Nginx 主配置启用高并发支持:
worker_rlimit_nofile 1048576;
events { worker_connections 65535; }











