2022.6.29 我的博客是这样崩的

至暗时刻

2021 年 6 月 29 日 9:35,我博客的重要合作伙伴 —— Google 向我发送电子邮件 [1],反馈大量服务和域名接入层不可用。我在当天 16:37 得知了博客的异常情况。基于报警内容,我第一时间怀疑博客的 CDN - 百度云加速出现问题。打开浏览器准备着手紧急处理(为了方便理解,下述事故处理过程做了部分简化)。

初因定位

17:00 登录 BU[2] 后台,发现后台并没有关于此事件的任何记录,导致未及时收到事件通知(我有完善的博客异常监控通知机制,博客异常通常能迅速通知到我的邮箱、Telegram 等)无法获取到事件的调试信息

17:05
机制的我决定绕过 BU 后台,自行向博客发出请求来测试。发现博客确实炸了,只有百度云加速的 502 网关错误,连接源站失败

又测试了博客的其它附属服务,此时已确认只有博客面向中国的主线有问题。排除面向海外的服务以及评论、图床等系统的问题

故障止损

17:10
此时我已进入版本控制系统 [3]
数据分析部 [4]依赖审查部 [5] 都没有报告什么异常

17:15
根据我的检测,自研的 均衡分流系统 [6] 还在积极响应我的请求,处于可用状态。基本确定 百度云加速 - Vercel 链问题的可能性。准备暂停百度云加速 CDN 服务,直连 Vercel CDN 节点尝试止损。

17:18
再次测试,发现博客主站服务仍未恢复,但注意到错误信息变成了 ERR_CERT_DATE_INVALID,SSL 证书过期?

20:42
此时根据我的测试,博客主站服务已恢复正常,观察 数据分析系统,请求异常数量大大降低,业务成功率恢复到 50% 以上。但此时国内走的是直连 Vercel,速度势必会受到影响。

根因定位

21:40
于是再套上百度云加速,并将 HTTPS 加速模式设为半程加密试图彻底修复问题。

21:45
错误信息变成了 ERR_TOO_MANY_REDIRECTS。并且等了很长时间都没有自行修复

22:05
将百度云加速的 HTTPS 加速模式设回全程严格加密,一切神奇地恢复了。

原因说明

背景

现博客框架基于 HEXO,主要采用 Github Actions 渲染,并自动推送到各个分流服务。主域名 jiecs.top 采用 阿里DNS云解析,针对不同请求自动分流到不同分流服务。目前国内的分流服务是 百度云加速 + Vercel。Vercel 有自带、自动续签且不可禁用的 HTTPS,所以我将百度云加速的 HTTPS 设为了全程严格加密。整套系统到发生故障时已稳定运行快三个月时间。

诱因

这三个月时间刚好是 Vercel 申请的 LetsEncrypt 证书的有效期,通常情况下到了有效期 Vercel 会自动续签。但因为百度云加速的全程加密,当 SSL 证书注册商通过 .well-known/* 路径验证域名所有权时,百度云加速发现此时源站的证书已过期,便会返回 502 源站错误,导致源站证书无法自动续签。

根因

Vercel 针对这种需要在 Vercel 上套 CDN 的情况有做支持。根据文档,我们需要在 CDN 中将 .well-known/* 路径设置为允许 HTTP 访问。但百度云加速的特定页面规则并不支持对 HTTPS 加速模式的设置。

问题分析

  1. 为何故障刚发生时 BU 后台没有关于此事件的任何记录?

事后复盘发现,虽然 BU 在全球各地都有监控节点,但中国不在全球范围内。博客只在面向中国的主线有问题,自然不会被记录。

  1. 那为何你们的合作伙伴 —— Google 能发现博客的异常,Google 在中国有机房?

我咋知道呢。

  1. 为何直连 Vercel 分流在故障开始阶段也不可用?

Vercel 在反复试图自动续签失败后动态调整了自动续签的重试间隔,而且续签 SSL 证书要时间。

  1. 为何在切换分流到确认恢复之间过了将近四个小时?

我刷B站去了。

  1. 后续根因定位将百度云加速设为半程加密为何会导致 ERR_TOO_MANY_REDIRECTS

Vercel 有不可关闭的强制 HTTPS,百度云加速使用 HTTP 向源站请求时源站会返回“重定向到 HTTPS”的信息,而用户浏览器发出的请求已是 HTTPS 了,从而触发了 ERR_TOO_MANY_REDIRECTS

优化改进

  1. Vercel 的 HTTPS 证书过期之后会临时自动关掉强制 HTTPS,等它过期我就把百度云加速改成半程加密。管它安全不安全的,浏览器看着安全就行了。

  2. 故障演练
    一定多多拉闸👊🤗

总结

事件是真实的,但并没有专门记录,上述大半 xx:xx 的时间都是瞎编的

其它摆烂不写了

  1. Google Search Console
  2. BetterUptime 一个监控网站可用性并提供公开状态页的 Paas 服务
  3. Github
  4. 百度云加速数据、百度统计、Google Analytics、Microsoft Clarity 等
  5. Dependabot
  6. Vercel、Netlify、Github Pages、Cloudflare Pages 等同时提供同一博客副本的分流