Cloudflare CDN 时遇到 502 Bad Gateway 错误,以下是针对 CDN 场景的排查思路和解决方案:
常见原因与解决方法
1. 源站服务异常(根本原因)
现象:即使绕过 Cloudflare(直接访问源站 IP),依然返回 502。
解决:
检查源站服务状态(如 Nginx、Apache、PHP-FPM、Node.js ):
bash复制systemctl status nginx systemctl status php-fpm
验证端口监听:
bash复制ss -tuln | grep 80 # 确保 80/443 端口监听ss -tuln | grep 9000 # PHP-FPM 默认端口
查看源站日志:
bash复制tail -f /var/log/nginx/error.log tail -f /var/log/php-fpm.log
2. Cloudflare 无法连接源站
现象:直接访问源站正常,但通过 Cloudflare 域名访问时 502。
解决:
Cloudflare 的 SSL 模式需与源站证书匹配:
如果使用 Strict 模式,但源站证书无效,会导致 502。
Flexible:源站无需证书,但需关闭 HTTPS 强制跳转。
Full/Strict:源站必须配置有效证书。
源站服务器防火墙(如
UFW、iptables)需允许 Cloudflare 的 IP 段:bash复制# 下载 Cloudflare 官方 IP 列表并添加规则 curl https://www.cloudflare.com/ips-v4 > cloudflare_ips.txt for ip in $(cat cloudflare_ips.txt); do ufw allow from $ip; done
SELinux/AppArmor:确保未限制 Web 服务访问。
登录 Cloudflare → 确认域名解析记录的
Proxy status已开启(橙色云图标)。确保
A 记录指向正确的源站 IP。检查 DNS 设置:
验证防火墙规则:
检查 SSL/TLS 设置:
3. 缓存或代理设置问题
现象:部分请求正常,部分请求 502,且问题随机出现。
解决:
如果使用自定义缓存规则(如
Page Rules),可能导致异常缓存。暂时关闭 Cloudflare 代理(灰色云图标),直接访问源站测试。
登录 Cloudflare →
Caching→ 清除全部缓存。清除 Cloudflare 缓存:
禁用代理临时排查:
检查缓存规则冲突:
4. 源站性能瓶颈
现象:大文件上传/下载时通过 Cloudflare 返回 502,直接访问正常。
解决:
检查 CPU/内存占用率,确保源站能处理高并发请求。
对静态文件(如
.iso、.zip)设置较长缓存时间,减少回源请求。调整源站超时设置(针对大文件):
nginx复制# Nginx 配置示例proxy_read_timeout 300s;proxy_send_timeout 300s; fastcgi_read_timeout 300s;
优化 Cloudflare 缓存策略:
升级源站资源:
关键排查步骤
1. 直接访问源站测试
bash复制curl -I http://源站IP# 如果返回 502,则问题出在源站服务本身(与 Cloudflare 无关)。
2. 检查 Cloudflare 状态面板
登录 Cloudflare → 查看
Overview页面是否有红色警告(如证书过期、API 限流等)。
3. 日志分析
Cloudflare 日志(需 Pro 计划以上):
登录 Cloudflare →
Analytics→HTTP标签,查看 502 请求的详细信息。源站访问日志:
bash复制tail -f /var/log/nginx/access.log # 注意 Cloudflare 的 User-Agent 和 IP(通常为 CF-Connecting-IP)
4. 检查 SSL/TLS 握手
使用
openssl测试源站证书:bash复制openssl s_client -connect 源站IP:443# 如果证书链不完整或过期,会导致 Cloudflare SSL 模式失败。
推荐配置示例
Nginx 配置(兼容 Cloudflare)
nginx复制server { listen 80; server_name yourdomain.com;
# 强制跳转 HTTPS(仅当 Cloudflare 使用 Flexible 模式时) return 301 https://$host$request_uri;
} server { listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/your/fullchain.pem; # 源站证书(Full/Strict 模式) ssl_certificate_key /path/to/your/privkey.pem;
location / { proxy_pass http://127.0.0.1:3000; # 后端服务 proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # Cloudflare 必须的头信息 proxy_set_header CF-Connecting-IP $http_cf_connecting_ip; }
}Cloudflare SSL 设置建议
快速验证步骤
bash复制# 1. 直接访问源站 IPcurl -I http://源站IP # 2. 通过 Cloudflare 域名访问curl -I https://yourdomain.com --resolve yourdomain.com:443: 源站IP# 3. 检查 Cloudflare 解析 dig +short yourdomain.com @1.1.1.1