温馨提示×

Debian Nginx日志中带宽消耗怎么看

小樊
44
2025-11-22 19:31:39
栏目: 智能运维

Debian Nginx日志中带宽消耗查看方法

一、核心思路

  • 在 Nginx 的访问日志中,衡量带宽消耗的关键字段是 $body_bytes_sent(发送给客户端的响应体字节数)。若你的日志格式使用了 combined 或常见默认格式,该字段通常位于第 10 列;若自定义了 log_format,请以实际格式中该字段的位置为准。通过统计该字段的累计值即可得到带宽消耗,再按时间、URL、IP 等维度聚合即可完成分析。

二、命令行快速统计

  • 前置确认

    • 日志路径通常为 /var/log/nginx/access.log;若使用自定义格式,请在 nginx.conflog_format 中确认 $body_bytes_sent 是否存在,并确认其在日志行中的列号(默认常见为第 10 列)。
  • 统计示例(按你的实际列号替换 $10)

    • 全部请求的总字节数
      awk '{sum += $10} END {print sum}' /var/log/nginx/access.log
      
    • 按指定日期统计(示例:2025/Nov/22
      grep '22/Nov/2025' /var/log/nginx/access.log | awk '{sum += $10} END {printf "%.2f MB\n", sum/1024/1024}'
      
    • 按客户端 IP 汇总
      awk '{sum[$1] += $10} END {for (ip in sum) printf "%s %.2f MB\n", ip, sum[ip]/1024/1024}' /var/log/nginx/access.log
      
    • 按 URL 汇总(第 7 列为请求路径 $request 的第一段)
      awk '{url=$7; gsub(/\?.*/,"",url); sum[url] += $10} END {for (u in sum) printf "%s %.2f MB\n", u, sum[u]/1024/1024}' /var/log/nginx/access.log
      
    • 最近 24 小时(配合 logrotate 按天切分时可用)
      # Debian 常见 logrotate 按天切分,access.log.1 为昨天
      zcat /var/log/nginx/access.log.1.gz | awk '{sum += $10} END {printf "%.2f MB\n", sum/1024/1024}'
      
    • 单位换算提示:字节转 MB 用 /1024/1024,转 GB 用 /1024/1024/1024

三、可视化与实时监控

  • GoAccess 报表

    • 安装:sudo apt-get install goaccess
    • 生成 HTML 报告(combined 格式):
      goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED
      
    • 在浏览器打开 report.html,可查看包含带宽在内的多维度统计图表与明细。
  • ngxtop 实时 Top N

    • 安装:pip3 install ngxtop
    • 实时按平均发送字节数×请求数排序,定位“最耗带宽”的 URL:
      ngxtop -l /var/log/nginx/access.log --order-by 'avg(bytes_sent) * count'
      
    • 其他常用:
      ngxtop -l /var/log/nginx/access.log -n 20                 # Top 20 请求
      ngxtop -l /var/log/nginx/access.log top remote_addr       # Top IP
      ngxtop -i 'status == 404' print request status -l /var/log/nginx/access.log  # 404 明细
      
    • 若需进一步确认进程级网络占用,可配合 nethogs 观察 nginx 进程实时带宽。

四、补充与排错

  • 字段与列号
    • 使用 $body_bytes_sent 统计的是响应体大小;若你的日志格式未包含该字段,需要在 log_format 中显式加入,再基于该字段进行统计。若采用 combined 或常见默认格式,通常对应第 10 列,否则请以实际列号为准。
  • 实时与历史
    • stub_status 模块提供实时的连接与收发状态(如 Sending 项),但它并非日志统计,适合做瞬时/短期观测;历史与细粒度分析仍应以访问日志为主。
  • 压缩日志
    • Debian 上 logrotate 默认常配合 gzip 压缩历史日志,分析时可用 zcat/zgrep 直接读取 .gz 文件,无需解压到磁盘。

0