可使用lua-resty-cache或ngx.var等配合proxy_cache动态干预缓存:access_by_lua设proxy_cache_bypass跳过缓存;header_filter_by_lua改Cache-Control但不影响存储;proxy_cache_purge配合Lua实现安全主动失效。

可以使用 lua-resty-cache 或直接通过 ngx.var、ngx.header 和 ngx.status 配合 Nginx 的缓存指令(如 proxy_cache)来动态干预缓存行为。核心思路是:在 access_by_lua* 或 rewrite_by_lua* 阶段修改缓存相关变量或响应头,从而影响后续的缓存决策。
设置缓存键并动态排除特定请求
Nginx 默认用 $scheme$host$request_uri 作为缓存键。若需对登录用户、带特定参数或 UA 的请求跳过缓存,可在 location 块中用 Lua 设置 proxy_cache_bypass 变量:
set $skip_cache 0;
access_by_lua_block {
local cookie = ngx.var.cookie_user_id
local arg_nocache = ngx.var.arg_nocache
if cookie or arg_nocache == "1" then
ngx.var.skip_cache = 1
end
}
proxy_cache_bypass $skip_cache;
这样,有登录态或带 ?nocache=1 的请求就不会进入缓存流程。
按响应内容动态控制缓存时长
有些接口返回的数据时效性不同(如状态为 “success” 缓存 5 分钟,“error” 缓存 10 秒)。可在 header_filter_by_lua_block 中读取上游响应体(需开启 lua_http_header_filter 或配合 body_filter_by_lua 缓存响应体),但更稳妥的做法是让后端通过响应头传递缓存策略:
- 后端在响应中设置自定义头:
X-Cache-Duration: 300 - Nginx 中用 Lua 提取该值,并赋给
proxy_cache_valid对应的状态码规则(需借助map+variables_hash_max_size配合) - 更常用的是统一用
add_header X-Cache-Status $upstream_cache_status;辅助调试
手动清理指定缓存(主动失效)
lua-resty-cache 不适用于 proxy_cache 磁盘缓存,但可通过构造缓存路径 + 文件操作(不推荐)或更安全的方案:
- 使用 ngx.var 暴露缓存键,在日志中记录便于排查
- 结合
proxy_cache_purge指令(需启用ngx_http_proxy_cache_purge_module)提供 purge 接口,用 Lua 校验权限后触发 - 示例:允许 POST 到
/purge/xxx清除对应 key 的缓存,由 Lua 解析 URI 并调用proxy_cache_purge
避免常见陷阱
Lua 脚本运行在 Nginx 多阶段,缓存逻辑依赖执行顺序:
-
access_by_lua*在缓存查找前执行 → 适合设置proxy_cache_bypass -
header_filter_by_lua*在响应头生成后、发送前执行 → 适合改写Cache-Control,但不影响 proxy_cache 存储行为 - 不要在
content_by_lua*中试图“重放”缓存响应 —— 这会绕过 Nginx 缓存机制,失去性能与一致性保障 - 确保
proxy_buffering on,否则部分 Lua 阶段无法读取完整响应体


















