缓存过期与清理策略
缓存过期和清理是保证数据一致性的关键。NGINX 提供自动过期和主动清理两种机制。
自动过期
按时间过期
nginx
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_cache_valid定义不同状态码的缓存有效期。过期后缓存标记为EXPIRED,下次请求会回源验证。
inactive 清除
nginx
proxy_cache_path /var/cache/nginx keys_zone=my_cache:10m inactive=60m;
inactive时间内未被访问的缓存被 cache manager 清除。即使未过期也会被清除。
主动清理
PURGE 方法(NGINX Plus)
nginx
proxy_cache_path /var/cache/nginx keys_zone=my_cache:10m;
server {
location / {
proxy_cache my_cache;
proxy_pass http://backend;
}
location ~ /purge(/.*) {
allow 10.0.0.0/8;
deny all;
proxy_cache_purge my_cache $1;
}
}
发送
PURGE /purge/path/to/resource可删除指定缓存。仅 NGINX Plus 和第三方ngx_cache_purge模块支持。
手动清除缓存
Bash
# 查找并删除特定缓存
find /var/cache/nginx -name "$(echo -n '/path/to/resource' | md5sum | cut -d' ' -1)" -delete
# 清空整个缓存目录
rm -rf /var/cache/nginx/*
手动删除需谨慎,直接删除文件可能导致 cache manager 元数据不一致。
缓存更新策略
后台更新
nginx
proxy_cache_use_stale updating error timeout http_500 http_502 http_503 http_504;
proxy_cache_background_update on;
proxy_cache_revalidate on;
proxy_cache_background_update— 后台异步更新过期缓存- 客户端仍获取旧缓存,同时 NGINX 异步回源更新
proxy_cache_revalidate— 使用条件请求验证
后台更新减少用户感知的延迟。适合内容更新频繁但对实时性要求不高的场景。
按 URL 模式跳过缓存
动态内容不缓存
nginx
map $request_uri $skip_cache {
default 0;
~*/admin/ 1;
~*/api/ 1;
~*\? 1; # 带参数的请求
~*/feed$ 1;
}
server {
proxy_cache_bypass $skip_cache;
proxy_no_cache $skip_cache;
}
缓存预热
预加载热门内容
Bash
# 使用 curl 预热
curl -s -o /dev/null http://localhost/popular-page-1
curl -s -o /dev/null http://localhost/popular-page-2
# 或使用爬虫批量预热
wget --spider -r -l 2 http://localhost/
缓存预热在发布前或高峰前加载热门页面到缓存,避免冷启动时的慢响应。
要点总结
proxy_cache_valid按状态码设置不同过期时间inactive清除长期未访问的缓存释放磁盘空间- NGINX Plus 支持
proxy_cache_purge主动清除缓存 proxy_cache_background_update后台异步更新过期缓存- 通过
map指令按 URL 模式跳过缓存 - 缓存预热减少冷启动延迟
- 手动删除缓存文件需谨慎,可能影响元数据一致性
📝 发现内容有误?点击此处直接编辑