1. SRS 使用记录:从零搭建高可靠直播系统的实战指南
作为一款轻量级的开源流媒体服务器,SRS(Simple RTMP Server)近年来在直播、视频会议等领域获得了广泛应用。我在过去两年中主导了三个基于SRS的直播系统建设项目,累计处理过千万级并发请求。本文将分享从环境搭建到性能调优的全套实战经验,包含多个生产环境中验证过的配置方案和故障排查技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SRS 核心架构解析
2.1 基础组件构成
SRS的核心进程采用单线程事件驱动模型,主要包含以下模块:
- Ingest:负责接收推流(支持RTMP/RTSP/SRT等协议)
- Forward:实现流转发和边缘集群部署
- HTTP Server:提供API管理和HLS/DASH切片服务
- Transcoder:进行实时转码(需额外编译FFmpeg模块)
在负载均衡方面,SRS采用分层架构设计。我们曾在电商大促期间通过"中心-边缘"节点部署,用6台边缘服务器支撑了单日1.2TB的流量分发。
2.2 关键配置文件解析
srs.conf是核心配置文件,这几个参数需要特别注意:
nginx复制listen 1935; # RTMP默认端口
max_connections 1000; # 单个进程连接数限制
daemon on; # 守护进程模式
http_server {
enabled on;
listen 8080; # HTTP API端口
}
警告:生产环境务必修改默认密码!我曾遇到过因使用默认admin密码导致服务器被入侵的案例。
3. 生产环境部署实战
3.1 编译安装优化方案
推荐从源码编译安装以获得最佳性能:
bash复制git clone https://github.com/ossrs/srs
cd srs/trunk
./configure --with-ffmpeg --with-transcode
make -j$(nproc) # 多线程编译加速
编译选项说明:
--with-ffmpeg:启用转码功能--with-transcode:支持协议转换--with-hls:启用HLS切片(默认已包含)
3.2 系统调优参数
在/etc/sysctl.conf中添加:
conf复制# 增加端口范围
net.ipv4.ip_local_port_range = 1024 65535
# 提高TCP缓冲区
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
# 应对TIME_WAIT状态
net.ipv4.tcp_max_tw_buckets = 180000
4. 高可用方案设计
4.1 边缘集群配置
在边缘节点配置中,关键是要做好回源负载均衡:
nginx复制vhost __defaultVhost__ {
cluster {
mode remote;
origin 192.168.1.10:1935 192.168.1.11:1935;
token_traffic off;
}
}
4.2 健康检查机制
建议配合Nginx实现自动故障转移:
nginx复制upstream srs_nodes {
server 192.168.1.10:1935 max_fails=3 fail_timeout=30s;
server 192.168.1.11:1935 backup;
}
5. 常见问题排查指南
5.1 推流失败分析
典型错误场景及解决方案:
| 现象 | 可能原因 | 排查命令 |
|---|---|---|
| 连接被拒绝 | 防火墙拦截 | telnet 服务器IP 1935 |
| 流不存在 | 未正确创建流 | curl http://localhost:8080/api/v1/streams |
| 编码不兼容 | 编码格式问题 | ffprobe rtmp://server/app/stream |
5.2 延迟优化方案
通过以下组合策略可将延迟控制在1秒内:
- 启用TCP_NODELAY:
nginx复制tcp_nodelay on; - 调整GOP长度:
bash复制
ffmpeg -i input -c copy -g 30 -f flv rtmp://server/app/stream - 使用低延迟HLS配置:
nginx复制hls_fragment 0.5; hls_td_ratio 1.5;
6. 监控与日志分析
6.1 Prometheus监控集成
在配置文件中启用统计接口:
nginx复制stats {
network 0;
disk sda,sdb;
}
然后配置Prometheus采集:
yaml复制scrape_configs:
- job_name: 'srs'
static_configs:
- targets: ['srs-server:8080']
6.2 关键日志分析技巧
重点关注这几类日志信息:
[error]:立即需要处理的严重错误[warn]:潜在问题预警[trace]:调试流处理细节
使用这个命令可以实时监控错误:
bash复制tail -f /var/log/srs.log | grep -E '\[error\]|\[warn\]'
7. 高级功能实践
7.1 动态转码配置
通过API实时调整转码参数:
bash复制curl -X POST http://localhost:8080/api/v1/transcodings \
-d '{
"vhost":"__defaultVhost__",
"app":"live",
"stream":"stream1",
"ffmpeg":"ffmpeg -i [input] -vcodec libx264 -preset ultrafast -acodec copy -f flv [output]"
}'
7.2 SRT协议支持
编译时需额外开启SRT选项:
bash复制./configure --with-srt
配置示例:
nginx复制srt_server {
enabled on;
listen 10080;
}
在推流端使用:
bash复制ffmpeg -i input -c copy -f mpegts "srt://server:10080?streamid=#!::r=live/stream1,m=publish"
经过多个项目的实战验证,SRS在资源消耗和功能完整性上取得了很好的平衡。特别是在突发流量场景下,通过合理的集群配置和参数调优,完全能够支撑大型直播活动。建议新用户在测试环境充分验证各项配置,逐步过渡到生产环境。
