在 nginx 中配置大文件断点续传,核心是启用 slice 模块配合 mp4 或通用范围请求处理逻辑。具体做法是在 location 块中设置 slice 1m; 将请求分片,并开启 mp4 支持以处理字节范围(range)请求,这样客户端可以分段下载,服务端也能按需读取。

slice 模块如何与范围请求协同工作
slice 模块本身并不直接处理 HTTP Range 头,它主要用于将一个大请求切分为多个子请求。要实现断点续传,必须结合 ngx_http_mp4_module 或手动处理 Range 头。当客户端发送带有 Range: bytes=0-1023 的请求时,Nginx 会根据配置判断是否使用切片。对于静态文件,通常不需要显式启用 slice 来实现基本的断点续传,因为 Nginx 原生支持范围请求。但 slice 在需要动态生成内容或对后端进行分片读取时有用。这里我们关注的是如何通过配置让 Nginx 正确处理范围请求,从而实现断点续传。

server {
listen 80;
server_name example.com;
location /files/ {
alias /var/www/files/;
# 启用 mp4 模块支持,自动处理范围请求
mp4;
# 可选:启用 slice 用于特定场景,如动态内容分片
# slice 1m;
# slice_args break;
}
}
上述配置中,mp4; 指令启用了 ngx_http_mp4_module,该模块会自动解析 Range 头并返回相应的字节范围。如果文件是普通静态文件,Nginx 默认也支持范围请求,无需额外配置。但若需对大文件进行更精细的控制,例如结合缓存或动态处理,可考虑使用 slice。注意,slice 模块在处理静态文件时可能增加复杂度,需谨慎使用。
如何处理 slice 模块的边界条件与错误
当使用 slice 模块时,若未正确配置 slice_args 或未处理子请求的合并,可能导致响应不完整或错误。此外,若客户端请求的范围超出文件大小,Nginx 会返回 416 Requested Range Not Satisfiable。确保 alias 路径正确且文件存在,避免因路径问题导致 404 错误。同时,检查 mp4 模块是否已编译进 Nginx,否则 mp4; 指令将无效。

# 验证 mp4 模块是否加载 nginx -V | grep -o with-http_mp4_module # 测试范围请求 curl -H "Range: bytes=0-1023" http://example.com/files/largefile.zip -o part1.bin
通过上述命令可验证 Nginx 是否正确处理范围请求。若 mp4 模块未加载,需重新编译 Nginx 并添加 --with-http_mp4_module 选项。对于 slice 模块,若需启用,需在 location 中添加 slice 1m; 和 slice_args break;,并确保后端能正确处理子请求。最后,监控日志以排查可能的错误,如 open() "/var/www/files/largefile.zip" failed (2: No such file or directory)。
基于 Range 头缺失时的降级行为
若客户端未发送 Range 头,Nginx 将返回完整文件。此时,断点续传功能不生效,但文件仍可正常下载。为确保兼容性,建议客户端始终发送 Range 头以支持断点续传。若服务器不支持范围请求,客户端应回退到全量下载。在实际应用中,可通过检测响应头中的 Accept-Ranges: bytes 来判断服务器是否支持断点续传。


















