仅配置 proxy_no_cache 无法真正绕过缓存,必须与 proxy_cache_bypass 配合使用;推荐用 map 统一生成布尔变量(如登录态、角色、调试参数),在 location 中同时设置两个指令,并添加响应头验证效果。

仅配置 proxy_no_cache 无法真正绕过缓存读取,必须和 proxy_cache_bypass 配合使用,二者变量一致、逻辑互补,才能实现“不查缓存 + 不存响应”的完整旁路。
用 map 提前算出要不要绕过
直接在 proxy_no_cache 里写条件不可靠,也难维护。推荐统一用 map 指令把各种请求特征转成布尔变量:
- 检测登录态:用
map $cookie_sessionid $no_cache_by_login { ~. 1; default 0; }—— 只要 sessionid 存在就标记为需绕过 - 识别高权限用户:用
map $http_x_user_role $no_cache_by_role { "admin" 1; "dev" 1; default 0; } - 匹配调试参数:用
map $args $no_cache_by_arg { ~debug=1 1; ~v=[^&]+ 1; default 0; }—— 支持 ?a=1&debug=1 或 ?v=2.3 这类任意位置的参数 - 所有 map 的 default 必须是 0,否则未命中规则的普通请求也会被误拦截
location 中同时启用读写双绕过
在对应 location 块里,把上面生成的变量一起传给两个指令:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
proxy_cache_bypass $no_cache_by_login $no_cache_by_role $no_cache_by_arg;—— 任一为真,就跳过缓存查找,直连后端 -
proxy_no_cache $no_cache_by_login $no_cache_by_role $no_cache_by_arg;—— 同样条件成立时,禁止把本次响应写入缓存 - 两个指令必须写在同一 location,且该 location 已启用
proxy_cache my_cache;,否则无效
避免误伤静态资源和匿名流量
个性化策略不能影响首页、图片、JS/CSS 等公共资源:
- 对 /static/、/images/、/assets/ 这类路径单独写 location,跳过上述 map 判断,只配
proxy_cache_valid和expires - 不要在 http 块全局写
proxy_no_cache $cookie_sessionid,空 cookie 会被当非空处理,导致大量 MISS - 如果业务有灰度头(如 X-Env: staging),也可用 map 提取,和登录态变量并列使用,保持扩展性
加响应头快速验证是否生效
调试阶段加上这两行,用 curl 就能一眼看出行为:
-
add_header X-Cache-Status "$upstream_cache_status" always;—— 返回 HIT / MISS / BYP -
add_header X-No-Cache-Reason "$no_cache_by_login|$no_cache_by_role|$no_cache_by_arg" always;—— 显示哪个变量触发了绕过 - 发起带 sessionid 或 ?debug=1 的请求,响应头中 X-Cache-Status 应为 BYP,且 X-No-Cache-Reason 至少有一个值是 1

















