Nginx proxy_cache与CDN协同构建两级缓存体系:CDN负责外层静态资源快速分发,Nginx作为回源前缓冲,处理未命中、灰度、带Cookie等精细化场景;需通过proxy_ignore_headers忽略后端干扰头,用proxy_cache_valid统一定义缓存策略,并借助Surrogate-Control等头实现协同控制。

在 Nginx 中配置 proxy_cache 与 CDN 边缘节点协同工作,本质是构建“Nginx 反向代理层缓存 + CDN 边缘节点缓存”的两级缓存体系。关键不在于让两者重复缓存同一份内容,而在于明确分工:CDN 负责最外层、高并发、静态/半静态资源的快速分发;Nginx proxy_cache 则作为回源前的最后一道缓冲,缓解源站压力,并处理 CDN 未命中或需精细化控制的场景(如带 Cookie 的登录态页面、灰度流量、私有头信息等)。
明确缓存层级职责,避免冲突
CDN 和 Nginx proxy_cache 都依赖 HTTP 缓存头(Cache-Control、Expires、Surrogate-Control 等)决策是否缓存及缓存时长。若配置不当,容易出现:
- CDN 缓存了本不该缓存的敏感响应(如含用户信息的 HTML)
- Nginx 误缓存了 CDN 已设为不缓存的内容,导致 stale 回源
- 两者缓存时间不一致,造成边缘节点过期但 Nginx 仍返回旧内容
建议做法:
- CDN 层统一由
Cache-Control控制,例如对/static/设为public, max-age=31536000(强缓存一年),对/api/设为no-cache或private - Nginx proxy_cache 不主动覆盖响应头,而是用
proxy_ignore_headers Cache-Control Expires Set-Cookie;忽略后端返回的干扰头,再通过proxy_cache_valid主动定义自己的缓存策略 - 对需两级缓存的内容(如图片、JS/CSS),确保后端响应中
Cache-Control: public, max-age=86400,CDN 和 Nginx 均可识别并缓存
配置 Nginx proxy_cache 区域与基础参数
在 http 块中定义共享内存缓存区(注意路径权限和磁盘空间):
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=cdn_cache:256m inactive=3d max_size=20g use_temp_path=off;
说明:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
-
keys_zone=cdn_cache:256m:256MB 共享内存用于存储缓存 key 和元数据,支持约千万级 key -
inactive=3d:3 天内未被访问的缓存条目自动清理(不影响max_age) -
use_temp_path=off:避免写临时文件,提升 I/O 效率
在 location 或 server 块中启用缓存:
location / {
proxy_pass https://origin.example.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
<pre class="brush:php;toolbar:false;"># 启用缓存
proxy_cache cdn_cache;
proxy_cache_valid 200 301 302 1h; # 成功响应默认缓存 1 小时
proxy_cache_valid 404 1m; # 404 缓存 1 分钟,防刷
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on; # 防止缓存失效时的并发回源(仅首请求回源)
proxy_cache_lock_timeout 5s;
# 关键:不继承后端的 Cache-Control,按自己规则走
proxy_ignore_headers Cache-Control Expires Set-Cookie Vary;
add_header X-Cache-Status $upstream_cache_status; # 方便调试}
与 CDN 协同的关键 Header 控制技巧
CDN 通常支持 Surrogate-Control 或自定义缓存指令(如 Cloudflare 的 CF-Cache-Status、阿里云 CDN 的 X-Cdn-Status)。Nginx 可配合这些头做差异化处理:
- 若 CDN 已命中,它可能添加
X-Cache: HIT from cdn,Nginx 可忽略自身缓存逻辑(但一般不建议跳过 proxy_cache,因 Nginx 缓存更靠近源站,延迟更低) - 对需绕过 CDN 直达 Nginx 缓存的请求(如内部监控、灰度请求),可通过特定 header(如
X-Bypass-CDN: 1)+map指令动态开关缓存:
map $http_x_bypass_cdn $cache_key {
default "$scheme$request_method$host$request_uri";
"1" "$scheme$request_method$host$request_uri$arg_version"; # 加版本区分
}
proxy_cache_key $cache_key;验证与运维要点
上线前务必验证两级缓存行为是否符合预期:
- 用
curl -I查看响应头:X-Cache-Status(Nginx)、X-Cache或CF-Cache-Status(CDN),确认 HIT/MISS 层级 - 修改资源后,先刷新 CDN 缓存(如 purge URL),再检查 Nginx 缓存是否同步失效(可手动
rm -rf /var/cache/nginx/proxy_cache/*清空,或用proxy_cache_purge模块) - 监控
proxy_cache_miss、proxy_cache_hit、proxy_cache_expired等变量,结合日志分析缓存效率 - 对 POST/PUT/DELETE 请求默认不缓存,如需缓存(如幂等接口),显式配置
proxy_cache_methods POST;并谨慎评估一致性风险
不复杂但容易忽略

















