必须在http块定义proxy_cache_path声明缓存区,再于location中用proxy_cache绑定、proxy_cache_valid设过期、proxy_cache_key定制键、proxy_cache_use_stale干预行为,才能真正启用反向代理缓存。

要在 location 块中真正启用 proxy_cache 实现反向代理缓存,不能只写一行 proxy_cache cache_one。必须配合缓存区域声明、响应策略、键值控制和行为干预,才能让 Nginx 在多数请求中跳过源站直接返回缓存内容。
一、先在 http 块定义缓存区(前提条件)
proxy_cache_path 必须出现在 Nginx 主配置的 http { } 块内,否则 location 中的 proxy_cache 指令会无效:
- 路径需存在且属主为 www(宝塔默认运行用户),例如:
mkdir -p /www/server/nginx/proxy_cache && chown www:www /www/server/nginx/proxy_cache - 典型配置(放在
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 名称必须与 location 中一致,比如这里叫
cache_one,后续就不能写成my_cache
二、在 location 中启用并控制缓存行为
找到含 proxy_pass 的 location 块(如反代 Node.js、PHP 或上游服务),在其下方添加以下指令:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
-
proxy_cache cache_one;—— 绑定上一步定义的缓存区 -
proxy_cache_valid 200 301 302 1h;—— 状态码 200/301/302 缓存 1 小时 -
proxy_cache_valid 404 1m;—— 404 响应也缓存 1 分钟,避免频繁探测 -
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 次才写入缓存,减少冷数据堆积
三、定制缓存键与透传关键头信息
默认缓存键是 $scheme$proxy_host$request_uri,但常需调整以支持多域名、带参路由或区分登录态:
- 显式设置更稳妥的键:
proxy_cache_key "$host$request_uri$is_args$args"; - 确保后端能识别真实客户端:
proxy_set_header Host $host;<br>proxy_set_header X-Real-IP $remote_addr;<br>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- 若需对登录用户绕过缓存(如含特定 cookie),加:
proxy_cache_bypass $cookie_user_token;<br>proxy_no_cache $cookie_user_token;
四、验证是否生效
重载 Nginx 后用 curl 测试:
curl -I https://your-domain.com/api/data- 观察响应头中是否有
X-Cache-Status: HIT或MISS - 首次请求应为 MISS,再次请求应为 HIT,且无
X-Upstream-Addr或后端 IP 出现,说明已绕过源站










