nginx 默认不启用 ngx_http_mp4_module 模块,需编译时添加 --with-http_mp4_module 参数;启用后须在 location 中配置 mp4; 指令,并确保 mp4 文件含前置 moov 头。

Nginx 默认不启用 ngx_http_mp4_module 模块,即使源码中已包含,也需在编译时显式开启。该模块用于支持对 MP4 文件的流式播放(如拖拽进度、按时间范围请求),但仅适用于静态 MP4 文件,且要求文件含合法的 moov 头(通常需用 ffmpeg -c copy -movflags +faststart 预处理)。
确认模块是否可用
该模块是 Nginx 官方模块,从 1.1.3 版本起内置,无需第三方补丁。检查源码目录下是否存在:
-
src/http/modules/ngx_http_mp4_module.c—— 存在即说明源码支持 - 注意:它不是动态模块(.so),只能静态编译进主程序
编译时启用 MP4 模块
在执行 ./configure 时添加 --with-http_mp4_module 参数:
./configure \ --prefix=/usr/local/nginx \ --with-http_mp4_module \ --with-http_ssl_module \ --with-http_v2_module \ ... # 其他所需模块
然后正常执行:
make && sudo make install- 编译完成后,可通过
nginx -V 2>&1 | grep -o with-http_mp4-module验证是否已启用
配置 Nginx 启用 MP4 支持
模块启用后,还需在 location 块中显式开启:
location ~ \.mp4$ {
mp4;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
add_header Accept-Ranges bytes;
}
关键点:
-
mp4;是开启该 location 下 MP4 处理的必需指令 -
mp4_buffer_size控制读取 moov 头的初始缓冲区大小(建议 ≥512k) -
mp4_max_buffer_size限制最大缓冲区(moov 过大时需调高) - 确保 MP4 文件已用
ffmpeg -i in.mp4 -c copy -movflags +faststart out.mp4优化过
常见问题排查
启用后仍无法拖拽或返回 404/500:
- 检查文件是否真为 MP4 容器(而非仅扩展名是 .mp4):用
ffprobe file.mp4确认有moovatom 且位置靠前 - 确认 Nginx 配置语法正确:
nginx -t - 查看错误日志:
tail -f logs/error.log,典型报错如mp4: moov atom not found或buffer overflow - SELinux 或文件权限问题可能导致读取失败,确保 Nginx 工作进程可读 MP4 文件











