Nginx slice模块本身不直接支持断点续传或多线程下载,仅负责将大文件按固定大小切片以配合Range请求实现按需传输;真正实现依赖客户端(如aria2c、浏览器video标签)发起Range请求并协同Nginx返回206响应。

Nginx 自带的 slice 模块本身不直接支持断点续传或客户端多线程下载,它仅负责将大文件按固定大小切片(如 1MB/片),配合 Range 请求实现“按需传输”。真正实现多线程并发 + 断点续传,依赖的是客户端行为(如 curl -C -、aria2c、播放器分片请求)与 Nginx 正确响应 206 Partial Content 的协同。Nginx 的作用是:高效、无状态地服务任意字节范围,且不因文件过大而阻塞或超时。
确认 slice 模块已启用并合理配置
Nginx 1.9.8+ 默认编译进 core,无需额外安装。关键不是开启 slice,而是确保它不干扰标准 Range 行为——slice 模块仅在启用且匹配 location 时才介入;若不需要服务超大文件的「动态切片」(如 HLS/DASH),通常应禁用或绕过它。真正支撑断点续传的是原生的 range 支持(默认开启)。
- 检查是否误启用了 slice:查看配置中是否有
slice 1m;或类似指令,若只是想支持普通视频断点下载,不要在 video location 中配置 slice - 确保
http { … } → server { … } → location ~* \.(mp4|mkv|avi)$ { … }块内未禁用 range:add_header Accept-Ranges bytes;(显式声明,非必需但推荐) - 验证 range 是否生效:用
curl -I -H "Range: bytes=0-1023" https://yoursite.com/video.mp4,应返回HTTP/2 206和Content-Range: bytes 0-1023/123456789
服务端关键参数调优(防超时、保稳定)
超大视频(几十 GB)长时间连接易触发超时或缓冲问题,需针对性调整:
-
client_max_body_size 0;—— 允许任意大小请求体(虽下载不用 body,但避免误判) -
client_header_timeout 60;,client_body_timeout 600;—— 防止慢速客户端被中断 -
send_timeout 300;—— 确保长连接下数据持续发送不被断开 -
tcp_nopush on;+tcp_nodelay on;—— 平衡吞吐与延迟,适合大文件流式传输 -
open_file_cache max=1000 inactive=20s;—— 缓存文件句柄,减少重复 open 开销
客户端如何真正实现多线程 + 断点续传
Nginx 不管理客户端状态,续传能力完全由客户端决定。典型方式:
-
命令行工具:
aria2c -x 16 -s 16 --continue=true https://site.com/movie.mp4(16 线程分段请求,自动合并,崩溃后--continue从本地已有部分继续) -
浏览器 / 播放器:现代 HTML5
标签天然支持 Range,拖动进度条即触发新 Range 请求;播放器(如 Video.js、hls.js)内部会缓存已加载片段,网络中断后重连自动续载 -
自研客户端:读取本地文件长度 → 发起
HEAD获取Content-Length→ 计算剩余字节 → 用Range: bytes=N-请求后续数据 → 追加写入文件
注意:slice 模块的真实适用场景
如果你确实需要 slice(比如构建自定义流媒体网关、对接特定 CDN 分片策略),它的用法是:
- 启用:
location /video/ { slice 10m; } - 客户端请求变为:
/video/file.mp4?md5=abc&start=0→ Nginx 内部按 10MB 切,返回第 0 片(bytes 0–10485759) - 但此时标准
Range头会被忽略!slice 和原生 Range 互斥。要支持断点续传,就不能用 slice,而应依赖原生 Range + 客户端分片逻辑
不复杂但容易忽略:Nginx 对断点续传的支持,本质是“不做多余事”——保持 HTTP/1.1 Range 规范兼容、避免超时、减少磁盘压力。slice 是另一套机制,用错反而破坏续传。











