在Grafana中通过$ request_length和$body_bytes_sent日志字段分别估算Nginx代理的进、出带宽,按秒聚合后以双Y轴折线图对比峰值,结合阈值与典型模式识别流量异常。

要在 Grafana 中清晰展示 Nginx 代理流量的“进带宽”(客户端→Nginx)与“出带宽”(Nginx→上游服务)峰值对比,关键不是直接测量物理链路带宽,而是通过日志中可记录、可聚合的变量,分别估算两个方向的秒级数据吞吐,并在 Grafana 中用双 Y 轴或并列折线图呈现峰值差异。
一、日志中分离“入向”与“出向”带宽字段
Nginx 原生不提供“入向字节数”,但可通过组合变量近似反映:
-
出向带宽(推荐):使用
$body_bytes_sent—— 实际发给客户端的响应体字节数,稳定、准确,是衡量下行带宽的核心依据; -
入向带宽(合理代理估算):使用
$request_length—— 请求行 + 请求头 + 请求体总长度(单位:字节),它包含客户端上传的全部数据,在反向代理场景下,能较好代表“进来的有效负载”; - 避免使用
$bytes_sent(含响应头)或$bytes_received(需启用ngx_http_realip_module且不总是可用),前者干扰大,后者依赖模块支持且非默认开启。
配置示例(http 块内):
access_log /var/log/nginx/proxy-bw.log proxy_bandwidth;
二、按秒聚合计算双向带宽速率
将原始日志转为每秒字节数(B/s),再换算为 KB/s 或 Mbps。建议用轻量工具(如 nginxlog-exporter)或自定义脚本解析,确保时间戳对齐到秒级窗口(如 2026-09-03T14:55:22 截取前19位)。
- 入向速率 = 每秒内所有
$request_length总和 ÷ 1024 → 单位 KB/s; - 出向速率 = 每秒内所有
$body_bytes_sent总和 ÷ 1024 → 单位 KB/s; - 若需区分上游节点,可结合
$upstream_addr分组聚合(例如只统计到10.0.2.5:8080的出向)。
三、Grafana 中实现峰值对比可视化
接入 Prometheus 后,在 Grafana 面板中创建双指标折线图:
- 查询入向峰值:类似
rate(nginx_proxy_in_bytes_total[1m]) * 8 / 1024(转为 Kbps,便于网络侧理解); - 查询出向峰值:类似
rate(nginx_proxy_out_bytes_total[1m]) * 8 / 1024; - 设置双 Y 轴:左侧显示入向(蓝色虚线),右侧显示出向(橙色实线),标注峰值时间点;
- 添加阈值线:例如设定“出向持续 > 50 MBps”为黄色告警,“入向/出向比值 > 3”提示异常上传行为(如文件直传未走分片)。
四、识别典型对比模式与含义
观察曲线关系比绝对数值更有诊断价值:
- 出远大于入:常见于 API 网关或静态资源分发,说明 Nginx 正在高效放大响应(如压缩后下发、CDN 回源);
-
入显著高于出:可能为大文件上传接口、Webhook 接收端或恶意请求(如 POST flood),需结合
$request_method和 UA 过滤分析; -
双向同步尖峰但出向延迟半秒:暗示上游处理慢(如数据库阻塞),可用
$upstream_response_time辅助验证; - 入有峰、出无峰 + 大量 502/504:上游不可达或超时,流量被拦截在代理层。


















