SRS 是一个高效的实时视频服务器,支持 RTMP、WebRTC、HLS、HTTP-FLV 等多种协议。以下是如何搭建 SRS 服务器集群的详细信息:
集群架构概述
SRS 集群通常由以下组件组成:
-
边缘服务器(Edge):处理客户端连接和流分发
-
源站服务器(Origin):接收推流并分发到边缘
-
负载均衡器:分配客户端请求到不同边缘节点
部署步骤
1. 源站服务器配置
# conf/origin.conf
listen 1935;
max_connections 1000;
daemon on;
pid ./objs/srs.pid;
srs_log_tank file;
srs_log_file ./objs/srs.log;
http_api {
enabled on;
listen 1985;
}
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
rtc_server {
enabled on;
listen 8000;
candidate $CANDIDATE_IP;
}
vhost __defaultVhost__ {
cluster {
mode local;
origin_cluster on;
coworkers 127.0.0.1:1985;
}
}
origin.conf 配置项详细说明
#基本配置项
listen 1935; # RTMP服务监听端口(默认1935)
max_connections 1000; # 最大连接数限制
daemon on; # 以守护进程模式运行
pid ./objs/srs.pid; # 进程ID存储文件
srs_log_tank file; # 日志输出方式(file|console)
srs_log_file ./objs/srs.log; # 日志文件路径
srs_log_level trace; # 日志级别(trace|debug|info|warn|error)
#HTTP API 配置
http_api {
enabled on; # 启用HTTP API管理接口
listen 1985; # API监听端口
crossdomain on; # 允许跨域访问
raw_api { # 原始API配置
enabled on; # 启用原始API(如/api/v1/versions)
}
}
#HTTP Server 配置(提供 HLS、HTTP-FLV 和 DVR 文件访问)
http_server {
enabled on; # 启用HTTP服务
listen 8080; # HTTP服务端口
dir ./objs/nginx/html; # HLS/DVR文件根目录
cors {
enabled on; # 允许跨域访问(对HLS/FLV重要)
allow_origin *; # 允许的域名(*为通配)
}
}
#RTC (WebRTC) 配置
rtc_server {
enabled on; # 启用WebRTC服务
listen 8000; # WebRTC信令端口
candidate $YOUR_SERVER_IP; # 服务器公网IP(必须修改) candidate 必须设置为服务器的公网IP或域名,否则 WebRTC 无法穿透 NAT。
}
#集群配置
vhost __defaultVhost__ {
cluster {
mode local; # 源站模式(local表示是Origin)
origin_cluster on; # 启用源站集群协作
coworkers 192.168.1.101:1985 192.168.1.102:1985; # 其他源站API地址
}
}
#转码与DVR录制
vhost __defaultVhost__ {
transcode { # 转码配置
enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine hd { # 转码引擎(示例:高清转码)
enabled on;
vcodec libx264;
vbitrate 1500;
vfps 25;
vwidth 1280;
vheight 720;
acodec aac;
abitrate 128;
}
}
dvr { # 录制配置
enabled on;
dvr_path ./objs/nginx/html/[app]/[stream]/[timestamp].flv;
}
}
#安全控制
vhost __defaultVhost__ {
# 推流鉴权
publish {
enabled on;
auth {
key "your_push_key";
expire 3600; # 密钥有效期(秒)
}
}
# 播放鉴权
play {
enabled on;
auth {
key "your_play_key";
}
}
}
#性能调优
vhost __defaultVhost__ {
tcp_nodelay on; # 禁用Nagle算法(降低延迟)
min_latency on; # 最小化延迟模式(牺牲吞吐量)
hls {
hls_fragment 5; # HLS分片长度(秒)
hls_window 30; # HLS播放窗口长度(秒)
}
}
2. 边缘服务器配置
# conf/edge.conf
listen 1935;
max_connections 1000;
daemon on;
pid ./objs/srs.pid;
srs_log_tank file;
srs_log_file ./objs/srs.log;
http_api {
enabled on;
listen 1985;
}
vhost __defaultVhost__ {
cluster {
mode remote;
origin $ORIGIN_SERVER_IP;
}
hls {
enabled on;
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
}
edge.conf 配置项详细说明
#基础配置
listen 1935; # RTMP服务监听端口(默认1935)
max_connections 1000; # 最大连接数限制(根据服务器性能调整)
daemon on; # 以守护进程模式运行
pid ./objs/srs.pid; # 进程ID存储文件
srs_log_tank file; # 日志输出方式(file|console)
srs_log_file ./objs/srs.log; # 日志文件路径
srs_log_level trace; # 日志级别(trace|debug|info|warn|error)
#HTTP API 配置
http_api {
enabled on; # 启用HTTP API管理接口
listen 1985; # API监听端口
crossdomain on; # 允许跨域访问
}
#边缘模式核心配置
vhost __defaultVhost__ {
cluster {
mode remote; # 边缘服务器模式(必须设为remote)
origin 192.168.1.100:1935; # 源站服务器地址(必须修改) 必须指向有效的源站服务器地址。
# 高级参数(可选)
token_traverse on; # 携带鉴权token到源站
origin_connect_timeout 5s; # 连接源站超时时间
origin_reconnect 3s; # 重连源站间隔
}
}
#协议输出配置
vhost __defaultVhost__ {
# HTTP-FLV 配置
http_remux {
enabled on; # 启用HTTP-FLV
mount [vhost]/[app]/[stream].flv; # URL路径格式
}
# HLS 配置
hls {
enabled on; # 启用HLS
hls_path ./objs/nginx/html; # 切片存储目录
hls_fragment 10; # 切片时长(秒)
hls_window 60; # HLS播放窗口长度(秒)
}
# WebRTC 中继配置
rtc {
enabled on; # 启用WebRTC中继
stun_timeout 30s; # STUN超时时间
}
}
#缓存与性能
vhost __defaultVhost__ {
# 边缘缓存配置
edge {
queue_length 10; # 边缘缓存数据包数量(降低延迟)
mix_correct on; # 自动校正混合时间戳
}
# 低延迟优化
tcp_nodelay on; # 禁用Nagle算法
send_min_interval 20ms; # 最小发送间隔
}
#安全控制
vhost __defaultVhost__ {
# 播放鉴权(边缘节点通常只需播放鉴权)
play {
enabled on;
auth {
key "your_play_key"; # 与源站保持一致
}
}
# 防盗链(可选)
refer {
enabled on;
all deny; # 默认禁止所有
allow 192.168.1.*; # 允许特定IP段
}
}
#故障转移配置
vhost __defaultVhost__ {
cluster {
# 备用源站配置(当主源站不可用时切换)
origin_backup 192.168.1.101:1935 192.168.1.102:1935;
origin_standby on; # 启用备用源站自动切换
}
}
#生产环境建议配置
vhost __defaultVhost__ {
# 日志记录客户端信息
play {
enabled on;
log on; # 记录播放日志
}
# 带宽保护
bandwidth {
enabled on;
default_kbps 3000; # 默认限制3Mbps/客户端
}
}
源站Origin与边缘Edge关系:
-
边缘节点本身不接收推流,只从源站拉流并分发给客户端。
3. 集群部署模式
模式一:单源站多边缘
-
1个源站接收推流
-
多个边缘服务器从源站拉流并服务客户端
模式二:多源站集群
-
多个源站通过集群协作
-
使用
coworkers
配置源站间通信
4. 负载均衡配置
可以使用以下方式实现负载均衡:
-
DNS 轮询
-
Nginx/HAProxy 反向代理
Nginx 配置示例# RTMP 负载均衡 rtmp { server { listen 1935; application live { live on; # 边缘服务器列表 push rtmp://edge1:1935/live; push rtmp://edge2:1935/live; push rtmp://edge3:1935/live; } } } # HTTP-FLV 负载均衡 http { upstream srs_edges { server edge1:8080; server edge2:8080; server edge3:8080; } server { listen 80; location / { proxy_pass http://srs_edges; } } }
HAProxy 配置示例
frontend rtmp_lb bind *:1935 mode tcp default_backend srs_edges_rtmp backend srs_edges_rtmp mode tcp balance roundrobin server edge1 edge1:1935 check server edge2 edge2:1935 check server edge3 edge3:1935 check frontend http_flv_lb bind *:80 mode http default_backend srs_edges_http backend srs_edges_http mode http balance leastconn server edge1 edge1:8080 check server edge2 edge2:8080 check server edge3 edge3:8080 check
-
CDN 网络集成
5. 启动命令
bash
# 启动源站
./objs/srs -c conf/origin.conf
# 启动边缘
./objs/srs -c conf/edge.conf
监控与维护
-
使用 SRS 的 HTTP API 监控服务器状态:
curl http://localhost:1985/api/v1/summaries
-
配置 Prometheus + Grafana 进行可视化监控
-
日志分析:定期检查 SRS 日志文件中的错误和警告
性能优化建议
-
根据服务器配置调整
max_connections
-
对于高并发场景,考虑启用 TCP REUSE 端口
-
合理配置 HLS 切片大小和窗口大小
-
对于 WebRTC,优化 ICE 候选地址配置
常见问题解决
-
边缘无法连接源站:检查防火墙和网络连通性
-
延迟过高:调整协议配置,考虑使用低延迟模式
-
内存泄漏:定期重启服务或升级到最新版本