1.
准备与前置条件
- 购买或准备一台公网ECS(推荐Linux Ubuntu 20.04/22.04),至少2核4G,带公网IP。
- 域名已备案(如果在中国大陆),并能修改DNS记录。
- CDN供应商账号(阿里云/腾讯云/Cloudflare等)和一个支持直播加速的CDN产品。
- 本地推流工具(OBS)和测试客户端(浏览器或VLC)。
2.
操作系统基础配置
- 更新系统:sudo apt update && sudo apt upgrade -y。
- 安装常用工具:sudo apt install -y git curl build-essential unzip nginx certbot。
- 建议设置时区、关闭不必要的服务并开启防火墙端口(80/443/1935/端口用于RTMP)。例如:sudo ufw allow 80,443,1935/tcp。
3.
安装 Nginx + RTMP 模块(快速方式:Docker)
- 推荐用已有镜像快速启动:docker run -d --name nginx-rtmp -p 8080:80 -p 1935:1935 tiangolo/nginx-rtmp。
- 如果要源码编译:git clone https://github.com/arut/nginx-rtmp-module && 下载 nginx 源码,按编译指南加模块编译。源码编译适合高度自定义。
4.
配置 Nginx RTMP 支持 HLS(示例配置)
- 在 nginx.conf 中添加 rtmp 段和 http 段,启用 HLS。关键配置示例(节选):
rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; hls on; hls_path /tmp/hls; hls_fragment 2s; hls_playlist_length 6s; } } }
- 在 http 段中添加 location /hls/ 指向 /tmp/hls 并允许跨域。
- 重启 nginx(或 Docker 容器重启)。
5.
安装 FFmpeg(必要时做转码、分片)
- 安装:sudo apt install -y ffmpeg。
- 用 ffmpeg 做转码/分辨率适配,例如:ffmpeg -i rtmp://localhost/live/stream -c:v libx264 -b:v 2500k -maxrate 2500k -bufsize 5000k -g 50 -c:a aac -b:a 128k -f flv rtmp://localhost/live/stream_720p。
- 常用于生成多码率流再由 CDN 做 ABR(自适应)。
6.
OBS 推流设置(本地/主播端)
- 在 OBS 中:流服务选择“自定义”,服务器填写 rtmp://{ECS公网IP或域名}/live,流密钥任意(例如 stream123)。
- 编码器:h.264;码率建议:720p 2500-4000kbps,1080p 4000-6000kbps;关键帧间隔(GOP)2秒。音频 128kbps。
- 测试推流并在服务器端的 /tmp/hls 观察是否生成 .m3u8/.ts 文件。
7.
在 CDN 控制台创建直播加速域(拉流模式示例)
- 新建加速域名,类型选择“直播拉流/HLS或HTTP拉流”。
- 回源地址填写你的 ECS 域名或公网IP(确保回源带端口或路径,例如 example.com/hls 或 123.123.123.123:8080/hls)。
- 缓存与回源配置:建议开启回源重试、回源带宽峰值保护,关闭针对 m3u8 的强缓存(或设置短缓存,例:10s),m3u8 与 ts 采用不同缓存策略。
8.
配置 CDN 域名解析与证书(HTTPS)
- 在域名管理处添加 CNAME 指向 CDN 提供的加速域名。
- 在 CDN 控制台开启 HTTPS(证书可由 CDN 提供或使用 Let’s Encrypt),或者在 ECS 上用 certbot 配置证书并让 CDN 使用 HTTPS 回源。
- 测试通过 https://cdn-domain.com/live/stream.m3u8 能拉到播放列表。
9.
低延迟优化实战(电商直播关键信息)
- HLS 切片与播放列表优化:hls_fragment=2s、hls_playlist_length=6s 可把延迟降到 ~6-10s;使用 chunked transfer 与 HTTP/2 可以进一步下降。
- 若需更低延迟 (<3s),考虑 WebRTC 或 CMAF+LL-HLS,需 CDN 支持并在服务端引入相应组件或云直播服务。
10.
安全与防盗链
- 在 CDN 层启用时间戳防盗链或签名鉴权,避免未授权拉流和并发盗用带宽。
- 在 ECS 上限制 RTMP 推流来源 IP(如仅允许主播IP或使用推流密钥校验)。
- 开启 WAF、防DDoS 配置,监控异常流量并自动清洗。
11.
监控、日志与自动扩容
- 开启 CDN 的监控面板(带宽、在线并发、回源流量),并配置告警阈值。
- 在 ECS 上配置 nginx 访问日志、ffmpeg 日志,并用 Prometheus+Grafana 或云监控做可视化。
- 根据并发量启用 CDN 扩容策略与后台多个 ECS 作源站热备,或启用云厂商的自动扩容组。
12.
常见故障与排查流程
- 无法推流:检查 1935 端口是否开放,OBS URL/KEY 是否正确,服务器 rtmp 是否启动。
- CDN 无法拉流:检查回源域名解析、回源端口与路径、回源防火墙与证书是否生效。
- 延迟高:检查切片时长、GOP、OBS关键帧设置、网络抖动并考虑更改为低延迟方案。
13.
示例 nginx rtmp 最小配置片段
- 配置示例(节选,放在 nginx.conf 内):
rtmp { server { listen 1935; application live { live on; hls on; hls_path /tmp/hls; hls_fragment 2s; hls_playlist_length 6s; } } }
http { server { listen 80; location /hls { types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /tmp; add_header Access-Control-Allow-Origin *; } } }
14.
Q1:电商直播用该方案能支撑多少并发观看?
- 回答:并发观看主要由 CDN 承载,单台 ECS 只承载回源压力与转码。用标准直播拉流+CDN,观众并发可达数万到数百万,关键在于选择带宽与节点覆盖充足的 CDN,ECS 做为回源建议做多活与负载均衡。
15.
Q2:如何确保直播画质与流畅度在网络波动时稳定?
- 回答:采用多码率编码(通过 FFmpeg 或 OBS 生成多码率 RTMP 推送)并让 CDN 支持 ABR,设置合理的码率与缓冲策略;在推流端开启网络缓冲与重试,服务器端做好转码与瞬时缓存,以及监控并自动切换上游回源。
16.
Q3:如果需要更低延迟(<3s),应如何改造现有方案?
- 回答:替换或补充HLS为低延迟方案:部署WebRTC或CMAF/LL-HLS,选择支持这些协议的CDN,并在服务端加入WebRTC网关或支持LL-HLS的切片器;成本与复杂度会上升,但可把延迟显著降低。