Nginx的proxy_cache是一组协同工作的指令机制,用于反向代理层高效缓存HTTP响应;需先在http块配置proxy_cache_path定义缓存区,再在location中用proxy_cache和proxy_cache_valid启用并控制缓存,通过proxy_cache_key定制缓存键,并借助X-Cache-Status等调试验证行为。

在 Nginx 中,proxy_cache 不是单个指令,而是由一组缓存相关指令协同工作的机制,用于在反向代理层实现高效、可控的 HTTP 响应缓存。它不依赖后端应用,能显著降低源站压力、提升响应速度,并支持细粒度的缓存策略控制。
一、基础缓存区域配置(proxy_cache_path)
缓存功能的前提是定义一个本地磁盘上的缓存存储区域:
-
proxy_cache_path必须写在http块中,不能放在server或location内 - 关键参数包括:
path(缓存目录)、keys_zone(共享内存区名和大小,如my_cache:10m)、max_size(磁盘上限)、inactive(未被访问多久后自动清理) - 示例:
proxy_cache_path /var/cache/nginx/my_cache keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
其中use_temp_path=off推荐启用,避免多一次文件移动开销
二、启用并绑定缓存到 location(proxy_cache + proxy_cache_valid)
在具体 location 块中启用缓存,并设定不同状态码的缓存时长:
-
proxy_cache my_cache:指定使用上面定义的keys_zone名称 -
proxy_cache_valid按响应状态码设置过期时间,例如:proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;proxy_cache_valid any 1m;
注意:any是兜底规则,但不会覆盖已明确声明的状态码规则 - 建议配合
proxy_cache_use_stale提升可用性,例如网络波动时仍可返回过期缓存:proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
三、缓存键与个性化控制(proxy_cache_key)
默认缓存键是 $scheme$proxy_host$request_uri,但常需排除干扰因素(如 Cookie、特定参数)或加入变量以支持多终端/灰度:
- 用
proxy_cache_key自定义键值,例如忽略会话 Cookie 和 UTMs:proxy_cache_key "$scheme$host$request_uri $http_accept_language"; - 若需区分移动端与 PC 端,可加入
$http_user_agent的简单标识(注意控制长度):proxy_cache_key "$scheme$host$request_uri $arg_v $mobile_flag";
配合map指令提取$mobile_flag - 慎用完整
$cookie_*或$args,易导致缓存碎片化、命中率骤降
四、调试与验证缓存行为
上线前必须确认缓存是否按预期工作:
- 在响应头中添加
X-Cache-Status方便调试:add_header X-Cache-Status $upstream_cache_status;
可见值包括HIT、MISS、BYPASS、EXPIRED、STALE等 - 检查 Nginx 错误日志是否报
cache manager process ... exited on signal 11等异常(常见于keys_zone太小或路径不可写) - 用
curl -I多次请求同一资源,观察X-Cache-Status和Age响应头变化 - 手动清理某类缓存可用
proxy_cache_purge(需启用ngx_http_proxy_cache_purge_module,通常需编译安装)










