手把手教你搭建 Nginx-RTMP 流媒体服务器(Ubuntu/Windows)

作者简介

👋Hi,我是 EZ 在线工具网的站长,专注于多媒体在线视频技术与浏览器端工具开发。

EZ 在线工具网 是一个以 在线视频处理 为核心的工具平台,提供包括 M3U8 在线播放、M3U8 转 MP4、RTMP / HLS 流测试、FFmpeg 在线转码 等功能,全部可直接在浏览器中使用,无需安装客户端。

引言

随着直播行业的爆发,B站、抖音、视频号已经成为我们生活的一部分。但你是否想过,这些光鲜亮丽的直播背后,技术原理是什么?如果我们想自己做一个私服,或者在内网搭建一个监控推流服务器,该怎么做?本文将从零开始,超详细地教你在 Ubuntu 和 Windows 两大主流平台上,手把手编译、配置、并跑通 Nginx-RTMP 流媒体服务器。让你不仅“知其然”,更“知其所以然”。

为什么选择 Nginx-RTMP?

在流媒体领域,协议繁多,列如:RTMP、 HLS,、FLV, WebRTC等,服务器也有 SRS, ZLMediaKit, Nginx-RTMP 等。为什么偏偏选 Nginx-RTMP?
我总结了概括以下优点:

  • 高性能 : 众所周知,Nginx 的高并发能力天下闻名。
  • 极度轻量:资源占用极低,一台 1H1G 的云服务器就能扛住几百路推流。
  • 配置简单:一个 nginx.conf 走天下。
  • 功能强大:支持 RTMP 推流,同时支持 HTTP-FLV 和 HLS 播放,完美兼容 PC 和移动端。
    本文目标:搭建一台服务器,实现 OBS 推流 -> 服务器 -> VLC/浏览器 播放 的完整闭环。

前期准备

工欲善其事,必先利其器。请准备好以下环境:

  • 一台服务器/电脑:云服务器(推荐 Ubuntu 20.04/22.04)或者本地 Windows 电脑。
  • 推流工具: OBS Studio(开源免费,推流界的瑞士军刀)。
  • 播放工具: VLC Media Player(万能播放器)。
  • 代码编辑器: VS Code、Notepad++ 或 Vim。

Ubuntu 平台搭建

为了方便演示,这里使用的是Ubuntu,这里不用 apt install,因为官方源里的 Nginx 不带 RTMP 模块,所以需要从源码编译,听起来很吓人?其实就是复制粘贴几行命令的事。😎

安装编译依赖

打开终端,依次执行以下命令:

# 更新软件源
sudo apt-get update

# 安装编译工具和依赖库
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev unzip wget

下载 Nginx 和 RTMP 模块

我们需要两个压缩包:Nginx 源码包、Nginx-RTMP-Module 模块包。

# 创建一个工作目录
mkdir ~/nginx-build && cd ~/nginx-build

# 下载 Nginx (推荐 1.20.x 版本,稳定)
wget http://nginx.org/download/nginx-1.20.2.tar.gz

# 下载 RTMP 模块 (作者 arut 的原版)
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

解压与配置

# 解压
tar -zxvf nginx-1.20.2.tar.gz
unzip master.zip

# 进入 Nginx 目录
cd nginx-1.20.2

最关键的一步来了:配置编译参数。
我们要告诉 Nginx:除了自带的功能,把旁边那个 nginx-rtmp-module 也打包进去。

./configure \
--prefix=/usr/local/nginx \
--add-module=../nginx-rtmp-module-master \
--with-http_ssl_module \
--with-http_v2_module

参数解释

  • --prefix:指定安装目录,方便管理。
  • --add-module:指定 RTMP 模块源码路径,注意是上一级目录的 master 文件夹。
  • --with-http_ssl_module:开启 SSL 支持,注意:HLS 必须用 HTTPS。

如果没有报错,最后会显示 "configured successfully"。

编译与安装

# 编译(make),-j4 表示用 4 个核心编译,速度快,可以根据机器配置设置核心数
make -j4

sudo make install

安装完成后,你的 Nginx 就在 /usr/local/nginx 目录下了。

编译安装Nginx-RTMP

Ubuntu 系统服务配置

创建 systemd 服务文件:

sudo vim /etc/systemd/system/nginx-rtmp.service

添加以下内容:

[Unit]
Description=nginx-rtmp server
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

启用服务:

sudo systemctl enable nginx-rtmp
sudo systemctl start nginx-rtmp

Windows 平台搭建

Windows 编译环境太麻烦,好在有大神做了编译好的二进制包。

下载解压

  1. 访问 GitHub 仓库:illuspas/nginx-rtmp-win32
  2. 下载最新的 nginx-rtmp-win32-1.2.1.zip
  3. 解压到非中文路径,例如 D:\nginx-rtmp

Windows Nginx RTMP

看到 nginx.exe 了吗?这就是我们的主角。


核心配置:nginx.conf 详解

无论 Ubuntu 还是 Windows,灵魂都在 conf/nginx.conf 文件里。
用编辑器打开它,找到 http { ... } 部分,在它的外面同级位置,添加以下 rtmp 配置:

rtmp {
    server {
        listen 1935; # RTMP 默认端口
        chunk_size 4096;

        application live {
            live on;             # 开启直播模式
            record off;          # 关闭录制(节省硬盘)
            allow publish 127.0.0.1; # 允许推流的客户端 IP,生产环境建议改成内网 IP 或密码验证
            
            # 开启 HLS 切片
            hls on;
            hls_path /tmp/hls;   # Ubuntu 路径
            # hls_path D:/nginx-rtmp/temp/hls; # Windows 路径,注意反斜杠
            hls_fragment 3s;     # 每个切片 3 秒
            hls_playlist_length 10s; # 播放列表长度 10 秒
        }
    }
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80; # HTTP 默认端口,用于播放 HLS
        server_name  localhost;

        # HLS 播放配置
        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp; # Ubuntu
            # root D:/nginx-rtmp/temp; # Windows
            add_header Cache-Control no-cache;
        }
    }
}

配置保存后:

  • Ubuntusudo /usr/local/nginx/sbin/nginx 启动。
  • Windows:双击 nginx.exe 启动(会闪一个黑窗口)。

防火墙注意:务必开放 1935 (推流) 和 80 (播放) 端口!

  • Ubuntu: sudo ufw allow 1935 && sudo ufw allow 80
  • Windows: 防火墙高级设置 -> 入站规则 -> 新建规则 -> 端口 -> TCP 1935, 80。

Windows 防火墙端口放行设置


实战推流:OBS 连接服务器

根据实际情况替换掉下方的服务器,我这里的IP是 192.168.1.3

OBS 设置

  1. 来源:添加“显示器采集”或“视频捕获设备”。

  2. 设置 -> 直播

    • 服务:自定义
    • 服务器rtmp://192.168.1.3/live
    • 推流码test 这个可以自定义,相当于房间号
  3. 设置 -> 输出

    • 码率:2000 Kbps (2Mbps) 足够清晰。
    • 输出模式->关键帧间隔:2 秒。

OBS Studio 推流设置

点击“开始推流”

如果 OBS 右下角显示“正在推流”,且码率不是 0,恭喜你!数据已经发出去了!


实战拉流:三种方式看直播

推上去了,怎么看?有三种主流协议。

协议 URL 格式 延迟 优点 缺点
RTMP rtmp://ip/live/test 1-3 秒 极低延迟 浏览器不支持,需播放器
HTTP-FLV http://ip/live/test.flv 2-5 秒 低延迟,网页可播 需 flv.js 支持
HLS http://ip/hls/test.m3u8 10-30 秒 兼容性最好 延迟高

方式一:VLC 播放

  1. 打开 VLC -> 媒体 -> 打开网络串流。
  2. 输入:rtmp://你的IP/live/test
  3. 回车,画面出来了!

VLC 播放器成功播放画面

方式二:浏览器播放 HLS(Safari/Edge)

直接在地址栏输入:http://你的IP/hls/test.m3u8
Safari 和 Edge 原生支持 HLS,直接就能看。Chrome 需要插件。

方式三:网页播放 HTTP-FLV

这里推荐EZ在线工具网的FLV/RTMP在线播放器,免去开发的麻烦。非常适合RTMP直播流测试,支持RTMP和FLV格式,实时直播流信息、截图等功能。

如果想自己编写,可以参考B站开源的flv.js
创建一个 index.html 文件,贴入以下代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Nginx-RTMP 直播</title>
    <script src="https://cdn.bootcss.com/flv.js/1.5.0/flv.min.js"></script>
</head>
<body>
    <h1>我的直播间</h1>
    <video id="videoElement" controls width="800" height="450"></video>
    <script>
        if (flvjs.isSupported()) {
            var videoElement = document.getElementById('videoElement');
            var flvPlayer = flvjs.createPlayer({
                type: 'flv',
                url: 'http://你的IP/live/test.flv' // 注意这里是 flv
            });
            flvPlayer.attachMediaElement(videoElement);
            flvPlayer.load();
            flvPlayer.play();
        }
    </script>
</body>
</html>

注意:上面的 nginx.conf 默认没开 flv,要开的话在 rtmp -> application live 里加一句 allow publish 127.0.0.1; 然后在 http server 里加:

location /live {
    flv_live on;
    chunked_transfer_encoding on;
    add_header 'Access-Control-Allow-Origin' '*';
}

FLV/RTMP在线播放器


进阶:内网穿透,让外网访问

如果你是在自己电脑上搭的(Windows),朋友想看怎么办?你没有公网 IP。

有三种方案:

  1. 花生壳/Frp:简单,但免费版限速。
  2. Zerotier/Hamachi:组建虚拟局域网,朋友装个客户端,用内网 IP 访问。
  3. Ngrok:国外工具,稳定但要钱。

最傻瓜的方法(路由器端口映射):
如果你有光猫拨号的公网 IP:

  1. 登录路由器(192.168.1.1)。
  2. 找到“虚拟服务器”或“端口转发”。
  3. 添加两条:
    • 外部端口 1935 -> 内部 IP(你电脑IP) -> 内部端口 1935
    • 外部端口 80 -> 内部 IP(你电脑IP) -> 内部端口 80
  4. 推流地址填你的公网 IP 即可。

常见问题排查

现象 原因 解决方法
OBS 推流报错 connection refused 防火墙挡了 / Nginx没开 检查防火墙,`ps -ef
OBS 推流成功,VLC 黑屏 编码格式不对 OBS 视频编码改为 H.264,音频改为 AAC
公网无法访问,内网可以 没做端口映射 / 没公网IP 去路由器做映射,或用 Frp
HLS 播放 404 Nginx 配置路径不对 检查 hls_pathlocation /hlsroot 是否对应

查看日志是个好习惯!

  • Ubuntu: tail -f /usr/local/nginx/logs/error.log
  • Windows: logs/error.log

总结与展望

恭喜你!你已经掌握了流媒体服务器最核心的搭建技术。

回顾一下我们做了什么:

  1. 搞定了Ubuntu / Windows Nginx-RTMP模块的环境搭建。
  2. 对配置文件 nginx.conf进行了RTMP推流的配置。
  3. 打通了 OBS -> Nginx -> VLC 的链路。

下一步可以玩什么?

  • 录制回放:配置 record all;exec_record_done 脚本,实现直播自动录制并上传到点播系统。
  • 多码率:配置 ffmpeg 转码,让用户根据网速选择 720P/1080P。
  • 鉴权:防止别人乱推流,配置 on_publish 接口回调验证密钥。
  • WebRTC:Nginx-RTMP 延迟还是有点高,想做连麦互动?去研究 ZLMediaKit 或 SRS,它们原生支持 WebRTC,延迟能到 500ms 以内。

参考资料

posted @ 2026-01-18 01:15  ez在线工具网  阅读(0)  评论(0)    收藏  举报