在 Ubuntu 24 上使用 Nginx 搭建 RTMP 流媒体服务器是一个很棒的选择,它可以让你实现视频直播和点播功能。下面我将为你详细介绍一步步的操作方法。

下面是搭建过程的整体流程图,帮助你直观地理解每个步骤:

flowchart TD
    A[环境准备与依赖安装] --> B[安装Nginx与RTMP模块]
    B --> C{选择安装方式}
    C -- 包管理器安装<br>(快速) --> D[配置RTMP服务]
    C -- 源码编译安装<br>(灵活) --> D
    D --> E[防火墙与权限设置]
    E --> F[推流测试]
    F --> G[播放测试]
    G --> H[高级功能配置<br>(HLS/安全/多路推流)]

🔧 安装 Nginx 与 RTMP 模块

首先,你需要安装 Nginx 和 RTMP 模块。有以下两种主要方式:

1. 使用包管理器安装(推荐,更简单快捷)
在终端中执行以下命令:

sudo apt update
sudo apt install nginx libnginx-mod-rtmp -y

此方法会自动处理依赖关系,但模块版本可能不是最新的。

2. 源码编译安装(适合需要特定版本或自定义功能)
如果需要最新版本或特定配置,可以从源码编译安装。

# 安装依赖
sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev -y

# 下载Nginx和RTMP模块源码
wget http://nginx.org/download/nginx-1.25.3.tar.gz
tar -zxvf nginx-1.25.3.tar.gz
git clone https://github.com/arut/nginx-rtmp-module.git

# 编译安装(注意路径替换)
cd nginx-1.25.3
./configure --add-module=../nginx-rtmp-module --with-http_ssl_module
make && sudo make install

编译安装能提供更大的灵活性,但过程相对复杂。

⚙️ 配置 RTMP 服务

安装完成后,需要配置 Nginx 以启用 RTMP 功能。

1. 编辑配置文件
Nginx 的主配置文件通常是 /etc/nginx/nginx.conf。使用文本编辑器打开它,在文件末尾添加以下 RTMP 配置块:

sudo nano /etc/nginx/nginx.conf

在文件末尾添加以下内容:

rtmp {
    server {
        listen 1935;                   # RTMP 默认监听端口
        chunk_size 4096;               # 数据块大小
        ping 30s;                       # 保活心跳时间
        notify_method get;               # 通知方法

        # 直播应用
        application live {
            live on;                     # 启用直播
            record off;                  # 关闭录制功能
            # 如果需要录制,可设置为 record all 并指定路径 record_path /var/rec;
            
            # 可选的访问控制(增强安全性)
            # allow publish 192.168.1.0/24; # 只允许指定网段推流
            # deny publish all;            # 拒绝其他所有IP推流
        }

        # HLS 应用(用于支持HTTP自适应流)
        application hls {
            live on;
            hls on;                      # 开启HLS
            hls_path /tmp/hls;           # HLS切片文件存储路径
            hls_fragment 5s;              # 每个TS切片时长
            hls_playlist_length 30s;     # HLS播放列表长度
        }
    }
}

2. 配置HTTP服务器用于HLS和状态监控(可选但推荐)
在配置文件的 http 块内添加以下内容,以便通过HTTP访问HLS流和服务器状态:

http {
    ... (其他原有配置)

    server {
        listen 80;
        server_name localhost;

        # HLS 流访问端点
        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;                   # 与rtmp配置中的hls_path对应
            add_header Cache-Control no-cache; # 禁用缓存用于实时播放
            add_header Access-Control-Allow-Origin *; # 解决跨域问题
        }

        # RTMP 状态监控页面
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        
        # 状态页面的样式文件
        location /stat.xsl {
            root /usr/local/nginx/nginx-rtmp-module; # 或模块所在路径
        }
    }
}

3. 测试配置并重启Nginx
保存配置文件后,执行以下命令:

# 测试配置文件语法是否正确
sudo nginx -t

# 如果测试成功,重新加载Nginx配置或重启Nginx服务
sudo systemctl reload nginx
# 或者 sudo systemctl restart nginx

# 如果使用源码编译安装,启动命令可能是
sudo /usr/local/nginx/sbin/nginx

🔒 防火墙与权限设置

确保系统的防火墙允许 RTMP 端口(默认为1935)通信:

sudo ufw allow 1935/tcp   # 允许RTMP流量
sudo ufw allow 80/tcp      # 如果使用HLS,允许HTTP流量

📡 推流与播放测试

服务器配置好后,可以进行推流和播放测试。

1. 推流测试
使用 OBS Studio 推流是最简单的方法:

  • 在OBS的"设置" -> "推流"中,选择"自定义"服务
  • 服务器地址填写:rtmp://你的服务器IP/live
  • 流密钥可以自定义,例如:test_stream
  • 然后点击"开始推流"

也可以使用 FFmpeg 进行推流测试:

ffmpeg -re -i 你的视频文件.mp4 -c:v libx264 -c:a aac -f flv "rtmp://localhost/live/test_stream"

2. 播放测试

  • RTMP 流播放:使用 VLC 播放器,打开"媒体" -> “打开网络串流”,输入地址:rtmp://你的服务器IP/live/test_stream
  • HLS 流播放(如果配置了HLS):在支持HLS的播放器(如VLC或浏览器中的播放器)中输入:http://你的服务器IP/hls/test_stream.m3u8

3. 查看服务器状态
如果配置了状态页面,可以通过浏览器访问 http://你的服务器IP/stat 查看当前流和连接状态。

🚀 高级功能与优化配置

1. 启用HLS支持
HLS(HTTP Live Streaming)能让你的直播流更容易通过HTTP分发,并更好地适应不同网络条件。配置参考前面的HLS应用部分。

2. 多路推流与转码
你可以配置Nginx将接收到的流自动推送到其他平台(如YouTube或Twitch):

application live {
    live on;
    record off;
    
    # 推送到其他RTMP服务器
    push rtmp://其他服务器地址/路径/流密钥;
}

3. 安全加固

  • 推流认证:可以通过HTTP回调实现推流认证
  • IP限制:如前面配置所示,限制推流IP范围
  • HTTPS加密:为状态页面和HLS流配置SSL/TLS加密

⚠️ 常见问题排查

如果遇到问题,可以检查以下几点:

  1. 查看Nginx错误日志:sudo tail -f /var/log/nginx/error.log
  2. 确认端口1935是否监听:sudo netstat -tlnp | grep 1935
  3. 检查防火墙设置是否阻止了相关端口
  4. 验证推流地址和流密钥是否正确

更多推荐