nginx 不支持定时器触发的缓存刷新,其缓存失效依赖响应头、proxy_cache_valid 和 inactive 时间,由 cache manager 被动扫描回收,而非时钟驱动;需借助外部脚本、purge 请求或版本化 url 实现定时清理。

Nginx 本身不提供“定时器触发的缓存刷新”这一原生功能。它的缓存机制默认基于响应头(如 Cache-Control、Expires)和配置的 inactive 时间自动管理生命周期,而不是靠定时任务周期性地批量刷新或重载缓存内容。
缓存失效依赖的是访问行为,不是时钟驱动
Nginx 的缓存清理由 cache manager 进程负责,它并不按固定时间点执行刷新,而是通过以下逻辑被动触发:
- 当 worker 进程处理请求时,发现某个缓存项已超过
inactive设置(例如inactive=60m),且该缓存在此期间未被任何请求命中,就标记为可回收; - cache manager 定期扫描缓存目录(频率由系统负载和磁盘 I/O 状态影响),回收过期或非活跃条目;
- 这个扫描动作本身没有精确到秒的定时调度,也不是靠
timer_resolution或 SIGALRM 控制——那些定时器主要用于事件循环、连接超时、日志轮转等内部机制,与缓存刷新无关。
想实现“定时刷新”,得绕开 Nginx 自身逻辑
如果业务确实需要每天凌晨清空某类缓存,或每小时更新一组静态页面,Nginx 不会主动做这件事,但你可以组合外部手段来达成效果:
-
用脚本定期删除缓存文件:根据
proxy_cache_path配置的路径(如/data/nginx/cache),配合find命令按时间或 key 特征清理,再kill -USR2或nginx -s reload(非必需,仅在需重置内存索引时); -
配合后端主动通知:后端发布新内容后,调用一个内部接口,由该接口向 Nginx 发送 PURGE 请求(需启用
ngx_http_proxy_cache_purge模块); -
用时间戳或版本号控制缓存键:把发布时间或构建哈希嵌入 URL 或
proxy_cache_key(如$uri?v=20260609),让旧缓存自然失效,无需手动刷新。
别混淆:timer_resolution 不管缓存
资料中提到的 timer_resolution 指令,作用是让 Nginx 使用 SIGALRM 信号同步时间精度(比如设为 100ms),主要影响日志写入时间戳、连接超时判断等,它不会导致缓存条目被定时重取或强制更新。Nginx 缓存是否更新,只取决于三件事:原始响应是否带有效缓存头、proxy_cache_valid 是否覆盖、以及后续请求是否触发了 inactive 超时回收。
更推荐的“准定时”做法:按需 + 可控
与其强行模拟定时刷新,不如让缓存行为更可控:
- 对不变资源,用
expires max或Cache-Control: public, immutable,彻底避免刷新需求; - 对每日更新的内容,后端返回
Cache-Control: max-age=86400,Nginx 自动在 24 小时后失效并回源; - 加
add_header X-Cache-Status $upstream_cache_status,方便监控 HIT/MISS/EXPIRED 分布,验证策略是否按预期工作。











