必须从源码编译并显式添加rtmp模块,因官方预编译版不含该功能;configure需指定--add-module=模块根路径,且rtmp块须与http平级置于配置顶层,否则报“unknown directive 'rtmp'”。

编译时必须显式启用 nginx-rtmp-module,静态链接进二进制
NGINX 官方不自带 RTMP 功能,nginx-rtmp-module 是第三方模块,不能靠 apt install nginx 或 yum install nginx 获得——那些包默认不含 RTMP 支持,装完也起不来 rtmp 块配置。
必须从源码编译,且 ./configure 里明确加 --add-module=路径。常见错误是:只下载了模块但没在 configure 里引用,或者路径写错(比如用相对路径却没在正确目录下执行)。
- 模块仓库地址固定为
https://github.com/arut/nginx-rtmp-module.git,建议用git clone拉取,避免手动下载 tar 包后解压路径混乱 -
--add-module后的路径必须是模块源码的根目录(即含config文件的那层),不是nginx-rtmp-module/子目录里的某个文件夹 - 别跳过依赖检查:
libpcre3-dev、libssl-dev、zlib1g-dev缺一不可,否则./configure直接报错退出,典型提示如the HTTP rewrite module requires the PCRE library
nginx.conf 里 rtmp 块不能嵌套在 http 块里
这是新手最常踩的坑:rtmp 是独立于 http 的协议块,必须和 http 平级,放在 nginx.conf 的顶层作用域。如果把它塞进 http { ... } 里,NGINX 启动时会直接报错:unknown directive "rtmp"。
正确结构是:
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
application live {
live on;
record off;
}
}
}
http {
server {
listen 8080;
location / {
root html;
}
}
}
-
rtmp块监听的是 TCP 端口(通常是1935),不是 HTTP 端口;http块负责 HLS 页面或静态资源,端口另配(如8080) - 每个
application对应一个流路径,比如推流地址是rtmp://your-server/live/stream1,其中live就是application名,stream1是流名 -
live on是必须项,漏掉会导致推流成功但拉流失败(VLC 显示 “connection refused” 或黑屏)
HLS 切片要额外配 hls 指令并开放 HTTP 访问路径
RTMP 本身不支持浏览器直接播放,得靠 HLS(.m3u8 + .ts)转封装。但光在 application 里加 hls on 不够,还得让 HTTP 能读到切片文件。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
关键三步缺一不可:
- 在
application内启用:hls on、hls_path /var/www/hls(路径需绝对,且 NGINX 进程要有写权限) - 在
http块里加location暴露该路径:location /hls { alias /var/www/hls; } - 确保
/var/www/hls目录存在且可写,否则切片失败,.m3u8文件为空或根本不出现在目录里
最终拉流地址变成 http://your-server:8080/hls/stream1.m3u8,而不是 RTMP 地址。注意端口是 HTTP 服务端口,不是 1935。
推流测试前先关防火墙,别被 Connection refused 带偏方向
本地 ffmpeg 推流失败时,第一反应常是怀疑配置或模块问题,但大概率是端口被拦。Ubuntu 默认开 ufw,CentOS 默认开 firewalld,1935 和 8080 都不会自动放行。
- 临时关闭验证:
sudo ufw disable(Ubuntu)或sudo systemctl stop firewalld(CentOS) - 永久放行命令:
sudo ufw allow 1935+sudo ufw allow 8080,别只开一个 - 云服务器(阿里云/腾讯云)还要去控制台安全组里手动添加入方向规则,光本地防火墙开了没用
真正容易被忽略的是:RTMP 协议依赖 TCP 连接稳定性,一旦中间有 NAT 或代理,ffmpeg -re -i input.mp4 -c copy -f flv rtmp://... 可能连上但几秒后断开,这种问题得查网络拓扑,不是改配置能解决的。










