要真正提升nginx到后端服务器的tcp连接复用率,关键在于proxy_http_version 1.1、proxy_set_header connection ''和upstream keepalive三者协同生效;缺一不可,否则keepalive无效,后端仍频繁新建连接。

WebSocket 代理本身不维护传统意义上的“连接池”,Nginx 的连接复用能力集中在 upstream 到后端服务的长连接管理上。真正需要优化的,是 Nginx worker 与后端服务器之间可复用的空闲连接数量、生命周期及资源分配方式,避免为每个客户端独占一条后端连接,从而大幅降低内存与 FD 消耗。
启用并合理设置 upstream keepalive
这是连接复用的核心配置,必须配合 HTTP/1.1 和 Connection 头协同生效:
- 在
upstream块中显式声明keepalive 32;(推荐值 16~64),表示每个 worker 最多缓存 32 条空闲的后端连接 - 确保下游代理配置含
proxy_http_version 1.1;和proxy_set_header Connection '';,否则 keepalive 不触发 - 避免设过大(如 256+):后端服务通常有最大空闲连接限制,超出会触发拒绝或超时;过小则复用率低,频繁建连
控制上游连接生命周期与复用条件
keepalive 连接不是永久驻留的,需靠超时与主动回收机制维持健康:
- 后端连接空闲超时由
keepalive_timeout控制(默认 60s),可在 upstream 中显式设为keepalive_timeout 60s; - 搭配
proxy_send_timeout和proxy_read_timeout(建议设为心跳间隔的 1.5~2 倍,如 90s),防止因业务延迟误杀活跃连接 - 禁用
proxy_buffering on和proxy_cache,避免 Nginx 缓存响应导致连接无法及时释放回池
匹配系统与 Nginx 的文件描述符容量
每条上游 keepalive 连接占用至少 1 个 FD,高并发下易触达上限:
- 系统层:设
fs.file-max ≥ 655360,用户级 ulimit -n 至少 65536,并确认 Nginx 进程实际生效(cat /proc/$(pgrep nginx)/limits | grep "Max open files") - Nginx 层:主配置加
worker_rlimit_nofile 65536;,events 块设worker_connections 65535; - 注意:worker_connections 是单 worker 最大并发连接数(含客户端 + 上游),keepalive 连接也计入其中
避免无效连接堆积与连接泄漏
连接池健康依赖“进得来、出得去”——既要复用,也要及时清理:
- 对高频建连行为限频:
limit_req zone=ws_conn burst=3 nodelay;防止爬虫或异常客户端耗尽连接配额 - 启用
proxy_socket_keepalive on;,让 TCP 层主动探测后端存活状态,及时关闭失效连接 - 关闭日志写入(
access_log off; error_log /dev/null warn;)减少 FD 和内存碎片压力











