nginx的slice模块用于大文件分片代理,通过range请求降低后端压力、支持断点续传;需配合proxy_pass、后端Range支持及合理缓存配置使用。

nginx 的 slice 模块本身不用于“请求转发”,而是配合 proxy_pass 实现对**大文件的分片代理(range-based proxying)**,核心目标是降低后端压力、支持断点续传、提升并发下载效率。它工作在 http 块或 location 块中,需与 proxy_cache 或后端 range 支持协同使用。
slice 模块的作用机制
slice 指令将一个原始请求按固定大小(如 1m)切分为多个子请求,每个子请求携带 Range: bytes=x-y 头,分别发往后端。nginx 自动合并响应体并返回给客户端,对外表现为单次完整响应。这要求后端服务必须支持 HTTP Range 请求(如静态文件服务器、兼容 RFC 7233 的 API)。
- 启用条件:编译 nginx 时需含
--with-http_slice_module(主流发行版通常默认开启) - 生效位置:仅在
location块中配置有效,http或server块中设置无效 - 关键限制:不能与
proxy_buffering off共存;不适用于非 range 场景(如 POST、动态接口)
基础配置示例(静态大文件代理)
以下配置实现对 /download/ 下文件的自动分片代理:
location /download/ {
slice 1m;
proxy_cache cache_one;
proxy_cache_valid 200 206 1h;
proxy_cache_bypass $arg_nocache;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header Range $slice_range;
proxy_pass http://backend$uri$is_args$args;
}
-
slice 1m:每片最大 1MB,最后一片可能更小 -
$slice_range是内置变量,值为bytes=0-1048575等,自动注入到Range请求头 - 后端响应 206 Partial Content 时,nginx 缓存各分片;200 则缓存整文件
- 务必保留
proxy_http_version 1.1和Connection "",避免连接复用干扰
与缓存协同的关键细节
分片代理的价值高度依赖缓存。若无缓存,每次请求都会触发多轮后端交互,反而增加延迟和负载。
- 缓存键需包含
$slice_range,否则不同分片会覆盖同一缓存项:proxy_cache_key "$scheme$request_method$host$uri$is_args$args$slice_range"; - 建议启用
proxy_cache_lock on,防止相同分片的并发请求穿透到后端 - 注意
proxy_cache_valid需同时声明200和206状态码的有效期
常见问题与规避方式
实际部署中易出现响应乱序、缓存未命中或 502 错误:
-
后端不支持 Range:返回 200 而非 206,导致 nginx 合并失败 → 检查后端是否返回
Accept-Ranges: bytes,或用curl -I http://backend/file验证 - 分片过大或过小:1m 是平衡点;视频类可设为 4–10m 减少请求数;小文件(if ($request_length
-
HTTPS 后端证书问题:确保
proxy_ssl_verify off(测试环境)或正确配置 CA 证书路径










