要让 Nginx 稳定支撑高频 WebSocket 连接,关键在于透传协议升级头、调高超时阈值、关闭缓冲与缓存、并扩容系统级连接能力。需配置 map 映射 Upgrade 头,设置 proxy_read_timeout 和 send_timeout 为心跳间隔上限,禁用 proxy_buffering 和 proxy_cache,并调优内核参数及 worker_connections。

要让 Nginx 稳定支撑高频 WebSocket 连接,关键不是堆配置,而是让 Nginx “真正理解”长连接的语义——它得知道这不是一次 HTTP 请求,而是一条持续通电的通道。
透传协议升级头,避免握手失败
高频连接下,每次握手失败都会引发客户端重连风暴,迅速拖垮服务。Nginx 默认会过滤 Upgrade 和 Connection 头,必须显式放行:
- 在
http块顶部定义映射,比if更高效:map $http_upgrade $connection_upgrade { default upgrade; '' close; } - 在
location中启用透传:proxy_http_version 1.1;<br>proxy_set_header Upgrade $http_upgrade;<br>proxy_set_header Connection $connection_upgrade; - 务必避免写成
Connection "upgrade"字面量——这样会覆盖掉非 WebSocket 请求的原始值,导致普通 HTTP 请求异常
调高超时阈值,匹配心跳节奏
高频连接不等于高流量,很多连接处于“静默但活跃”状态(如每 30 秒发一次心跳)。Nginx 默认 60 秒超时会误杀这类连接:
-
proxy_read_timeout 86400;(24 小时):设为略大于客户端最大心跳间隔,防止空闲时被断开 -
proxy_send_timeout 86400;:避免大消息分片发送中途超时 -
proxy_connect_timeout 60;:保持较短,仅控制建连阶段,不影响已建立连接 - 不要设为无限(
0),否则异常连接无法释放,反而耗尽资源
关闭缓冲与缓存,保障实时性
WebSocket 消息是流式、低延迟的,Nginx 默认的响应缓冲和缓存机制会引入不可控延迟甚至丢帧:
-
proxy_buffering off;:禁用响应体缓冲,消息到达即转发 -
proxy_cache off;:显式关闭缓存,防止Upgrade请求被错误缓存 -
proxy_cache_bypass $http_upgrade;:作为兜底,确保带Upgrade头的请求一定不走缓存
扩容系统级连接能力
单靠 Nginx 配置无法突破 OS 层限制。高频连接必然触发大量 TIME_WAIT 和文件描述符消耗:
- 设置用户级文件描述符上限:
echo '* soft nofile 1048576' >> /etc/security/limits.conf<br>echo '* hard nofile 1048576' >> /etc/security/limits.conf - 调优内核参数:
net.core.somaxconn = 65535<br>net.ipv4.tcp_tw_reuse = 1<br>net.ipv4.ip_local_port_range = 1024 65535 - Nginx 主配置中同步提升:
worker_rlimit_nofile 1048576;<br>events { worker_connections 65535; }


















