要让nginx稳定支撑大量websocket连接,必须协同调优协议透传、连接生命周期管理与系统资源:透传upgrade和connection头确保101握手成功;设proxy_read_timeout、proxy_send_timeout为86400并关闭buffering和cache;同时扩容文件描述符、内核参数及worker_connections。

要让 Nginx 稳定支撑大量 WebSocket 连接,不能只改几个超时值——得从协议透传、连接生命周期管理、系统资源三方面协同调优。配置错一处,就可能出现 101 握手失败、连接频繁中断或 TIME_WAIT 泛滥。
确保 WebSocket 协议头正确透传
这是最常被忽略却最关键的一环。Nginx 默认会过滤 Upgrade 和 Connection 头,导致握手卡在 HTTP 200,根本升不了级:
- 在
location块中必须写入:proxy_http_version 1.1; -
proxy_set_header Upgrade $http_upgrade;—— 注意是$http_upgrade变量,不是固定字符串 -
proxy_set_header Connection "upgrade";—— 引号不能漏,也不能写成空字符串或""
后端是 Node.js(ws)、Spring Boot(@MessageMapping)或 Swoole 时,缺这三项中的任意一项,90% 会出现“连不上”。
调整长连接生命周期参数
WebSocket 是长连接,但 Nginx 默认按 HTTP 短连接逻辑处理,需覆盖默认超时和缓冲行为:
-
proxy_read_timeout 86400;—— 设为 24 小时(或略大于客户端心跳间隔),防止空闲连接被静默断开 -
proxy_send_timeout 86400;—— 避免大消息分片发送中途超时 -
proxy_buffering off;—— 关闭响应缓冲,保证消息实时透传;WebSocket 不适用缓存场景 -
proxy_cache off;—— 显式禁用缓存,避免 Upgrade 请求被缓存命中返回 200
扩容系统级连接资源
Nginx 配置再好,也受限于操作系统能打开的文件描述符和网络连接数:
- 增大文件描述符上限:
echo '* soft nofile 1048576' >> /etc/security/limits.confecho '* hard nofile 1048576' >> /etc/security/limits.conf
并确认 Nginx 启动用户(如www-data)已生效 - 优化内核参数(
/etc/sysctl.conf):net.core.somaxconn = 65535net.ipv4.ip_local_port_range = 1024 65535net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_tw_reuse = 1 - Nginx 主配置中启用高并发支持:
worker_rlimit_nofile 1048576;events { worker_connections 65535; }
验证是否真正生效
别只看配置 reload 成功,要检查实际运行状态:
- 用
ss -s | grep estab查看当前 ESTABLISHED 连接数 - 执行
nginx -T | grep worker_connections确认配置已加载且数值匹配 - 观察错误日志中是否有
upstream prematurely closed connection或client timed out类报错











