首页主机资讯怎样利用Nginx日志进行流量统计

怎样利用Nginx日志进行流量统计

时间2025-12-08 22:38:03发布访客分类主机资讯浏览418
导读:利用 Nginx 日志进行流量统计的实用方案 一 前置准备 确认日志包含用于统计的字段:至少包含 $body_bytes_sent(响应体字节数,用于出网流量)与 $request_time(请求处理时间,用于性能关联)。若使用默认 co...

利用 Nginx 日志进行流量统计的实用方案

一 前置准备

  • 确认日志包含用于统计的字段:至少包含 $body_bytes_sent(响应体字节数,用于出网流量)与 $request_time(请求处理时间,用于性能关联)。若使用默认 combined 格式,通常已包含前者;如需更丰富维度,可自定义格式并加入 $request_time、$request_uri、$http_user_agent、$http_x_forwarded_for 等。示例:
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" $request_time';
        
    access_log /var/log/nginx/access.log main;
        
    
    为便于机器解析,也可采用 JSON 格式记录日志。完成配置后执行 nginx -t & & systemctl reload nginx 使配置生效。

二 命令行快速统计

  • 统计总出网流量(单位:字节,可换算为 KB/MB/GB)
    awk '{
    sum+=$10}
     END {
    printf "Total bytes: %.0f\n", sum}
    ' /var/log/nginx/access.log
    
  • 按天统计出网流量
    awk '{
        day=$4;
         gsub(/\[|\]/,"",day);
         split(day,d,"/");
         key=d[1]"/"d[2]"/"d[3];
     bytes[$key]+=$10}
    
         END {
    for(k in bytes) printf "%s %.0f\n", k, bytes[k]}
    ' /var/log/nginx/access.log
    
  • 按小时统计请求量与总流量(用于观察峰值)
    awk '{
        h=$4;
         gsub(/\[|\]/,"",h);
         split(h,t,":");
         key=t[1]":"t[2];
        
         reqs[key]++;
     bytes[key]+=$10}
    
         END {
    for(k in reqs) printf "%s %d %.0f\n", k, reqs[k], bytes[k]}
    ' /var/log/nginx/access.log
    
  • 按 URI 统计下载量 Top10(排除静态资源,聚焦业务路径)
    awk '$7 !~ /\.(js|css|png|jpg|jpeg|gif|ico|svg)$/ {
    bytes[$7]+=$10}
    
         END {
    for(k in bytes) printf "%.0f %s\n", bytes[k], k}
    ' /var/log/nginx/access.log | sort -nr | head
    
  • 按客户端 IP 统计出网流量 Top10(识别大流量来源)
    awk '{
        ip=$1;
     bytes[ip]+=$10}
    
         END {
    for(k in bytes) printf "%.0f %s\n", bytes[k], k}
    ' /var/log/nginx/access.log | sort -nr | head
    
  • 统计 4xx/5xx 错误码对应的流量(定位异常请求带来的流量)
    awk '$9 ~ /^[45]/ {
    err[$7]+=$10}
    
         END {
    for(k in err) printf "%.0f %s\n", err[k], k}
        ' /var/log/nginx/access.log | sort -nr
    

说明:以上命令以默认的 combined 日志为例,字段位置可能因自定义格式而变化;如采用 JSON 日志,建议使用 jq 进行解析。上述方法适合临时排查与快速报表生成。

三 可视化与集中化方案

  • GoAccess 实时分析与报表

    # 终端实时查看
    goaccess /var/log/nginx/access.log -f json --log-format=COMBINED --real-time-html --ws-url=ws://0.0.0.0:7890
    
    # 导出 HTML 报告
    goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED
    

    GoAccess 支持多种输出(HTML、JSON、CSV),适合快速搭建可视化看板与导出报表。

  • ELK Stack 集中分析与可视化

    • Logstash 负责采集与解析(grok 匹配 Nginx 日志),Elasticsearch 存储与索引,Kibana 构建仪表盘与告警。
    • 适用场景:多实例、海量日志、需要长期留存与复杂查询分析。
  • Grafana Loki + Promtail 轻量方案

    • Promtail 采集 Nginx 日志并推送到 LokiGrafana 进行查询与可视化,资源占用相对更低,适合云原生环境。

四 自动化与注意事项

  • 日志切割与归档
    • 使用 logrotate 按日/按大小切割,避免单文件过大影响统计与 I/O;切割后配合上述命令或导入流程处理历史分片。
  • 统计口径与边界
    • 以上以 $body_bytes_sent 近似“出网流量”;若需“入网流量”,可在日志中加入 $request_length(请求体字节数),两者合计更接近会话总流量。
    • 代理/CDN 场景建议记录 $http_x_forwarded_for 以区分真实客户端;若启用压缩(gzip),$body_bytes_sent 为压缩后大小,与带宽账单可能不一致。
  • 性能与实时性
    • 大文件统计建议使用按小时/按天预聚合(如先按小时拆分再统计),或采用 GoAccess 实时模式ELK/Loki 流式处理以减轻单机压力。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 怎样利用Nginx日志进行流量统计
本文地址: https://pptw.com/jishu/766428.html
Ubuntu僵尸进程对系统稳定有何影响 ubuntu minimal用户管理方法

游客 回复需填写必要信息