一份基于SRS(Simple Realtime Server)+ CDN边缘节点srs edge加速的万人级直播部署清单

 

涵盖:
  • 架构设计思路
  • 服务器角色与配置建议
  • 安装与配置命令(含 SRS、Nginx、FFmpeg 等)
  • CDN 节点部署与回源逻辑
  • 压测与验证步骤

 

一、整体架构概览

[推流端] → [SRS 源站(Origin)] ←→ [私有 CDN 边缘节点(Edge)]→ [Nginx 负载均衡] → [播放端]
                     ↑
               (可选:转码/录制)
  • SRS 源站:接收主播推流(RTMP/HTTP-FLV/WebRTC),支持 HLS/FLV/DASH 输出。
  • CDN 边缘节点:部署轻量级 SRS Edge 或 Nginx-rtmp-module,缓存并分发流。
  • 负载均衡:边缘节点前可加 LVS/Nginx/HAProxy 实现 DNS 或 HTTP 层调度。
  • 扩展性:通过增加边缘节点横向扩容,单源站可支撑 1000+ 并发推流,边缘节点可承载数万播放。

 

角色数量推荐配置说明
SRS 源站(Origin) 1~2 台(主备) 8C16G / 10Gbps 带宽 / SSD 处理推流(可能多路)、转码、录制;需高上行带宽
CDN 边缘节点(Edge) ≥3 台(按区域部署) 4C8G / 1Gbps+ 带宽 / HDD 每台可承载 3000~5000 并发播放(FLV/HLS)
负载均衡器(可选) 1~2 台 4C8G / 高网络吞吐 用于边缘节点调度(如 Nginx/LVS)
监控/日志服务器(可选) 1 台 4C8G Prometheus + Grafana 监控

 

💡 注:万人并发假设为 10,000 人同时观看 720p(约 1.5Mbps/人),总下行带宽 ≈ 15 Gbps。需合理分布边缘节点。

明确带宽与并发的换算关系

带宽单位换算:
1MB/s = 8Mbps 
单用户直播带宽需求 = 视频码率 + 协议开销
  • 标清(480P):500kbps - 800kbps
  • 高清(720P):1.2Mbps - 1.5Mbps
  • 超清(1080P):2Mbps - 3Mbps
理论并发上限(无优化):
  • 720P(1.5Mbps / 人):2400Mbps ÷ 1.5Mbps = 1600 人
  • 480P(600kbps / 人):2400Mbps ÷ 0.6Mbps = 4000 人 
    要突破到万人级,必须通过 协议优化、分发缓存、码率控制 三重手段,将单用户带宽再降低 50% 以上。

二、环境准备(所有节点)

# 关闭防火墙和 SELinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

# 安装通用依赖
yum install -y wget gcc gcc-c++ make pcre-devel openssl-devel

部署步骤

  1.编译安装 SRS(v5.x 推荐)

git clone https://github.com/ossrs/srs.git
cd srs/trunk
./configure --full && make 

  2.配置 conf/origin.conf

listen              1935;
max_connections     3000;
srs_log_tank        file;
srs_log_file        ./objs/srs.log;

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

stats {
    network         0;
    disk            sda sdb xvda xvdb;
}

vhost __defaultVhost__ {
    hls {
        enabled         on;
        hls_path        ./objs/nginx/html;
        hls_fragment    10;
        hls_window      60;
    }

    http_remux {
        enabled     on;
        mount       [vhost]/[app]/[stream].flv;
    }

    # 可选:录制
    dvr {
        enabled         on;
        dvr_path        ./objs/dvr/[app]/[stream].[timestamp].mp4;
    }
}

  3.启动源站

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

✅ 此时可通过 ffmpeg 推流测试:
ffmpeg -re -i demo.mp4 -c copy -f flv rtmp://<origin_ip>/live/stream123

播放地址:
FLV: http://<origin_ip>:8080/live/stream123.flv
HLS: http://<origin_ip>:8080/live/stream123.m3u8

 

  4. 部署 CDN 边缘节点(Edge)

每台边缘节点运行 SRS Edge 模式,回源到 Origin。

配置 conf/edge.conf

listen              1935;
max_connections     5000;
srs_log_tank        file;
srs_log_file        ./objs/srs.log;

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

vhost __defaultVhost__ {
    mode            remote;  # Edge 模式
    origin          <origin_ip>:1935;  # 指向源站

    http_remux {
        enabled     on;
        mount       [vhost]/[app]/[stream].flv;
    }

    hls {
        enabled     on;
        hls_path    ./objs/nginx/html;
    }
}

启动边缘节点

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

✅ 播放地址变为:http://<edge_ip>:8080/live/stream123.flv,自动回源拉流。

 

  5. (可选)部署 Nginx 负载均衡(调度边缘节点)

# /etc/nginx/sites-available/cdn-lb
upstream cdn_edges {
    server edge1_ip:8080;
    server edge2_ip:8080;
    server edge3_ip:8080;
}

server {
    listen 80;
    server_name live.yourdomain.com;

    location ~ ^/live/(.*)\.flv$ {
        proxy_pass http://cdn_edges/live/$1.flv;
        proxy_set_header Host $host;
        proxy_buffering off;
    }
  #srs edge不支持分片分发,分片分发使用 nginx edge
    location ~ ^/live/(.*)\.(m3u8|ts)$ {
        proxy_pass http://cdn_edges/live/$1.m3u8;
    }
}

重载 Nginx:

sudo nginx -t && sudo systemctl reload nginx

最终播放地址:http://live.yourdomain.com/live/stream123.flv

 

 

四、压测与验证步骤

1. 功能测试

  • 使用 OBS / FFmpeg 向源站推流
  • 从边缘节点拉取 FLV/HLS 流,验证延迟(通常 FLV < 3s,HLS < 10s)
  • 检查 HLS 切片是否生成正常

2. 并发压力测试(使用 srs-bench 或自定义脚本)

安装 srs-bench(SRS 官方工具)

go install github.com/ossrs/srs-bench@latest

模拟 5000 播放客户端(FLV)

srs-bench -c 5000 -u "http://edge_ip:8080/live/stream123.flv"

⚠️ 注意:需多台机器分布式压测,避免单机网络瓶颈。

3. 监控指标

  • CPU/Memory 使用率(htop
  • 网络带宽(iftop / nethogs
  • SRS 内置 stats:http://<ip>:1985/api/v1/summaries
  • 连接数:netstat -an | grep :1935 | wc -l

 

五、生产环境优化

 
  1. Nginx 高可用:部署 2 台 Nginx 节点,通过 Keepalived 实现 VIP 漂移,避免单点故障;
  2. Edge 节点缓存优化:将 Edge 节点的 hls_path 指向 SSD 磁盘,提升切片读写速度;
  3. SRS 参数优化:
    • max_connections 根据内存调整(每连接约 10~20KB),启用 tcp_nodelay on 减少延迟
  4. 带宽限流:在 Nginx 中限制单 IP 并发数,防止恶意刷流:
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn perip 10;  # 单 IP 最多 10 个连接
  5. 开启 BBR 算法:所有节点开启 TCP 拥塞控制,提升带宽利用率:
    echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
    echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
    sysctl -p

     

总结

  1. 核心架构:Nginx 作为统一入口负责负载均衡和故障切换,SRS Edge 节点负责直播流缓存和转发,源站仅承担推流和 Edge 同步开销;
  2. 关键配置:Nginx 的 upstream 配置 Edge 集群并开启 max_fails/fail_timeout 实现故障自动剔除,转发时禁用 Nginx 缓存(缓存由 SRS Edge 负责);
  3. 并发支撑:单台 Nginx 可支撑 10 万 + 并发连接,配合 3-5 台 SRS Edge 节点,300MB/s 源站带宽可轻松承载万人级直播。

 

  

边缘集群(Edge Cluster)就是为了解决很多人观看的问题,可以支持非常多的人观看直播流。注意:

  • SRS Edge只支持直播流协议,比如RTMP或HTTP-FLV等,参考RTMP Edge Cluster
  • SRS Edge不支持HLS或DASH等切片的直播流,本质上它们不是流,就是文件分发。
  • SRS Edge不支持WebRTC的流分发,这不是Edge设计的目标,WebRTC有自己的集群方式。

就是HLS或DASH等切片的边缘集群,基于NGINX实现,所以也叫NGINX Edge Cluster。

 

问题答案
Nginx 能否做 HLS 文件分发? ✅ 非常适合,是行业标准做法
SRS Edge 能否替代? ❌ 不能,HLS 是文件,不是流
核心配置是什么? proxy_cache + 区分 .m3u8(短缓存)和 .ts(长缓存)
最终效果 源站负载降低 90%+,边缘节点扛住海量并发

 

📌 记住:
“流用 SRS Edge,文件用 Nginx Cache” —— 这是构建高性能私有直播 CDN 的黄金法则。

 

 https://www.bilibili.com/video/BV1DP4y1K7Jc/

六、参考资源

 

posted @ 2026-01-20 15:38  与f  阅读(1)  评论(0)    收藏  举报