proxy_no_cache 是 nginx 的请求级缓存绕过开关,不删缓存而强制单次回源,需配合 proxy_cache 使用,支持变量动态控制,适用于大促精准刷新。

在凌晨大促期间,用户流量陡增,缓存策略稍有不慎就容易导致页面展示陈旧数据(比如库存、价格、活动状态),而全量清缓存又可能击穿后端。proxy_no_cache 不是用来“清缓存”的指令,而是让 Nginx 主动绕过缓存、实时回源的开关——它配合合理条件使用,能实现精准、轻量、分钟级的数据刷新,无需重启或批量失效。
明确 proxy_no_cache 的作用机制
它不删除缓存,也不修改缓存内容,只是在本次请求中跳过 cache lookup 阶段,强制回源获取响应。响应仍可被后续请求缓存(除非同时配置 proxy_cache_bypass 或 Cache-Control)。关键点:
- 生效于请求阶段,与缓存键(cache_key)无关,是“单次请求豁免”
- 必须配合 proxy_cache 指令启用才有效,单独使用无意义
- 值为布尔表达式,支持变量(如 $arg_nocache、$http_x_no_cache)
- 常见写法:proxy_no_cache $arg_nocache $http_upgrade; 表示只要带 ?nocache=1 或含 Upgrade 头就绕过缓存
大促前配置动态绕过规则
不要等到零点再手动加参数,提前部署可触发的“软刷新”通道:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 在 location 块中定义:proxy_no_cache $is_promo_refresh;
- 用 map 构建判断逻辑,例如检测特定时间窗口 + 特定 URL 路径:
map $time_iso8601 $is_promo_refresh {
~^2024-0[1-9]-1[0-9]T0[1-3]:\d{2}:\d{2} 1;
~^2024-0[1-9]-2[0-9]T0[1-3]:\d{2}:\d{2} 1;
default 0;
}
(匹配 10–15 日凌晨 1–3 点) - 对商品详情、购物车、下单页等关键接口单独设置更激进的绕过条件,比如每 2 分钟自动触发一次(通过定时请求带 nocache 参数)
结合业务信号做精准刷新
比时间更可靠的是业务事件。例如库存变更后,前端或运营系统主动发起一次带标识的请求:
- 后端在扣减库存成功后,调用:curl -H "X-No-Cache: true" https://api.example.com/item/123
- Nginx 配置:proxy_no_cache $http_x_no_cache;
- 该请求绕过缓存取到最新数据,并将新响应缓存(注意控制 max-age 或 ETag),后续普通请求即可拿到更新后的结果
- 相比 purge 缓存,这种方式无并发竞争、不丢缓存热度、延迟更低
避免常见误用陷阱
proxy_no_cache 很轻便,但用错反而放大风险:
- ❌ 不要对整个 server 块全局开启:proxy_no_cache 1; —— 这等于关闭全部缓存,大促时直接压垮上游
- ❌ 不要依赖不可控变量(如 $remote_addr)做判断,易被滥用或误伤
- ✅ 建议搭配 proxy_cache_valid 200 302 60s; 控制基础缓存时长,再用 proxy_no_cache 在关键窗口内“插队”刷新
- ✅ 开启日志记录绕过行为:log_format cache_log '$remote_addr - $request "$upstream_http_x_cache" "$upstream_cache_status"'; 方便复盘哪些请求走了回源










