Nginx原生不支持按Range缓存分片,slice模块仅用于请求分片代理;实现高效大文件Range缓存需严格满足五个前提、同步配置三要素($slice_range传参、含$slice_range的cache_key、HTTP/1.1协议栈),并关闭proxy_buffering、启用proxy_cache_lock、设短inactive时间、同时缓存200/206响应。

Nginx 本身不支持“按 Range 缓存分片”,slice 模块也不是缓存切片工具,而是请求分片代理工具。要让大视频文件在 CDN 或回源层实现高效、低负载的 Range 缓存,关键在于 把 slice 和 proxy_cache 协同配置到位,并规避常见误区。
必须满足的五个前提条件
-
nginx -V输出中必须包含--with-http_slice_module(主流发行版通常默认启用) -
slice指令只能写在location块内,http或server级无效 - 必须搭配
proxy_pass使用;root/alias静态服务不触发 slice - 后端需响应
Accept-Ranges: bytes,且能正确处理Range: bytes=x-y(如 Nginx 静态服务、S3、OSS、标准 Web API) - 客户端请求必须带
Range头(如播放器、下载器发起的分段请求),普通 GET 不触发切片
核心配置三要素(缺一不可)
传递分片范围:
proxy_set_header Range $slice_range;
让每个子请求精准携带类似bytes=0-1048575的头,驱动后端返回对应片段区分缓存键:
proxy_cache_key "$scheme$request_method$host$uri$is_args$args$slice_range";
确保每一片独立缓存,避免不同 Range 冲突或覆盖启用 HTTP/1.1 协议栈:
proxy_http_version 1.1;proxy_set_header Connection "";
因为 Range 是 HTTP/1.1 特性,且需清除连接头防复用干扰
缓存策略适配分片逻辑
关闭缓冲,防止内存/磁盘积压:
proxy_buffering off;
视频类 ≥10MB 资源开启on是性能杀手,关掉后响应流式透传,只缓存响应头和首段内容开启缓存锁,防并发回源:
proxy_cache_lock on;proxy_cache_lock_timeout 15s;
多个客户端请求同一 Range 时,只允许一个回源,其余等待命中缓存设置激进的 inactive 时间:
inactive=10m;
大文件访问稀疏,用户常只看开头,10 分钟无访问即淘汰,避免冷数据长期占满磁盘合理分配 keys_zone:
每 1MB keys_zone 支持约 8000 个 key;若预计缓存 10 万文件,至少配keys_zone=video_cache:128m缓存 200 和 206 响应:
proxy_cache_valid 200 206 304 1d;206 Partial Content必须被缓存,否则每次 Range 请求都回源
FastAPI Flask Proxy下载FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
禁用影响缓存的响应头干扰:
proxy_ignore_headers Cache-Control Expires;
防止后端返回的Cache-Control: no-cache或过短max-age覆盖你的缓存策略
示例完整 location 配置
location /videos/ {
slice 1m;
proxy_buffering off;
proxy_cache video_cache;
proxy_cache_valid 200 206 304 1d;
proxy_cache_lock on;
proxy_cache_lock_timeout 15s;
proxy_cache_key "$scheme$request_method$host$uri$is_args$args$slice_range";
proxy_set_header Range $slice_range;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass https://origin-server;
}配套的 http 块缓存路径定义:
proxy_cache_path /var/cache/nginx/video levels=1:2
keys_zone=video_cache:256m
inactive=10m
max_size=50g;不复杂但容易忽略

















