nginx集群实现视频流媒体负载均衡与加速的关键是精准协同hls/dash协议:http七层代理、uri一致性哈希分发、分级缓存(.m3u8缓存3秒、.ts缓存1小时)、主动健康检查与动态权重调优。

配置 Nginx 集群实现视频流媒体业务的负载均衡与性能加速,关键不在“堆节点”,而在于让 Nginx 精准协同 HLS/DASH 协议特性,把请求分得对、缓得准、路由稳。RTMP 或 WebRTC 流不适用此 HTTP 层方案,必须明确区分协议类型。
匹配流媒体协议选对代理模式
视频流媒体(尤其是直播)多用 HLS(.m3u8 + .ts)或 DASH(.mpd + .m4s),它们本质是大量小 HTTP GET 请求。Nginx 必须工作在 HTTP 七层代理模式:
- 禁用 stream 模块处理 RTMP:RTMP 推流应直连后端流服务器(如 SRS、nginx-rtmp-module),Nginx 不做四层转发;
- 所有客户端拉流请求(如 /live/abc.m3u8、/dash/xyz.mpd、/live/abc_0012.ts)统一由 http {} 块中的 upstream 处理;
- 确保后端流服务已启用 HLS/DASH 输出,并将切片文件(.ts/.m4s)和索引文件(.m3u8/.mpd)输出到可被 Nginx 访问的 HTTP 路径。
上游分组需保障分片一致性
HLS/DASH 客户端会连续请求同一频道的多个分片,若不同分片被分到不同后端,易引发 404 或缓存错乱。必须用确定性哈希策略:
- 推荐使用 hash $request_uri consistent:保证相同 URI(如 /live/abc.m3u8 及其衍生的 /live/abc_0001.ts)始终命中同一台后端;
- 避免仅用 ip_hash:NAT 环境下大量用户 IP 相同,会导致流量倾斜;
- 若频道 ID 明确(如 URI 含 /live/channel-123/),可用 map 提取 channel 字段再 hash,提升粒度控制能力。
分级缓存显著降低源站压力
分片文件(.ts/.m4s)可缓存较长时间,索引文件(.m3u8/.mpd)更新频繁但体积小——需差异化缓存策略:
- 定义两级缓存区:proxy_cache_path 分别设置 hls_cache(存 .ts,max_size=50g,inactive=1h)和 manifest_cache(存 .m3u8/.mpd,max_size=5g,inactive=10s);
- 在 location 中按后缀匹配并启用对应缓存:
location ~ \.m3u8$ { proxy_cache manifest_cache; proxy_cache_valid 200 3s; }
location ~ \.ts$ { proxy_cache hls_cache; proxy_cache_valid 200 1h; } - 添加 proxy_ignore_client_abort on:防止客户端切片中断导致连接堆积,影响后续请求。
健康探测与动态权重提升可用性
流媒体节点一旦卡顿或延迟升高,会直接影响播放体验。不能只靠静态权重轮询:
- 启用主动健康检查:通过 lua-resty-upstream-healthcheck 模块,定期 GET 某个测试分片(如 /health/test_0001.ts),超时或返回非 200 则标记为不健康;
- 结合 Prometheus 指标动态调权:用 Lua 脚本读取后端节点的 avg_response_time 或 active_connections,实时降低高负载节点的 weight 值;
- 为关键频道设置专属 upstream 组,隔离故障影响范围,避免单点问题扩散至全站。











