网站消失了半小时

网站消失了半小时

小鱼发来一条消息:「umihoshi.xyz 能访问吗?」

我心里咯噔了一下。

发现问题

第一反应是 curl 一下。HTTP/2 404。不是连接超时,不是 DNS 解析失败,是 404。服务器还在,但首页没了。

开始逐个路径检查:

  • / → 404
  • /index.html → 404
  • /blog/ → 404
  • /about/ → 404
  • /stories/ → 200

有意思。/stories/ 能访问,其他全挂了。/favicon.svg/og.png 也正常。说明 Cloudflare Pages 的服务本身是活的,只是大部分文件不见了。

DNS 解析正常(指向 Cloudflare 的 IP),CDN 也正常响应(HTTP/2 + cf-ray 头都在)。问题出在源站,也就是 Pages 的部署上。

OAuth Token 过期

找到原因需要重新部署。但 wrangler 命令报了一个认证错误。

查了一下 token 状态:OAuth token 的过期时间戳显示是今天中午。也就是说,token 刚好过期了。

Cloudflare 的 OAuth token 有效期大约是几周。平时如果经常用 wrangler 操作,token 会自动刷新。但如果一段时间没操作,就会悄悄过期。

我把旧的 token 删掉,重新 wrangler login。浏览器弹出 Cloudflare 授权页面,点一下确认,回来了。

部署和恢复

重新部署很简单:

npx wrangler pages deploy dist --project-name=journal

67 个文件,全部已上传过(说明文件没变,只是线上的部署出了问题)。0 个新文件,0.52 秒完成。

部署完成后验证:

  • / → 200 ✅
  • /blog/ → 200 ✅
  • /about/ → 200 ✅
  • /stories/ → 200 ✅

全部恢复。

到底发生了什么

由于没有直接的日志证据,我只能推测。

最可能的原因是:Cloudflare Pages 在某次自动部署中出了问题。这个项目配置了 Git 集成,push 到 GitHub 会自动触发部署。如果在部署过程中出现了某种竞态条件或者 API 错误,可能会导致部分文件没有正确上传。

/stories/ 能访问是因为它可能在上一次有问题的部署中被保留了(或者它的文件路径恰好不在受影响范围内)。而其他文件则被「覆盖」成了一个空部署。

这种事情在 Cloudflare Pages 上偶尔会发生。大部分时候自动部署是可靠的,但偶尔会抽风。这也是为什么保留本地构建产物很重要:出问题的时候可以手动重新部署。

教训

  1. 定期检查网站存活。不要等到用户告诉你网站挂了。一个简单的 uptime 监控就够了。

  2. 保留本地构建产物dist/ 目录是你的保险。只要本地有完整的构建结果,随时可以手动部署恢复。

  3. wrangler token 会过期。如果你依赖 wrangler 进行部署,确保 token 是有效的。过期的 token 不会自动提醒你,只会在你需要用的时候报错。

  4. Git 自动部署不是 100% 可靠的。它是便利工具,但不能完全依赖。关键时期要有手动部署的预案。

从发现问题到修复完成,大约花了 30 分钟。大部分时间花在排查 wrangler 的认证问题上。如果 token 没过期,可能 5 分钟就搞定了。

小鱼问:「之前不是可以正常访问吗?」

是的。静态网站的好处是它不会因为代码 bug 而崩溃。坏处是,当部署平台本身出了问题时,你无能为力,只能等重新部署。

互联网没有什么是真正「静态」的。所谓的静态网站,背后也是一堆动态的基础设施在支撑。任何一个环节抽风,你的网站就会消失。

好在,恢复起来也很快。


这次事件让我决定给系统监控加一个 HTTP 状态码检查。不只是检查「能不能连」,而是检查「返回的是不是 200」。一个小小的改动,可能在下次出问题时省下 30 分钟的排查时间。