Nginx location块支持大文件分片断点续传的关键是避免干扰、确保Range正确识别透传与缓存区分:静态直供需禁用max_ranges 0和gzip range;代理场景须透传Range/If-Range头并绕过206缓存;启用slice时需同步配置$slice_range缓存键;MP4还需mp4模块与faststart优化。

要让 Nginx 的 location 块真正支持大文件分片断点续传,关键不是“开启某项功能”,而是避免配置干扰、确保 Range 请求能被正确识别、透传、响应和缓存区分。Nginx 1.1.3+ 原生支持 Range,但分片场景(尤其是代理或缓存环境)需精细协同。
静态文件直供:确保原生 Range 正常生效
当 Nginx 直接提供 ZIP、MP4、ISO 等大文件(用 root 或 alias),无需额外模块,但必须满足以下条件:
- 删除或注释掉
max_ranges 0;——该指令会彻底禁用所有 Range 请求,建议保留默认或设为max_ranges 10; - 对二进制大文件禁用 gzip:
gzip off;或更稳妥地加gzip_disable "range";,否则压缩会破坏Content-Range字节计算 - 避免在 location 中使用
rewrite、auth_basic、limit_req或try_files指向非静态处理器(如 PHP),否则请求会被中途截断,无法进入 range 模块处理流程 - 确认文件可读、路径权限正确,且
stat()能获取文件大小(否则返回 416)
代理场景:透传 Range 并绕过缓存干扰
若 location 使用 proxy_pass 回源(如后端服务、CDN 或对象存储),Nginx 默认不转发 Range 头,必须显式补全:
-
proxy_set_header Range $http_range;——将客户端原始 Range 值传给上游 -
proxy_set_header If-Range $http_if_range;——保障条件请求一致性,避免整包返回 -
proxy_pass_request_headers on;——确保其他必要头不丢失 - 强制绕过缓存:
proxy_cache_bypass $http_range;和proxy_no_cache $http_range;,防止 206 响应被错误缓存或复用 - 禁用 206 缓存:
proxy_cache_valid 206 1m;(极短时间)或直接不缓存,绝不可写proxy_cache_valid 200 206 1h;
启用 slice 分片代理(超大文件优化)
对 GB 级文件,可结合 slice 指令实现底层分片回源,提升并发与缓存效率,客户端无感知:
- 在 location 中添加
slice 1m;(每片 1MB),Nginx 自动将单个 Range 请求拆解为多个子请求 - 配套设置:
proxy_set_header Range $slice_range;——让上游只处理当前分片范围 - 缓存 key 必须含分片信息:
proxy_cache_key "$uri|$slice_range";,避免不同分片命中同一缓存条目 - 确保上游服务(如 Nginx、Apache、MinIO、S3)本身支持 Range 请求并返回 206
MP4 视频拖拽播放专项支持
普通 Range 支持不足以保证视频秒开拖拽,还需 MP4 特殊配置:
- 确认 Nginx 编译时启用了
--with-http_mp4_module(运行nginx -V 2>&1 | grep mp4验证) - MP4 文件需含
moov头(faststart),可用 FFmpeg 重写:ffmpeg -i in.mp4 -c copy -movflags +faststart out.mp4 - 在对应 location 中添加
mp4;指令,并可选调优:mp4_buffer_size 1m;、mp4_max_buffer_size 5m;
验证是否生效,用 curl 测试:
curl -I -H "Range: bytes=0-1023" https://your.site/file.zip
成功响应应含 HTTP/1.1 206 Partial Content、Accept-Ranges: bytes 和正确的 Content-Range 头。


















