设置 proxy_cache_max_range_offset 是优化 Nginx 流式内容缓存的关键,限制仅起始偏移 ≤ 设定值的 Range 片段可缓存,避免碎片化与无效元数据膨胀,需搭配含 $http_range 的 cache_key、Vary 头及 proxy_cache_bypass 等配置协同生效。

设置 proxy_cache_max_range_offset 是优化 Nginx 缓存流式内容(如视频、大文件下载)的关键手段,核心目标是避免缓存碎片化、降低磁盘开销、提升命中率,同时保障拖拽播放等 Range 请求的响应质量。
控制可缓存 Range 的起始位置
该参数不决定是否响应 Range,而是限制「哪些 Range 片段能进缓存」:只有 bytes=N- 中的 N ≤ 设定值 时,才允许缓存该片段。超出则直接透传上游,不生成缓存条目。
- 例如设为
proxy_cache_max_range_offset 2m;,则bytes=0-1023、bytes=1048576-2097151可缓存;bytes=2097152-及之后全部跳过缓存 - 对首屏加载、前几秒预加载等高频访问偏移非常友好,而跳过尾部稀疏请求,减少无效元数据膨胀
- 默认不限制,生产环境必须显式设置,否则 10GB 视频里一个
bytes=9999999999-请求就可能建空缓存块
必须搭配含 $http_range 的 cache_key
若缓存键未包含 Range 头,不同偏移请求会复用同一缓存体,导致返回错误字节段——用户拖到 5 分钟处却拿到开头 1MB 数据。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 推荐 cache_key 写法:
proxy_cache_key $scheme$proxy_host$request_uri$http_range; - 配合
add_header Vary "Range";或更完整的Vary "Origin, Range",确保浏览器和中间缓存正确区分 - 禁用
proxy_force_ranges(设为off),避免 Nginx 自行拆分 200 响应伪造 206,干扰源站 Range 逻辑
协同关闭无关缓存与透传关键头
单纯设 offset 不够,还需阻断缓存机制对 Range 请求的误判和干扰。
- 绕过所有 Range 请求的缓存:
proxy_cache_bypass $http_range;+proxy_no_cache $http_range; - 不缓存 206 响应:
proxy_cache_valid 206 0;(或干脆不配 206) - 透传 Range 和 If-Range:
proxy_set_header Range $http_range;、proxy_set_header If-Range $http_if_range; - 关闭缓冲:
proxy_buffering off;,防止 Nginx 拼接或截断流式响应
验证与调优建议
上线后需确认行为符合预期,重点观察日志与响应头。
- 检查
$upstream_cache_status:Range 命中应显示HIT或UPDATING;被跳过应为BYPASS或MISS - 初始建议值设为
2m~5m,覆盖典型首屏/预加载范围;若监控发现大量bytes=0-缓存命中但bytes=1048576-请求仍多,可适度上调至10m - 结合
proxy_cache_use_stale updating,缓解高并发拖拽场景下缓存更新竞争

















