需启用 ngx_http_mp4_module 模块并确保 MP4 文件为 faststart 格式,再在 location 中配置 mp4; 指令及 Accept-Ranges 头,方可支持断点续传与拖拽播放。

要让 Nginx 支持 MP4 视频的断点续传和拖拽播放(即处理 HTTP Range 请求),核心是启用 ngx_http_mp4_module 模块并正确配置 location 块。该模块默认在大多数预编译的 Nginx 包中已编译,但需确认启用且 MP4 文件满足格式要求。
确认 MP4 模块已启用
运行以下命令检查模块是否在 Nginx 中可用:
nginx -V 2>&1 | grep -o with-http_mp4_module若输出含 with-http_mp4_module,说明模块已编译;若无,则需重新编译 Nginx 并添加 --with-http_mp4_module 参数。
MP4 文件需满足格式前提
MP4 文件必须将 moov atom 放置在文件开头(即“faststart”或“web-optimized”格式),否则浏览器无法发起有效的 Range 请求。常见问题:用 FFmpeg 转码后未加 -movflags +faststart,会导致拖动失败或只能从头播放。
修复方法(使用 FFmpeg):
- ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4
- 验证是否生效:可用
ffprobe output.mp4查看 moov 是否在前,或用hexdump -C output.mp4 | head -20检查前几 KB 是否含 "moov" 字符串
Nginx 配置支持 Range 请求的 MP4 服务
在 server 或 location 块中启用 mp4 模块,并确保不干扰静态文件的默认处理逻辑:
- 匹配 .mp4 后缀请求,用
mp4;指令启用流式支持 - 保留
add_header Accept-Ranges bytes;(虽 mp4 模块自动设置,显式声明更清晰) - 禁用缓存干扰(可选):对开发调试建议加
add_header Cache-Control "no-store",生产环境应合理配置缓存策略
示例配置:
location ~ \.mp4$ {mp4;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
add_header Accept-Ranges bytes;
expires 1h;
}
验证 Range 请求是否生效
用 curl 手动测试关键 Range 行为:
- 请求文件开头 1024 字节:curl -I -H "Range: bytes=0-1023" http://your.site/video.mp4 → 应返回
206 Partial Content及Content-Range头 - 检查响应头是否含
Accept-Ranges: bytes - 在 Chrome DevTools 的 Network 标签中播放视频,拖动进度条,观察是否发出多个带 Range 的请求且状态码为 206
如返回 200 而非 206,常见原因:MP4 未 faststart、location 未命中、mp4 指令缺失、或被其他 rewrite/try_files 规则覆盖。










