从 HTTP ERROR 521 到 Nginx 满血复活:一次由残留配置引发的故障排查实录

· 阅读约需8分钟

从 HTTP ERROR 521 到 Nginx 满血复活:一次由残留配置引发的故障排查实录

最近,我的网站突然报错,访客访问时会看到 Cloudflare 的 HTTP ERROR 521 页面(该网页无法正常运作)。经过一番排查,发现罪魁祸首居然是一个极其容易忽略的 Nginx 残留配置文件。记录一下整个排查和修复过程,希望能帮到遇到同样问题的朋友。


一、故障现象与初步排查

用户端反馈网站无法访问,浏览器显示 HTTP ERROR 521。这个错误码是 Cloudflare 专属的,它明确告诉我们:Cloudflare 的边缘节点无法连接到你的源服务器(Origin Server)。

一开始我怀疑是源服务器宕机了,于是查看了源站的 Nginx 访问日志。日志显示监控工具(Uptime-Kuma)每分钟都在成功请求主页,搜索引擎爬虫也在正常抓取,甚至我自己还能顺利登录 WordPress 后台发布文章。日志中充满了 200 OK 状态码,看起来服务器本身运行完全正常。

这就奇怪了。既然服务器是正常的,为什么 Cloudflare 会报 521?通常这意味着源站的某些服务在特定瞬间崩溃,或者存在配置错误导致 Cloudflare 无法成功建立连接。


二、定位问题:Nginx 配置检测报错

为了进一步排查,我登录 SSH,尝试重启 Nginx 服务,结果 Nginx 直接报错无法启动:

nginx version: nginx/1.31.6
nginx: [emerg] cannot load certificate "/www/server/panel/vhost/cert/0.default/fullchain.pem": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/www/server/panel/vhost/cert/0.default/fullchain.pem, r) error:10000080:BIO routines::no file)
nginx: configuration file /www/server/nginx/conf/nginx.conf test failed

问题浮出水面:Nginx 在加载 SSL 证书时,找不到一个名为 0.default 的证书文件。这不仅导致 Nginx 无法启动,也解释了为什么 Cloudflare 会因无法回源而报 521 错误。

在宝塔面板环境中,0.default.conf 通常是默认站点或之前删除网站后残留的配置文件。该文件引用了不存在的 SSL 证书路径,导致 Nginx 启动失败。


三、解决过程:清理残留配置

既然找到了原因,解决起来就简单了。请按以下顺序操作:

1. 查看并备份残留配置

首先查看 Nginx 虚拟主机配置目录,确认残留文件的存在:

ls /www/server/panel/vhost/nginx/

你会看到许多 .conf 文件,其中就包含了报错的 0.default.conf。为了安全起见,不要直接删除,而是将其重命名备份:

mv /www/server/panel/vhost/nginx/0.default.conf /www/server/panel/vhost/nginx/0.default.conf.bak

2. 测试 Nginx 配置

备份完成后,再次测试 Nginx 配置,确认语法是否正确:

nginx -t

如果看到类似以下的输出,说明问题已经解决:

nginx: the configuration file /www/server/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /www/server/nginx/conf/nginx.conf test is successful

3. 重启 Nginx 服务

配置测试通过后,重启 Nginx 使配置生效:

systemctl restart nginx

或者,直接前往宝塔面板的“软件商店” -> 找到 Nginx -> 点击“重启”按钮。


四、修复结果与后续建议

执行完上述操作后,回到浏览器刷新网站,Cloudflare 的 HTTP ERROR 521 彻底消失,网站恢复正常访问。

如果你也遇到了类似问题,建议在修复后进行以下收尾工作:

  • 清理备份文件:确认网站稳定运行几天后,删除之前备份的 0.default.conf.bak 文件,避免日后的配置混淆。
  • 开启证书自动续签:在宝塔面板的 SSL 设置中,确保开启了“自动续签”功能。Let’s Encrypt 证书有效期只有 90 天,过期后同样会导致 521 错误。
  • 规范 Cloudflare 加密模式:在 Cloudflare 的 SSL/TLS 设置中,建议使用 Full 或 Full (Strict) 模式,确保与源站证书匹配。
  • 定期体检:可以设置一个计划任务,每周执行一次 nginx -t,提前发现残留配置或证书丢失的问题。

这次的故障再次证明:在服务器运维中,那些不起眼的残留文件往往能引发巨大的连锁反应。希望这篇实录能帮你少走弯路!