Nginx proxy_cache 与 upstream 结合可实现动态数据边缘加速,核心在于精准控制缓存对象、时效及有效性判定;配置涵盖共享缓存区定义、带健康检查与会话粘性的后端集群、按状态码与内容特征的精细化缓存策略,以及缓存清理与灰度验证机制。

Nginx 的 proxy_cache 与 upstream 负载均衡结合,是实现动态数据边缘分发加速的成熟方案——关键不在“能不能缓”,而在于“缓什么、缓多久、怎么判别可缓”。
以下配置逻辑兼顾稳定性、命中率与业务语义,适用于 API 响应、PHP 页面、带参数的动态接口等场景。
一、定义共享缓存区与分层存储路径
缓存必须独立于 upstream 实例存在,且支持多 worker 进程并发读写:
proxy_cache_path /var/cache/nginx/levels=1:2 keys_zone=dynamic_cache:50m inactive=60m max_size=5g use_temp_path=off;
说明:
- keys_zone=dynamic_cache:50m:内存中缓存键索引区,50MB 可支撑约 100 万条缓存条目;
- inactive=60m:60 分钟内未被访问的缓存自动清理,避免冷数据堆积;
- use_temp_path=off:禁止使用临时目录,减少磁盘 IO 和文件移动开销;
- 不推荐直接挂载 SSD 缓存路径(如
/mnt/ssd/cache),除非你已启用directio 4k;并调优文件系统。
二、构建带健康检查与会话粘性的后端集群
动态数据缓存需配合稳定后端,否则缓存脏数据风险高:
upstream backend_api {
# 启用主动健康检查(需编译 nginx_upstream_check_module)
check interval=3 rise=2 fall=3 timeout=1;
<pre class="brush:php;toolbar:false;"># 会话保持:优先用 cookie sticky,比 ip_hash 更可靠
sticky cookie srv_id expires=1h domain=.example.com path=/;
server 10.0.1.10:8080 weight=3 max_fails=2 fail_timeout=30s;
server 10.0.1.11:8080 weight=2 max_fails=2 fail_timeout=30s;
server 10.0.1.12:8080 backup; # 故障兜底节点}
注意点:
- sticky cookie 避免因 CDN 或 NAT 导致 IP 一致而打散会话;
- backup 节点不参与常规轮询,仅当其他节点全不可用时启用;
- max_fails + fail_timeout 控制故障剔除节奏,防止瞬时抖动误判。
三、按响应状态与内容特征精细化缓存策略
动态接口不能“一刀切”缓存。重点控制:哪些响应可缓、缓多久、是否忽略某些请求头:
server {
listen 80;
server_name api.example.com;
<pre class="brush:php;toolbar:false;">location / {
proxy_pass http://backend_api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 启用缓存,使用上一步定义的 zone
proxy_cache dynamic_cache;
# 缓存键:排除 Cookie、User-Agent 等易变头,但保留认证 token(若需区分用户级缓存则另设 key)
proxy_cache_key "$scheme$request_method$host$request_uri";
# 按 HTTP 状态码设置不同缓存时长(单位:秒/分/小时)
proxy_cache_valid 200 301 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid 500 502 503 504 10s;
# 允许在后端异常时返回过期缓存(提升可用性)
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
# 忽略后端返回的 Cache-Control:no-cache、Set-Cookie 等头(强制缓存逻辑由 Nginx 决定)
proxy_ignore_headers Cache-Control Expires Set-Cookie Vary;
# 添加响应头标识缓存状态,便于调试和监控
add_header X-Cache-Status $upstream_cache_status;
add_header X-Cache-Age $upstream_cache_age;
}}
关键细节:
-
proxy_ignore_headers 是动态缓存生效的前提——很多 PHP/Node 接口默认返回
Cache-Control: no-cache,不忽略则永不缓存; - 若需对登录态用户做个性化缓存(如
/user/profile?uid=123),可在proxy_cache_key中加入$arg_uid; - 不建议缓存含
Set-Cookie的响应,除非你明确知道该 cookie 是无状态或只用于前端埋点。
四、缓存清理与灰度验证机制
Nginx 原生不支持按 URL 清除缓存,需借助扩展模块或绕行方案:
- 安装
ngx_cache_purge模块后,添加如下 location 实现手动清除:
location ~ /purge(/.*) {
allow 127.0.0.1;
allow 10.0.0.0/8;
deny all;
proxy_cache_purge dynamic_cache "$scheme$request_method$host$1";
}- 上线新版本前,可先用
curl -X PURGE http://api.example.com/purge/xxx清旧缓存; - 生产环境建议配合灰度发布:将部分流量导向新后端,同时通过
X-Cache-Status统计 HIT/MISS 比例,确认缓存行为符合预期后再全量切换。
不复杂但容易忽略。


















