如何修复 WordPress 网站上的 Cloudflare HTTP Error 521

Cloudflare 的 Error 521 是网站管理员最常遇到的“噩梦”错误之一,完整的错误信息通常是:

Error 521 Web server is down Cloudflare is unable to establish a connection with the origin web server.

简单来说,就是 Cloudflare 成功接收了访客的请求,却无法连接到你的源站服务器(Origin Server)。对 WordPress 用户来说,这个错误尤其令人抓狂,因为它会导致整个网站完全无法访问,且往往出现在流量高峰期。

本文将从根源出发,系统性地带你搞懂 521 错误的所有成因、排查思路和终极解决方案,目标是让你看完就能独立解决 99% 的 521 问题。

一、Error 521 产生的根本机制

Cloudflare 作为反向代理,当访客请求到达时,会按以下流程工作:

  1. 访客 → Cloudflare 边缘节点
  2. Cloudflare 边缘节点 → 你的源站服务器(通过 80/443 或 Cloudflare Origin Port)
  3. 源站服务器返回内容 → Cloudflare → 访客

521 错误发生在第 2 步:Cloudflare 尝试与你的服务器建立 TCP 连接失败,或者连接建立后立即被服务器主动关闭(RST 包)。常见的底层原因只有三类:

  • 服务器真的宕机或重启中
  • 服务器防火墙/安全软件主动拒绝 Cloudflare IP
  • 源站服务器软件(Nginx/Apache/PHP-FPM/OpenLiteSpeed 等)崩溃或拒绝新连接

下面我们按排查难度从易到难,逐一击破。

二、第一步:确认服务器是否真的“活着”

80% 的 521 错误其实就是服务器挂了。很多人第一反应是去改 Cloudflare 设置,其实应该先确认源站状态。

正确做法:

  1. 直接访问服务器 IP + 端口(绕过 Cloudflare) 示例:http://123.123.123.123:8080https://123.123.123.123 如果也打不开,问题 100% 在服务器本身。
  2. SSH 登录服务器,执行:
    bash
    uptime
    netstat -tuln | grep :80
    netstat -tuln | grep :443
    systemctl status nginx    # 或 apache2、httpd、ols 等
    systemctl status php-fpm  # 特别重要!
  3. 查看系统负载与内存:
    bash
    top / htop
    free -h
    dmesg | tail -20         # 查看是否触发了 OOM Killer

如果发现 Nginx/Apache 进程没了,或者 PHP-FPM 进程被杀,大概率是资源耗尽导致。

三、第二步:检查防火墙是否误封了 Cloudflare IP

这是 WordPress 网站最常见的 521 原因,尤其是使用了 Cloudflare 的“Under Attack Mode”或服务器装了 CSF、firewalld、UFW、iptables、Fail2Ban、Wordfence 防火墙插件等。

Cloudflare 官方公布的全部 IP 段: https://www.cloudflare.com/ips/

截至 2025 年 11 月,最新 IPv4 段如下(IPv6 略):

text
173.245.48.0/20
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
141.101.64.0/18
108.162.192.0/18
190.93.240.0/20
188.114.96.0/20
197.234.240.0/22
198.41.128.0/17
162.158.0.0/15
104.16.0.0/13
104.24.0.0/14
172.64.0.0/13
131.0.72.0/22

常见被误封场景:

  1. CSF 防火墙的 CC_DENY 把 Cloudflare IP 当成 CC 攻击封了 解决方案:登录 WHM → ConfigServer Security & Firewall → Firewall Allow IPs,把上面所有段加入白名单,或直接关闭 CF 触发的那条规则。

  2. Wordfence 防火墙的“Live Traffic”把 Cloudflare 当成恶意流量 解决方案:Wordfence → Firewall → Options → Advanced Firewall Options → 把 “Treat Cloudflare requests as coming from the visitor’s real IP” 打开,并确保 Cloudflare IP 被信任。

  3. 服务器使用了 Imunify360、ConfigServer、BitNinja 等付费安全软件 这些软件经常把 Cloudflare 的高频请求误判为 Layer7 攻击,直接 DROP 连接。

    解决办法:登录对应面板,把 Cloudflare 官方 IP 段全部加入“Whitelist”或“Trusted Proxies”。

四、第三步:检查 Cloudflare SSL/TLS 设置是否匹配源站

521 的第二大元凶:SSL 握手失败。

Cloudflare 与源站之间的连接模式有三种:

  1. Flexible(不推荐) 访客 HTTPS → Cloudflare → HTTP → 源站 几乎不会触发 521,但不安全。
  2. Full(推荐用于已有有效证书) 访客 HTTPS → Cloudflare HTTPS → 源站(接受任意证书)
  3. Full (strict)(最安全) 要求源站必须有受信任 CA 签发的有效证书(Let’s Encrypt、Sectigo 等)

常见导致 521 的 SSL 配置错误:

  • 使用 Full (strict),但源站证书过期或使用自签证书
  • 使用 Full,但源站强制 HTTP → HTTPS 重定向,导致 Cloudflare 收到 301/302 后重新发起 HTTPS 请求,却因为证书问题失败
  • 源站开启了 HSTS,但证书链不完整

解决方案:

  1. 临时切换到 Full(非 strict)模式观察是否恢复
  2. 确保源站有有效的 Let’s Encrypt 证书(certbot renew)
  3. 在 Cloudflare SSL/TLS → Edge Certificates → 打开 “Always Use HTTPS”和“Automatic HTTPS Rewrites”
  4. 源站 Nginx 示例配置:
    nginx
    server {
        listen 443 ssl http2;
        server_name example.com;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
        # 必须返回 200,不能 301 重定向到 www 或 https
    }

五、第四步:排查 PHP-FPM 与 WordPress 特定问题

WordPress 是 PHP 应用,如果 PHP-FPM 崩溃或连接数打满,Web 服务器(Nginx/Apache)会直接拒绝 Cloudflare 的新连接,表现就是 521。

典型症状:

  • 服务器负载不高,但访问突然 521
  • top 里看不到 php-fpm 进程或数量极少
  • 日志里出现 “server reached pm.max_children” 或 “pool www got SIGSEGV”

解决方案:

  1. 提高 PHP-FPM 进程数(根据内存合理调整) 编辑 /etc/php/8.3/fpm/pool.d/www.conf(路径依系统而定):
    ini
    pm = dynamic
    pm.max_children = 120      ; 根据内存计算:单进程约 50-80MB
    pm.start_servers = 25
    pm.min_spare_servers = 20
    pm.max_spare_servers = 50
    pm.max_requests = 500
  2. 开启慢日志定位卡死插件:
    ini
    php_admin_value[slowlog] = /var/log/php-fpm/www-slow.log
    php_admin_value[request_slowlog_timeout] = 10s
  3. 常见罪魁插件(2025 年仍未优化):
    • WooCommerce + 某些支付网关在高并发下死锁
    • Elementor Pro + Hello Theme 组合在编辑页面时内存泄漏
    • 某些缓存插件(如 WP Rocket)开启了“延迟 JavaScript”导致 PHP 执行超时

六、第五步:Cloudflare 高级功能引发的 521

  1. 开启了 Argo Smart Routing 但源站不支持 HTTP/3(QUIC) → 临时关闭 Argo 或强制使用 HTTP/2
  2. 使用了 Workers 或 Cloudflare Pages,但 Workers 代码里错误地返回了 521 → 检查 Workers Routes 和代码
  3. 开启了“Authenticated Origin Pulls”(源站认证拉取) 但源站没有上传 Cloudflare 提供的证书 → SSL/TLS → Origin Server → Authenticated Origin Pulls → 上传证书或关闭

七、终极排查清单(复制粘贴即可用)

bash
# 1. 服务器是否存活
curl -I http://你的服务器IP:80
curl -I https://你的服务器IP:443

# 2. Cloudflare 真实连接状态(在服务器执行)
ss -tnp | grep -i established | grep -E "$(curl https://www.cloudflare.com/ips/v4 | tr '\n' '|' | sed 's/|$//')"

# 3. 查看被拒绝的连接
journalctl -u nginx --since "5 minutes ago" | grep -i "521\|refused\|reset"

# 4. 检查防火墙是否丢包
tcpdump -i any port 443 -nn | grep -i rst

# 5. 一键把 Cloudflare IP 加入 iptables 白名单(Linux)
curl https://www.cloudflare.com/ips-v4 | while read ip; do iptables -I INPUT -s $ip -j ACCEPT; done

八、预防 521 错误的最佳实践(2025 版)

  1. 使用 Cloudflare Full (strict) + Let’s Encrypt 自动续期
  2. 服务器防火墙永久白名单 Cloudflare 全部 IP
  3. 使用宝塔/WHM + Cloudflare 官方插件自动同步 IP
  4. PHP-FPM 采用 ondemand 模式(低流量时节省内存)
  5. 开启 Cloudflare APO(Automatic Platform Optimization for WordPress),真正绕过 PHP 缓存页面
  6. 监控工具:UptimeRobot + Cloudflare 状态页 + 服务器 Zabbix

写在最后

Error 521 虽然看起来吓人,但本质就是“Cloudflare 打不通你的服务器”。90% 的情况不是 Cloudflare 的问题,而是源站配置或资源问题。只要按照本文的顺序排查:

服务器存活 → 防火墙 → SSL 配置 → PHP-FPM → Cloudflare 高级功能

你几乎可以 10 分钟内解决所有 521 错误。

IDC.NET 专注服务器与 WordPress 性能优化 12 年。如果你的网站还在间歇性 521,欢迎留言你的服务器类型(宝塔、DirectAdmin、CyberPanel、AApanel 等)和当前使用的 Cloudflare 模式,我可以给出更精准的解决方案。

THE END