Nginx缓存高效应对流量高峰的关键在于精准命中、稳定返回与安全失效。需聚焦缓存路径、键值、有效期和回源控制四环节,优先缓存静态资源、低频动态页及聚合接口,避开含用户身份等敏感内容;合理配置proxy_cache_path与proxy_cache_key,剔除干扰参数;通过proxy_cache_valid、proxy_cache_use_stale、proxy_cache_lock等指令精细管理生命周期与回源行为;再辅以limit_req和limit_conn限流,降低源站压力。

直接配置 Nginx 缓存应对流量高峰,关键不在“加缓存”,而在“让该缓存的请求精准命中、稳定返回、安全失效”。很多团队开了 proxy_cache 却收效甚微,问题常出在缓存路径、键值、有效期和回源控制这四个环节没对齐业务实际。
明确哪些内容该进缓存
不是所有响应都适合缓存。优先缓存那些“变化少、访问多、生成贵”的内容:
-
静态资源:CSS、JS、图片、字体文件,用
location ~* \.(js|css|png|jpg|webp)$单独配置,配合add_header Cache-Control "public, max-age=31536000" -
动态页面但更新低频:商品详情页、新闻正文、帮助文档等,发布后数小时甚至数天内不变,可设
proxy_cache_valid 200 304 1h - 聚合类接口结果:如首页推荐位、排行榜、统计看板,若数据每 5–15 分钟更新一次,缓存对应时间即可,避免每次请求都查库
-
避开缓存的场景:含用户身份信息的页面(如个人中心)、支付回调、表单提交接口——这些必须绕过缓存或使用私有缓存策略(
Cache-Control: private)
设置合理的缓存存储与键值
缓存存在哪儿、怎么标识,决定了命中率和安全性:
-
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:20m max_size=2g inactive=30m use_temp_path=off;——levels=1:2避免单目录文件过多;keys_zone内存区大小要够存热点 key(每万并发建议 ≥10m);use_temp_path=off减少磁盘 IO -
proxy_cache_key "$host$request_uri$is_args$args";——默认 key 不含 Cookie 和 User-Agent,适合公开内容;若需区分登录/未登录状态,可加入$cookie_user_id,但务必确认该 cookie 稳定且无敏感字段 - 避免用
$request_uri直接作 key:带跟踪参数(如?utm_source=weibo)会导致重复缓存,建议用$host$uri$is_args$args剔除干扰参数
控制缓存生命周期与回源行为
缓存不是“存了就完事”,它需要主动管理过期、穿透和并发更新:
-
proxy_cache_valid 200 301 302 10m;——不同状态码设置不同有效期,200 可设长些,302 重定向通常短些 -
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;——后端出错或正在更新时,仍可返回旧缓存,防止雪崩 -
proxy_cache_lock on; proxy_cache_lock_timeout 5s;——同一 key 的多个并发请求,只放行第一个回源,其余等待或返回 stale,避免“缓存击穿” - 搭配
proxy_ignore_headers Cache-Control Expires;可强制覆盖上游设置,适用于后端无法修改响应头的老旧系统
配合限流与连接控制降低真实回源压力
缓存是第一道防线,限流是第二道保险:
- 对高频回源路径(如热门文章 URL),用
limit_req_zone $uri zone=hoturi:10m rate=5r/s;控制单位时间回源请求数 - 限制单个 URI 并发回源连接:
limit_conn_zone $uri zone=uri_conn:10m;+limit_conn uri_conn 3;,防止单一热点拖垮源站 - 大文件回源时启用
limit_rate 2m;,避免带宽被单个大响应占满 - 所有限流规则建议放在
location块内,且与proxy_pass同级,确保生效于回源链路而非客户端响应


















