Nginx 无法原生识别冷热数据,但可通过日志分析+map映射缓存时间、proxy_cache inactive自动淘汰、stub_status+Prometheus实时监控实现近似动态缓存策略。

直接通过 Nginx 原生机制无法自动识别“冷热数据”并动态调整缓存策略,但可以结合日志分析、外部工具与 Nginx 配置联动,实现近似效果。核心思路是:先采集访问频次与时间特征,再映射为缓存参数(如过期时间、是否启用磁盘缓存),最后由 Nginx 执行差异化策略。
用 access_log + 日志分析识别冷热资源
Nginx 默认记录每次静态请求,可定制日志格式突出关键字段,便于后续聚类:
- 在 http 块中定义带 URI 和响应时间的日志格式:log_format hotlog '$time_iso8601 $uri $status $body_bytes_sent $request_time';
- 对静态资源 location 单独启用该日志:access_log /var/log/nginx/static_access.log hotlog;
- 每小时或每天用脚本统计 URI 访问次数(例如用 awk + sort + head),标记前 5% 为“热资源”,后 20% 为“冷资源”
用 map 指令将热度映射为缓存时间变量
将离线分析结果写入配置变量,让 Nginx 在运行时按热度决定缓存时长:
- 生成一个 map 文件(如 /etc/nginx/conf.d/hotness.map),内容类似:
map $uri $cache_ttl {
default "1m";
"~^/static/js/app\.v2\..*\.js$" "1d";
"~^/static/css/main\.css$" "1d";
"~^/static/img/logo\.png$" "1h";
} - 在 server 或 location 中引用:expires $cache_ttl; 或 proxy_cache_valid 200 $cache_ttl;
- 每次更新热度映射后执行 nginx -t && systemctl reload nginx
用 proxy_cache + inactive 控制冷资源自动淘汰
不依赖人工判断,靠访问活跃度自动释放空间:
- 为静态资源单独定义缓存区,设置较短的 inactive 时间:
proxy_cache_path /data/nginx/static_cache levels=1:2 keys_zone=static_cache:50m max_size=5g inactive=30m; - 在 location 中启用,并关闭长期驻留:
proxy_cache static_cache;
proxy_cache_valid 200 1d;
proxy_cache_use_stale off; - 这样:热资源持续被访问,始终保留在缓存中;冷资源 30 分钟无访问即自动清理,节省磁盘
用 stub_status + Prometheus 实现实时热度观测
获取当前缓存命中率、请求数等指标,辅助人工决策或触发自动化流程:
- 开启 stub_status:location /nginx_status { stub_status; allow 127.0.0.1; deny all; }
- 配合 nginx-vts-exporter 或 prometheus-nginxlog-exporter 抓取日志和状态指标
- 设置 Grafana 看板,监控各文件后缀的 request/sec、cache hit ratio,发现某类资源(如 /static/fonts/)命中率骤降 → 判定为变冷 → 触发脚本缩短其 expires 值


















