Nginx统一缓存网关需系统性配置:先用proxy_cache_path定义共享缓存区,再通过map+proxy_cache_valid分级策略、显式proxy_cache_key控制键唯一性、cache_purge或版本化实现失效,并禁用敏感接口缓存。

用 Nginx 构建统一的流量缓存网关,核心是把缓存逻辑前置到入口层,让高频请求不触达后端服务。它不是简单加个 proxy_cache 就完事,而是围绕缓存策略、键设计、失效控制和可观测性做系统性配置。
缓存区域与基础配置
缓存能力依赖于 proxy_cache_path 预先定义的共享内存区域,这是所有 location 复用缓存的基础:
- 指定磁盘路径、缓存层级(如
levels=1:2)、最大容量(max_size=10g)和 inactive 时间(如inactive=1h,超时未被访问则自动清理) - 必须配
keys_zone=my_cache:10m——这个 zone 名会用于后续所有proxy_cache指令,且 10m 内存可存储约 8 万个缓存 key - 建议开启
use_temp_path=off,避免临时文件拷贝开销
按业务场景精细化缓存策略
不同接口对缓存的要求差异很大,不能一刀切。应通过 map + proxy_cache_valid 实现动态分级:
- 对静态资源(
/static/、.js/.css):设置proxy_cache_valid 200 302 1d,并配合 ETag 和 Last-Modified 自动校验 - 对 API 数据(如
/api/v1/products):根据响应头中的Cache-Control: public, max-age=60动态继承,用proxy_ignore_headers Cache-Control关闭默认忽略,再用proxy_cache_valid any 10s设兜底 - 对登录态敏感接口(如含
Authorization或Cookie的请求):默认禁用缓存,用proxy_cache_bypass $http_authorization $cookie_session主动跳过
缓存键(cache_key)必须可控且唯一
默认的 proxy_cache_key $scheme$proxy_host$request_uri 容易导致缓存污染,比如带分页参数或时间戳的 URL 被当成不同资源缓存:
- 显式重写 key:例如
proxy_cache_key "$scheme://$host$request_uri";去掉 query string;或保留关键参数proxy_cache_key "$scheme://$host$uri?$arg_id&$arg_type"; - 对带身份信息的请求,加入用户维度:如
proxy_cache_key "$scheme://$host$uri $http_x_user_id";(需前端透传可信标识) - 避免使用
$args全量拼接,防止排序不同、空参、调试参数(如debug=1)导致重复缓存
缓存刷新与主动失效机制
Nginx 原生不支持 PURGE,但可通过标准方式实现可控失效:
- 利用
proxy_cache_purge(需编译时启用 ngx_http_cache_purge_module):配置location ~ /purge(/.*),配合 IP 白名单限制调用权限 - 更稳妥的做法是“缓存版本化”:在 upstream 返回头中注入
X-Cache-Version: v2,然后在 cache_key 中加入该值,发布新版本时只需改 header,旧缓存自然失效 - 对强一致要求的资源(如商品库存),直接绕过缓存,用
proxy_cache_bypass 1强制回源


















