KernelRanch
返回文章列表

故障排查手册:从 cf-ray 到一个具体的原因

2026-11-10 #Cloudflare

Cloudflare 前面加了一层之后,"网站打不开"的原因分散在五层里:DNS 解析、证书握手、边缘规则、Worker 代码、上游服务。乱猜会浪费大量时间,按层往下走,每一层用一条命令排除,通常三分钟内能定位到具体某一层。

DNS 层的排查细节见 95-dns-troubleshooting-dig.md,攻击相关的判断见 86-attack-triage-order.md。这篇是总顺序与错误码对照。

1. 五层顺序

层一条命令排除掉什么
1 DNSnslookup 你的域名 1.1.1.1解析没生效、指到了旧 IP
2 证书`curl -sI https://域名 \head -1`握手失败、证书不匹配
3 边缘看响应头 cf-ray / server请求有没有到 Cloudflare
4 Workerwrangler tail <worker名>代码抛错、超时、额度
5 上游直连源站 IP 加 Host 头源站自己挂了

顺序不能颠倒。证书错误时去看 Worker 日志是白费力气,请求根本没走到那一步。

2. 状态码对照

码含义先查什么
520源站返回了未知响应源站日志,通常是应用崩溃或返回了非 HTTP 内容
521源站拒绝连接源站进程是否在跑、端口是否监听
522连接源站超时防火墙、安全组、源站负载
523源站不可达源站 IP 是否正确(DNS 记录写错)
524源站在 100 秒内没响应慢查询、同步阻塞;这个超时不可调
525TLS 握手失败源站的 SSL 配置、协议版本
526源站证书无效证书过期、域名不匹配、自签证书
1016源站 DNS 记录找不到CNAME 目标拼错、目标域名已删除
1020被规则拦截WAF、防火墙、Bot 规则
1027Worker 超出额度日请求用尽或 CPU 超限
1033隧道错误Cloudflare Tunnel 没连上
1101Worker 抛了异常wrangler tail 看堆栈
1102Worker 超出资源限制CPU 时间、内存

524 值得单独说:它固定是 100 秒,改不了。源站接口偶尔要跑两分钟,那这个接口就不该同步等,改成异步任务加轮询。

3. cf-ray 怎么用

响应头里的 cf-ray: a58314a2c814045b-HKG,短横线后面是处理这次请求的机房代码。三个用途:

确认请求确实到了 Cloudflare。没有 cf-ray 说明 DNS 还没切过来,或者本地 DNS 缓存了旧记录。

判断是不是单机房问题。多个地区都报错但 cf-ray 后缀不同,说明是全局配置问题;只有某个后缀出问题,可能是该机房到源站的链路。

给支持提单。cf-ray 是 Cloudflare 支持定位请求的唯一凭据,出问题时先把它记下来。

4. 最小验证集

# 1. 解析
nslookup example.com 1.1.1.1

# 2. 完整响应头,不跟随跳转
curl -sI https://example.com/ | head -20

# 3. 带 Host 头直连源站,绕过 Cloudflare
curl -sI https://1.2.3.4/ -H "Host: example.com" -k

# 4. Worker 实时日志
npx wrangler tail cf97-url-shortener --format pretty

第 3 步是关键的分叉点:直连源站正常、走 Cloudflare 异常,问题在边缘配置或 Worker;两边都异常,问题在源站。用 -k 跳过证书校验是为了排除证书因素,不是因为证书不重要。

5. 六种典型症状

全站 522,源站一切正常。多半是源站防火墙拦了 Cloudflare 的 IP 段,或者只放行了 80 没放行 443。让源站看连接日志里有没有来自 Cloudflare 的请求。

静态页正常,接口全挂。Worker 或 Pages Functions 的问题,先 wrangler tail 看有没有异常,再看是不是额度用尽(1027)。

只在部分地区慢。看 cf-ray 后缀分布。如果集中在某个机房,可能该机房回源链路异常,这种只能等或换源站区域。

重定向循环。curl -sIL 看每一跳的 location。常见原因是 SSL/TLS 模式设成了 Flexible,源站又强制跳 HTTPS,两边互相跳。

证书报错但控制台显示有效。检查是不是 Universal SSL 还没签发完(新接入的域名最长要等 24 小时),或者访问的是没覆盖的二级子域(免费证书只覆盖一级)。

偶发 520,重试就恢复。单次 520 且重试正常,通常是源站某个工作进程重启或返回了空响应。如果每小时出现几次,去看源站的进程数与内存,多半是 OOM 被杀后在重启。

改了 DNS 但没生效。TTL 和本地缓存。nslookup 指定 1.1.1.1 能拿到新记录,说明是本地或运营商缓存,等 TTL 过期即可。

6. 常见问题

wrangler tail 连不上怎么办?它走 WebSocket 到 Cloudflare,公司网络或代理可能拦。换成控制台的实时日志页面,或者临时在代码里 console.log 后看 Workers Logs。

怎么区分"我的代码慢"和"上游慢"?在 Worker 里打时间戳,performance.now() 夹住 fetch 前后,两个差值一看便知。CPU 时间不包括等上游的时间,所以 1102 通常是计算密集而不是 IO 慢。

需要每次都从头查一遍吗?不需要。把上面五层做成一个检查脚本,出问题时一次跑完,输出每层结果。状态页与告警的搭建见 101-project-status-page.md,配置备份见 103-backup-config-export.md。

小结

排查的效率取决于顺序,不取决于工具多少。DNS、证书、边缘、Worker、上游,五层依次排除,每一层有一条命令能给出是或否,通常两层之内就能定位。直连源站那一步是最有价值的分叉,它把问题一刀切成"边缘侧"和"源站侧"。

错误码表用来快速缩小范围,但不要停在码上。522 只是一个现象,真正的原因是端口、防火墙还是负载,得看源站日志。把 cf-ray、时间点、复现步骤记下来,无论自己查还是找人帮忙都省一半时间。

数据来源与检索时间

检索时间 2026-11-10。

来源URL对应数据
错误码说明https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-5xx-errors/520–526 的定义与 524 的 100 秒超时
4xx 与 1xxx 错误https://developers.cloudflare.com/support/troubleshooting/http-status-codes/1016、1020、1027、1033 等
wrangler tailhttps://developers.cloudflare.com/workers/observability/logs/tail/实时日志用法与连接方式
Universal SSLhttps://developers.cloudflare.com/ssl/edge-certificates/universal-ssl/签发时间、只覆盖一级子域

核验说明

  • 文档核对:5xx 与 1xxx 错误码含义、524 的 100 秒、Universal SSL 的覆盖范围与签发时间来自上述页面。
  • 真实执行:cf-ray 后缀在本会话的部署验证中出现过 -HKG,格式与文中一致;wrangler tail 未对已删除的 Worker 运行。
  • 未做:没有刻意构造 520/522/525 等错误去验证排查步骤,源站相关章节依据错误码文档与通用排障经验。七个典型症状为归纳,不是逐条复现记录。