如何修复 Cloudflare 522 错误:连接超时

当您访问网站时看到 "Error 522: Connection timed out",这意味着 Cloudflare 无法在超时限制内建立到源站服务器的 TCP 连接。与 520 或 521 错误不同,522 明确表示连接超时——源站服务器没有在 Cloudflare 等待的时间窗口内完成 TCP 握手。

522 错误通常不是 Cloudflare 本身的问题,而是源站服务器宕机、防火墙拦截了 Cloudflare 的 IP 段、或者服务器负载过高无法响应。本文将引导您逐步排查 5 个常见原因,帮助您在几分钟内恢复网站访问。

广告位

步骤 1:检查源站服务器是否运行

522 错误最直接的原因是源站 Web 服务未运行。首先通过 SSH 登录到您的服务器,检查 Nginx 或 Apache 进程状态:

# 检查 Nginx 状态
sudo systemctl status nginx

# 检查 Apache 状态
sudo systemctl status apache2

# 检查服务监听的端口
sudo ss -tlnp | grep -E ':80|:443'

如果服务已停止,立即启动并设置为开机自启:

sudo systemctl start nginx
sudo systemctl enable nginx

同时确认 80 和 443 端口确实处于监听状态。如果 ss 命令显示没有进程监听这些端口,说明 Web 服务配置有误或启动失败,需要查看服务日志排查启动错误。

步骤 2:验证源站服务器防火墙

即使源站 Web 服务正常运行,如果防火墙阻止了 Cloudflare 的 IP 段,TCP 连接仍然无法建立,从而触发 522 错误。检查当前防火墙规则:

# 查看当前 iptables 规则
sudo iptables -L -n | grep -E '80|443'

# 使用 firewalld
sudo firewall-cmd --list-all

# 查看 Cloudflare IP 段
curl -s https://www.cloudflare.com/ips-v4

确保 Cloudflare 的 IPv4 和 IPv6 地址段被放行。对于使用 iptables 的服务器,可以批量添加规则:

for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
  sudo iptables -I INPUT -p tcp -s "$ip" --dport 443 -j ACCEPT
done

# 保存规则
sudo iptables-save | sudo tee /etc/iptables/rules.v4

注意:如果您同时使用云服务商的安全组(如 AWS 安全组或阿里云安全组),也需要在那里放行 Cloudflare IP 段的入站流量。

步骤 3:检查 Cloudflare DNS 设置

DNS 配置错误同样会导致 522 错误。登录 Cloudflare 控制台,进入 DNS 设置页面,确认以下要点:

如果您最近迁移了服务器,请务必更新 DNS 记录。Cloudflare 代理模式下的 DNS 更改通常在几分钟内生效。

步骤 4:直接测试源站服务器

绕过 Cloudflare 直接测试源站服务器,可以精确定位问题是否出在源站本身。使用 curl 命令指定源站 IP 进行请求:

# 绕过 Cloudflare,直接测试源站
curl -I --resolve example.com:443:ORIGIN_IP https://example.com/

# 测试端口连通性
curl -v telnet://ORIGIN_IP:443

# 使用 nc 测试 TCP 握手
nc -zv ORIGIN_IP 443

如果直接连接正常但通过 Cloudflare 失败,问题很可能出在防火墙规则或网络路由上。如果直接连接也超时,则需要检查源站服务器的网络配置、Web 服务状态以及是否有其他安全软件拦截了入站连接。

步骤 5:检查服务器负载

高负载可能导致服务器无法在 Cloudflare 的超时窗口内完成 TCP 握手。Cloudflare 默认等待约 100 秒,但如果服务器 CPU 或内存资源耗尽,即使这个时间也可能不够。检查系统负载:

# 查看系统负载和运行时间
uptime

# 查看 CPU 和内存使用情况
top -bn1 | head -10
free -m

# 查看当前连接数
ss -s

如果负载过高,考虑以下措施:优化应用代码减少 CPU 消耗、增加服务器内存或 CPU 核心数、配置 Cloudflare 缓存规则减轻源站压力、或者启用 Cloudflare 的 "Under Attack Mode" 临时缓解流量洪峰。对于 PHP 应用,检查 PHP-FPM 进程数是否达到上限:

sudo systemctl status php*-fpm
grep -E 'max_children|pm.max' /etc/php/*/fpm/pool.d/www.conf
广告位

快速参考:原因与修复

症状 / 日志信息 根本原因 修复方法
源站无响应,522 持续出现 Web 服务未运行或已崩溃 启动 Nginx/Apache 并设置开机自启
服务器在线但 Cloudflare 连接超时 防火墙拦截了 Cloudflare IP 段 在 iptables/UFW 中放行 Cloudflare IPv4 和 IPv6 段
迁移服务器后出现 522 DNS 记录指向旧 IP 地址 更新 Cloudflare DNS 中的 A/CNAME 记录
间歇性 522 错误 服务器负载过高导致 TCP 握手超时 优化应用、增加资源或启用 Cloudflare 缓存
直连源站正常但经 Cloudflare 失败 云安全组未放行 Cloudflare IP 在 AWS/阿里云安全组中添加入站规则
仅在 HTTPS 下出现 522 443 端口未监听或 SSL 配置错误 检查 Nginx SSL 配置并确认 443 端口监听

相关指南