Nginx 无原生 max_conns 告警功能,需结合错误日志监控(如“upstream queue is full”)与外部监控系统(如 Prometheus + Alertmanager)采集 upstream server 连接数并设置阈值告警。

Nginx 本身不直接提供 max_conns 触发告警的内置机制,它没有“连接数超限就自动发邮件/调用 webhook”的原生告警能力。但你可以通过 监控 max_conns 的实际效果 + 外部监控系统联动,实现等效的“max_conns 触发告警”目标。核心逻辑是:当某个 upstream server 因达到 max_conns 被主动拒绝连接时,Nginx 会在 error log 中记录特定错误,并且该 server 的活跃连接数、失败计数等指标会出现可识别异常。
下面分三步说明如何落地:
查看 max_conns 是否生效及是否被触发
max_conns 是 upstream server 指令中的参数,用于限制单个后端节点同时处理的最大连接数(需配合 queue 指令才具备排队能力,否则直接拒绝):
upstream backend {
server 192.168.1.10:8080 max_conns=100;
server 192.168.1.11:8080 max_conns=100;
}
⚠️ 注意:
-
max_conns仅在 worker 进程内 统计本 worker 到该 server 的连接数,不是全局总连接数; - 若未配置
queue,超出max_conns的请求会立即返回503 Service Temporarily Unavailable; - 若配置了
queue timeout=30s, 请求会排队等待,超时仍返回503。
验证是否触发:
- 检查 Nginx 错误日志中是否出现类似条目:
upstream queue is full while connecting to upstream
或no live upstreams while connecting to upstream(当所有 server 都因max_conns拒绝且无备用时) - 使用
curl -I http://your-domain/观察响应码是否偶发503; - 对应 server 的
nginx_status中Active connections可能持续贴近max_conns值(需结合stub_status+ 自定义采集)。
采集关键指标用于告警判定
你需要从两个层面采集数据:
-
Nginx 内置状态(推荐启用 stub_status)
在某 location 暴露/nginx_status,再用 Prometheus exporter(如nginx-prometheus-exporter)或自定义脚本定期抓取。重点关注:-
Active connections(全局活跃连接) - 各 upstream server 的连接分布(需
nginx-module-vts或 OpenResty 的lua-resty-upstream-healthcheck才能细粒度获取单 server 连接数)
-
-
错误日志关键词监控(最直接有效)
使用 filebeat / fluentd / rsyslog 实时监听/var/log/nginx/error.log,匹配:-
upstream queue is full -
no live upstreams -
connect() failed (110: Connection timed out) while connecting to upstream(可能关联连接打满)
这些日志行出现频次突增,就是max_conns瓶颈已实际影响服务。
-
配置外部监控系统实现告警
以 Prometheus + Alertmanager 为例(主流且轻量):
- 部署
nginx-prometheus-exporter,它能解析 stub_status 并暴露nginx_upstream_server_active_connections等指标; - 编写告警规则(例如当某 server 连接数 > 95%
max_conns并持续 2 分钟):
- alert: UpstreamServerMaxConnsExceeded
expr: nginx_upstream_server_active_connections{upstream="backend", server="192.168.1.10:8080"} > 95
for: 2m
labels:
severity: warning
annotations:
summary: "Upstream server {{ $labels.server }} near max_conns limit"
- 同时配置日志侧告警(如用 Loki + Promtail + Grafana Alerting):
当rate({job="nginx"} |~ "upstream queue is full|no live upstreams"[5m]) > 0.1(即每分钟超 6 次)即触发。
这样就完成了从“配置 max_conns”到“真实瓶颈可感知、可量化、可告警”的闭环。
不复杂但容易忽略











