要让nginx代理websocket稳定不掉线,必须同步加固协议透传、连接生命周期和系统承载力三方面:透传upgrade和connection头确保101握手成功;设proxy_read_timeout和proxy_send_timeout为86400并关闭buffering与cache;扩容文件描述符、内核参数及worker_connections。

要让 Nginx 代理 WebSocket 时传输稳定、不掉线、不卡顿,核心不是“调几个超时值”,而是从协议透传、连接生命周期、系统承载力三个层面同步加固。单点优化容易失效,比如只改 proxy_read_timeout 却漏了 Upgrade 头透传,连接根本升不了级。
确保 WebSocket 升级请求完整透传
这是 90% 连接失败的根源。Nginx 默认会丢弃 Upgrade 和 Connection 头,导致后端收不到升级信号,返回 HTTP 200 而非 101。
- 必须在
location块中显式配置:proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;(注意用变量,不是字符串)proxy_set_header Connection "upgrade";(引号不能省,也不能写成空值) - 补充关键头避免后端误判:
proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;(防止缓存拦截升级请求)
匹配长连接特性的超时与缓冲策略
WebSocket 是持续双向通信,不能套用 HTTP 短连接逻辑。默认 60 秒超时会导致空闲连接被静默断开。
- 设为远高于客户端心跳间隔(推荐 86400 秒,即 24 小时):
proxy_read_timeout 86400;proxy_send_timeout 86400;proxy_connect_timeout 75;(建立阶段可稍短) - 关闭所有缓冲和缓存:
proxy_buffering off;(避免消息堆积延迟)proxy_cache off;proxy_buffer_size 4k;(保持最小安全值,不放大)
释放系统级并发上限
Nginx 配置再合理,也会被系统资源卡住。大量 ESTABLISHED 连接需要足够文件描述符和内核支持。
- 提升用户级限制(以 nginx 运行用户如
www-data为准):
编辑/etc/security/limits.conf,添加:* soft nofile 1048576* hard nofile 1048576 - 优化内核参数(
/etc/sysctl.conf):net.core.somaxconn = 65535net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_tw_reuse = 1 - Nginx 主配置启用高并发:
worker_rlimit_nofile 1048576;events { worker_connections 65535; use epoll; }
验证是否真正生效
reload 配置不等于生效。需确认运行态数值和实际连接行为:
- 查当前活跃连接数:
ss -s | grep estab - 确认 nginx 加载的 worker_connections:
nginx -T 2>/dev/null | grep worker_connections - 用浏览器 DevTools → Network → Filter “ws” 或 “wss”,看状态码是否为 101 Switching Protocols
- 命令行快速验证:
wscat -c ws://your-domain.com/path(成功连接即显示交互提示)











