nginx缓存通过拦截高频低变响应降低后端存储负载,适用于静态资源、只读api、带版本路径及聚合查询结果;需合理配置proxy_cache_path、proxy_cache_valid、proxy_cache_lock,并跳过动态/私有/写操作请求,配合purge与监控保障实效性。

Nginx 缓存能有效降低后端存储集群的负载,核心思路是:把高频、低变化的响应内容“挡”在 Nginx 层,避免每次请求都穿透到存储服务(如对象存储网关、文件服务集群或数据库代理层)。它不替代存储,而是做一层智能缓冲。
明确缓存适用的内容类型
不是所有请求都适合缓存。重点缓存以下几类:
- 静态资源:图片、视频缩略图、CSS/JS、文档模板等——这类内容变更少、访问频次高,缓存命中率高;
-
只读 API 响应:如商品详情页、文章元数据、配置信息接口(HTTP 状态码为 200/304,且响应头含
Cache-Control: public, max-age=3600); -
带版本标识的资源路径:例如
/v1/assets/logo-abc123.png,URL 中含哈希值,可放心设长缓存(如 1 年),避免失效难题; - 聚合查询结果:比如首页推荐位、排行榜等由多个后端服务拼装的数据,Nginx 可缓存整个响应体,大幅减少对下游存储和计算节点的并发调用。
配置 proxy_cache 避免穿透存储集群
关键是在 Nginx 的 http 块中定义缓存区,并在反向代理 location 中启用,同时控制缓存生命周期:
- 设置缓存路径与内存索引:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=storage_cache:50m inactive=30m max_size=20g;
其中keys_zone内存区足够大(50MB 可支持约 40 万缓存 key),inactive=30m表示 30 分钟未被访问即自动清理,防止冷数据长期占盘; - 在代理到存储网关的 location 中启用缓存:
location /api/files/ {<br> proxy_cache storage_cache;<br> proxy_cache_valid 200 302 10m;<br> proxy_cache_valid 404 1m;<br> proxy_cache_use_stale error timeout updating;<br> proxy_pass http://storage_gateway;<br>}
这样 200/302 响应缓存 10 分钟,404 缓存仅 1 分钟,既防刷又保时效; - 加
proxy_cache_lock on;防止缓存失效瞬间大量请求同时回源,造成存储集群瞬时高峰。
精准跳过不应缓存的请求
动态操作、用户私有数据、上传/删除路径必须绕过缓存,否则会导致数据错乱或权限泄露:
- 对带认证头或 Cookie 的请求跳过:
proxy_no_cache $http_authorization $cookie_session $arg_auth_token; - 对写操作路径强制 bypass:
location ~ ^/(upload|delete|api/v1/user) {<br> proxy_cache_bypass 1;<br> proxy_no_cache 1;<br> proxy_pass http://storage_gateway;<br>} - 根据响应头自动不缓存:
proxy_cache_valid 200 302 10m;<br>proxy_cache_valid any 1m;<br>add_header X-Cache-Status $upstream_cache_status;<br>proxy_ignore_headers Cache-Control Expires Set-Cookie;
最后这行确保上游返回的Cache-Control: no-cache不会覆盖你的策略。
配合缓存清理与监控保障实效性
缓存不是“设完就不管”。需主动管理:
- 发布新资源时,用
proxy_cache_purge模块(需编译启用)按 key 清理,例如:location ~ /purge(/.*) {<br> allow 127.0.0.1;<br> deny all;<br> proxy_cache_purge storage_cache "$scheme$request_method$host$1";<br>}
然后curl -X PURGE http://example.com/purge/logo.png即可精准清除; - 通过
X-Cache-Status响应头(值为HIT/MISS/BYPASS)在日志或浏览器开发者工具中验证是否生效; - 定期检查
df -h /var/cache/nginx和nginx -T | grep proxy_cache_valid,确认缓存空间未满、策略未被覆盖。











