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 核心流程回顾

我把整个流程画了一张图,方便你理解各个组件之间的关系:

Nginx + RTMP 模块推流架构 OBS 推流端 rtmp://ip/live/test RTMP 推流 Nginx 服务器 端口 1935 application live 分发 VLC 播放端 rtmp://ip/live/test 关键配置说明: • listen 1935 —— RTMP 协议默认端口,防火墙需放行 • application live —— 推流端点名称,可自定义 • live on —— 开启直播模式;record off —— 关闭自动录制 ① 编译安装 Nginx + RTMP 模块 ② 配置 rtmp 块 application live ③ OBS 推流验证 VLC 拉流播放

4.7 常见问题与避坑

我在项目里遇到过不少问题,挑几个典型的说说:

  • 端口被占用:1935 端口可能被其他服务占了。用 lsof -i:1935 查一下,如果有冲突,要么停掉那个服务,要么改 Nginx 的监听端口。
  • 防火墙没放行:云服务器的话,记得在安全组里开放 1935 端口。本地的话,systemctl stop firewalld 先关掉防火墙测试,通了再配规则。
  • OBS 推流报错:检查服务器地址格式,rtmp://ip/live 后面不要加多余的斜杠。我曾经手抖多打了一个 /,排查了十分钟。
  • VLC 无法播放:确认推流端已经在推流,流名称要一致。VLC 对 RTMP 的支持有时候有点抽风,换个播放器试试也行。

重要提醒:生产环境不要用本文的默认配置。至少要做三件事:限制推流密钥、开启鉴权、配置 HTTPS。这些后面章节会详细讲,但你现在心里要有这根弦。