nginx 不支持在 access_log 或 error_log 中直接记录 upstream server 的实时活跃连接数,该状态仅可通过 stub_status 或 nginx-module-vts 等扩展方式获取;推荐生产环境使用 nginx-module-vts + prometheus 实现可视化监控。

Nginx 本身不直接在 access_log 或 error_log 中记录每个 upstream server 的实时活跃连接数,它也不提供原生日志字段(如 $upstream_active_connections)来输出该数值。活跃连接数是 Nginx 内部维护的运行时状态,仅可通过 stub_status 模块暴露的监控端点获取,不能写入常规日志文件。
但你可以通过以下方式间接实现“监控活跃连接数”的目标:
用 stub_status 暴露实时连接统计
这是最标准、最轻量的方式。需启用 ngx_http_stub_status_module(默认已编译进大多数发行版):
server {
listen 127.0.0.1:8080;
server_name _;
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
访问 http://127.0.0.1:8080/nginx_status 会返回类似:
Active connections: 32 server accepts handled requests 12345 12345 67890 Reading: 2 Writing: 5 Waiting: 25
⚠️ 注意:这里的 Active connections 是 Nginx 自身的总活跃连接数(含客户端连接),不是 upstream 后端的连接数。要查后端活跃连接数,需配合其他手段。
查看 upstream 各节点的活跃连接数(关键方法)
Nginx 官方并未在 stub_status 中暴露 per-server 连接数,但可通过以下两种可靠方式获取:
使用
nginx -T+grep辅助观察(调试用)
运行nginx -T 2>/dev/null | grep -A 10 "upstream backend"可看到配置;但无法反映实时值。-
启用
ngx_http_upstream_module的内置变量(需搭配 Lua 或 OpenResty)
标准 Nginx 不支持$upstream_addr以外的动态连接指标。真正能读取各后端当前连接数的,只有:- OpenResty 的
resty.upstream模块 - 或通过
lua_shared_dict+balancer_by_lua_block自定义统计逻辑(高级用法)
- OpenResty 的
更实用的是:用 Prometheus + nginx-module-vts 或 nginx-plus 的 API
如果你用的是 NGINX Plus,可调用 /api/5/http/upstreams/<name></name> 获取每个 server 的 active 字段;
如果用开源版,推荐接入 nginx-module-vts,它扩展了 /status/format/json 接口,返回包含 active、maxFails、fails 等字段的完整 upstream 状态,例如:
"backend": {
"type": "http",
"server": [
{
"name": "192.168.1.10:8080",
"active": 7,
"maxFails": 3,
"fails": 0
},
{
"name": "192.168.1.11:8080",
"active": 2,
"maxFails": 3,
"fails": 0
}
]
}
这个 active 值就是 least_conn 所依赖的「当前活跃连接数」,可被 Prometheus 抓取并绘图告警。
日志中记录 least_conn 调度行为(间接佐证)
虽然不能记连接数,但可以记录每次请求选中的后端地址,再结合外部工具聚合分析趋势:
log_format upstream_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'upstream:"$upstream_addr" upstream_response_time:$upstream_response_time';
access_log /var/log/nginx/upstream.log upstream_log;
这样每条日志会包含实际转发到的后端 IP 和端口(如 192.168.1.10:8080),长期采集后可用脚本统计各节点单位时间内的请求数 —— 在 keepalive 充足、连接复用率高时,该数值与活跃连接数呈正相关。
小结建议
- 不要指望 access_log 直接输出
active connection count,那是内部状态,不可日志化; - 生产环境推荐部署
nginx-module-vts+ Prometheus + Grafana,实现可视化监控; - 开发/调试阶段用
curl http://localhost/status/format/json | jq '.upstreams.backend.server'快速查看; - 若用 OpenResty,可用
balancer_by_lua_block注入自定义连接计数逻辑,但需自行保证线程安全。
不复杂但容易忽略:least_conn 的效果高度依赖 keepalive 和健康检查,监控时务必同步关注 max_fails 触发剔除、keepalive 连接池耗尽等异常信号。











