1.
概述与目标
本文目标是帮助小团队以低成本搭建一个高可用的CDN直播系统,能承载常见并发、自动容灾、支持OBS/FFmpeg推流、生成HLS并通过CDN分发。假定团队资源有限,优先使用廉价VPS、开源软件和按需CDN流量计费。
2.
所需前提与组件
需要准备:1) 一个或多个廉价VPS(Hetzner/Scaleway/阿里云云服务器按需);2) CDN服务(CloudFront、Bunny、阿里云CDN等,可先选1个试用);3) 源站软件:nginx + nginx-rtmp-module 或 SRS;4) 推流端:OBS或FFmpeg;5) HTTPS证书(Let's Encrypt);6) 存储用于录制(S3/对象存储或本地挂载)。
3.
总体架构设计
采用“推流到源站(VPS)→ 源站生成HLS/TS分片→ CDN边缘缓存分发”的架构。为高可用准备多个源站并采用DNS/负载均衡或多CDN拉流策略;在CDN端启用回源健康检查与origin shielding以减少源压力。
4.
源站快速搭建(nginx-rtmp 示例)
在VPS上用Docker部署:准备Dockerfile或直接使用现成镜像。核心nginx.conf关键点:在rtmp块定义应用直播名,开启hls、hls_path、hls_fragment短片段(2s-4s)以降低延迟;示例推流地址:rtmp://your-origin/live/streamkey。如果不想编译,可用srs镜像(docker run -p 1935:1935 ossrs/srs)。
5.
示例nginx-rtmp配置要点
配置示例要点包括:rtmp { server { listen 1935; application live { live on; record off; hls on; hls_path /tmp/hls; hls_fragment 3s; hls_playlist_length 9s; } } } 将 /tmp/hls 通过 nginx http server 静态暴露,并配合HTTPS反向代理。确保防火墙允许1935和80/443端口。
6.
编码器与多码率转码
小团队可直接让主播用OBS推多码率或只推高码率在服务端用FFmpeg做转码。FFmpeg示例:ffmpeg -i rtmp://origin/live/streamkey -c:v libx264 -b:v 1500k -c:a aac -ar 48000 -b:a 128k -f flv rtmp://origin/live/streamkey_1500 用脚本监控并后台运行,注意CPU消耗,必要时只做少量码率。
7.
CDN接入方式:Push vs Pull
推荐使用Pull(CDN从源站拉取HLS)更简单:将源站HLS地址(https://origin/hls/stream.m3u8)配置到CDN回源。启用CDN缓存规则,设置短TTL以保证直播低延迟。若CDN支持Push(推流到边缘),可将RTMP/RTS推至CDN端点直接分发,节省源站带宽。
8.
高可用与容灾策略
用两条手段:1) 多源站+DNS负载:在DNS中配置多A记录或用云厂商的健康检测+故障转移;2) 多CDN+统一播放器策略:前端播放器实现备份拉流,当首个CDN拉流失败时自动切换备用CDN(通过播放器的 error 事件或m3u8替换)。同时在源站启用origin shielding或缓存层减少突发流量。
9.
监控、报警与演练
部署基础监控:采集CPU、带宽、HLS生成情况、错误码。可用Prometheus+Grafana或简单的UptimeRobot/StatusCake做HTTP健康检查。配置阈值告警(带宽过高、片段生成失败、404增多),并定期进行故障切换演练,验证DNS/多CDN切换是否生效。
10.
成本优化建议
控制成本的方法:使用按流量计费的CDN、启用源站带宽限制与缓存策略、尽量在CDN侧做转码(若支持)、减少转码分辨率与码率变体数量、使用对象存储周期性移除录制文件。此外选用便宜VPS并限制其承担仅回源或推流任务,核心负载交给CDN。
11.
上线部署步骤清单(实操)
步骤:1) 购买VPS并配置域名解析;2) 部署nginx-rtmp或SRS容器并验证本地推流(OBS推到rtmp://vps/live/streamkey);3) 配置nginx http暴露HLS并启用HTTPS(certbot);4) 在CDN控制台添加回源域名并配置缓存规则;5) 在播放器中使用CDN的m3u8地址测试并打开监控;6) 配置备份CDN与DNS健康检查,完成演练。
12.
常见问答:如何选择CDN?
问:小团队如何选CDN以兼顾成本与可用性?答:先试用1-2家支持试用流量的CDN,比较回源性能与价格。按流量计费适合不稳定业务;若目标高可用,选一家主CDN加一家备用CDN并实现播放器端切换。
13.
常见问答:如何降低延迟?
问:直播延迟高怎么办?答:缩短HLS分片(2-4s)、减少playlist长度、开启CDN低延迟(LL-HLS或WebRTC若需要超低延迟)、优化转码链路减少buffer,确保网络丢包率低。
14.
常见问答:小团队遇到突发流量如何应对?
问:当直播突然爆量,源站压力剧增时怎么处理?答:提前设置CDN缓存和origin shielding,开启备用CDN和DNS故障转移;必要时临时增加VPS并在DNS/负载器上加入新源,或向CDN申请流量包与限流策略以保护源站。