nginx日志可通过解析access.log中$bytes_sent或$body_bytes_sent字段,用awk按url聚合字节数并排序,快速统计top带宽消耗资源;需确认日志格式含有效字节数字段,推荐用-f'"'分隔法兼容get/post等请求。

在 Nginx 中,日志本身不直接支持带宽统计,但可通过解析 access.log(通常含 $bytes_sent 或 $body_bytes_sent 字段)配合 awk 快速提取消耗带宽最多的 Top 资源(如 URL 或文件路径)。
确认日志格式中包含字节数字段
Nginx 默认日志格式(log_format combined)一般已包含 $body_bytes_sent(响应体字节数),这是计算带宽的核心字段。检查你的 nginx.conf 中的 log_format 是否类似:
若使用了 $bytes_sent,它包含响应头+体总字节数,更准确;若只用 $body_bytes_sent,则忽略响应头(通常影响不大)。确保该字段在日志行中存在且非“-”或空值。
用 awk 提取 URL 和字节数并聚合统计
假设日志格式为:
192.168.1.100 - - [10/Jan/2024:14:22:05 +0800] "GET /images/logo.png HTTP/1.1" 200 12567 "https://example.com/" "Mozilla/5.0..."
其中第7个字段是请求(如 "GET /images/logo.png HTTP/1.1"),第10个字段是字节数(如 12567)。可用以下命令提取 Top 10 带宽消耗资源:
命令示例:
awk '{url=$7; gsub(/^"GET[[:space:]]+|HTTP\/[0-9.]+".*$/, "", url); if ($10 ~ /^[0-9]+$/ && $10 > 0) bytes[$url] += $10} END {for (u in bytes) print bytes[u], u | "sort -nr | head -10"}' /var/log/nginx/access.log
说明:
-
$7取请求字段,用gsub去掉开头的"GET和结尾的HTTP/1.1",只保留路径(如/images/logo.png) -
$10是字节数字段(按默认 combined 格式位置),加条件过滤非数字和零值 -
bytes[$url] += $10按 URL 累加总字节数 -
END块中输出并用sort -nr | head -10排序取 Top 10
处理 POST、HEAD 或其他请求方法
如果日志中包含 POST、HEAD 等请求,上面的 gsub 正则可能失效。更健壮的方式是用双引号分割:
awk -F'"' '{if (NF >= 2) {req=$2; split(req, a, " "); if (length(a) >= 2) url=a[2]; else url="-"} if (NF >= 3 && $10 ~ /^[0-9]+$/) bytes[url] += $10} END {for (u in bytes) print bytes[u], u | "sort -nr | head -10"}' /var/log/nginx/access.log
该写法以双引号为分隔符,取第二个字段(即整个请求行),再空格切分获取路径,兼容多种 HTTP 方法。
小技巧:实时监控或限制范围
可结合 tail -f 实时分析最新日志:
tail -f /var/log/nginx/access.log | awk -F'"' '{...}' | sort -nr | head -10
或限定时间范围(如最近一小时),先用 sed 或 awk 过滤日期再处理;也可用 zcat 处理压缩日志(zcat access.log.1.gz | awk ...)。











