需按小时聚合nginx日志的请求数、流量和uv,跨多日对比均值与标准差识别稳定波峰(如10:00、20:00)和波谷(如03:00–05:00),并用goaccess可视化验证业务真实性。

要统计 Nginx 日志中每日不同时段的流量波峰与波谷规律,核心是按小时聚合请求量、流量(字节数)和独立访客(UV),再对比多日数据找出重复出现的高低谷时段。不能只看单日峰值,而要看“每日是否在相似时间反复出现高/低值”,这才是可复用的规律。
按小时提取并统计请求数与流量
日志时间字段(第 4 列)格式为 [10/Jan/2026:14:22:35 +0800],小时信息固定位于第 14–15 字符位置:
- 统计每小时请求数:awk '{print $4}' access.log | cut -c 14-15 | sort | uniq -c | sort -nr
- 统计每小时响应总字节数(需确保日志含 $body_bytes_sent):awk '{h=substr($4,14,2); b=$10; sum[h]+=b} END {for (i in sum) print i, sum[i]}' access.log | sort(注意:$10 是默认日志格式下 $body_bytes_sent 的列号,需先用 head -1 access.log 确认实际列位)
叠加 UV 和状态码验证真实业务高峰
单纯请求数可能被静态资源或爬虫拉高,需交叉验证:
- 每小时独立 IP 数(UV):awk '{h=substr($4,14,2); print h,$1}' access.log | sort -k1,1 -k2,2 | uniq -w2 | awk '{uv[$1]++} END {for (h in uv) print h, uv[h]}' | sort
- 每小时 4xx/5xx 错误占比:若某小时请求激增但错误率同步上升(如 >5%),大概率是探测或异常刷量,非真实业务波峰
跨多日对齐分析识别稳定规律
取最近 7 天日志(或按业务周期选工作日/周末分别处理),统一提取每小时维度数据后横向对比:
- 用脚本将每天的小时级请求数导出为 CSV,列名为 Hour, Day1, Day2, ..., Day7
- 计算每小时的均值与标准差,标准差小且均值高的小时(如 10:00、20:00)即为稳定波峰;均值低且波动小的(如 03:00–05:00)即为规律性波谷
- 避免跨天干扰:用 grep '10/Jan/2026' access.log 先筛出单日,再处理,防止时区或日志轮转导致时间错位
用 goaccess 快速生成趋势图辅助判断
命令行聚合适合定量,图形化更易发现模式:
- 运行:goaccess access.log -a --date-format=%d/%b/%Y --time-format=%H:%M:%S --log-format='%h %^ [%d:%t %^] "%r" %s %b "%R" "%u"' --output=report.html
- 打开 report.html → 进入 Hourly Requests 标签页,勾选多日数据,观察曲线是否呈现“双峰”(早高峰+晚高峰)或“单峰”(如企业 SaaS 集中在工作时间)
- 点击某高峰小时,下钻查看该时段 Top URL 和 User-Agent,确认是否来自真实用户行为(如大量 Chrome 访问首页)而非监控探针或 CDN 回源











