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 加速模式的设置。
问题分析
- 为何故障刚发生时 BU 后台没有关于此事件的任何记录?
事后复盘发现,虽然 BU 在全球各地都有监控节点,但中国不在全球范围内。博客只在面向中国的主线有问题,自然不会被记录。
- 那为何你们的合作伙伴 —— Google 能发现博客的异常,Google 在中国有机房?
我咋知道呢。
- 为何直连 Vercel 分流在故障开始阶段也不可用?
Vercel 在反复试图自动续签失败后动态调整了自动续签的重试间隔,而且续签 SSL 证书要时间。
- 为何在切换分流到确认恢复之间过了将近四个小时?
我刷B站去了。
- 后续根因定位将百度云加速设为半程加密为何会导致
ERR_TOO_MANY_REDIRECTS
?
Vercel 有不可关闭的强制 HTTPS,百度云加速使用 HTTP 向源站请求时源站会返回“重定向到 HTTPS”的信息,而用户浏览器发出的请求已是 HTTPS 了,从而触发了 ERR_TOO_MANY_REDIRECTS
。
优化改进
Vercel 的 HTTPS 证书过期之后会临时自动关掉强制 HTTPS,等它过期我就把百度云加速改成半程加密。管它安全不安全的,浏览器看着安全就行了。
故障演练
一定多多拉闸👊🤗
总结
事件是真实的,但并没有专门记录,上述大半 xx:xx 的时间都是瞎编的
其它摆烂不写了