Nginx 不为 WebSocket 维护客户端连接池,但为上游后端建立可复用的长连接池;需配置 keepalive、HTTP/1.1、Connection 头清空等实现复用,并协同调优超时与系统资源限制。

Nginx 本身不为 WebSocket 连接维护传统意义上的“连接池”,它不会复用客户端到代理的连接去服务多个请求,但会为每个上游后端(WebSocket 服务)建立和管理一组可复用的长连接——这才是真正需要调优的“上游连接池”。关键不是池子有多大,而是避免为每个客户端独占一个后端连接,否则资源会指数级耗尽。
上游连接复用:必须显式启用 keepalive
Nginx 默认对每个客户端请求都新建一条到后端的连接,WebSocket 场景下这会导致连接数爆炸。需在 upstream 块中配置:
- keepalive 32; —— 表示最多缓存 32 个空闲的、已建立的上游连接供后续请求复用
- proxy_http_version 1.1; 和 proxy_set_header Connection ''; —— 关闭连接自动关闭,让连接能被复用
- 注意:
keepalive数值不宜盲目设高,应略大于单个 worker 进程平均并发请求量;超过该数的新请求会新建连接,但旧连接会被及时回收
worker 级连接容量:匹配系统上限
每个 Nginx worker 进程能持有的总连接数(含客户端连接 + 上游连接)受三重限制:
- worker_connections 65535; —— 主配置 events 块中设定,表示单个 worker 最多处理多少并发连接(含读、写、空闲状态)
-
worker_rlimit_nofile 1048576; —— 提升 worker 进程可打开文件描述符上限,确保
worker_connections能真正生效 - 操作系统级限制:
fs.file-max和用户级nofile必须同步调大,否则 Nginx 启动时会静默降级
连接生命周期控制:防止“僵尸连接”堆积
上游连接若长期空闲却不释放,会卡住 keepalive 池,新请求被迫新建连接。需协同设置超时:
- proxy_read_timeout 60s; —— 不是给客户端设的,而是控制 Nginx 等待上游响应的最长时间(如握手、心跳回复)
- proxy_send_timeout 10s; —— 控制向后端发数据时的阻塞等待上限,防止单条消息发送卡死整个连接
- 这两项共同决定一条上游连接在空闲多久后被主动关闭并从 keepalive 池中移除
避免连接池失效的典型错误
以下配置会让 keepalive 完全失效,导致每条 WebSocket 请求都新建上游连接:
- 漏写
proxy_http_version 1.1;或写成1.0 -
proxy_set_header Connection "close";或proxy_set_header Connection "";(空字符串 ≠ 删除头) - 在
location中误加proxy_buffering on;或proxy_cache on;,触发 Nginx 内部连接独占逻辑 - 后端服务返回
Connection: close响应头,且未在 Nginx 层覆盖(可用proxy_hide_header Connection;+proxy_set_header Connection '';强制清除)


















