CDN 回源 502 Bad Gateway 错误怎么排查解决?

文章导读
CDN 回源出现 502 通常意味着 CDN 节点无法成功连接到你的源站服务器。排查的核心逻辑是:先跳过 CDN 直连源站验证服务可用性,再检查链路配置与源站安全策略。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. Nginx 白名单配置实战
  5. 怎么验证是否生效
  6. 常见坑
  7. 参考来源
A A

CDN 回源出现 502 通常意味着 CDN 节点无法成功连接到你的源站服务器。排查的核心逻辑是:先跳过 CDN 直连源站验证服务可用性,再检查链路配置与源站安全策略。

先说结论:502 是网关错误,核心矛盾在 CDN 节点与源站之间的通信链路,优先排查源站负载和安全拦截。

  • 先确认:源站 IP 是否可直接访问且服务正常(注意区分 HTTP/HTTPS)
  • 先处理:将 CDN 回源 IP 段加入源站安全组及 Web 服务器白名单
  • 再验证:修改本地 Host 绑定源站 IP 测试响应,观察日志错误码

命令速用版

# 1. 测试源站端口连通性 (推荐 nc,若未安装可用 curl 替代)
nc -zv 源站 IP 80
# 或
curl -v telnet://源站 IP:80

# 2. 模拟回源请求 (注意区分 HTTP/HTTPS)
curl -I -H "Host: www.example.com" http://源站 IP
curl -Ik -H "Host: www.example.com" https://源站 IP

# 3. 查看源站实时日志 (Nginx 示例)
tail -f /var/log/nginx/error.log | grep -i "502"

为什么会这样

HTTP 协议中 502 Bad Gateway 表示作为网关或代理角色的服务器,从上游服务器收到了无效的响应。在 CDN 场景下,CDN 节点是代理,你的源站是上游。如果源站宕机、防火墙拦截了 CDN 节点、或者 SSL 握手失败,CDN 节点无法拿到合法数据,就会返回 502。

分步处理

1. 直连源站测试:绕过 CDN,直接使用源站 IP 访问。
注意:若源站强制 HTTPS,使用 HTTP 直连会失败导致误判。请分别测试 80 和 443 端口。
如果直连也通,说明源站活着,问题在链路或配置;如果直连不通,先修源站。

2. 检查安全组与防火墙
云平台控制台:进入 ECS 控制台 -> 网络与安全 -> 安全组 -> 入方向规则,确认放行了 CDN 节点 IP 段或 0.0.0.0/0(测试用)。
系统防火墙:检查 iptables 或 firewalld 是否拦截了非本地请求。

3. 核对回源 Host:CDN 回源请求头中的 Host 必须与源站配置的域名一致。如果源站是 Nginx,检查 server_name 是否匹配 CDN 回源携带的 Host,否则可能命中默认 server 返回 502。

4. 查看源站日志:查看 Nginx 的 error.log 或 Apache 的 error_log,重点搜索 "upstream prematurely closed connection" 或 "SSL handshake failed"。

Nginx 白名单配置实战

若源站开启了访问控制,需显式允许 CDN 回源 IP 段。在 Nginx 配置中添加如下规则:

CDN 回源 502 Bad Gateway 错误怎么排查解决?
server {
    listen 80;
    server_name www.example.com;

    location / {
        # 允许 CDN 回源 IP 段 (示例 IP,请替换为实际 CDN 厂商提供的 IP 段)
        allow 1.2.3.0/24;
        allow 4.5.6.0/24;
        # 允许本地调试
        allow 127.0.0.1;
        # 拒绝其他所有直接访问
        deny all;

        proxy_pass http://backend;
    }
}

配置生效后,记得执行 nginx -t 检查语法并 nginx -s reload 重载。

怎么验证是否生效

使用 curl 命令带上 verbose 参数,观察握手过程和状态码。同时检查响应头中是否有 CDN 厂商标识(如 X-Cache 字段),确认请求是否经过了 CDN 且返回了 200 状态码。

curl -v -H "Host: www.example.com" http://CDN 域名

关键指标:

  • HTTP 状态码应为 200
  • 响应头包含 X-Cache: HITMISS (表示经过 CDN)
  • Connection: close 异常断开

常见坑

1. 源站 IP 变更未更新:源站迁移后 IP 变了,但 CDN 控制台没改,导致回源到旧 IP。

2. WAF 拦截:源站前挂了 WAF,误把 CDN 节点当攻击者封禁了。需将 CDN 节点 IP 加入 WAF 白名单。

3. SSL 版本不匹配:源站强制 TLS 1.2,但 CDN 节点配置较低或反之,导致握手失败返回 502。检查源站 SSL 配置兼容性。

4. 源站超时设置过短:源站处理时间超过 CDN 等待阈值(通常 30s),CDN 会主动断开返回 502。

参考来源

  • IETF RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content, Section 6.6.3, URL: https://datatracker.ietf.org/doc/html/rfc7231#section-6.6.3
  • 阿里云 CDN 错误码排查文档,URL: https://help.aliyun.com/document/271/6736.html
  • 腾讯云 CDN 错误码排查文档,URL: https://cloud.tencent.com/document/product/228/31053