Nginx支持视频断点续传和拖拽播放的关键是正确处理HTTP Range请求,需确保启用ngx_http_mp4_module模块、MP4文件含faststart头、location中配置mp4;指令,并通过curl或浏览器DevTools验证返回206状态码。

Linux 下 Nginx 支持大文件(尤其是视频)断点续传和在线拖拽播放,核心不是“开启某个开关”,而是确保 HTTP Range 请求能被正确解析、响应并高效传输。Nginx 默认就具备该能力,关键在于排除干扰、匹配格式、验证行为。
确认 MP4 模块已编译且启用
Nginx 原生的 ngx_http_mp4_module 是支持视频流式拖拽的基础。它不是插件,而是编译时可选模块:
- 运行
nginx -V 2>&1 | grep -o with-http_mp4_module,若输出含该字符串,说明已启用 - 若无输出,需重新编译 Nginx 并添加
--with-http_mp4_module参数 - 无需手动加载模块,只要编译进去了,在配置中启用
mp4;即可生效
确保 MP4 文件为 faststart 格式
即使 Nginx 配置正确,如果 MP4 的 moov atom(元数据头)在文件末尾,浏览器无法发起有效 Range 请求,拖动会卡顿或只能从头播放:
- 用 FFmpeg 修复:
ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4 - 验证方式:
ffprobe output.mp4查看moov是否在开头;或hexdump -C output.mp4 | head -20看前几 KB 是否含moov - 转码过程中务必加
-movflags +faststart,否则新生成的 MP4 仍不支持拖拽
配置 location 支持 Range 并启用 mp4 指令
针对视频路径(如 /videos/ 或以 .mp4 结尾的请求),配置需明确启用流式处理:
- 匹配规则建议用正则:
location ~ \.mp4$ { ... }或location /videos { ... } - 必须包含
mp4;指令——这是触发 MP4 特殊处理的关键,非可选 - 显式声明头更稳妥:
add_header Accept-Ranges bytes; - 可选调优缓冲:
mp4_buffer_size 1m; mp4_max_buffer_size 5m;(应对超大文件) - 避免与
rewrite、try_files或satisfy冲突,确保请求真实落到该 location
验证是否真正返回 206 Partial Content
不要只看页面能否播放,要抓取底层 HTTP 行为:
- 用 curl 测试:
curl -I -H "Range: bytes=0-1023" https://your.site/video.mp4 - 成功响应应含:
HTTP/1.1 206 Partial Content、Content-Range: bytes 0-1023/123456789、Accept-Ranges: bytes - 若返回 200,说明某处禁用了 Range(如
max_ranges 0;)、文件不可读、gzip 干扰或未命中 mp4 location - 浏览器中打开 DevTools → Network → 拖动进度条,观察是否发出多个带
Range的请求,且状态码为 206


















