Nginx动态请求缓存需按特征分流、精准键控制和条件化开关:先定义专用缓存区,再在location中启用;通过proxy_cache_bypass和proxy_no_cache实现运行时引流;cache_key须含用户/设备维度;按状态码分级设置缓存时效并启用stale容错。

不是简单开启缓存,而是让 Nginx 把符合条件的动态请求“导向”缓存区处理——关键在于 按特征分流 + 精准键控制 + 条件化缓存开关。
定义专用缓存区并绑定到 location
必须先在 http 块中声明缓存区域,再在具体 location 中启用它:
-
proxy_cache_path /var/cache/nginx/dynamic levels=1:2 keys_zone=dynamic_cache:50m max_size=5g inactive=10m use_temp_path=off;
— 专为动态内容设独立路径和更大内存区(50MB keys_zone 避免键驱逐) - 在目标
location(如location /api/或location ~ ^/user/)中写:proxy_cache dynamic_cache;
用 proxy_cache_bypass 和 proxy_no_cache 控制“是否进缓存”
真正实现“引流”是靠运行时判断:哪些请求该走缓存,哪些必须绕过。
-
proxy_cache_bypass $cookie_auth $arg_nocache $http_x_no_cache;
— 只要存在登录态 cookie、带?nocache=1参数或请求头含X-No-Cache: 1,就跳过缓存直接回源 -
proxy_no_cache $cookie_admin $arg_debug;
— 管理员访问或调试模式下,不写入缓存(防止敏感数据误存)
设计带用户/设备维度的 cache_key
动态内容缓存的核心风险是“缓存污染”,key 必须区分不同用户、终端或参数:
-
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args$cookie_user_id$cookie_device_type";
— 加入$cookie_user_id和$cookie_device_type,确保 PC 用户和手机用户不共用同一缓存项 - 避免只用
$request_uri,否则带不同查询参数或登录态的请求会互相覆盖
按状态码分级设置缓存时效
动态接口返回结果差异大,不能统一设时间:
-
proxy_cache_valid 200 302 2m;— 成功响应缓存 2 分钟,适配短时效数据 -
proxy_cache_valid 404 10s;— 404 缓存 10 秒,防频繁探测攻击 -
proxy_cache_valid 500 502 503 504 1s;— 错误页缓存极短时间,快速反映后端恢复 - 配合
proxy_cache_use_stale error timeout updating http_500;,异常时仍可返回旧缓存,保障可用性


















