nginx 不直接提供负载水位仪表盘,但可通过日志记录 $body_bytes_sent 和 $backend_id 字段,结合 tail+awk 秒级聚合或 nginxlog-exporter 接入 prometheus 实现带宽水位监控,并需区分状态水位与流量水位。

Nginx 本身不直接提供“负载水位”的实时仪表盘,但可通过日志 + 外部聚合的方式,精准反映各后端节点的出向带宽水位(即单位时间发送字节数),这是最贴近业务流量压力的核心指标。
带宽水位靠日志字段支撑
关键不是看连接数或请求数,而是看实际发出的数据量。需在 log_format 中固定输出两个字段:
-
$body_bytes_sent:本次响应真实发出的字节数(不含响应头),是计算带宽的直接依据; -
$backend_id:用map将上游地址映射为可读别名(如node-a),用于区分集群成员。
示例配置(放在 http { } 块内):
map $upstream_addr $backend_id {
default "unknown";
"10.0.1.10:8080" "node-a";
"10.0.1.11:8080" "node-b";
"10.0.1.12:8080" "node-c";
}
log_format bandwidth_log '$time_iso8601|$backend_id|$body_bytes_sent';
access_log /var/log/nginx/bandwidth.log bandwidth_log;
秒级聚合可用轻量命令实现
不用上整套监控平台,一条 tail + awk 就能每秒输出各节点带宽(KB/s):
tail -f /var/log/nginx/bandwidth.log | \
awk -F'|' '{
ts = substr($1, 1, 19);
if (ts != prev_ts) {
if (NR > 1) {
printf "%s | node-a:%.1f KB/s | node-b:%.1f KB/s | node-c:%.1f KB/s\n",
prev_ts, a/1024, b/1024, c/1024;
}
a = b = c = 0;
prev_ts = ts;
}
if ($2 == "node-a") a += $3;
else if ($2 == "node-b") b += $3;
else if ($2 == "node-c") c += $3;
}'
水位可视化建议对接 Prometheus
已有 Prometheus 环境时,推荐用 nginxlog-exporter 解析该日志格式,暴露为 nginx_bandwidth_bytes_total{backend="node-a"} 类型指标。再在 Grafana 中:
- 对每个
backend按 1s 或 5s rate 计算带宽(单位转为 Mbps); - 设置阈值线(如单节点带宽 > 80 MB/s 触发预警);
- 叠加 CPU、连接数等指标做交叉分析,避免误判(例如带宽高但延迟低,可能是大文件下载而非异常)。
补充:状态水位 ≠ 流量水位
若还需知道节点是否健康(up/down)、失败次数、响应延迟,需额外启用 nginx_upstream_check_module,配合 /status 接口或 upstream_status 日志变量。但注意:状态正常 ≠ 负载不高,两者要分开监控、联合研判。











