nginx 使用 ngx_http_slice_module 实现超大文件分片代理需四要素对齐:启用 slice 指令、透传 $slice_range、缓存 key 包含 $slice_range、配合 proxy_cache;仅适用于 proxy_pass 场景,且后端须支持 206 响应。

确认模块可用性
运行 nginx -V 2>&1 | grep -o with-http_slice_module,有输出说明已编译支持。若无,需源码重编译并加 --with-http_slice_module 参数。Ubuntu/Debian 官方包常默认不启用,不能仅靠 apt 安装就认为可用。
必须同步配置的三项核心要素
缺一不可,否则分片失效或全部写入同一缓存项:
-
启用 slice 指令:只能写在
location块内,例如slice 1m;(每片 1MB),大小建议 512k–4M,太小会激增请求数,太大降低并发收益 -
透传 $slice_range 到后端:用
proxy_set_header Range $slice_range;,确保源站收到的是真实字节范围(如bytes=0-1048575) -
缓存 key 包含 $slice_range:写成
proxy_cache_key "$scheme$host$uri$is_args$args$slice_range";,否则所有分片共用一个缓存 key,后片会覆盖前片
配套必要设置
保证分片逻辑稳定运转:
-
启用 proxy_cache 并设合理过期:必须配合使用,
proxy_cache_valid 200 206 1h;,且proxy_cache_path中inactive时间不宜过长(如inactive=24h),避免冷分片长期占满磁盘 -
强制 HTTP/1.1 协议:加
proxy_http_version 1.1;,因 Range 是 HTTP/1.1 特性,HTTP/1.0 会退化为全量响应 -
开启 cache lock 防雪崩:
proxy_cache_lock on;+proxy_cache_lock_timeout 3s;,避免多个客户端同时请求未缓存分片时反复穿透源站 -
后端必须原生支持 206:返回头需含
Accept-Ranges: bytes和Content-Range,OSS/S3/标准 Web Server 默认支持;自研后端(如 Node/PHP)需手动解析 Range 并切片响应
典型 location 配置示例
以下配置可直接用于 /video/ 路径下的超大视频分片代理:
location ^~ /video/ {
slice 1m;
proxy_cache slice_cache;
proxy_cache_key "$scheme$host$uri$is_args$args$slice_range";
proxy_cache_valid 200 206 1h;
proxy_cache_lock on;
proxy_cache_lock_timeout 3s;
proxy_set_header Range $slice_range;
proxy_http_version 1.1;
proxy_pass https://origin.example.com$uri$is_args$args;
}











