应使用 $body_bytes_sent 字段统计响应体大小,通过 awk 提取 URL 路径并累加字节数,再 sort -nr 排序取 Top10;需确保 log_format 启用该字段,区分静态资源与动态请求,结合 UA、Referer 分析真实带宽来源。

要快速定位 Nginx 中占用带宽最高的文件请求,核心是解析 access.log,按响应体大小($body_bytes_sent)统计并排序 URL 或文件路径。
确认日志格式是否包含真实响应大小
Nginx 默认日志中的 $bytes_sent 包含响应头,而 $body_bytes_sent 才是纯响应体(即实际下载的文件内容大小),排查带宽占用必须用后者。检查你的 log_format 是否启用:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';若未启用 $body_bytes_sent,需修改配置、重载 Nginx(nginx -s reload),并等待新日志产生——旧日志无法补出该字段。
提取 TopN 高流量文件(命令行速查)
假设日志路径为 /var/log/nginx/access.log,用以下命令快速找出传输量最大的 10 个请求路径:
awk '$9 ~ /^[0-9]+$/ {url[$7] += $9} END {for (u in url) print url[u], u}' /var/log/nginx/access.log | sort -nr | head -10-
$7是$request字段(如"GET /static/js/app.min.js HTTP/1.1"),需进一步提取路径;更稳妥写法是用match()提取 URL: - 精准提取路径+累加字节数(推荐):
awk '{match($0, /"[A-Z]+[[:space:]]+([^[:space:]]+)[[:space:]]+HTTP\//, m); if (m[1] && $10 ~ /^[0-9]+$/) sum[m[1]] += $10} END {for (i in sum) print sum[i], i}' /var/log/nginx/access.log | sort -nr | head -10说明:该命令自动匹配请求行中的路径(如 /images/banner.jpg),按 $body_bytes_sent(通常为第10字段)累加,再倒序取前10。
区分静态资源与动态请求,聚焦真凶
高带宽不等于问题——CDN 缓存失效、爬虫批量抓取、或未压缩的大文件(如视频、PDF、未优化 JS/CSS)才是重点:
- 检查路径后缀:
.mp4、.zip、.pdf、.tar.gz等二进制文件天然占带宽; - 警惕无后缀或伪静态路径:
/download?id=123可能输出大文件,需结合后端逻辑判断; - 对比 User-Agent:大量
python-requests、curl或非常规 UA,可能是恶意采集或未限速的脚本; - 检查 Referer:空 Referer 或异常域名可能指向盗链,可配合
valid_referers指令拦截。
辅助验证与长期监控建议
单次分析后,建议做两件事:
- 用
curl -I或浏览器开发者工具确认目标文件真实大小和是否启用压缩(查看Content-Encoding: gzip和Content-Length); - 对高频大文件加访问控制:限制频率(
limit_req)、禁止外链(valid_referers)、或迁移至 CDN 并开启压缩/分片; - 日常可用
goaccess或ngxtop实时分析,例如:ngxtop -l /var/log/nginx/access.log -t '%a - %u [%t] "%r" %s %b "%R" "%u"' top remote_addr --no-follow(按 IP 统计总流量)。

















