Nginx集成RTMP模块实现RTMP推拉流完整指南
本文将详细介绍如何在Linux环境下为Nginx集成RTMP模块,实现完整的RTMP推流和拉流功能。以下是完整的实现方案:
一、RTMP模块概述
1. nginx-rtmp-module 特性
- 支持协议:RTMP、HLS、DASH、HDS
- 核心功能:
- 直播推流/拉流
- 实时转码
- 视频录制
- 流中继
- 统计监控
- 优势:
- 高并发支持(1000+连接)
- 低资源消耗
- 与Nginx无缝集成
2. 架构原理
二、环境准备与安装
1. 系统要求
- Linux发行版:Ubuntu 20.04+/CentOS 7+
- Nginx版本:1.18.0+
- 依赖库:OpenSSL、PCRE、zlib
2. 安装依赖
# Ubuntu/Debian
sudo apt update
sudo apt install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev
# CentOS/RHEL
sudo yum groupinstall "Development Tools"
sudo yum install -y pcre-devel openssl-devel zlib-devel
3. 下载源码
# 创建工作目录
mkdir nginx-rtmp-build && cd nginx-rtmp-build
# 下载Nginx
wget http://nginx.org/download/nginx-1.22.1.tar.gz
tar -zxvf nginx-1.22.1.tar.gz
# 下载RTMP模块
git clone https://github.com/arut/nginx-rtmp-module.git
三、编译安装Nginx+RTMP模块
1. 配置编译选项
cd nginx-1.22.1
./configure \
--prefix=/usr/local/nginx-rtmp \
--add-module=../nginx-rtmp-module \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_stub_status_module \
--with-threads \
--with-file-aio
2. 编译安装
make -j$(nproc)
sudo make install
3. 创建系统服务
sudo tee /etc/systemd/system/nginx-rtmp.service <<EOF
[Unit]
Description=The NGINX RTMP Server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx-rtmp/logs/nginx.pid
ExecStartPre=/usr/local/nginx-rtmp/sbin/nginx -t
ExecStart=/usr/local/nginx-rtmp/sbin/nginx
ExecReload=/usr/local/nginx-rtmp/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
# 启用服务
sudo systemctl daemon-reload
sudo systemctl enable nginx-rtmp
四、配置RTMP服务
1. 基础配置
# /usr/local/nginx-rtmp/conf/nginx.conf
# 在http块外添加rtmp配置
rtmp {
server {
listen 1935;
chunk_size 4096;
buflen 1s;
# 直播应用配置
application live {
live on;
record off;
# 开启HLS输出
hls on;
hls_path /var/www/hls/live;
hls_fragment 3s;
hls_playlist_length 60s;
# 开启DASH输出
dash on;
dash_path /var/www/dash/live;
dash_fragment 3s;
dash_playlist_length 60s;
# 访问控制
allow publish 192.168.0.0/16; # 允许内网推流
deny publish all;
allow play all; # 允许所有播放
}
# 录制应用
application record {
live on;
record all;
record_path /var/recordings;
record_unique on;
record_suffix -%Y%m%d-%H%M%S.flv;
}
}
}
# 在http块内添加HLS/DASH服务
http {
server {
listen 8080;
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /var/www;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
location /dash {
root /var/www;
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/stat;
}
}
}
2. 创建目录结构
sudo mkdir -p /var/www/{hls/live,dash/live}
sudo mkdir /var/recordings
sudo chown -R www-data:www-data /var/www /var/recordings
3. 启动服务
sudo systemctl start nginx-rtmp
五、推流与拉流实战
1. 推流方法
使用FFmpeg推流
# 推视频文件
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -c:a aac -f flv rtmp://server_ip/live/stream_key
# 推摄像头(Linux)
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -preset ultrafast -f flv rtmp://server_ip/live/camera
# 推桌面(Windows)
ffmpeg -f gdigrab -i desktop -c:v libx264 -preset ultrafast -f flv rtmp://server_ip/live/screen
使用OBS Studio推流
- 设置 > 推流
- 服务:自定义
- 服务器:
rtmp://server_ip/live
- 串流密钥:自定义(如
my_stream
)
2. 拉流方法
RTMP协议播放
rtmp://server_ip/live/stream_key
HTTP-FLV播放(低延迟)
http://server_ip:8080/live?app=live&stream=stream_key.flv
HLS播放(兼容性好)
http://server_ip:8080/hls/live/stream_key.m3u8
DASH播放(自适应码率)
http://server_ip:8080/dash/live/stream_key.mpd
3. 播放器测试
# VLC播放RTMP
vlc rtmp://server_ip/live/stream_key
# FFplay播放HTTP-FLV
ffplay http://server_ip:8080/live?app=live&stream=stream_key.flv
# 网页播放器
<html>
<video controls>
<source src="http://server_ip:8080/hls/live/stream_key.m3u8" type="application/x-mpegURL">
</video>
</html>
六、高级功能配置
1. 多码率转码
application live {
live on;
# 原始流
exec ffmpeg -i rtmp://localhost/live/$name
-c:v libx264 -b:v 800k -vf scale=640:360 -f flv rtmp://localhost/live360p/$name
-c:v libx264 -b:v 1500k -vf scale=1280:720 -f flv rtmp://localhost/live720p/$name;
}
application live360p {
live on;
hls on;
hls_path /var/www/hls/live360p;
}
application live720p {
live on;
hls on;
hls_path /var/www/hls/live720p;
}
2. 推流鉴权
application live {
live on;
# 推流认证
on_publish http://auth_server/auth.php;
# 播放认证
on_play http://auth_server/play_auth.php;
}
3. 集群部署
# 边缘节点配置
application live {
live on;
pull rtmp://origin_server/live name=stream_key static;
}
4. 安全加固
# IP白名单
allow publish 192.168.1.0/24;
deny publish all;
# HTTPS支持
rtmp {
server {
listen 1935 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
}
}
七、监控与管理
1. 状态页面
访问:http://server_ip:8080/stat
2. 关键监控指标
# 实时连接数
curl -s http://localhost:8080/stat | grep -c 'active'
# 带宽使用
iftop -i eth0 -P
# 服务器负载
top -p $(pgrep nginx)
3. 日志分析
# 查看错误日志
tail -f /usr/local/nginx-rtmp/logs/error.log
# 分析访问日志
goaccess /usr/local/nginx-rtmp/logs/access.log -o report.html
八、性能优化
1. Nginx配置优化
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
rtmp {
server {
listen 1935 backlog=1024;
max_connections 1000;
# 输出缓冲区优化
out_queue 10240;
out_cork 8;
}
}
2. 内核参数优化
# /etc/sysctl.conf
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
3. 硬件加速
application live {
exec ffmpeg -i rtmp://localhost/live/$name
-c:v h264_nvenc -preset p7 -f flv rtmp://localhost/h264/$name; # NVIDIA GPU
}
九、常见问题解决
1. 推流连接失败
原因:防火墙阻止1935端口
解决:
sudo ufw allow 1935/tcp
sudo ufw allow 8080/tcp
2. 播放卡顿
优化:
- 降低推流码率
- 增加HLS分片时长
- 启用CDN加速
3. 高延迟问题
解决方案:
# 配置低延迟模式
application live {
interleave on;
wait_key on;
wait_video on;
idle_streams off;
hls_fragment 1s;
hls_playlist_length 3s;
}
4. 录制文件损坏
修复方法:
# 使用FLV修复工具
flvmeta broken.flv fixed.flv
十、完整测试方案
1. 自动化测试脚本
#!/bin/bash
# 启动推流
ffmpeg -re -f lavfi -i testsrc=size=1280x720:rate=30 \
-c:v libx264 -preset ultrafast -f flv rtmp://localhost/live/test &
# 等待推流启动
sleep 2
# 播放测试
ffplay -fflags nobuffer rtmp://localhost/live/test &
ffplay http://localhost:8080/hls/live/test.m3u8 &
# 运行10分钟
sleep 600
# 停止测试
killall ffmpeg ffplay
2. 压力测试工具
# 使用srs-bench
./sb_rtmp_publish -i test.flv -c 100 -r rtmp://server/live/test
总结
通过Nginx集成RTMP模块,您可以构建一个功能强大的流媒体服务器,支持:
- 高并发RTMP推流/拉流
- 多协议输出(HLS/DASH)
- 实时转码与录制
- 集群化部署
- 完善的安全控制
关键优势:
- 高性能:单服务器支持1000+并发
- 低延迟:RTMP原生支持<1秒延迟
- 灵活性:与Nginx生态无缝集成
- 开源免费:无商业授权限制
生产环境建议:
- 使用CDN分发HLS/DASH流
- 启用硬件加速转码
- 配置完善的监控告警
- 定期安全审计
通过本文指南,您已掌握从编译安装到高级配置的完整流程,可快速部署企业级RTMP流媒体服务。