CDN 返回 502 通常意味着 CDN 节点无法从源站获取有效响应,优先排查源站连通性和应用服务状态。
先说结论:重点检查源站是否可达、服务是否存活以及防火墙是否拦截了 CDN 回源请求。
- 先确认:源站 IP 是否变更或带宽是否打满
- 先处理:将 CDN 回源 IP 段加入防火墙或安全组白名单测试连通性
- 再验证:绕过 CDN 直接访问源站看是否恢复
核心排查思路
CDN 作为反向代理,当它向源站发起请求却收到无效响应、连接被拒绝或超时时,会向用户返回 502 Bad Gateway。这不代表 CDN 坏了,而是源站“没接电话”或“说了胡话”。
实操步骤:源站负载与进程
登录源站服务器,首先确认系统资源是否耗尽导致无法响应新请求。
# 查看 CPU 和内存负载,按 P 键按 CPU 排序
top -c
# 查看当前连接数,确认是否被打满
netstat -ant | grep ESTABLISHED | wc -l
# 查看 Web 服务进程是否存活 (以 Nginx 为例)
ps -ef | grep nginx
如果负载过高,需排查是否有异常进程或突发流量;如果进程不存在,尝试重启服务。
实操步骤:网络与安全组配置
注意:严禁直接关闭生产环境防火墙。正确做法是将 CDN 厂商的回源 IP 段加入白名单。
1. 获取 CDN 回源 IP 段:在 CDN 控制台文档中查找官方公布的 IP 列表。
2. 配置安全组:在云服务器控制台安全组规则中,放行 TCP 80/443 端口,源地址设置为 CDN IP 段。
3. 本地测试连通性:
# 测试端口连通性
telnet 源站 IP 80
# 模拟回源请求 (带上 Host 头)
curl -H "Host: 你的域名" -v http://源站 IP
如果 telnet 不通,说明网络链路或安全组拦截;如果 curl 返回 502,说明应用层问题。
实操步骤:日志关键字分析
通过源站 Web 服务器日志定位具体错误原因,不同关键字对应不同问题。
# Nginx 错误日志排查
tail -f /var/log/nginx/error.log
# 查找连接拒绝 (服务未启动或端口错误)
grep "Connection refused" /var/log/nginx/error.log
# 查找上游超时 (源站处理慢或卡死)
grep "upstream timed out" /var/log/nginx/error.log
# 查找主动关闭连接 (源站进程崩溃)
grep "unexpectedly closed connection" /var/log/nginx/error.log
Apache 日志通常位于 /var/log/httpd/error_log,关键字类似 proxy:error 或 Connection refused。
针对“占比高”特征的差异化排查
根据 502 错误在 CDN 日志中的分布特征,采取不同策略:
- 全局占比高:所有地域均报 502,通常是源站整体宕机、带宽打满或防火墙全拦截。
- 特定地域占比高:仅部分节点报 502,可能是源站到该地域的网络路由问题,或该区域 CDN 节点被源站误封。
- 特定 URL 占比高:仅个别接口报 502,通常是后端应用逻辑错误、数据库连接池满或特定代码超时。
验证与常见坑
验证方法:修改本地 hosts 绑定源站 IP,访问域名。如果直接访问源站正常,但通过 CDN 访问仍 502,则是 CDN 配置或回源链路问题;如果直连也 502,则是源站应用问题。
常见坑:
- 源站开启了 CC 防护误杀 CDN 节点 IP。
- SSL 证书过期导致 HTTPS 回源失败。
- 源站内网 IP 配置错误导致回源路由不通。
- 源站 Keepalive 超时时间短于 CDN 节点,导致连接复用失败。