nginx本身不支持RTMP或HLS,必须通过nginx-rtmp-module扩展实现;rtmp块需与http同级且独立存在,hls on须在application内启用,hls_path与HTTP location alias路径必须严格一致并确保Nginx进程有写权限。

nginx 本身不支持 RTMP 或 HLS,必须通过 nginx-rtmp-module 扩展才能处理直播流和生成 HLS 切片。直接改 nginx.conf 的 http 块是无效的——HLS 生成逻辑在 rtmp 模块里,不是 HTTP 配置能开启的。
确认 nginx 已编译进 rtmp 模块
运行 nginx -V 2>&1 | grep rtmp,如果没输出,说明没装对模块。常见错误是只安装了普通 nginx 包(如 yum install nginx),它不含 RTMP 支持。
- 必须从源码编译,且
./configure时带--add-module=../nginx-rtmp-module -
nginx -V输出中应包含nginx-rtmp-module路径 - CentOS/RHEL 上别用 EPEL 的 nginx 包,它默认禁用第三方模块
rtmp { } 块必须放在 nginx.conf 顶层,不能嵌套在 http { } 里
很多教程把 rtmp 配置误塞进 http 块,Nginx 启动会直接报错:unknown directive "rtmp"。它和 http 是同级块,位置应在文件末尾、events 和 http 之后,但不能在里面。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 正确位置示例:
events { ... } http { ... } rtmp { server { ... } } -
rtmp块内必须有server { listen 1935; ... },端口 1935 是 RTMP 默认端口,防火墙需放行 -
application hls { live on; hls on; hls_path /var/www/html/hls; }—— 这才是开启 HLS 的关键,hls on不写或拼错成hlson就不会生成 .m3u8
HLS 文件路径与 HTTP 访问路径要严格匹配
比如你设了 hls_path /var/www/html/hls;,那 Nginx 的 http 块里就必须用 location /hls { alias /var/www/html/hls; },而不是 root /var/www/html;。用 root 会导致访问 /hls/xxx.m3u8 实际去查 /var/www/html/hls/xxx.m3u8,多了一层目录,404。
-
alias是精确映射,root是拼接路径,这里必须用alias -
types块里必须声明application/vnd.apple.mpegurl m3u8,否则浏览器不识别 .m3u8 为可播放类型 - 确保
hls_path目录存在、Nginx worker 进程有写权限(chown -R nginx:nginx /var/www/html/hls)
推流后没生成 .ts 文件?先检查 ffmpeg 推流命令和权限
用 ffmpeg -re -i test.mp4 -c copy -f flv rtmp://localhost/hls/stream 推流,如果 /hls 目录始终为空,大概率是权限或路径问题,不是配置语法错。
- 推流地址中的
hls必须和rtmp { application hls { ... } }名称完全一致(区分大小写) - 检查
hls_fragment值是否太小(如1s),导致切片太快、日志来不及刷盘;建议用5s起手 - 推流后立刻
ls -l /var/www/html/hls/,若无文件,看nginx -t是否通过,再查error.log里有没有open() "/var/www/html/hls/xxx.ts" failed (13: Permission denied)

















