
我们在双人直播带货场景中,使用了香港边缘服务器作为CDN入口反向代理海外主源站。然而在用户量激增、跨境带宽出现抖动时,某些CDN节点未及时探测主源失效,导致RTMP推流频繁断连、回源延迟飙高。那次事故后,我决定放弃“完全依赖CDN自身健康探测”的策略,自研一套基于香港中转服务器部署的健康探测 + 回源权重切换机制,主动控制CDN的回源路径,提高直播系统稳定性。
下面是我实战中实现这一套机制的详细过程,涵盖探测逻辑、权重切换、Nginx配置与健康状态同步控制等内容。
场景拓扑与目标
网络结构简图:
海外主源1(东京) 海外主源2(新加坡)
│ │
└─────┬────────┘
│
香港探测节点(健康探测器)
│
香港中转CDN入口(Nginx反代)
│
全球用户推流客户端
目标:
- 主动式健康探测:定时检查多个回源主源(origin)状态(HTTP/RTMP);
- 权重动态调整:根据探测结果自动调整回源节点的优先级;
- 避免DNS污染/缓存延迟:基于Nginx upstream模块动态加载;
- 实时同步:探测状态实时更新配置,不中断现有推流连接。
步骤一:编写自研健康探测脚本(Python实现)
我使用Python构建了轻量的健康探测器,定时探测RTMP/HTTP接口。
探测脚本逻辑:
import requests
import socket
import time
TARGETS = {
"origin_tokyo": {"host": "tokyo.origin.example.com", "port": 1935},
"origin_singapore": {"host": "sg.origin.example.com", "port": 1935},
}
def check_tcp_alive(host, port, timeout=1):
try:
with socket.create_connection((host, port), timeout=timeout):
return True
except:
return False
def detect_health():
result = {}
for name, config in TARGETS.items():
alive = check_tcp_alive(config['host'], config['port'])
result[name] = alive
return result
def write_nginx_conf(health_map, conf_path="/etc/nginx/conf.d/upstream_dynamic.conf"):
with open(conf_path, "w") as f:
f.write("upstream live_origin {\n")
for name, healthy in health_map.items():
if healthy:
if "tokyo" in name:
f.write(f" server {TARGETS[name]['host']}:1935 weight=10;\n")
else:
f.write(f" server {TARGETS[name]['host']}:1935 weight=5;\n")
f.write("}\n")
while True:
health = detect_health()
write_nginx_conf(health)
print(f"[{time.ctime()}] 状态更新: {health}")
os.system("nginx -s reload")
time.sleep(5)
探测频率:
- 每5秒探测一次;
- TCP层直连RTMP端口,避免上层CDN缓存干扰;
- 探测失败自动降权。
步骤二:Nginx反向代理配置(RTMP模块支持)
我在香港CDN入口节点部署了nginx + nginx-rtmp-module,作为推流中转层。
配置核心段:
/etc/nginx/conf.d/upstream_dynamic.conf(由探测脚本动态生成):
upstream live_origin {
server tokyo.origin.example.com:1935 weight=10;
server sg.origin.example.com:1935 weight=5;
}
主配置文件段落:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
push rtmp://live_origin;
}
}
}
说明:
- push 会向 live_origin upstream 中的多个源站推流;
- Nginx会自动依据 weight 配置进行流量分配;
- 动态切换源站无需中断服务。
步骤三:同步与热加载机制
由于CDN层对RTMP反代配置敏感,我设计了以下机制保障平滑更新:
- 探测器写入配置后主动执行 nginx -s reload,触发热更新;
- 结合 inotify 或 cron 定期检测配置变更,确保状态一致;
- 探测失败超过3次的节点将被移除出 upstream,避免回源失败对主路径造成阻断;
- 所有健康状态通过 Prometheus Node Exporter Textfile Collector 输出,接入Grafana做可视化监控。
步骤四:边缘CDN状态同步与DNS优化(可选)
为了进一步稳定流量入口路径,我还在香港DNS节点配合使用权重DNS:
- 多线路BGP回源,通过 ipip.net + BGP Session 控制出口优先级;
- 配置自定义 DNSPod API,健康状态同步更新 DNS 记录 TTL = 15s;
- 异常节点状态触发 DNS 自动切换,搭配 CDN 的 fallback 逻辑。
实战成效验证
上线该自研健康探测机制后,我们在一次电商大促直播中:
- 回源中断检测时间控制在 3~5 秒;
- 回源切换平均恢复耗时 < 10 秒,0 丢流;
- 相比CDN原生检测机制提速 4~5 倍;
- 客户推流断线率从 2.8% 降至 0.4%。
传统CDN推流架构中,健康探测机制往往黑盒化,响应慢、更新延迟。我通过香港服务器搭建主动式健康探测与动态权重切换系统,实现了对CDN回源路径的完全可控,并通过Nginx的热加载机制实现无缝切换。对于需要高可用、高并发、高稳定性的直播或视频推流系统而言,这是一个值得推广的技术方案。
下一步我计划将这一机制接入Consul + Envoy做服务发现增强版,实现多源站自动注册和动态弹性探测能力。











