要真正降低后端源站负载,必须让Nginx绕过源站直接响应:一、在Nginx主配置http块声明proxy_cache_path定义cache_one缓存区;二、在站点location块中添加proxy_cache cache_one等指令启用缓存并设置有效期、锁机制与缓存键;三、添加proxy_ignore_headers、proxy_cache_revalidate等指令透传并支持校验更新;四、重载后用curl验证X-Cache-Status响应头。

要真正降低后端源站的计算与 IO 负载,关键不是“开了缓存”,而是让 Nginx 在绝大多数请求中完全绕过源站——即命中缓存并直接响应。这需要三部分协同:全局缓存区声明、location 级缓存策略、以及缓存行为控制逻辑。宝塔面板默认不启用缓存,必须手动补全配置。
一、声明全局缓存区(必须在 http 块)
这是 proxy_cache 能生效的前提。Nginx 不允许在 location 中直接定义缓存路径,必须先在主配置里声明一个可被引用的缓存区。
- 进入【软件商店】→ 找到已安装的 Nginx → 【设置】→ 【配置修改】
- 在
http {块开头(建议放在include mime.types;上方),插入:
说明:
cache_one 是缓存区名称,后续 location 中需严格一致;
10m 是内存中用于索引的共享内存大小,10MB 足够支撑数万缓存项;
inactive=30m 表示 30 分钟内无访问则自动清理,避免无效缓存堆积;
max_size=1g 是磁盘总容量上限,防止占满硬盘。
执行命令确保目录存在且权限正确:
mkdir -p /www/server/nginx/proxy_cache && chown www:www /www/server/nginx/proxy_cache二、在站点 location 中启用并调用缓存
仅声明缓存区还不够,必须在反向代理所在的 location 块中启用它,并明确哪些响应可缓存、缓存多久。
- 进入【网站】→ 目标站点 → 【设置】→ 【配置文件】
- 找到已有反向代理规则对应的
location块(通常含proxy_pass http://127.0.0.1:3000;) - 在
proxy_pass下方添加以下指令:
proxy_cache_valid 200 301 302 1h;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
proxy_cache_min_uses 2;
proxy_cache_key $scheme$host$request_uri$is_args$args;
重点说明:
proxy_cache_valid 200 301 302 1h:只有 HTTP 状态码为 200/301/302 的响应才被缓存,且默认缓存 1 小时;
proxy_cache_min_uses 2:同一 URL 至少被请求 2 次才写入缓存,避免冷数据污染缓存空间;
proxy_cache_lock 防止缓存未生成时多个并发请求同时打到后端(即“缓存雪崩”);
proxy_cache_key 建议包含 $args,否则带参数的请求(如 ?v=1.2.3)会被当成同一缓存项。
三、透传缓存头并支持校验更新
后端应用若返回了 Cache-Control: public, max-age=3600 或 ETag,Nginx 默认不透传也不校验,导致缓存无法智能更新。需显式开启:
- 在同一 location 块中,紧接上面缓存指令后添加:
proxy_cache_revalidate on;
proxy_set_header Accept-Encoding "";
说明:
proxy_ignore_headers Cache-Control Expires:忽略后端返回的过期头,完全由 Nginx 自己的 proxy_cache_valid 控制生命周期;
proxy_cache_revalidate on:当缓存即将过期时,Nginx 会自动发起条件请求(带 If-None-Match 或 If-Modified-Since),若后端返回 304,则延长缓存有效期;
proxy_set_header Accept-Encoding "":禁用 gzip 压缩透传,避免因压缩差异导致缓存键不一致(尤其后端对不同 UA 返回不同压缩格式时)。
四、验证与维护
配置完成后重载 Nginx(宝塔界面点【重载配置】),再用 curl 验证是否生效:
curl -I https://your-domain.com/some-static-path观察响应头中是否有:
- X-Cache-Status: HIT(缓存命中)
- X-Cache-Status: MISS(首次请求,写入缓存)
-
X-Cache-Status: BYPASS(被
proxy_no_cache或 cookie 排除)
如需主动清理某 URL 缓存,可配置 purge 接口或使用第三方模块;日常运维中,关注 /www/server/nginx/proxy_cache 目录大小和 inode 使用率即可判断缓存健康度。











