nginx无传统连接池,但需监控客户端tcp连接与upstream长连接缓存:用stub_status看active/reading/writing/waiting状态,结合ss命令、error_log和keepalive参数防泄漏,并通过健康检查与告警联动保障稳定性。

Nginx 本身没有传统意义上的“连接池”(如数据库连接池),但存在两类关键连接资源:客户端到 Nginx 的 TCP 连接,以及 Nginx 到后端 upstream 的长连接缓存。所谓“连接池状态监控”,实际是分别盯住这两层连接的占用、复用与释放行为,防止因连接堆积、泄漏或配置失当导致资源耗尽、响应延迟甚至服务不可用。
监控客户端连接压力:用 stub_status 看实时分布
stub_status 模块提供最轻量、最直接的客户端连接视图,返回三行文本,核心是 Active/Reading/Writing/Waiting 四项:
-
Active connections:当前所有 TCP 连接总数(含空闲);持续接近
worker_processes × worker_connections阈值,说明连接资源逼近瓶颈 - Reading:正在读取请求头/体的连接数;若长期高于 Active 的 5%,可能遭遇慢速攻击、网络抖动或客户端发包异常
- Writing:正向客户端发送响应的连接数;若持续占 Active 30% 以上且波动小,大概率是后端响应慢、大文件传输阻塞或网卡带宽打满
-
Waiting:已建立连接但无数据收发的空闲连接(即 keepalive 连接);该值过低(尤其配合
accepts ≠ handled)表明 worker 无法及时处理新连接,常见于worker_connections不足或系统级 file descriptor 耗尽
监控 upstream 连接池泄漏:查系统连接 + 日志 + 超时策略
upstream 的“连接池”由 keepalive N 控制,每个 worker 最多缓存 N 条空闲连接。泄漏表现为 ESTABLISHED 连接数远超理论上限(N × worker_processes),需多维度交叉验证:
- 用
ss -ant | grep :upstream_port | grep ESTAB | wc -l统计真实连接数,对比理论值 - 检查 error_log 中是否高频出现
upstream connection is busy或no live upstreams,这是连接池被无效连接占满的典型信号 - 收紧关键参数:
keepalive_timeout(建议设为 15–30s,略大于后端 P95 响应时间)、keepalive_requests(建议 100–500,防单连接承载过多请求后状态异常) - 确保后端响应含
Connection: keep-alive头,HTTP/1.0 后端需手动加add_header Connection keep-alive
结合主动健康检查与告警联动
仅看连接数不够,还需让 Nginx 主动感知后端连接是否“可用”而非仅“可连”:
- 启用
nginx_upstream_check_module(OpenResty 或编译安装),配置 HTTP 探针访问/health,用rise=2 fall=3控制状态切换节奏 - 将探针响应码、失败次数、连接建立耗时等指标接入 Prometheus,设置规则:比如连续 3 次探测超时,或 ESTABLISHED 连接数 5 分钟内上涨 200%,触发 Zabbix 或企业微信告警
- 错误日志中开启
error_log ... debug(需编译带--with-debug),搜索keepalive free和keepalive close日志,确认空闲连接是否真被回收
配置与采集要安全、稳定、可落地
监控本身不能成为负担:
- stub_status 接口必须绑定本地地址(如
listen 127.0.0.1:8081),路径避开/status等通用名,只允许运维网段访问 - 禁用该 location 的 access_log,避免高频采集压垮磁盘 I/O
- 采集脚本用正则提取固定位置字段(如
Active connections: (\d+)),不依赖 JSON,适配所有 Nginx 版本 - 系统级连接数告警建议设软阈值(如 80%
worker_connections)和硬阈值(95%),前者用于优化干预,后者触发自动扩容或限流预案











