Cloudflare 为什么会报 522 错误?

先别忙着重启服务器。522 卡在 Cloudflare 到源站这一段,跟访客到 Cloudflare 那一段无关——分清这一点,排查范围立刻少一半。

更新于 2026年8月21日 · 阅读时间 约 9 分钟

522 的意思是 Cloudflare 在 19 秒内没能和你的源站建立 TCP 连接。最常见的原因是源站防火墙挡掉了 Cloudflare 的回源 IP。

522 的错误页把三个环节画成一排:访客那一格是绿的,Cloudflare 那一格也是绿的,只有最右边的源站那一格写着 Host Error。这张图其实已经把答案说了七成——请求成功到了 Cloudflare,是从 Cloudflare 走向你的服务器时断的。

所以刷新页面、清缓存、换个网络再试,对 522 一点用都没有。下面按官方文档的判定条件把它拆开,给一条从最可能到最少见的排查路线,最后单独讲国内源站特有的那种。

522 到底卡在哪一步

Cloudflare 是反向代理,一次代理请求实际上是两段独立的 TCP 连接:访客到 Cloudflare 是一段,Cloudflare 到源站是另一段。两段各有各的超时表,522 只跟第二段有关。

官方给的判定条件很具体,有两条,满足任意一条就返回 522:Cloudflare 发出 SYN 之后 19 秒内没有收到源站的 SYN+ACK;或者 TCP 连接已经建立,但 Cloudflare 在 90 秒内没有收到自己那个资源请求的确认。19 秒不是一次死等,中间会按 1、1、1、1、1、2、4、8 秒的间隔重试 SYN,全部落空才算超时。

这两条说的是同一件事:源站没有回话。不是回得慢,是根本没回——慢有另外的错误码等着。

Cloudflare 回源过程中的四道超时Cloudflare 边缘节点① 建立 TCP 连接边缘发 SYN,等源站的 SYN+ACK19 秒522② 发出请求,等确认连接已建立,等源站 ACK90 秒522③ 等源站给出响应Proxy Read Timeout125 秒524④ 读到响应内容响应为空或不合法520你的源站
四道超时对应四种失败方式。522 卡在最前面两步——源站根本没回话;等很久才超时的是 524,回了话但内容不对的是 520。

这几个数字都写在官方的 连接超时限制页上,除了 125 秒那条对企业方案可调,其余都是固定值,改不了。

先用错误码把范围缩小

52x 这一族看着都像「服务器挂了」,但它们卡在完全不同的位置,指向的排查对象也不一样。

错误码卡在哪典型原因
520源站回了话,但内容是空的或不合法应用崩溃、响应头超过 128 KB、源站的 HTTP/2 配置不对
521源站明确拒绝了连接服务没起来、端口没监听、防火墙用 REJECT 而不是 DROP
522连接建不起来,超时防火墙丢包、源站过载、DNS 记录里的 IP 是旧的
523到不了源站,没有路由IP 不可达;云上路由表把 Cloudflare 用的网段引向了内网
524连上了,但 125 秒内没给出响应慢查询、大数据导出、进程卡死

记一个对比就够了:521 是敲门有人回你「不行」,522 是敲门根本没人应。前者说明源站的网络栈活着、只是拒绝,后者连拒绝都没有。这个差别决定了你该去看服务进程,还是去看防火墙。各错误码的完整说明见 521523524 各自的文档页。

按这个顺序查,多数人在第二步就停了

第一步:先分清是全站、间歇,还是只有某些路径

这一步能省掉后面一大半功夫。全站持续 522,指向源站整体故障——机器关了,或防火墙把回源整个挡了。时好时坏,指向过载、连接数打满或链路丢包。只有某几个路径出错,多半是那几个接口把源站拖垮了。

看分布别靠自己刷新。仪表盘的 HTTP Traffic 页可以按「源站状态码」筛出 522,配合 域名分析 看时间分布和涉及的数据中心,注意这份错误分析是 1% 采样,小流量站点要多等一会。想按路径定位,用 源站分析 看各个端点的 TCP 失败率。

第二步:防火墙有没有挡住回源 IP

官方把这一条列在 522 成因的第一位,实际排查中它的命中率也确实最高。原因不难理解:开了代理之后,源站看到的来源不再是成千上万个访客 IP,而是 Cloudflare 那几个共享网段,在防火墙眼里就是「少数几个 IP 在打大量请求」,自动封禁和限速规则很容易被触发。

处理方式是把 官方 IP 段列表 整体放行,注意 IPv4 和 IPv6 是两份,源站有 AAAA 记录时回源可能走 v6,只放行 v4 会留下一半的坑。具体到 iptables、.htaccess 怎么写,官方这一页 给了可以直接照抄的例子。这些网段会变,别把某次抄下来的清单当永久配置,最好定期同步。

还有两件容易忽略的事。其一,要按地区限制访问,别在源站防火墙上做——那会连带把回源掐掉,用边缘上的 WAF 自定义规则才对。其二,应用日志里没有请求记录,不等于请求没到你的机房,中间的负载均衡、缓存层、云安全组各有各的日志,官方也提醒要一并翻。

第三步:DNS 记录里的源站 IP 还对吗

换机器、重建实例、弹性 IP 被回收再分配,这些都会让 DNS 记录里的 A 记录指向一个已经不属于你的地址。请求发过去石沉大海,就是 522;如果那个地址完全不可达,则更可能是 523。核对一遍代理记录背后的真实 IP,比盯着服务器日志猜要快得多。

源站规则 改写过回源目标的,也要检查改写后的主机名能不能解析——官方举的例子是规则指向一个 A 记录为保留地址的主机名,结果就是 522。

第四步:源站自己撑不住

连接队列满了、内存打爆了、数据库把工作进程占死了,源站都会开始丢掉新进来的 SYN。这类 522 的特征是跟着流量走:低谷正常,高峰出错。

顺带看一眼源站有没有关掉 HTTP keep-alive。Cloudflare 会复用已建立的 TCP 连接,最长保持到 900 秒的空闲上限;官方明确建议源站开着 keep-alive,否则每个请求都要重新握手,连接重置会明显变多。

第五步:两种看着莫名其妙的情况

一是 Workers。给 Worker 绑了自定义域之后,在这个 Worker 里 fetch 它自己的主机名会直接返回 522——请求绕回了自己。改用路由、换一个目标主机名,或者启用 global_fetch_strictly_public 兼容性标志都能解决。二是 Pages,要确认自定义域已配好、CNAME 指向的是 Pages 的域名。这两种情况下源站根本不是一台你能登录的机器,前面四步全都用不上。

国内源站的 522,常常不是同一回事

回源是一条跨境链路

Cloudflare 的免费方案不使用中国大陆境内的数据中心,大陆访客会被路由到香港、日本、新加坡等地的节点。如果你的服务器在境内,那么「边缘节点到源站」这一段就是一条实实在在的跨境链路,而 19 秒的连接窗口是按正常网络设计的,遇上晚高峰的丢包和抖动,八次 SYN 重试全部落空并不稀奇。

这种 522 有个很好认的特征:源站日志里干干净净,什么异常都没有——因为 SYN 压根没送到。此时去查应用、查数据库、重启服务,全是白费力气。可选的路只有几条:把源站挪到香港或境外、接受这份抖动、上 China Network 用境内节点(企业级方案,且要求域名已完成 ICP 备案),或者干脆不让 Cloudflare 主动回源。

安全组、系统防火墙、面板防火墙是三层

国内主机上放行回源 IP 的坑在于层数。云厂商控制台里有一层安全组,系统里有 iptables 或 firewalld,装了面板的话面板还自带一层,三层任意一层没放行,症状都一模一样。特别是那种「只允许国内 IP 访问」的收紧策略,一加上去就会把全部回源流量掐死,而它在很多人的印象里属于安全加固,不属于会出事的改动。

与其逐层翻规则,不如直接在源站抓包看有没有来自 Cloudflare 网段的 SYN:抓不到,堵在机器外面;抓得到却没有回包,堵在机器里面。

要不要干脆不开入站端口

还有一条思路是把连接方向反过来:让源站上的 cloudflared 主动向 Cloudflare 建立出站连接,请求沿着这条已有的连接下发。这样源站不需要开放任何入站端口,也就不存在「防火墙挡了回源 IP」「源站 IP 变了忘了改记录」这一整类问题,顺带还不需要固定公网 IP。它自己的限制另有一套,写在 内网穿透那一篇里,动手前值得先看一眼。

改完之后怎么确认真的好了

刷新一下能打开不算验证——522 常常是间歇的。几个更靠谱的做法:

  • 记下错误页上的 cf-ray,也就是 Ray ID,它能把某一次具体的请求定位到具体的数据中心,比描述「大概几点出错」有用得多。
  • 访问 /cdn-cgi/trace,确认自己这次请求落在哪个节点上,跨地区对比时尤其有用。
  • 在 HTTP Traffic 页按源站状态码持续观察一段时间,看 522 的曲线是不是真的归零,而不是恰好被采样漏掉了。
  • 用源站分析盯 TCP 失败率和 P95 响应时间,前者接近零、后者离 125 秒还远,才算稳。

如果需要立刻止血,可以把对应的 DNS 记录临时改成 DNS only(灰云),让访客直连源站。这同时也是个干净的判断手段:灰云下能正常访问,就说明源站活着。代价见文末问答,确认完记得改回去。

要联系托管商或提交工单,官方列了必须一起给出的信息:错误码、出错时间与时区、完整 URL,见 5xx 错误总览。少了这三样,对方基本查不动。

常见问题

522 错误是我这边的问题还是 Cloudflare 的问题?

几乎总是你这边。522 的判定条件是 Cloudflare 向源站发出 SYN 之后 19 秒内没收到回应,或者连接建立后 90 秒内等不到确认——两条都描述同一件事:源站没有回话。真正需要怀疑 Cloudflare 的场景很少,判断方法是绕开代理直连源站 IP 测一次,如果直连也连不上,问题百分之百在源站或它前面的防火墙。

522 和 524 有什么区别?

522 是连接压根没建起来,524 是连上了但源站迟迟不给响应。125 秒那条线很好记:Cloudflare 等源站响应的默认上限是 125 秒,超过就是 524,说明你的应用在跑一个很慢的查询或者卡死了。522 则连应用层都没走到,问题在网络和防火墙那一层,看应用日志通常什么都看不到。

网站时好时坏,一会 522 一会正常,是什么原因?

间歇性 522 通常有三个来源:源站过载导致连接队列打满、源站防火墙或安全软件对回源 IP 触发了限速规则、以及边缘到源站这段链路本身在丢包。国内源站配境外边缘节点时第三种尤其常见,晚高峰更明显。先在仪表盘按源站状态码筛出 522 看它的时间分布,如果集中在固定时段,多半是负载或链路,而不是配置。

源站在国内、用 Cloudflare 免费版会更容易出 522 吗?

会。免费方案不使用中国大陆境内的数据中心,所以边缘节点在境外,而源站在境内,回源这一段是一条跨境链路。19 秒的连接窗口在跨境高峰期的丢包和抖动面前并不总是够用,表现就是间歇性 522,而源站日志里干干净净——因为 SYN 根本没到。要用境内节点需要企业级的 China Network 方案,并且要求域名已完成 ICP 备案。

出现 522 时把橙云关掉改成 DNS only 能解决吗?

能让页面恢复,但那不是修好,是绕过。改成 DNS only 之后访客直连你的源站,Cloudflare 不再参与,522 自然消失,代价是源站真实 IP 暴露、缓存和 WAF 防护同时失效。把它当成排查手段和临时止血是合理的:如果灰云状态下访问正常,就证明源站活着,问题在回源那一段。确认之后还是要把橙云开回去。

在手机上管好 Cloudflare

Orange Cloud 是 Cloudflare 的第三方 iOS / Android 客户端,用 Cloudflare 官方 OAuth 登录,随手切代理状态、改 DNS 记录、看隧道状态和流量分析。

下载 Orange Cloud