Nginx 性能优化:配置 proxy_no_cache 实现动态跳过特定请求缓存

作者:袖梨 2026-06-18
要真正实现动态跳过缓存,必须同时配置 proxy_cache_bypass 和 proxy_no_cache 并共用同一变量(如 $skip_cache),前者跳过缓存读取,后者阻止响应写入缓存;需用 map 指令将路径、请求头、Cookie、参数等映射为布尔变量,并在 location 中统一启用双指令,任一变量为非空或非零即生效。

proxy_no_cache 本身不跳过缓存读取,只控制响应是否写入缓存。要真正实现“动态跳过特定请求缓存”,必须配合 proxy_cache_bypass,并用变量驱动判断逻辑——不是简单写 proxy_no_cache 1,而是让变量成为缓存策略的开关。

明确两个指令的分工

• proxy_cache_bypass:决定本次请求是否跳过缓存查找,直接回源
• proxy_no_cache:决定本次响应是否写入缓存,避免污染缓存池
二者需使用同一变量(如 $skip_cache),且变量值为非空字符串或非零数值时才触发行为。只配一个,效果不完整。

用 map 提前定义业务规则

把路径、请求头、Cookie、参数等特征转为布尔变量,解耦判断逻辑与主配置:

  • 按 URL 路径跳过:map $request_uri $skip_cache_by_path { ~*^/admin/ 1; ~*^/api/debug 1; default 0; }
  • 按请求头角色跳过:map $http_x_user_role $skip_cache_by_role { "admin" 1; "dev" 1; default 0; }
  • 按 Cookie 判断登录态:map $cookie_sessionid $skip_cache_by_login { ~. 1; default 0; }
  • 按查询参数触发:map $arg_nocache $skip_cache_by_arg { "1" 1; "true" 1; default 0; }

在 location 中统一启用双绕过

变量定义好后,在具体转发块中同时启用两个指令:

  • proxy_cache my_cache;(必须已启用缓存)
  • proxy_cache_bypass $skip_cache_by_path $skip_cache_by_role $skip_cache_by_login $skip_cache_by_arg;
  • proxy_no_cache $skip_cache_by_path $skip_cache_by_role $skip_cache_by_login $skip_cache_by_arg;

只要任一变量值为 1,整条指令即生效,请求跳过缓存读取,响应也不写入缓存。

验证和避坑要点

• 验证是否生效:用 curl -H "X-User-Role: admin" https://site.com/api/data,检查响应头中无 X-Cache: HIT,且 $upstream_cache_status 为 BYP
• default 值必须设为 0:防止未匹配规则的请求被误跳过
• 不要在 http 块中直接写 proxy_no_cache $cookie_sessionid:空 cookie 可能导致非预期行为
• 静态资源(如 /static/)建议单独 location 处理,避免混入个性化规则

相关文章

精彩推荐