利用 Nginx 日志进行流量统计的实用方案
一 前置准备
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 使配置生效。二 命令行快速统计
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
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
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
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 集中分析与可视化
Grafana Loki + Promtail 轻量方案
四 自动化与注意事项