首先量化需求:预计并发流量(并发观看数)、平均码率(例如720p 2.5Mbps)、每日观影时长与峰值倍数。用并发*码率计算所需出口带宽(例如1000并发*2.5Mbps≈2.5Gbps)。明确直播/点播混合比例、是否需要录制与回放、是否有全球用户(本例侧重美国)。
建议架构:采集/上传端 -> 录制/转码集群(短期可用Spot实例)-> 对象存储(S3/Backblaze/Wasabi)保存切片/清晰度 -> CDN(CloudFront/Cloudflare/多CDN)边缘分发 -> 前端播放器(video.js/HLS.js)。控制面用Kubernetes/Auto Scaling管理转码和前端服务。
带宽敏感时优先选大流量套餐与便宜出口的供应商(AWS、GCP、DigitalOcean、Vultr、OVH、Hetzner等)。若追求低出站成本,可考虑Backblaze B2或Wasabi做对象存储,再配合Cloudflare/R2以降低CDN回源费用。对比各家出站价格并考虑流量峰值能力。
步骤:注册域名 -> 在DNS添加A/AAAA记录指向负载均衡器/最近节点 -> 使用Let's Encrypt(certbot)自动签发证书。Nginx基础配置开启http2、合理cache-control。示例server块:listen 443 ssl http2; ssl_certificate /etc/letsencrypt/...; location /hls/ { add_header Cache-Control "max-age=60"; }
点播:上传原始文件到对象存储,使用后台任务用ffmpeg转码成多码率并生成HLS。示例命令(生成3个码率):ffmpeg -i input.mp4 -map 0 -c:v libx264 -crf 23 -sc_threshold 0 -g 48 -keyint_min 48 -b:v 250k -maxrate 300k -bufsize 500k -s 426x240 -hls_time 6 -hls_segment_filename seg_240p_%03d.ts playlist_240p.m3u8 (重复不同码率/分辨率),将切片上传到S3。
运行nginx-rtmp-module接收rtmp推流,使用ffmpeg从rtmp拉流并推送多路HLS切片到本地或直接上传S3。简单配置示例:rtmp { server { listen 1935; application live { live on; record off; } } }。ffmpeg拉流并生成HLS:ffmpeg -i rtmp://localhost/live/stream -c:v libx264 -b:v 1500k -hls_time 4 -hls_segment_filename /var/www/hls/stream_720p_%03d.ts /var/www/hls/stream_720p.m3u8
将HLS切片与主播放列表存对象存储便于CDN回源缓存:使用并行上传工具(s3cmd、aws cli、rclone)把切片上传到按目录分片(按日期/流ID)结构。开启存储生命周期(短期热存,过期删除或转冷存),节省长期成本。
在CloudFront/Cloudflare创建分发,origin指向对象存储bucket或原站LB。设置短TTL用于直播(例如HLS片段5-10s缓存)与较长TTL用于静态资源(封面、播放器JS)。使用origin shield/回源缓存减少回源流量成本。
用Spot/预留实例做转码,转码队列可用Kubernetes + Spot节点。尽量将冷数据移到低价冷存。优化码率与清晰度阶梯,使用AV1仅在支持设备上,否者使用x264做主流兼容。监控带宽并设置峰值报警,使用流量分层计费策略或与供应商谈判包月流量。
前端:使用负载均衡器+Auto Scaling Group或Kubernetes HorizontalPodAutoscaler按CPU/网络扩容。转码:将转码任务放入消息队列(RabbitMQ/SQS)由工作节点消费,工作节点使用Spot并随供给弹性扩容。对象存储和CDN天然弹性,注意回源限制与并发上传速率。
用压力工具(wrk、locust、siege)模拟m3u8与.ts并发请求,重点测试CDN回源QPS与origin带宽,预演活动前进行“暖缓存”上传热门片段,避免上线第一分钟的大量回源。
监控带宽(Prometheus+node_exporter)、CDN回源和S3流量;使用Grafana建成本面板。安全:使用带签名的短链接(signed URL)防盗链,启用WAF限速,限制单IP并发连接,使用HTTPS强加密。
答:先用最小可用架构:S3(或Backblaze)+CloudFront(或Cloudflare免费层)+单台转码/接入服务器。用预估并发做压测,根据真实流量逐步扩容。转码使用Spot/按需容器,尽量把静态和HLS切片放对象存储并由CDN承担大流量。
答:通过下列软件/配置控制:1)合理设置码率与清晰度阶梯;2)短TTL但启用CDN边缘缓存并用origin-shield减少回源;3)对大文件使用分段上传并启用生命周期策略;4)用限流、签名URL和区域限制减少无效流量;5)转码用Spot实例减少计算成本。
答:提前准备自动化扩容策略(ASG/K8s HPA)并设流量阈值触发;临时降级策略:自动降低分辨率/码率,关闭非必要功能(自动字幕、个性化封面);使用多CDN分担流量并启用按需加速;实时监控并在必要时与CDN/云厂商开启按需流量包或限额通知避免超额。