直接在负载均衡配置中叠加nginx缓存是最务实的降压方案,需定义共享缓存区、在location中启用proxy_cache、优化缓存键与绕过逻辑,并配置加锁和容错机制以提升命中率与稳定性。

直接在负载均衡配置里叠加缓存,是降低后端压力最务实的做法。Nginx 本身不处理业务逻辑,但它能拦下大量重复请求——无论这些请求来自用户,还是被分发到不同后端节点的相同接口调用。关键不是“要不要缓存”,而是让缓存生效、命中率高、不干扰业务逻辑。
先定义共享缓存区,给缓存一个“家”
缓存必须有存储位置和管理大脑,这两样得在 http 块里提前声明:
-
proxy_cache_path /var/cache/nginx/static_api levels=1:2 keys_zone=api_cache:512m max_size=2g inactive=1h use_temp_path=off;—— 指定磁盘路径、内存元数据区大小(512MB 支持约 400 万个缓存项)、总容量上限和自动清理周期 - 确保目录存在且权限正确:
mkdir -p /var/cache/nginx && chown -R nginx:nginx /var/cache/nginx -
use_temp_path=off必须开启,避免临时文件拷贝,保证缓存锁和响应一致性
在 upstream 后的 location 中启用缓存
缓存不能只配在 upstream 里,得落到具体转发逻辑中。推荐做法是:把 proxy_pass 和缓存控制写在同一个 location,指向 upstream 名称:
location /api/ { proxy_pass http://backend; proxy_cache api_cache; }- 配合
proxy_cache_valid 200 201 5m;缓存成功响应 5 分钟;对 404 可设proxy_cache_valid 404 1m;避免反复穿透 - 加
add_header X-Cache-Status $upstream_cache_status;方便通过响应头判断是 HIT、MISS 还是 STALE
优化缓存键与绕过逻辑,避免“假缓存”
默认按完整 URL 缓存,带参数的 API 很容易每个请求都生成新缓存项。要提升复用率就得主动干预:
- 统一键值:
proxy_cache_key "$scheme://$host$request_uri";忽略查询参数顺序和无关参数(如?t=123) - 跳过登录态请求:
proxy_cache_bypass $http_cookie $arg_nocache;当有 Cookie 或带nocache=1参数时,不走缓存 - 忽略干扰头:
proxy_ignore_headers Set-Cookie Vary;防止后端返回 Set-Cookie 导致整个响应被拒存
加锁 + 容错,扛住热点失效风暴
缓存过期瞬间大量并发请求打到后端,极易引发雪崩。两道防护必不可少:
-
proxy_cache_lock on;+proxy_cache_lock_timeout 6s;—— 只放行首个回源请求,其余等待结果复用 -
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;—— 即使回源失败或超时,也返回旧缓存,不断流、不穿底
不复杂但容易忽略。缓存和负载均衡不是两个独立模块,而是一体协同的减压组合——前者管“要不要打过去”,后者管“打到哪一台”。配对使用,效果翻倍。











