如何修复 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 设置页面,确认以下要点:
- A 记录或 CNAME 记录指向正确的源站 IP 地址。如果服务器最近更换了 IP,DNS 记录可能仍然指向旧地址。
- 代理状态(橙色云朵图标)已正确启用。灰色云朵表示流量不经过 Cloudflare 代理,不会出现 522。
- TTL 设置不会导致缓存过期的 IP。在代理模式下,TTL 通常设为自动。
- 如果使用负载均衡器,确认所有源站 IP 都指向活跃且健康的服务器。
如果您最近迁移了服务器,请务必更新 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 端口监听 |