网站打不开,访客只能看到空白页面,上面写着“错误 520”,而 Cloudflare 只是提示“源服务器返回未知错误”,这种是什么情况呢?我们应该如何解决?
什么是 Cloudflare 错误 520?
错误 520 表示 Cloudflare 成功连接到源服务器,但收到的响应无法理解。520 错误并非标准的 HTTP 状态码,而是 Cloudflare 特有的错误代码,表明在连接建立之后服务器端出现了问题。
通俗地说,错误 520 是什么意思?Cloudflare 敲了敲门,您的服务器开了门,然后返回了一些无法理解的内容——或者根本什么都没返回。访客看到的 Cloudflare 错误 520 页面底部会有一个 Cloudflare Ray ID,这是该请求的唯一标识符。
错误 520 与其他 5xx 错误有何不同
Cloudflare 错误列表明确区分了标准的 HTTP 错误和 Cloudflare 自己的错误代码。像 500 和 503 这样的标准 Cloudflare 5xx 错误来自您的服务器,并具有明确的含义。511 以上的 Cloudflare 错误代码则不同,它们描述的是 Cloudflare 与源站之间的通信情况,而不仅仅是您服务器的内部状态。
520 错误具体表示服务器返回了意外的内容,例如空的响应体或重置连接,而 Cloudflare 的其他错误代码则指向在不同阶段出现的超时或连接失败。
Cloudflare 错误 520 的常见原因
大多数 Cloudflare 520 错误的情况都可追溯到以下四种原因之一:
源服务器崩溃和资源过载
当 Cloudflare 连接的源服务器内存或 CPU 不足时,它可能会在进程完全终止之前返回乱码或空响应。服务器资源使用率过高,比如流量激增或 PHP 进程失控,可能是最常见的原因。
首先检查 Cloudflare 的状态,以排除 Cloudflare 方面的问题。然后实时查看服务器的资源消耗情况。如果 CPU 占用率一直为 100% 或内存几乎耗尽,那就是问题所在。
Cloudflare 的 IP 地址被封禁
这个问题让很多管理员都感到棘手。防火墙可能在未察觉的情况下屏蔽了 Cloudflare 的 IP 地址——可能是某个安全插件,也可能是之前某个事件中应用的 fail2ban 规则。当 Cloudflare 自身的请求被屏蔽时,服务器将无法正常响应,Cloudflare 的防火墙设置实际上会破坏代理功能。
您需要明确将 Cloudflare 的 IP 范围列入白名单。Cloudflare 会在 cloudflare.com/ips 上发布当前的列表。
短 TCP 空闲超时值
Cloudflare 的 TCP 超时设置不匹配是此列表中最隐蔽的原因。如果您的服务器关闭空闲 TCP 连接的速度比 Cloudflare 预期的要快,Cloudflare 可能会在连接已断开的情况下发送请求。Cloudflare 的超时阈值为 300 秒——如果服务器的保持活动超时设置低于此值,您将间歇性地收到看似随机出现和消失的 Cloudflare 错误 520 事件。
由于它并非影响到每一个请求,所以若不专门查找,这种原因确实很难诊断出来。
过大的响应头和 Cookie
Cloudflare 对 HTTP 响应头的大小有限制——单个响应头大约 8KB,总大小不超过 32KB。如果您的应用程序返回了大型的 Cookie 或大量自定义响应头,可能会在不经意间超出 Cloudflare 对响应头大小的限制。
要验证这一点,请打开 Chrome 开发者工具,重现错误,然后从“网络”选项卡导出 Chrome 生成的 HAR 文件。查看失败请求的响应标头,并将总大小相加。
如何解决 Cloudflare 错误 520
这份 Cloudflare 520 错误修复清单涵盖了从快速 DNS 检查到直接调试的所有内容——逐一排查,直到找到问题所在。要彻底解决 520 错误,必须解决根本原因,而不仅仅是表面症状。否则,Cloudflare 520 错误会反复出现。
修复 Cloudflare DNS 记录
过期或错误的 Cloudflare 指向的 DNS 记录会导致根本性的连接失败。检查 Cloudflare DNS 记录,并确认源 IP 地址是最新的。如果最近迁移了服务器,过期的记录是 Cloudflare 错误 520 的一个非常可能的原因。更新它,等待传播,然后再次测试。
检查 HTTP 标头和 Cookie
打开 Chrome 开发者工具并重现错误。导出 Chrome 在“网络”选项卡下保存的 HAR 文件。查看失败请求的响应头,特别是总头大小以及任何异常大的set-cookie值。
如果 Cloudflare 标头大小看起来过大,请在应用程序中精简 Cookie 并合并自定义标头。任何单个 HTTP 响应标头超过 8KB 都会引发问题。
测试时禁用.htaccess 文件
暂时重命名.htaccess文件并进行测试。某些 Cloudflare 的 .htaccess 配置,例如重定向循环或格式错误的重写规则,会产生 Cloudflare 无法解析的响应。如果禁用它后错误消失,可逐段添加规则以找出导致问题的行。这是解决由 Apache 配置问题导致的 520 错误的可靠方法。
查看 PHP 和服务器错误日志
PHP 错误日志会显示脚本在响应过程中是否崩溃。执行期间出现致命错误会导致 PHP 发送格式错误或空响应,这两种情况都会触发 520 错误。可以在仪表板的“分析”>“日志”(付费计划)中查看 Cloudflare 错误日志,并在重现问题时跟踪服务器日志:
tail -f /var/log/nginx/error.log
# or for Apache:
tail -f /var/log/apache2/error.log
从这个角度来看,在触发错误时实时查看日志是解决 520 错误最快的方法。
使用 cURL 命令进行调试
直接在您的源服务器上运行 curl 命令 HTTP 请求——完全绕过 Cloudflare——可让您了解服务器返回的内容。如果响应看起来正常,问题就出在 Cloudflare 到服务器的路径上。如果看起来有问题,那么服务器本身就有问题。
curl -I https://your-origin-ip --header "Host: yourdomain.com"
仔细检查输出中的 HTTP 响应头。无效或格式错误的响应头可以解释很多原本令人困惑的 520 错误。
暂停或禁用 Cloudflare
如果需要立即恢复网站运行,请暂停 Cloudflare 代理。前往控制面板,打开“概览”选项卡,滚动到底部,然后点击“暂停网站上的 Cloudflare”。这样流量将直接路由到源服务器,而无需经过代理层。
您还可以启用 Cloudflare 开发模式,该模式会禁用 Cloudflare 缓存绕过行为,并强制向源服务器发出新的请求。这对于确定缓存是否为影响因素很有用。请记住,Cloudflare 暂停会移除 SSL 终止和性能功能。这是一种诊断措施,并非长期解决方案。
联系 Cloudflare 支持团队
如果您已经仔细检查了上述所有内容但仍无法找到原因,请从访客看到的错误页面中获取 Cloudflare Ray ID。在您提交支持工单时分享该 ID——Cloudflare 可以查找确切的请求日志,并查看您的源服务器返回的内容。在此之前,请先在 cloudflarestatus.com 上查看 Cloudflare 的状态,以确认其端没有正在进行的事件。
如何防止 520 错误再次出现
Cloudflare 服务中断导致网站瘫痪,这种情况发生一次就令人痛苦不堪,若反复出现则更糟,但完全可以避免。采取三个预防措施就能从根本上解决 520 错误,防止其再次出现。
监控服务器资源消耗
对 CPU 和内存设置警报,这样您就能在服务器崩溃之前而非之后知晓情况。像 Netdata 这样的工具或基本的基于 cron 的脚本可以在服务器资源使用量超过阈值时向您发送通知。尽早发现失控进程可避免导致 520 错误的崩溃。另外,一如既往地监控 Cloudflare 状态——有时 520 错误的激增其实是 Cloudflare 部分服务中断所致,尽早知晓这一点可为您节省一小时的自身系统排查时间。
在防火墙中将 Cloudflare 的 IP 范围列入白名单
永久将所有 Cloudflare IP 地址添加到防火墙的允许列表中。这将消除未来出现 520 错误的整个类别。在 UFW 中:
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
ufw allow from $ip to any port 443
done
Cloudflare 会不定期更新其 IP 列表,所以如果可以的话,请将其自动化。让 Cloudflare 防火墙规则与公布的列表保持同步意味着安全插件或 fail2ban 规则再也不会意外地阻止 Cloudflare 的请求。将 Cloudflare IP 列入白名单这一步很容易被忽略,而每当出现 520 错误时,人们总是希望早些时候就完成这一步。
将 TCP 超时时间增加到 300 秒以上
将您服务器的保持活动超时设置高于 Cloudflare 的 300 秒超时阈值,以消除最难诊断的间歇性 520 错误。
对于 Nginx:
keepalive_timeout 305;
Apache:
KeepAliveTimeout 305
这个 Cloudflare TCP 超时修复方案只需一行代码,就能防止一大类连接中断错误。
错误 520 与其他 Cloudflare 错误
520 错误代码常常与 Cloudflare 的其他错误代码混淆。了解它们之间的区别很有必要——尤其是如果您还看到 Cloudflare 的 504 错误,这表明上游响应缓慢,与下面提到的任何问题都完全不同。
错误 520 与错误 522 连接超时
Cloudflare 错误 522 表示 Cloudflare 根本无法与您的源服务器建立 TCP 连接——在建立连接之前,Cloudflare 的超时机制已触发。520 错误则不同:连接成功建立,但响应为空或格式错误。Cloudflare 522 错误通常意味着您的服务器未在正确的端口上监听,或者完全无法访问。522 错误的 Cloudflare 页面看起来相似,但描述的是根本不同的故障。
错误 520 与错误 524(网关超时)
Cloudflare 524 错误意味着 Cloudflare 已连接到服务器,但等待超过 100 秒仍未收到响应。Cloudflare 错误 524 是速度过慢的问题;520 是响应错误的问题。如果您的服务器只是运行缓慢——比如执行了繁重的数据库查询或长时间运行的脚本——Cloudflare 超时触发时会显示 524 错误,而不是 520 错误。
错误 520 与错误 502(错误网关)的区别
Cloudflare 错误 502 是一个标准的 HTTP 状态码,表示上游对 HTTP 请求返回了无效响应。Cloudflare 502 通常指向代理或网关层配置错误——例如 Nginx 上游或负载均衡器。520 错误则范围更广:任何未知或空响应,无论是否真正开始过正常的 HTTP 交换。
错误520常见问题
什么是 Cloudflare Ray ID?
Cloudflare 的 Ray ID 是分配给通过 Cloudflare 网络的每个请求的唯一标识符。它会出现在 Cloudflare 错误页面的底部。当您联系Cloudflare支持团队时,分享 Ray ID 可以让他们的团队更快地获取该请求的确切交易日志,这比试图凭记忆描述问题要快得多。
Cloudflare 错误 520 是由什么引起的?
Cloudflare 错误 520 会在 Cloudflare 成功连接到源服务器后,源服务器返回空响应或无效响应时发生。那么错误 520 的本质是什么?服务器与 Cloudflare 之间的连接已打开,但服务器无法返回任何有意义的内容。错误 520 本身是 Cloudflare 记录“源服务器发生了某些情况,但我们不知道具体是什么”的方式。
错误 520 是永久性的服务器错误吗?
否。服务器错误 520 几乎总是配置问题或短暂崩溃所致。一旦根本原因得到解决,比如重启崩溃的进程或调整超时值,520 错误就会消失。如果不加以处理,520 错误会反复出现。
如何修复 WordPress 中的 520 错误?
WordPress 出现 520 错误通常是因为插件冲突或执行过程中出现 PHP 致命错误。请停用所有插件并进行测试。如果 Cloudflare 错误 520 消失,就逐个重新激活插件,直到错误再次出现。另外,检查 PHP 错误日志——缓存插件或 WooCommerce 插件在执行过程中崩溃,就会产生这种触发 520 错误的空响应。
如何在我的服务器上将 Cloudflare 的 IP 地址列入白名单?
从 cloudflare.com/ips 获取当前的 Cloudflare 白名单 IP 列表。将每个范围添加到防火墙的 80 和 443 端口。在 UFW 中:<b0></b0>;。在 iptables 中:<b1></b1>;。请保持 Cloudflare IP 地址在允许列表中更新——Cloudflare 会发布变更——这样 Cloudflare 防火墙配置就不会意外地阻止 Cloudflare 自身的流量。
原创文章,作者:余初云,如若转载,请注明出处:https://blog.jidcy.com/jsjc/2177.html
