nginx反向代理大文件分片下载需组合slice、proxy_pass、proxy_cache及头处理,仅对proxy_pass生效;需验证slice模块启用,配置slice大小、缓存路径与键、透传$slice_range头、缓存206响应,并设置accept-ranges、关闭proxy_buffering等确保流式传输。

要让 Nginx 在反向代理场景下支持大文件分片代理下载(即客户端发起 Range 请求时,Nginx 自动拆成多个子请求回源、分片缓存并拼装返回),核心不是“开启 slice 就能分片下载”,而是正确组合 slice、proxy_pass、proxy_cache 和关键头处理。它只对代理请求生效,不用于静态文件服务。
确认 slice 模块可用且适用场景
Nginx 1.9.8+ 内置该模块,但部分发行版(如 Ubuntu 官方包)未编译进二进制。运行以下命令验证:
-
nginx -V 2>&1 | grep -o with-http_slice_module—— 有输出表示已启用 - 若无,需重新编译并添加
--with-http_slice_module - 注意:slice 仅在
proxy_pass场景下工作;直接用root或alias提供静态视频时,slice 不起作用,此时靠的是 Nginx 原生 Range 支持(默认开启)
基础分片代理配置(关键四要素)
以下配置适用于 CDN 边缘节点或反向代理层,对 /video/ 下资源启用 1MB 分片回源与缓存:
- 在
http块中定义缓存区:proxy_cache_path /var/cache/nginx/slice levels=1:2 keys_zone=slice_cache:100m inactive=24h max_size=50g; - 在
location中启用分片并绑定缓存键:slice 1m;proxy_cache slice_cache;proxy_cache_key "$scheme$host$request_uri$slice_range";($slice_range是核心变量,值如bytes=0-1048575) - 必须透传 Range 请求头给后端:
proxy_set_header Range $slice_range; - 允许缓存 206 响应:
proxy_cache_valid 200 206 1h;
确保响应头完整与流式转发
分片代理易因响应头缺失或缓冲截断导致播放卡顿或 seek 失败:
- 显式声明接受范围:
add_header Accept-Ranges "bytes"; - 防止响应头被截断:
proxy_buffer_size 128k; - 关闭代理缓冲(避免内存堆积和首字节延迟):
proxy_buffering off; - 启用缓存锁防并发回源:
proxy_cache_lock on;proxy_cache_lock_timeout 3s;
验证是否生效
用 curl 检查关键行为:
- 发起 Range 请求:
curl -I -H "Range: bytes=0-1023" https://your-domain/video.mp4
应返回HTTP/2 206及Content-Range: bytes 0-1023/123456789 - 查看 Nginx 日志或缓存目录,确认生成多个以
$slice_range区分的缓存文件(如/var/cache/nginx/slice/xx/xxx) - 观察源站访问日志:同一视频首次请求应触发多次带不同
Range头的子请求(如bytes=0-1048575、bytes=1048576-2097151…)











