分析Nginx日志统计每个URL访问内容的总大小($body_bytes_sent) ?

参考回答:

要分析 Nginx 访问日志中每个 URL 的访问内容总大小($body_bytes_sent),可以通过以下步骤:

  1. 定位 Nginx 访问日志文件:通常,Nginx 的访问日志位于 /var/log/nginx/access.log,但具体路径可能根据系统配置不同而不同。

  2. 使用 awk 提取 URL 和响应体大小字段:使用 awk 提取日志中的 URL(通常是 $7 字段)和响应体大小(通常是 $10 字段)。

  3. 统计每个 URL 的总响应体大小:对提取出的 URL 和响应体大小进行累加。

  4. 排序并输出:按照响应体大小降序排列,并输出结果。

命令示例:

cat /var/log/nginx/access.log | awk '{print 7,10}' | awk '{a[1]+=2} END{for (i in a) print i, a[i]}' | sort -nr -k2 | head -n 10
Bash

命令解析
cat /var/log/nginx/access.log:输出访问日志内容。
awk '{print 7,10}':提取日志中的第 7 个字段(即请求的 URL)和第 10 个字段(即响应体的大小,$body_bytes_sent)。
awk '{a[1]+=2} END{for (i in a) print i, a[i]}':统计每个 URL 的总响应体大小,累加相同 URL 的响应体大小。
sort -nr -k2:按照响应体大小降序排序(-n 为数值排序,-r 为反向排序,-k2 指定按第二列排序,即响应体大小)。
head -n 10:输出访问内容总大小最多的前 10 个 URL。

详细讲解与拓展:

1. Nginx 访问日志格式

Nginx 默认的访问日志格式通常为 combined,记录了请求的客户端 IP 地址、请求时间戳、请求方法、请求的 URL、响应状态码、响应体大小、请求来源、用户代理等信息。日志的一行示例:

127.0.0.1 - - [14/Mar/2019:10:05:23 +0000] "GET /index.html HTTP/1.1" 200 1034 "-" "Mozilla/5.0"
Log

其中,第 7 个字段(/index.html)表示请求的 URL,第 10 个字段(1034)表示响应体的大小(即 $body_bytes_sent)。

2. 提取 URL 和响应体大小

日志的第 7 个字段通常是请求的 URL(即 $request 中的路径部分),第 10 个字段是响应体大小($body_bytes_sent)。通过 awk 提取这两个字段,并将相同的 URL 访问内容大小累加起来。

3. 统计总大小

awk '{a[1]+=2} END{for (i in a) print i, a[i]}' 这条命令对相同的 URL 进行累计,将每个 URL 的响应体大小累加起来。a[$1] 是以请求的 URL 为索引,$2 是每次请求的响应体大小。最终,输出每个 URL 和其对应的总响应体大小。

4. 排序输出结果

使用 sort -nr -k2 将结果按照总响应体大小降序排列,-n 表示按数值排序,-r 表示反向排序,-k2 表示按第二列(即响应体大小)进行排序。

5. 优化与扩展

  • 过滤特定请求路径:如果只关心特定路径的请求(例如 /api),可以通过 grep 进行过滤:
    grep '/api' /var/log/nginx/access.log | awk '{print 7,10}' | awk '{a[1]+=2} END{for (i in a) print i, a[i]}' | sort -nr -k2 | head -n 10
    
    Bash
  • 按时间段统计:可以使用 grep 过滤出特定时间段的日志,然后再进行分析。例如,分析 2019 年 3 月 14 日的数据:
    grep '14/Mar/2019' /var/log/nginx/access.log | awk '{print 7,10}' | awk '{a[1]+=2} END{for (i in a) print i, a[i]}' | sort -nr -k2 | head -n 10
    
    Bash
  • 日志分析工具:如果日志文件非常大,可以使用 GoAccessAWStatsELK Stack 等工具进行更高效的日志分析和可视化。

总结:

通过分析 Nginx 访问日志中的响应体大小($body_bytes_sent),我们可以了解到每个 URL 的总数据传输量。使用 awksortuniq 等命令组合,可以高效地提取、统计并分析访问数据,帮助网站管理员了解哪些页面的访问内容较大,并进行优化。同时,针对大规模日志数据,使用专业的日志分析工具能够提高处理效率。

发表评论

后才能评论