监控静态资源吞吐量需通过nginx定制日志采集$ blow_bytes_sent字段,按路径分离静态请求,结合流式聚合或prometheus exporter实现分钟级/秒级实时统计,并联动stub_status与网络指标定位瓶颈。

监控静态资源传输的吞吐量,核心是准确采集单位时间内传输的字节数,并区分静态请求路径,避免与动态流量混杂。Nginx 本身不直接暴露“吞吐量”指标,但可通过日志统计、状态模块辅助和外部工具聚合实现高精度、低开销的实时监控。
用独立 access_log 记录静态字节量
静态资源吞吐依赖 $body_bytes_sent 字段(实际发给客户端的响应体字节数),必须在专用于静态资源的 location 中启用定制日志:
- 为 JS/CSS/图片等路径单独配置 location,例如:
location ~* \.(js|css|png|jpg|woff2)$ { ... } - 定义专用日志格式,确保包含
$body_bytes_sent和时间戳:log_format static_bytes '$time_local $uri $status $body_bytes_sent'; - 启用该格式写入独立文件:
access_log /var/log/nginx/static_bytes.log static_bytes buffer=64k flush=3s;(缓冲+定时刷盘,兼顾性能与延迟)
按分钟聚合计算实时吞吐率
吞吐量单位为 bytes/sec 或 MB/s,需对日志做时间窗口聚合。推荐用流式命令实时计算:
- 每分钟滚动统计总字节数:
tail -n 0 -f /var/log/nginx/static_bytes.log | awk -F' ' '{sum += $4; count++} NR%60==0{print strftime("%H:%M"), sum, "bytes"; sum=0}' - 转换为 MB/s(假设每分钟采样一次):
awk '{mbps = $2 / 1024 / 1024 / 60; printf "%s: %.2f MB/s\n", $1, mbps}' - 若需更高精度(如秒级),可用 logrotate 按秒切分 + Python 滑动窗口统计,或接入 Prometheus exporter
结合 stub_status 交叉验证连接负载
单纯字节数不能反映瓶颈位置。配合 stub_status 可判断吞吐是否受连接能力限制:
- 启用
/nginx_status并限制访问,观察Active connections和Writing状态数 - 当吞吐持续升高但
Writing连接数逼近worker_connections上限时,说明发送带宽或内核 socket 缓冲区成为瓶颈 - 若
Waiting数值长期偏高而吞吐未升,可能客户端复用不足或前端 CDN 缓存命中率低,导致无效连接堆积
用 Prometheus + Grafana 可视化长期趋势
生产环境建议固化指标链路:
- 用
prometheus-nginxlog-exporter解析static_bytes.log,提取nginx_static_bytes_total计数器 - Prometheus 中通过
rate(nginx_static_bytes_total[1m])得到实时吞吐速率(bytes/sec) - Grafana 中叠加展示:吞吐曲线 +
nginx_connections_active+ 网络接口出向流量(node_network_transmit_bytes_total),确认 Nginx 输出是否占满网卡 - 设置告警:连续 5 分钟吞吐突降 >30% → 检查上游存储/CDN;突增 >200% → 关联分析请求来源是否异常











