插件窝 干货文章 nginx-rtmp-module构建流媒体直播服务器实战指南

nginx-rtmp-module构建流媒体直播服务器实战指南

Nginx HLS RTMP server 120    来源:    2025-04-01

Nginx-RTMP-Module 构建流媒体直播服务器实战指南

1. 概述

Nginx-RTMP-Module 是一个基于 Nginx 的流媒体服务器模块,支持 RTMP、HLS、DASH 等多种流媒体协议。本指南将详细介绍如何从零开始构建一个功能完整的流媒体直播服务器。

2. 环境准备

2.1 系统要求

  • Linux 服务器 (推荐 Ubuntu 20.04/22.04 或 CentOS 7/8)
  • 至少 2GB RAM
  • 足够的存储空间用于录制和缓存
  • 稳定的网络连接

2.2 依赖安装

Ubuntu/Debian:

sudo apt update
sudo apt install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev

CentOS/RHEL:

sudo yum install -y gcc make pcre pcre-devel openssl openssl-devel zlib zlib-devel

3. 安装 Nginx 与 RTMP 模块

3.1 下载源码

wget https://nginx.org/download/nginx-1.23.3.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/refs/heads/master.zip
unzip master.zip
tar -zxvf nginx-1.23.3.tar.gz

3.2 编译安装

cd nginx-1.23.3
./configure --add-module=../nginx-rtmp-module-master \
            --with-http_ssl_module \
            --with-http_v2_module \
            --with-http_flv_module \
            --with-http_mp4_module
make
sudo make install

4. 配置 Nginx-RTMP 服务器

4.1 基本配置

编辑 /usr/local/nginx/conf/nginx.conf,添加 RTMP 配置:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        allow publish 127.0.0.1;
        deny publish all;

        application live {
            live on;
            record off;

            # 推流认证
            on_publish http://localhost/auth;

            # HLS 支持
            hls on;
            hls_path /tmp/hls;
            hls_fragment 3s;
            hls_playlist_length 60s;

            # DASH 支持
            dash on;
            dash_path /tmp/dash;
            dash_fragment 3s;
            dash_playlist_length 60s;
        }

        # 录制配置
        application record {
            live on;
            record all;
            record_path /var/rec;
            record_unique on;
            record_suffix -%Y-%m-%d-%H_%M_%S.flv;
        }
    }
}

http {
    server {
        listen 80;

        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
            add_header Access-Control-Allow-Origin *;
        }

        location /dash {
            root /tmp;
            add_header Cache-Control no-cache;
            add_header Access-Control-Allow-Origin *;
        }

        # 状态监控页面
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root /path/to/nginx-rtmp-module-master/stat.xsl;
        }
    }
}

4.2 认证配置示例

创建认证脚本 /usr/local/nginx/html/auth (Python 示例):

#!/usr/bin/env python
import sys
import json

# 验证逻辑
def authenticate(name, key):
    # 这里替换为你的验证逻辑
    valid_keys = {
        "stream1": "password1",
        "stream2": "password2"
    }
    return valid_keys.get(name) == key

# 读取输入
data = sys.stdin.read()
params = dict(p.split('=') for p in data.split('&'))

# 验证
if authenticate(params.get('name'), params.get('key')):
    print("HTTP/1.1 200 OK\r\n\r\n")
else:
    print("HTTP/1.1 401 Unauthorized\r\n\r\n")

5. 启动与测试

5.1 启动 Nginx

sudo /usr/local/nginx/sbin/nginx

5.2 推流测试

使用 OBS 或 FFmpeg 推流:

ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f flv rtmp://your-server-ip/live/stream-key

5.3 播放测试

  • RTMP 播放: rtmp://your-server-ip/live/stream-key
  • HLS 播放: http://your-server-ip/hls/stream-key.m3u8
  • DASH 播放: http://your-server-ip/dash/stream-key.mpd

6. 高级配置

6.1 多分辨率转码

application live {
    live on;

    exec_push ffmpeg -i rtmp://localhost/live/$name
              -c:v libx264 -preset veryfast -s 1280x720 -b:v 2500k -maxrate 2500k -bufsize 5000k -g 50 -f flv rtmp://localhost/hls/$name_720
              -c:v libx264 -preset veryfast -s 854x480 -b:v 1000k -maxrate 1000k -bufsize 2000k -g 50 -f flv rtmp://localhost/hls/$name_480
              -c:v libx264 -preset veryfast -s 640x360 -b:v 750k -maxrate 750k -bufsize 1500k -g 50 -f flv rtmp://localhost/hls/$name_360;

    hls on;
    hls_path /tmp/hls;
    hls_nested on;

    hls_variant _720 BANDWIDTH=3000000,RESOLUTION=1280x720;
    hls_variant _480 BANDWIDTH=1500000,RESOLUTION=854x480;
    hls_variant _360 BANDWIDTH=1000000,RESOLUTION=640x360;
}

6.2 负载均衡

rtmp {
    upstream live {
        server 192.168.1.10:1935;
        server 192.168.1.11:1935;
        server 192.168.1.12:1935;
    }

    server {
        listen 1935;

        application live {
            live on;
            proxy_pass live;
        }
    }
}

7. 监控与维护

7.1 状态监控

访问 http://your-server-ip/stat 查看实时状态

7.2 日志分析

Nginx 日志位于 /usr/local/nginx/logs/

7.3 自动清理旧文件

# 每天清理7天前的HLS文件
0 3 * * * find /tmp/hls -type f -mtime +7 -exec rm -f {} \;

8. 安全建议

  1. 启用 HTTPS
  2. 限制推流IP
  3. 使用强认证机制
  4. 定期更新 Nginx 和 RTMP 模块
  5. 监控服务器资源使用情况

9. 常见问题解决

Q: 推流成功但无法播放 - 检查防火墙是否开放1935(RTMP)和80/443(HTTP)端口 - 检查HLS/DASH路径权限

Q: 高延迟问题 - 调整HLS片段大小(hls_fragment) - 使用低延迟配置: nginx hls_sync 100ms; hls_continuous on; hls_base_url http://your-cdn.com/;

Q: 音视频不同步 - 确保推流时使用正确的帧率 - 检查编码参数,特别是关键帧间隔(-g参数)

Q: 服务器负载过高 - 启用硬件加速 - 限制并发连接数 - 考虑使用CDN分发

通过本指南,您应该能够成功搭建一个功能完善的流媒体直播服务器。根据实际需求调整配置,并定期维护以确保服务稳定性。