4、Nginx-RTMP模块:编译安装Nginx并添加rtmp模块,配置第一个RTMP直播推流端点
好,咱们进入正题。上一章我们把直播协议和推流的基本概念捋了一遍,这一章就要动手了。说白了,就是要把 Nginx 这个 Web 服务器改造成一个能接收 RTMP 推流的服务端。
你可能会问:为什么非得自己编译?直接用包管理器装一个不行吗?嗯,我刚开始也这么想。但后来发现,官方仓库里的 Nginx 默认不带 RTMP 模块,你得自己把它编译进去。这就像买车,原厂配置没给你装拖车钩,你得自己焊一个上去。
核心目标:从源码编译 Nginx,加入 RTMP 模块,配置一个可用的推流端点,并用 OBS 验证推流成功。
4.1 环境准备与依赖安装
我习惯在 CentOS 7/8 或 Ubuntu 20.04+ 上做这件事。如果你用的是 Windows,建议先装个 WSL2 或者开一台 Linux 虚拟机。别问我为什么不用 Windows 原生编译——我在项目里试过,坑多到能种菜。
先装编译工具链和依赖库:
# CentOS / RHEL
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
# Ubuntu / Debian
apt-get update
apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
这里有个细节:pcre-devel 和 zlib-devel 是 Nginx 编译时必须的,前者处理正则,后者处理压缩。少了任何一个,编译到一半就会报错。我曾经在客户现场因为没装 pcre-devel 卡了半小时,后来发现是基础镜像太干净了。
4.2 下载 Nginx 源码与 RTMP 模块
接下来,我们需要两样东西:Nginx 本体源码,以及 nginx-rtmp-module 的源码。我建议用 Nginx 的稳定版,别追最新版,生产环境稳字当头。
# 下载 Nginx(以 1.24.0 为例)
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
# 下载 RTMP 模块(从 GitHub 拉取)
git clone https://github.com/arut/nginx-rtmp-module.git
你想想看,这两个目录解压后,最好放在同一级目录下,方便后面编译时指定路径。我习惯把它们都丢到 /usr/local/src 下面,整洁一点。
4.3 编译安装 Nginx + RTMP 模块
这是最核心的一步。进入 Nginx 源码目录,执行 configure 脚本,用 --add-module 参数把 RTMP 模块加进去。
cd nginx-1.24.0
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_flv_module \
--with-http_mp4_module \
--add-module=../nginx-rtmp-module
make -j$(nproc)
make install
这里我解释几个参数:
--prefix:指定安装目录,我习惯用/usr/local/nginx,方便管理。--with-http_ssl_module:支持 HTTPS,后面做安全推流时用得上。--add-module:就是咱们的主角——RTMP 模块的路径。-j$(nproc):用所有 CPU 核心并行编译,能快不少。
注意:如果 configure 阶段报错,八成是缺了某个 devel 包。仔细看错误信息,缺什么补什么。别慌,我见过有人因为一个报错就重装系统的,没必要。
编译完成后,验证一下模块是否加载成功:
/usr/local/nginx/sbin/nginx -V 2>&1 | grep rtmp
如果输出里出现了 nginx-rtmp-module,说明编译成功了。嗯,到这里你已经走完了最麻烦的一步。
4.4 配置第一个 RTMP 推流端点
现在来编辑 Nginx 的配置文件。默认路径是 /usr/local/nginx/conf/nginx.conf。我建议先备份原文件,再动手改。
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
vim /usr/local/nginx/conf/nginx.conf
在 http 块外面(或者里面都行,但为了清晰我习惯放外面),添加一个 rtmp 块:
rtmp {
server {
listen 1935; # RTMP 默认端口
chunk_size 4096;
application live {
live on;
record off;
}
}
}
这个配置是什么意思?
listen 1935:RTMP 协议默认监听 1935 端口,别改成别的,除非你有特殊需求。chunk_size 4096:每个数据块的大小,默认值就行,不用动。application live:定义了一个名叫live的推流端点。你可以理解成一个房间,推流端和播放端都进这个房间。live on:开启直播模式。record off:不自动录制,省磁盘。
保存后,启动 Nginx:
/usr/local/nginx/sbin/nginx -t # 测试配置语法
/usr/local/nginx/sbin/nginx # 启动
如果 -t 输出 syntax is ok,说明配置没问题。这时候用 netstat -tlnp | grep 1935 看看端口是否在监听。
小技巧:如果启动失败,去 /usr/local/nginx/logs/error.log 看日志。90% 的问题都能在那里找到答案。
4.5 用 OBS 验证推流
配置好了,总得试试能不能用。打开 OBS Studio,进入「设置」→「推流」:
| 参数 | 值 |
|---|---|
| 服务 | 自定义 |
| 服务器 | rtmp://你的服务器IP/live |
| 推流码 | test(任意字符串,作为流名称) |
点击「开始推流」,如果 OBS 状态栏显示「正在推流」且没有报错,恭喜你,第一个 RTMP 端点已经跑起来了。
这时候你可以用 VLC 播放器验证:打开「媒体」→「打开网络串流」,输入 rtmp://你的服务器IP/live/test,如果能看到画面,说明整个链路通了。
4.6 核心流程回顾
我把整个流程画了一张图,方便你理解各个组件之间的关系:
4.7 常见问题与避坑
我在项目里遇到过不少问题,挑几个典型的说说:
- 端口被占用:1935 端口可能被其他服务占了。用
lsof -i:1935查一下,如果有冲突,要么停掉那个服务,要么改 Nginx 的监听端口。 - 防火墙没放行:云服务器的话,记得在安全组里开放 1935 端口。本地的话,
systemctl stop firewalld先关掉防火墙测试,通了再配规则。 - OBS 推流报错:检查服务器地址格式,
rtmp://ip/live后面不要加多余的斜杠。我曾经手抖多打了一个/,排查了十分钟。 - VLC 无法播放:确认推流端已经在推流,流名称要一致。VLC 对 RTMP 的支持有时候有点抽风,换个播放器试试也行。
重要提醒:生产环境不要用本文的默认配置。至少要做三件事:限制推流密钥、开启鉴权、配置 HTTPS。这些后面章节会详细讲,但你现在心里要有这根弦。