怎样利用Nginx日志进行流量统计
导读:利用 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 等。示例:
为便于机器解析,也可采用 JSON 格式记录日志。完成配置后执行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;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=COMBINEDGoAccess 支持多种输出(HTML、JSON、CSV),适合快速搭建可视化看板与导出报表。
-
ELK Stack 集中分析与可视化
- Logstash 负责采集与解析(grok 匹配 Nginx 日志),Elasticsearch 存储与索引,Kibana 构建仪表盘与告警。
- 适用场景:多实例、海量日志、需要长期留存与复杂查询分析。
-
Grafana Loki + Promtail 轻量方案
- Promtail 采集 Nginx 日志并推送到 Loki,Grafana 进行查询与可视化,资源占用相对更低,适合云原生环境。
四 自动化与注意事项
- 日志切割与归档
- 使用 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
