必须在http块定义proxy_cache_path并确保keys_zone与location中proxy_cache值一致,再于proxy_pass所在location中配置proxy_cache、proxy_cache_valid、proxy_cache_key等指令才能启用缓存。

要在 location 块中真正启用 proxy_cache,不能只写一行 proxy_cache cache_name;。必须配合缓存区定义、状态码策略、缓存键控制和容错行为设置,否则 Nginx 会忽略缓存,每次仍回源请求。
必须先在 http 块定义缓存区
这是硬性前提,缺一不可:
- 缓存路径需提前创建并赋权,例如:
mkdir -p /www/server/nginx/proxy_cache && chown www:www /www/server/nginx/proxy_cache - 在
http { }块顶部(通常放在include mime.types;上方)添加:proxy_cache_path /www/server/nginx/proxy_cache levels=1:2 keys_zone=cache_one:10m inactive=30m max_size=1g use_temp_path=off; -
keys_zone名称(如cache_one)必须与后续location中的proxy_cache值完全一致
在含 proxy_pass 的 location 中启用并精细控制
找到实际反向代理后端的 location(比如代理 PHP、Node.js 或 API 接口),在其内部添加以下指令:
-
proxy_cache cache_one;—— 绑定已定义的缓存区 -
proxy_cache_valid 200 301 302 1h;—— 成功响应缓存 1 小时 -
proxy_cache_valid 404 1m;—— 404 也缓存 1 分钟,防恶意探测 -
proxy_cache_key "$host$request_uri$is_args$args";—— 避免带参 URL 被错误合并(如分页、筛选参数) -
proxy_cache_use_stale error timeout updating http_500-504;—— 出错或后台更新时仍可返回旧缓存 -
proxy_cache_lock on;和proxy_cache_lock_timeout 5s;—— 防止缓存失效瞬间大量并发回源 -
proxy_cache_min_uses 2;—— 同一资源至少被访问 2 次才写入缓存,避免冷数据占空间
按状态码区分缓存时长(同一 location 内支持)
可以对不同 HTTP 状态码设置独立有效期,Nginx 会自动匹配:
-
proxy_cache_valid 200 201 5m;→ 仅对 200/201 生效 -
proxy_cache_valid 500 502 503 10s;→ 错误响应快速过期,防止雪崩 -
proxy_cache_valid 404 30s;→ 404 缓存半分钟足够,太长易掩盖真实问题 -
proxy_cache_valid any 0s;→ 强制不缓存任何响应(适合健康检查等敏感路径)
验证与调试建议
加一行头方便观察缓存是否生效:add_header X-Cache-Status $upstream_cache_status;
响应头中会出现 HIT、MISS、BYPASS 或 EXPIRED 等值。
配置完成后务必执行:sudo nginx -t && sudo systemctl reload nginx
注意:所有 proxy_cache_* 指令都必须出现在启用了 proxy_pass 的 location 块内,否则无效。











