nginx实现动态内容“按需缓存”的核心是条件启用与精细化键值设计:需定义专用缓存区(proxy_cache_path+keys_zone),用proxy_cache_bypass和proxy_no_cache按请求特征动态绕过或禁存,通过含用户标识、设备等维度的cache_key避免污染,并依状态码分级设置proxy_cache_valid时效,辅以proxy_cache_use_stale保障高可用。

要让 Nginx 缓存“按需存储”动态内容,核心不是缓存所有请求,而是精准控制哪些请求进缓存、用什么键区分、何时失效——关键在 条件启用 和 精细化键值设计,而不是简单打开 proxy_cache。
定义专用缓存区并设置合理生命周期
缓存必须先声明区域,路径、内存区、淘汰策略都要匹配动态场景:
-
路径与结构:使用
proxy_cache_path指定本地目录,levels=1:2避免单目录文件过多;use_temp_path=off提升写入效率 -
内存区(keys_zone):分配足够内存存缓存键,如
my_dynamic:20m,太小会导致键驱逐、命中率骤降 -
自动清理:
inactive=5m表示 5 分钟内未被访问的缓存项会被清理,适合热点波动大的动态页 -
总容量限制:
max_size=5g防止磁盘被缓存占满,Nginx 会按 LRU 清理旧条目
用 proxy_cache_bypass 和 proxy_no_cache 实现按需开关
真正实现“按需”,靠的是运行时判断——不靠人工删缓存,而靠请求特征自动绕过或拒存:
-
跳过缓存(bypass):当请求含特定参数或头时,直接穿透到后端,不查也不存。例如:
proxy_cache_bypass $arg_nocache $http_x_no_cache;
只要 URL 带?nocache=1或请求头含X-No-Cache: 1,就跳过缓存 -
禁止缓存(no_cache):即使响应本可缓存,也强制不存。例如:
proxy_no_cache $cookie_admin $arg_debug;
管理员登录态(cookie_admin 存在)或调试模式下,一律不写入缓存 - 两者常配合使用:bypass 控制读,no_cache 控制写,共同保障敏感/个性化请求不污染缓存池
设计区分度高的 cache_key,避免缓存污染
动态内容常因用户、设备、参数不同而结果不同,key 若不包含这些维度,就会出现 A 用户看到 B 用户的数据:
- 基础组合推荐:
proxy_cache_key "$scheme$host$request_uri$is_args$args$cookie_user_id$http_user_agent"; -
用户级隔离:加入
$cookie_user_id或$arg_token,确保登录用户各自缓存 -
终端适配:加入
$http_user_agent(或简化为$http_ua_platform)可区分移动端/PC,但注意粒度太细会降低复用率 -
忽略无意义参数:用
map指令预处理 URI,过滤掉utm_*、ref=等跟踪参数,防止同一页面因不同来源生成多份缓存
按状态码和业务逻辑分层设置缓存时间
动态接口返回码差异大,不能一刀切。用 proxy_cache_valid 分级管理:
-
proxy_cache_valid 200 302 60s;—— 成功响应缓存 1 分钟,兼顾新鲜度与压力缓解 -
proxy_cache_valid 404 10s;—— 404 缓存很短,避免错误页长期滞留 -
proxy_cache_valid 500 502 503 504 1s;—— 后端故障时缓存极短,防止雪崩扩散 -
proxy_cache_valid any 1s;—— 作为兜底,防止未显式声明的状态码意外缓存 - 搭配
proxy_cache_use_stale error timeout updating,允许在后台更新时返回过期内容,保证可用性











