用 hash $request_uri consistent 是提升静态资源集群缓存命中率最直接有效的方式,确保相同 url 请求始终路由至同一后端,避免重复回源和缓存碎片;$request_uri 含完整路径与查询参数、区分大小写且不自动解码,精度高于 $uri、$args 和 $remote_addr,配合 consistent 参数、禁用 weight、规范 uri 编码及后端缓存策略对齐,方可实现高命中率。

用 hash $request_uri consistent 是提升静态资源集群缓存命中率最直接有效的方式。它让相同 URL 请求始终落到同一台后端,各节点只需缓存自己负责的资源,避免重复回源和缓存碎片。
为什么 $request_uri 是最佳哈希键
$request_uri 包含完整路径与原始查询参数(如 /static/logo.png?v=2.3.1),区分大小写、不自动解码,能精确标识一次资源请求。相比其他变量:
-
$uri丢弃查询参数,/a.css和/a.css?v=1会被分到不同节点,版本更新后旧缓存无法复用 -
$args只有参数部分,无法区分/img/1.jpg和/js/app.js -
$remote_addr在 NAT 或多设备场景下失效,且不能保证资源级缓存共享
基础配置必须满足三个条件
缺一不可,否则一致性效果打折扣甚至失效:
- upstream 块中必须写成
hash $request_uri consistent;,consistent参数不可省略 - 所有
server行不能带weight=、backup、max_fails等参数,它们会干扰哈希分布逻辑 - 确保客户端请求 URI 编码规范,避免未编码空格或中文导致 400;必要时在 server 块加
underscores_in_headers on
配合后端缓存策略才能真正生效
Nginx 层路由只是第一步,后端行为必须对齐:
- 各节点生成缓存 Key 的规则要一致,比如统一忽略
utm_*、ts=类追踪参数,否则同一 URL 存的是不同内容 - 推荐使用共享缓存(如 Redis 集群)而非纯本地内存缓存,避免单机容量瓶颈和冷启动问题
- Nginx 层可开启
proxy_cache_lock on,防止缓存未命中时多个相同请求并发回源
上线前快速验证是否按预期工作
调试阶段建议加入响应头观察实际路由结果:
- 在 location 块中添加:
add_header X-Routed-To "$upstream_addr"; - 用 curl 多次请求同一 URL(如
curl -I https://cdn.example.com/static/a.js?v=1),确认响应头中X-Routed-To值固定不变 - 对比开启前后监控指标:典型静态资源集群缓存命中率可从 65% 提升至 90%+,后端节点请求分布标准差明显收窄











