直接用日志分析静态资源访问热点的核心是“分离日志 + 时间窗口筛选 + uri归一化 + 频次排序”,一条命令即可输出最近一小时最热的20个文件。

直接用日志分析静态资源访问热点,核心是“分离日志 + 时间窗口筛选 + URI归一化 + 频次排序”。不需要额外服务,一条命令就能跑出最近一小时最热的 20 个文件。
1. 先确保日志已分离并标准化
如果静态请求还混在主 access.log 里,统计会失真。必须提前配置独立日志:
- 在 server 块中用 location 精准匹配后缀(如 .js|.css|.png|.woff2),并指定专用日志路径
- 自定义 log_format,至少包含 $time_local(用于时间过滤)和 $request_uri(用于提取路径)
- 关闭 robots.txt、favicon.ico 等干扰路径的日志,避免刷屏
2. 提取指定时间段内的静态请求URI
以最近一小时为例,用 awk 动态计算时间范围,精准截取日志行:
awk -v d1="$(date -d '1 hour ago' '+%d/%b/%Y:%H:%M:%S')" -v d2="$(date '+%d/%b/%Y:%H:%M:%S')" '$4 >= "["d1 && $4 nginx/static_access.log |
3. 清洗路径、去参、统一格式
原始 URI 常带版本号、时间戳、CDN 参数,需标准化才可聚合:
- 去掉 ? 后全部查询参数:sed 's/\?.*$//'
- 转小写防止大小写重复计数:tr 'A-Z' 'a-z'
- 可选:把 /static/v3.2.0/ → /static/(用 sed 替换版本路径)
组合起来就是:sed 's/\?.*$//' | tr 'A-Z' 'a-z' | sed 's|/static/[^/]*/|/static/|g'
4. 统计频次并输出TOP热点
清洗后的 URI 列表交给 sort + uniq -c 排序即可:
sort | uniq -c | sort -nr | head -20
完整命令示例:
awk -v d1="$(date -d '1 hour ago' '+%d/%b/%Y:%H:%M:%S')" -v d2="$(date '+%d/%b/%Y:%H:%M:%S')" '$4 >= "["d1 && $4
输出类似:
142 /static/app.min.js
96 /static/css/main.css
73 /static/img/logo.webp
5. 进阶:自动更新热点映射用于缓存策略
把上述结果定期生成 Nginx map 文件,驱动不同资源的缓存时长:
- 脚本每小时运行一次,生成 /etc/nginx/conf.d/hotmap.map
- 内容格式为:map $uri $cache_ttl { default "10m"; "/static/app.min.js" "1d"; ... }
- 在静态 location 中用 expires $cache_ttl; 生效











