nginx多源站负载均衡通过主动健康检查、动态剔除异常节点及多种调度算法,实现cdn回源请求在多个后端源站间智能分发,提升可用性与抗压能力。

用 Nginx 做多源站负载均衡,本质是让 CDN 回源请求不再只打向单台服务器,而是按策略分发到多个后端源站,从而规避单点故障、缓解突发流量、提升整体回源成功率。
一、为什么需要多源站负载均衡?
CDN 回源失败常见原因包括:某台源站宕机、网络抖动、CPU 或带宽打满、防火墙拦截、SSL 证书过期等。如果 CDN 只配置一个回源地址,一旦该源不可用,所有缓存失效请求都会 502/504,用户直接看到错误页。而通过 Nginx 主动做多源负载,可内置健康检查、自动剔除异常节点、支持多种调度算法,比 CDN 自带的简单轮询更可控、更健壮。
二、核心配置要点(含健康检查)
以下是最简但生产可用的 Nginx 多源站配置片段,基于 nginx-plus 或开源版 + nginx-upstream-check-module(推荐编译进 nginx):
1. 定义带健康检查的 upstream
- 使用
check指令启用主动探测(如每 3 秒发一次 HEAD 请求,超时 1 秒,连续 2 次失败则标记 down) - 各源站加
weight控制流量比例,避免新旧机器负载不均 - 启用
max_fails和fail_timeout作为兜底被动检查机制
2. server 块中透传关键头并限制回源行为
- 必须设置
proxy_set_header Host $host;,避免源站因 Host 不匹配拒绝请求 - 添加
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For,方便源站日志和限流 - 建议开启
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;,在上游异常时仍可返回旧缓存,保底可用
三、实战中要注意的细节
光配对 upstream 和 proxy_pass 远不够,这些实操细节决定稳定性:
- 源站域名解析要本地化:避免 upstream 中写域名导致 DNS 波动影响健康检查;统一用内网 IP 或 hosts 绑定
- 健康检查路径要轻量且真实:不要用 /healthz 这类可能被中间件拦截的路径,推荐用静态文件如 /ping.html,HTTP 状态码 200 即视为存活
- CDN 回源 Host 头需与源站预期一致:若源站是虚拟主机模式(如 Nginx 的 server_name),CDN 回源 Host 必须匹配,否则 444 或 404;可在 Nginx 中用 map 指令动态改写
-
连接复用要打开:加上
proxy_http_version 1.1;和proxy_set_header Connection "";,减少 TCP 握手开销,尤其对高频小图回源很关键
四、验证与可观测性建议
上线前务必验证,运行后持续监控:
- 用
curl -I http://your-nginx-ip/upstream_status(需启用 stub_status)查看各节点状态、失败次数、当前权重 - 模拟某台源站宕机(如 systemctl stop nginx),观察 Nginx 是否 3 秒内自动摘除、流量是否平滑切到其余节点
- 在 access_log 中加入
$upstream_addr和$upstream_status,便于排查具体哪台源返回了 502 - 配合 Prometheus + nginx-vts-exporter,把 upstream 的请求量、失败率、响应时间做成看板,设置告警阈值(如 5 分钟内失败率 >5%)











