NGINX 通过 ngx_http_flv_module 支持 FLV 伪流,可解析 start 参数实现拖拽播放;需编译含该模块、配置 flv 指令、确保 FLV 文件含关键帧索引;但 FLV 已过时,推荐改用 MP4+mp4 模块、HLS 或 DASH。

NGINX 本身不原生支持 FLV 流媒体的伪流(progressive download)或 RTMP 播放,但可通过 ngx_http_flv_module 模块实现基于 HTTP 的 FLV 文件“拖拽播放”(即支持 start 参数跳转到指定时间点),适用于传统 Flash 播放器或兼容 FLV 伪流协议的 HTML5 封装方案。
启用 FLV 模块并配置 location
确认 NGINX 编译时已包含 --with-http_flv_module(主流发行版如 Ubuntu/Debian 的 nginx-full 或源码编译默认开启)。在 server 块中添加如下 location 配置:
- 匹配以
.flv结尾的请求,并启用 FLV 处理 - 设置
expires提升缓存效率,避免重复传输头信息 - 添加
add_header兼容部分播放器对 MIME 类型的要求
location ~ \.flv$ {
flv;
expires 1h;
add_header Content-Type "video/x-flv";
add_header Cache-Control "public, no-transform";
}
支持时间戳跳转(start 参数)
FLV 伪流核心能力是解析 URL 中的 start=xxx 参数(单位:秒),定位到最近的关键帧开始返回数据。NGINX 的 flv 指令自动处理该逻辑,但需确保:
- FLV 文件本身包含完整且规范的 metadata(含
duration、keyframes等);可用flvtool2或ffmpeg -i in.flv -c copy -metadata title="x" out.flv修复 - URL 示例:
http://example.com/video.flv?start=65.2,NGINX 自动查找第 65.2 秒附近的关键帧起始位置 - 若跳转失败,检查日志中是否报
"no keyframe found",说明文件缺少关键帧索引
与静态文件服务协同优化
FLV 文件建议统一存放于专用目录(如 /var/www/videos/),配合以下增强配置:
- 启用
sendfile on和tcp_nopush on,提升大文件传输效率 - 限制单连接并发数(
limit_conn)和带宽(limit_rate),防止带宽打满 - 添加
open_file_cache缓存文件句柄,减少 stat 系统调用开销
location /videos/ {
alias /var/www/videos/;
flv;
sendfile on;
tcp_nopush on;
open_file_cache max=1000 inactive=60s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
limit_conn addr 10;
limit_rate 2m;
}
注意事项与替代建议
FLV 是过时格式,现代浏览器已弃用 Flash,纯 FLV+HTTP 方案仅适用于遗留系统或内网定制播放器。生产环境更推荐:
- 转为 MP4(H.264+AAC)并启用
mp4模块,支持标准 HTML5<video>+seek - 使用 HLS(
.m3u8+.ts)或 DASH,适配移动端与自适应码率 - 如需低延迟直播,应搭配 NGINX-RTMP 模块(独立项目)或 SRS、ZLMediaKit 等专业流媒体服务器










