CentOS 7下SRS 4.0流媒体服务器全栈部署指南:从Docker到源码深度实践

在视频直播和实时通信技术蓬勃发展的今天,搭建一个稳定高效的流媒体服务器已成为许多开发者和运维人员的刚需。SRS(Simple Realtime Server)作为国内开发者开源的高性能流媒体服务器,以其轻量级、低延迟和丰富的协议支持(RTMP/HTTP-FLV/HLS等)赢得了广泛关注。本文将带您深入探索在CentOS 7环境下部署SRS 4.0的两种主流方式——Docker容器化部署与源码编译安装,并附赠实战中积累的性能调优技巧和故障排查经验。

1. 环境准备与前置条件

在开始部署前,我们需要确保CentOS 7系统已经做好充分准备。建议使用最小化安装的CentOS 7.6或更高版本,这样可以减少不必要的软件冲突。首先更新系统基础组件:

yum update -y && yum install -y epel-release

对于防火墙配置,建议暂时关闭SELinux以避免权限问题:

setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config

硬件资源配置方面,SRS对CPU和内存的要求取决于并发流数量和转码需求。以下是一个参考配置表:

应用场景 推荐CPU 推荐内存 磁盘类型
测试/开发环境 2核 4GB SSD 50GB
中小型直播 4核 8GB SSD 100GB
大型直播/转码 8核+ 16GB+ NVMe 200GB+

提示:如果计划使用HLS协议,需要额外考虑磁盘I/O性能,因为HLS会产生大量切片文件。

2. Docker容器化部署方案

对于追求快速部署和隔离性的用户,Docker无疑是最佳选择。SRS官方提供了维护良好的Docker镜像,我们可以直接利用这些资源。

2.1 Docker环境安装

首先确保系统已安装Docker CE版本:

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker && systemctl enable docker

验证Docker安装成功:

docker --version
docker run hello-world

2.2 启动SRS容器

使用官方镜像启动SRS服务非常简单,以下命令会拉取最新稳定版镜像并启动容器:

docker run -d --name srs \
  -p 1935:1935 -p 1985:1985 -p 8080:8080 \
  -v /data/srs/conf:/usr/local/srs/conf \
  -v /data/srs/logs:/usr/local/srs/objs \
  registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4

参数说明:

  • -p 1935:1935 :映射RTMP默认端口
  • -p 8080:8080 :映射HTTP访问端口
  • -v :挂载配置和日志目录,便于持久化

2.3 容器化部署的进阶配置

对于生产环境,我们可能需要更精细的控制。以下是一个优化过的docker-compose.yml示例:

version: '3'
services:
  srs:
    image: registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4
    container_name: srs
    restart: unless-stopped
    ports:
      - "1935:1935"
      - "1985:1985"
      - "8080:8080"
    volumes:
      - ./conf:/usr/local/srs/conf
      - ./logs:/usr/local/srs/objs
    environment:
      - SRS_LISTEN=1935
      - SRS_HTTP_SERVER_PORT=8080
    ulimits:
      nofile:
        soft: 65535
        hard: 65535

启动服务:

docker-compose up -d

3. 源码编译安装方案

如果您需要深度定制SRS功能或进行二次开发,源码编译安装是更好的选择。这种方式虽然复杂,但可以获得更高的性能和更灵活的配置。

3.1 构建环境准备

安装必要的开发工具和依赖库:

yum groupinstall -y "Development Tools"
yum install -y pcre-devel openssl-devel zlib-devel

克隆SRS源码仓库(建议使用国内镜像加速):

git clone https://gitee.com/winlinvip/srs.oschina.git srs && cd srs/trunk
git checkout 4.0release

3.2 编译与安装

SRS使用自动化构建系统,编译过程非常简单:

./configure --with-ssl --with-hls --with-http-callback
make -j$(nproc)

注意: -j$(nproc) 参数会根据CPU核心数并行编译,显著加快构建速度。

编译完成后,可以选择安装到系统目录:

make install

或者直接运行(推荐开发环境使用):

./objs/srs -c conf/srs.conf

3.3 系统服务配置

为了让SRS随系统自动启动,我们需要创建systemd服务单元。创建文件 /etc/systemd/system/srs.service

[Unit]
Description=SRS Streaming Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/srs/objs/srs -c /usr/local/srs/conf/srs.conf
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -QUIT $MAINPID
Restart=always
User=root
WorkingDirectory=/usr/local/srs

[Install]
WantedBy=multi-user.target

启用并启动服务:

systemctl daemon-reload
systemctl enable srs
systemctl start srs

4. 部署验证与性能调优

无论采用哪种部署方式,部署完成后都需要验证服务是否正常运行,并根据实际需求进行调优。

4.1 基础功能验证

使用FFmpeg进行简单的推流测试:

ffmpeg -re -i example.mp4 -c copy -f flv rtmp://localhost/live/teststream

在另一终端使用FFplay播放:

ffplay rtmp://localhost/live/teststream

或者通过HTTP-FLV协议播放:

ffplay http://localhost:8080/live/teststream.flv

4.2 性能监控与调优

SRS提供了丰富的统计接口,通过访问 http://localhost:1985/api/v1/summaries 可以获取服务器状态。以下是一些关键性能指标:

指标名称 健康阈值 优化建议
连接数 < 1000/核心 增加节点或升级配置
CPU使用率 < 70% 优化转码参数或限制并发
内存占用 < 80% 检查内存泄漏或增加资源
网络吞吐 < 80%带宽 优化码率或增加带宽
推流延迟 < 3秒 调整GOP大小或启用低延迟模式

4.3 防火墙配置

为确保外部客户端可以访问,需要开放相关端口:

firewall-cmd --permanent --add-port=1935/tcp  # RTMP
firewall-cmd --permanent --add-port=8080/tcp  # HTTP
firewall-cmd --permanent --add-port=1985/tcp  # API
firewall-cmd --reload

4.4 常见问题排查

问题1 :推流成功但无法播放

  • 检查防火墙设置
  • 验证播放器是否支持所选协议
  • 查看SRS日志 tail -f objs/srs.log

问题2 :高并发下服务不稳定

  • 调整系统文件描述符限制 ulimit -n 65535
  • 优化内核参数 net.core.somaxconn net.ipv4.tcp_max_syn_backlog
  • 考虑使用多进程模式启动SRS

问题3 :HLS延迟过高

  • 减少切片时长 hls_fragment
  • 启用 hls_cleanup 自动清理旧切片
  • 考虑使用HTTP-FLV协议替代

5. 生产环境部署建议

经过基础部署和测试后,如果计划将SRS用于生产环境,还需要考虑以下关键因素:

5.1 高可用架构设计

单节点部署存在单点故障风险,建议采用以下架构:

  1. 边缘-源站架构 :多个边缘节点就近服务用户,源站统一管理流
  2. 负载均衡 :使用Nginx或专用负载均衡器分发请求
  3. 故障转移 :配置监控和自动切换机制

5.2 安全防护措施

  • 鉴权设置 :启用 http_hooks token_traverse 进行推拉流鉴权
  • HTTPS支持 :为HTTP-FLV/HLS配置SSL证书
  • IP限制 :通过防火墙规则限制推流IP
  • 日志审计 :定期归档和分析访问日志

5.3 监控与告警

完善的监控系统应包括:

  • 基础资源监控 :CPU、内存、磁盘、网络
  • 服务状态监控 :SRS进程、端口可用性
  • 业务指标监控 :在线用户数、推流数、延迟情况
  • 告警机制 :设置合理的阈值触发通知

推荐使用Prometheus+Grafana组合搭建监控平台,SRS原生支持Prometheus指标导出:

./objs/srs -c conf/prometheus.conf

6. 高级功能扩展

SRS不仅支持基础的流媒体服务,还提供了许多高级功能满足特定场景需求。

6.1 多协议转换

SRS可以实现不同流媒体协议间的转换,常见组合包括:

  • RTMP转HLS:用于移动端兼容
  • RTSP转RTMP:接入监控摄像头
  • WebRTC转RTMP:兼容传统播放器

配置示例(在srs.conf中添加):

vhost __defaultVhost__ {
    # RTMP转HLS
    hls {
        enabled on;
        hls_path ./objs/nginx/html;
        hls_fragment 10;
        hls_window 60;
    }
    
    # RTSP转RTMP
    rtsp_transport {
        enabled on;
        listen 554;
    }
}

6.2 集群与边缘节点

对于大规模部署,可以配置多级缓存和边缘节点:

  1. 源站配置(srs.conf):
cluster {
    mode origin;
    coworkers 192.168.1.101:1935 192.168.1.102:1935;
}
  1. 边缘节点配置:
cluster {
    mode edge;
    origin 192.168.1.100:1935;
}

6.3 与OBS深度集成

OBS是流行的推流工具,与SRS配合使用时可以优化以下参数:

  • 视频设置
    • 分辨率:根据网络状况选择(720p/1080p)
    • 码率:建议2000-6000kbps
    • 关键帧间隔:2秒(影响延迟)
  • 输出设置
    • 编码预设:veryfast或faster
    • 速率控制:CBR(恒定码率)
    • 音频编码:AAC,128kbps

在OBS中配置服务器地址为:

rtmp://your-server-ip/live

流密钥可以设置为任意字符串用于区分不同流。

6.4 自动化运维脚本

为提高运维效率,可以准备一些常用脚本:

服务状态检查脚本(check_srs.sh)

#!/bin/bash
SRS_PID=$(pgrep -f "srs -c")
if [ -z "$SRS_PID" ]; then
  echo "SRS is not running!"
  exit 1
else
  echo "SRS is running (PID: $SRS_PID)"
  # 检查端口监听
  netstat -tulnp | grep srs
  # 检查最近错误日志
  tail -n 20 /usr/local/srs/objs/srs.log | grep -i error
fi

日志切割脚本(logrotate_srs.conf)

/usr/local/srs/objs/srs.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 644 root root
    postrotate
        kill -USR1 $(cat /usr/local/srs/objs/srs.pid)
    endscript
}

7. 实际应用案例分享

在最近的一个在线教育项目中,我们使用SRS搭建了整套直播系统。系统需要支持:

  • 教师端通过OBS推流(RTMP)
  • 学生端通过Web(HTTP-FLV)和移动端(HLS)观看
  • 实时录制功能
  • 观看人数统计

最终采用的配置方案如下:

服务器配置

  • 阿里云ECS,8核16GB,带宽100Mbps
  • CentOS 7.9操作系统
  • Docker Compose部署方式

srs.conf关键配置

listen 1935;
max_connections 1000;
daemon on;
pid ./objs/srs.pid;
chunk_size 4096;
ff_log_dir ./objs;
srs_log_tank file;
srs_log_file ./objs/srs.log;

http_server {
    enabled on;
    listen 8080;
    dir ./objs/nginx/html;
}

vhost __defaultVhost__ {
    hls {
        enabled on;
        hls_path ./objs/nginx/html;
        hls_fragment 10;
        hls_window 120;
        hls_cleanup on;
    }
    
    http_remux {
        enabled on;
        mount [vhost]/[app]/[stream].flv;
    }
    
    dvr {
        enabled on;
        dvr_path ./objs/nginx/html/[app]/[stream]/[timestamp].flv;
        dvr_plan segment;
        dvr_duration 1800;
    }
}

性能表现

  • 延迟:HTTP-FLV约1-2秒,HLS约10-15秒
  • 并发支持:稳定支持800+同时在线
  • 资源占用:平均CPU 40%,内存4GB

遇到的挑战主要是初期HLS延迟过高,通过调整切片参数和启用HTTP-FLV协议解决了这个问题。另一个教训是没及时配置日志轮转,导致磁盘被日志文件占满。

更多推荐