nginx proxy_cache 通过etag/last-modified条件请求与分层缓存实现跨机房内容一致:各机房独立本地缓存、统一cache_key绑定x-content-version、后台静默更新+请求锁保障平滑切换、主动purge接口支持紧急清理。

Nginx 的 proxy_cache 本身不支持跨机房文件级共享,但通过 HTTP 条件请求(ETag / Last-Modified)配合分层缓存策略,可以在多个机房独立部署的前提下,实现内容版本一致、更新平滑、带宽节省的边缘分发效果。
核心逻辑不是“共享缓存”,而是“统一缓存语义 + 协同验证行为”。各机房节点各自落盘、各自管理,靠协议头驱动生命周期,靠条件请求降低回源开销,靠主动控制保障一致性。
✅ 各机房独立配置高性能本地缓存
每个机房(如华东、华北、新加坡)都应使用本地 SSD 挂载路径,避免 NFS 或 CephFS 等分布式文件系统:
proxy_cache_path /ssd/cache/huadong levels=1:2 keys_zone=huadong:512m max_size=50g inactive=2h use_temp_path=off; proxy_cache_path /ssd/cache/beijing levels=1:2 keys_zone=beijing:512m max_size=50g inactive=2h use_temp_path=off;
- 目录需提前创建并赋权:
chown nginx:nginx /ssd/cache/huadong -
use_temp_path=off减少中间写入,提升原子性与性能 -
inactive=2h控制未访问缓存条目的自动清理周期,避免磁盘长期占用
✅ 用 ETag 统一内容指纹,让条件请求自然生效
后端服务必须为每个响应生成稳定、可比对的 ETag:
- 静态资源(JS/CSS/图片)由 Nginx 自动计算,无需干预(默认开启)
- 动态接口(PHP/Node.js/Go)应在生成响应时计算内容哈希(如
MD5(body)),输出:ETag: "a1b2c3d4e5f67890" Cache-Control: public, max-age=3600
- 收到
If-None-Match时,严格比对值;匹配即返回304 Not Modified,且不带任何响应体、不设Content-Length
Nginx 不需要额外指令——只要缓存已过期,它就会自动带上 If-None-Match 发起条件请求。
✅ 缓存键绑定版本标识,确保多机房 key 一致
避免因参数、Cookie 或时间戳导致同一内容被拆成多个 key:
proxy_cache_key "$scheme$host$request_uri$http_x_content_version";
上游服务在响应头中输出:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
X-Content-Version: v20260617a
这样,所有机房对同一 URL + 同一版本,生成完全相同的 cache key,命中率和刷新节奏天然同步。
✅ 启用后台静默更新 + 请求锁,消除更新抖动
当缓存过期后,Nginx 发起条件请求收到 304,会直接复用旧内容;若收到新内容(200),则需安全写入:
proxy_cache_use_stale updating; proxy_cache_background_update on; proxy_cache_lock on; proxy_cache_lock_timeout 300ms;
-
updating:允许在后台刷新时返回旧缓存 -
background_update:在返回 stale 响应的同时异步拉取新内容 -
cache_lock:防止多个并发请求同时触发回源,造成上游压力倍增
这套组合能让用户无感地完成内容切换,毫秒级完成“旧→新”过渡。
✅ 主动清理接口应对紧急发布或错误回滚
编译启用 ngx_cache_purge 模块,在各机房暴露清理端点:
location ~ /purge(/.*) {
allow 127.0.0.1;
allow 10.0.0.0/8;
deny all;
proxy_cache_purge huadong "$scheme$host$1";
}
发布新版本后,调用 /purge/api/product/list 即可清除所有机房对应路径的缓存(需分别调用),比等待 max_age 过期更可控。
不复杂但容易忽略:ETag 是内容指纹,不是装饰头;版本头是协同信号,不是可选字段;本地缓存是基础,不是妥协方案。










