要让nginx真正撑住高并发websocket连接,必须同时配置协议透传、关闭缓冲与缓存、延长超时并禁用连接复用干扰、扩容系统级连接能力;缺一不可,90%连不上问题源于upgrade头未透传。

要让 Nginx 真正撑住高并发 WebSocket 连接,不能只调几个 timeout 参数——得从协议透传、连接生命周期、系统资源三块一起动。
必须透传升级头,握手才成功
WebSocket 握手依赖 HTTP 的 Upgrade 和 Connection 头,Nginx 默认会过滤它们。漏配任意一项,客户端就卡在 200 响应,收不到 101 Switching Protocols:
-
proxy_http_version 1.1;(显式声明,不靠默认) -
proxy_set_header Upgrade $http_upgrade;(变量名必须小写,不能写成$HTTP_UPGRADE或字符串"websocket") -
proxy_set_header Connection "upgrade";(引号不能少,也不能写成空值或$connection)
后端是 ws、Spring Boot 或 Swoole 时,这三项缺一不可,90% 的“连不上”问题都出在这儿。
关闭缓冲与缓存,避免消息阻塞
WebSocket 是实时流式通信,不适合 HTTP 那套响应缓存逻辑:
-
proxy_buffering off;(禁用响应缓冲,保证消息逐帧透传) -
proxy_cache off;(显式关闭缓存,防止 Upgrade 请求被缓存返回 200) -
proxy_cache_bypass $http_upgrade;(可选,增强绕过逻辑)
不关这两项,大消息可能卡住,心跳包也可能被延迟或丢弃。
延长超时并禁用连接复用干扰
Nginx 默认按短连接管理,需覆盖为长连接语义:
-
proxy_read_timeout 86400;(设为 24 小时,或略大于客户端心跳间隔,比如 90 秒心跳就设 120) -
proxy_send_timeout 86400;(防止分片消息发送中途断开) - 不要设
keepalive_timeout或keepalive_requests,它们对 WebSocket 无效,反而可能干扰
注意:proxy_read_timeout 是空闲读超时,不是连接总时长;只要客户端有心跳,连接就能一直续命。
扩容系统级连接能力
Nginx 配置再好,也跑不过 OS 限制:
- 修改
/etc/security/limits.conf:* soft nofile 1048576* hard nofile 1048576
并确认 Nginx 启动用户(如www-data)已生效 - 调整
/etc/sysctl.conf:net.core.somaxconn = 65535net.ipv4.ip_local_port_range = 1024 65535net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_fin_timeout = 30 - Nginx 主配置中启用高并发支持:
worker_rlimit_nofile 1048576;events { worker_connections 65535; }
验证是否生效:ss -s | grep estab 查当前 ESTABLISHED 连接数,nginx -T | grep worker_connections 确认配置已加载。
不复杂但容易忽略











