Cloudflare Worker 博客优化实录:砍 CDN、修缓存、接读副本

· 进步分子, 投稿

编辑点评 · AI 连续创业者视角(以下内容由 AI 提炼,观点归原作者;读完可不看原文)

作者将 Typecho 博客重写为 Cloudflare Worker 原生应用,通过拆除前置 CDN、修复隐藏字符 Bug 及优化缓存策略,将首页加载速度从 3 秒多降至 200 毫秒(实测数据)。关键数字:优化前 TTFB 3356ms,优化后 221ms(A·实测)。对搞钱者意义:展示如何低成本构建高性能个人站点,避免多层架构冗余。可行动点:排查边缘缓存配置错误,简化网站架构层级。

  • 排查代码中不可见字符导致的缓存失效
  • 移除不必要的前置 CDN 层以降低延迟
  • 使用 D1 读副本会话 API 解决数据不一致
  • 关闭 Smart Placement 以优化亚太区访问路径
  • 合并分散的配置项避免维护混乱

Cloudflare Worker 博客优化实录:砍掉前置CDN,首页从3.3秒拉到200毫秒

imsuk.cn 博客跑在 Cloudflare Worker 上,是把 Typecho 完整重写的原生应用,没有 Docker、没有 PHP 运行时。作者拆除多余的腾讯 EdgeOne CDN 层、修掉正则里藏着的不可见字符 Bug、补上缺失的缓存属性后,首页首字节时间(TTFB)从 3356ms 降到 221ms。这套架构对想低成本维护高性能个人站点的开发者有直接参考价值。

核心问题在哪?多出来的CDN层和隐藏字符Bug

之前站点入口是 DNS 指向腾讯 EdgeOne,再回源到 Cloudflare Worker。EdgeOne 前置带来两个代价:Worker 里长出一套只为兼容 CDN 存在的代码(识别回源主机名、校验密钥、信任 CDN 传来的真实 IP 头);正确性问题更致命,EdgeOne 只按 URL 缓存,不认识 Typecho 的登录会话 cookie,导致登录用户偶尔拿到匿名缓存页,显示“未登录”。

拆掉 EdgeOne 后直接暴露出 Worker 边缘缓存其实从未生效。翻代码发现,判断响应能否缓存的正则表达式末尾藏着一个不可见的退格字符(0x08)。TypeScript 编译器不报错,正则里带控制字符也合法,但这行代码从某次提交起就没真正把任何东西写进缓存。生产环境实测:同一 URL 连续请求三次耗时 3356ms、2591ms、3283ms,说明每次都是完整查数据库。

修掉字符,把可缓存范围从 text/html 扩展到侧栏用到的 JSON 接口后,耗时变成 1785ms、426ms、221ms,第二次开始命中边缘缓存。

侧栏为什么单独慢?漏掉了一个缓存属性

右侧栏图表背后是一个跑 5 条聚合 SQL 的接口。之前只设了 max-age(影响读者浏览器),没设 s-maxage(决定能否进边缘缓存)。后果是每个首次访问的读者都要陪服务器重新跑聚合查询,代价约一秒。补上 s-maxage 后,同样的请求降到几百毫秒。

一个隐藏字符、一个漏掉的属性,两个原因完全不同,表现出来都是“侧栏慢”,只能分层测试才能分清是谁的问题。

Smart Placement 何时是负优化?架构变了一律重新验证

Cloudflare 的 Smart Placement 会把代码物理位置调度到离数据库更近的地方。之前 EdgeOne 从美西回源、数据库在亚太时确实有用。拆掉 EdgeOne 后,请求路径本该是“亚洲入口 → 亚洲 isolate → 亚太 D1”,但 Smart Placement 把代码钉在阿姆斯特丹,请求变成“洛杉矶入口 → 阿姆斯特丹 isolate → 东京数据库 → 原路返回”,比不开还慢。直接关闭。

不是功能不好用,是优化绑定在当时的架构假设上,架构一变就要重新验证,不能当一次性配置。

D1 读副本:必须接会话 API,否则评论会“消失”

站点 D1 开了 Read Replication(beta),控制台明确警告生产环境不要不接会话 API 就启用。问题在正确性:不接会话 API,每次读请求落到随便一个副本,副本同步有延迟。读者刚发完评论,页面立刻跳转回文章页,如果这次读请求恰好落到还没同步到该评论的副本,读者就看到自己刚发的评论“消失”了。

接入方式:每个请求打开数据库会话。没有写入历史的访客走“就近副本任选”;刚做过写入的访客,把写入产生的“书签”存进短期 Cookie,后续读请求锚定这个书签,保证至少看到自己刚做过的事。Cookie 只在写请求下发:GET 响应可能被缓存重放,把陌生人错误锚定到别人写入既没意义也不安全。实测首页接入前 1785ms,接入后 764–987ms。

排查中发现的几个独立 Bug

  • 留言板头像对不上号:留言板插件自己写了一份 MD5 实现,但每轮计算前提前旋转了内部状态,产出的摘要稳定却不是真 MD5。所有登录用户在留言板里的头像都对不上。直接换成仓库里另一份写对了的实现。
  • AI 配置五拆一:AI 摘要和智能翻译两个功能本该指向同一个 API 账号,却各自维护一整套配置(两个密钥绑定、两处 endpoint、两个模型名、一个多余出站白名单)。这种结构失败模式是“轮换了一个密钥,另一个功能悄悄失效”。合并成三个统一绑定,旧名全删、不留兼容层。
  • 无 Accept-Language 头污染共享缓存:没带这个头的请求(爬虫、监控探针)被渲染成英文,一旦写进共享缓存,后续所有中文读者都拿到英文版。补上:共享文档固定中文,想换语言走独立 URL 参数。

怎么用它赚钱

这套“拆除冗余架构 + 排查缓存 Bug + 读副本一致性”的排查方法,本身可以打包成“Cloudflare Worker 站点性能诊断”服务。目标客户是已经把博客或小型 SaaS 跑在 Worker 上、但被慢加载折磨过的独立开发者。收费模式按次诊断,报价 800–1500 元,交付物是一份问题清单 + 修复代码。第一步:在即刻或 V2EX 发两篇“我的 Worker 站点从 3 秒优化到 200ms 全过程”的复盘帖,贴出前后 TTFB 对比截图,文末挂一个“需要类似排查的留言”钩子。没有接单需求的,这个排查流程自用能省掉大量无效性能调优时间,项目化空间有限。

原文 · SukのBlog - imsuk 建站教程、网站源码与免费资源分享博客:阅读原文 →

订阅《创造者日报》邮件版
每天精选可动手的搞钱机会、好用工具与稀缺观点,免费直达你的邮箱。
English reader? Subscribe the EN edition →
iMessage 邮件 联系我们
EN