选择cloudflare,给我的博客带来了什么

0 阅读11分钟

写在前面

搭建「栏轩阁」个人博客的过程中,后端架构是我反复思考最多的部分。既要足够轻量(个人博客,没有高并发压力),又要功能齐全(评论、统计、AI 对话、邮件归档……),还要尽可能降低成本。

最终的选择是 Cloudflare。不是因为它大厂光环,而是它提供的服务矩阵恰好覆盖了我全部的 backend 需求,而且全部跑在同一套 Free / 低付费计划里


一、基础层:DNS + CDN

1. 自定义域名 + DNS — 整个博客的基石

「栏轩阁」的前端是部署在 GitHub Pages 上的静态站点,后端 API 跑在 Cloudflare Workers 上。Cloudflare DNS 就是连接这两者的中枢:

博客访问(用户 → 浏览器)
       ↓
  lxpavilion.top(Cloudflare DNS)
       ├── A / CNAME 记录 → GitHub Pages(静态站点)
       └── api.lxpavilion.top → Workers(后端 API)

GitHub Pages 域名托管: 博客主域名 lxpavilion.top 通过 Cloudflare DNS 的 CNAME 记录指向 GitHub Pages 分配的域名。Cloudflare 自动代理(橙色云朵开启)后,所有访问流量先经过 Cloudflare 边缘节点再回源到 GitHub 服务器,实现了两个效果:

  • 全球加速:GitHub Pages 的源服务器在美国,国内访问速度不理想;开启 Cloudflare 代理后,静态资源从最近的 CDN 节点交付,加载速度明显提升
  • 隐藏源 IP:访问者看到的只有 Cloudflare 的 IP,GitHub Pages 的真实地址不会暴露

API 子域名: api.lxpavilion.top 通过 DNS 记录指向 Workers,所有前端通过这个统一入口调用后端 API,解决了前端直接请求第三方 API 的跨域和 Token 安全问题(详见下文"后端代理"章节)。

延伸配置: Cloudflare DNS 还用于配置 Newsletter 发件域名的 SPF/DKIM 记录——无论是 Buttondown 还是 MailerLite,都需要在 DNS 中添加特定的 TXT 记录来验证域名所有权和发件身份。

2. CDN + Cache API — 加速层

Cloudflare CDN 提供全球节点缓存静态资源,博客的 HTML、CSS、JavaScript 和图片都通过 CDN 加速分发。配合 Cache API 可以在 Workers 中精细控制缓存策略。

对 GitHub Pages 的加速效果: GitHub Pages 没有自家的 CDN 加速能力,国内某些地区的访问延迟可能高达数百毫秒。接入 Cloudflare 后,静态资源的 TTFB(首字节时间)从平均 300-500ms 降低到 50-100ms 左右。

缓存刷新: 博客更新后,POST /purge 端点调用 Cloudflare API 按 URL 或前缀精准刷新缓存,配合博客后台的"刷新缓存"按钮,完全可控,不用担心旧内容被缓存。

IndexNow 搜索引擎自动推送: 每次 POST /purge 触发 CDN 缓存刷新时,Cloudflare 的 Automatic IndexNow 功能会自动向支持的搜索引擎(Bing、Yandex 等)推送内容更新通知。

在此基础上,我还做了双重兜底:

  • Bing Webmaster 站点绑定:在 Bing Webmaster Tools 中关联站点并验证所有权,确保收录入口畅通
  • 自定义 IndexNow API 请求:通过 Workers 在发布文章时主动调用 IndexNow API,作为 Cloudflare 自动推送的补充,进一步缩短收录延迟

最终链路:发布文章 → Purge 缓存 → Cloudflare Automatic IndexNow + 自定义 API 请求 → 搜索引擎快速收录

3. Cloudflare Workers — 后端底座

这是整个博客的后端底座。一个名为 blog-api 的 Worker 处理了几乎所有实时逻辑。

路由覆盖:

端点方法用途
/pingGET健康检查
/POST站点数据统计分析(GraphQL Analytics)
/platformGET聚合 CSDN / 掘金 / 博客园的平台数据
/rss?url=...GETRSS 代理抓取
/purgePOSTCDN 缓存刷新
/ai/chatPOSTAI 聊天(Live2D 看板娘)
/api/auth/*登录注册、GitHub OAuth
/api/view/*文章阅读计数
/api/comment/*自建评论系统
/api/email/*邮件管理

如果不用 Workers,这些功能我至少需要一个 Node.js 服务器 + 数据库 + 定时任务组合。

真实体验:

  • 冷启动确实存在,但 Smart Placement 开启后体感改善很多
  • Free Plan 每天 100,000 次请求额度,个人博客完全用不完
  • wrangler deploy 一键部署,CI/CD 友好

4. 后端代理 — 告别 Token 保留与 CORS 问题

获取其他平台的数据时(CSDN、博客园、稀土掘金的文章爬虫、GitHub API 登录与评论、RSS 订阅抓取等),以前直接在前端调用会遇到两个问题:

  • 跨域(CORS):浏览器限制前端直接请求第三方 API
  • Token 暴露:API Key 和 Token 无法安全地保留在前端代码中

Workers 作为 BFF(Backend For Frontend) 统一代理层,完美解决了这两个问题:

前端请求 → api.lxpavilion.top/Worker → Workers 代理转发 → 第三方 API
                                      ↕
                              Token 存在环境变量中,永不暴露

所有第三方 API 的 Token 都通过 wrangler secret put 存储在 Worker 环境变量中,前端只与自己的域名通信,既安全又干净。


三、存储层:D1 关系型数据库

5. Cloudflare D1 — 分布式 SQLite

博客早期图片等静态数据通过 GitHub 管理 + 流水线部署,但随着实时性数据需求的增加——登录功能、评论系统、阅读计数——必须引入数据库。

最开始我犹豫过是否用 SQLite 做生产数据库,但 D1 证明了这个担心是多余的。它本质上是分布式的 SQLite,天然和 Workers 同区域部署,延迟极低。

我的 D1 建了 6 张表:

表名用途
user用户体系(支持 GitHub OAuth 登录)
article_view文章阅读计数,按 IP + UserAgent + 文章 ID 去重
comment_reaction评论互动数据
comment_upvote评论点赞数据
emails邮件归档(配合 Email Routing 自动入库)
settings键值配置(如邮件转发地址)

真实体验:

  • 最大亮点:和 Workers 同区域部署,延迟极低
  • 备份简单:一条 wrangler d1 backup 命令搞定所有数据
  • 写扩散型博客场景完全够用,并发量对 D1 来说小菜一碟
  • 迁移工具 wrangler d1 migrations create + apply 比 Prisma 还轻量,无需额外的 ORM

四、服务层:邮件、AI 与分析

6. Cloudflare Email Routing — 邮件归档系统

这是我用过的所有 Cloudflare 服务中最让人惊喜的功能。通过 Email Routing 配合 Worker 的 email() 事件处理,实现了完整的收发 + 归档 + 转发链路。

为什么不用第三方邮箱服务?

对比维度第三方邮箱(Zoho / QQ 域名邮箱)Cloudflare Email Routing
自定义域名部分支持✅ 完全支持
邮件归档依赖厂商✅ 存自己 D1
转发灵活性固定规则✅ Worker 自定义逻辑
隐私控制厂商可访问✅ 数据在自己手里
路径多样化有限✅ 无限(hi@ / notify@ / admin@ 等)

工作流:

发件人 → hi@lxpavilion.top → Email Routing(DNS MX 记录)
                                  ↓
                            Worker email 事件处理
                                  ↓
                          ┌── 解析 MIME(postal-mime)
                          ├── 存入 D1(emails 表)
                          ├── 查询转发地址(DB settings 表)
                          └── message.forward() → 我的主邮箱

路径多样化示例: 同一个域名 @lxpavilion.top 的不同前缀,可以走完全不同的处理链路:

邮箱地址用途处理方式
email@lxpavilion.top个人主路径,接收博客评论、读者来信等Worker 中转 → 解析 MIME → 存入 D1 归档保存
notify@lxpavilion.top通知路径,接收服务通知、验证邮件等直接转发到真实邮箱,不存入 D1,避免垃圾广告污染归档

这样设计的好处是:主邮箱的所有通信记录都在自己的数据库里,隐私可控;通知邮箱直接透传,省去不必要的存储开销。

配套的管理 API(/api/email/*)和博客后台页面,可以浏览、搜索、删除历史邮件,以及设置转发目标地址。

关于 Newsletter 发件: 虽然 Email Routing 可以处理入站邮件,但出站订阅推送需要通过专业的 Newsletter 平台来做。我的方案是 MailerLite(免费版),配合 Cloudflare DNS 验证发件域名,实现零成本的 RSS 自动推送。详细配置过程可参考免费订阅服务升级:MailerLite 完全指南(与 Buttondown 对比)

真实体验:

  • 完全替代了 Zoho Mail / QQ 邮箱域名邮箱等方案
  • 核心逻辑不到 200 行代码,实现了收件 + 归档 + 转发全链路
  • 所有邮件数据存在自己的 D1 里,隐私完全可控

7. Cloudflare Workers AI — 看板娘智能对话

博客的 Live2D 看板娘(Ava / Diana 双角色)背后跑的是 Workers AI。不需要自己去部署模型、管理 GPU、配置 API key。

模型: @cf/qwen/qwen3-30b-a3b-fp8(通义千问变体)

集成方式:

const response = await env.AI.run("@cf/qwen/qwen3-30b-a3b-fp8", {
  messages: [{ role: "system", content: systemPrompt }, ...history],
  max_tokens: 2048,
});

真实体验:

  • 首 token 约 1–2s,对聊天场景完全可以接受
  • 代码量极少:绑定好之后只有一行 env.AI.run(),没有 API key 管理,没有鉴权配置
  • 我捕获了 rate limit 错误(code 3036,配额用完),优雅降级为"休息一下,待会再聊"的提示

8. Cloudflare Analytics API — 站点统计看板

没有用 Google Analytics 或 Umami 等第三方统计工具。Workers 通过 GraphQL Analytics API 直接拉取 CDN 层的访问数据:

  • 实时请求量、带宽、状态码分布
  • 热门 URL 排行
  • 访客地理分布
  • 缓存命中率

这些数据通过 / 端点聚合后,展示在博客后台的统计看板中。数据源来自 CDN 边缘节点,比第三方 JS 脚本统计更准确(不会被广告拦截器屏蔽)。


五、优化层:加速与缓存

9. Smart Placement — 智能部署

Workers 的 Smart Placement 会自动把 Worker 部署到最合适的位置——靠近用户还是靠近数据处理端(如 D1),由 Cloudflare 的智能调度决定。

配置仅一行:

"placement": { "mode": "smart" }

开启后 API 响应时间降低了约 30%,而且是免费的优化。


六、账单:到底花了多少钱?

服务费用备注
WorkersFree10 万 req/day,个人博客用不完
D1Free5GB 存储 + 每月 500 万读 / 10 万写
Workers AIFree每天 1 万次神经元调用
Email RoutingFree无限制转发规则
CDN + DNSFree无限流量(合理使用)
AnalyticsFree内置在 CDN 中
自定义域名域名年费,与 Cloudflare 无关
后端总成本¥0/月真正的零成本后端架构

以前如果自建这些功能:一台轻量云服务器 ¥50/月,数据库 ¥20+/月,AI 模型部署 ¥100+/月,总计轻松破 ¥170/月。Cloudflare 把这些全部打到了免费档。


七、我没用到(但值得了解)的服务

服务没用的原因
KVD1 完全替代了键值存储需求
R2博客媒体通过 GitHub 管理 + 图床,暂不需要对象存储
Pages前端用 Vercel 部署,Next.js 在 Vercel 上体验更好
Durable Objects博客没有强一致性实时协作场景
Vectorize当前 AI 只有对话,还没有向量检索需求
Queues消息队列对个人博客太重了

八、真实体验:优点与痛点

👍 让我心动的地方

  1. 零运维:不需要操心系统更新、防火墙、SSH 密钥、数据库备份策略
  2. 渐进增强:从 DNS 开始用,慢慢加 CDN → Workers → D1 → AI,每一步都是自然延伸
  3. 统一账单:所有服务在一个 Dashboard 里管理,不用记 5 个不同厂商的登录地址
  4. 开发者体验wrangler CLI + wrangler.json 配置即代码,Git 管理一切
  5. 极致轻量:整个博客后端的依赖只有 @cloudflare/workers-types + postal-mime,没有 Express、没有 Prisma、没有 Redis

🤔 需要妥协的地方

  1. 调试体验wrangler dev 模拟环境与实际部署有差距;wrangler tail 看日志总像隔了一层
  2. 冷启动:虽然 Smart Placement 改善了,但长时间无请求后首次访问偶尔会有顿挫感
  3. D1 没有 Trigger:很多数据库事件驱动的逻辑无法用,不得不在应用层手动处理
  4. 平台锁定顾虑:理论上所有代码都是 Standard Workers 标准 API,但 D1 的查询方言和 Cloudflare 特有的绑定机制让迁移没那么无缝
  5. 本地开发依赖网络:虽然可以离线开发,但很多绑定(D1、AI)需要远程连接或模拟

九、架构反思:Cloudflare 解决的核心问题

回头看,引入 Cloudflare 之前我面临几个核心痛点:

痛点Cloudflare 的解法
前端直接请求第三方 API 有跨域问题Workers 做 BFF(Backend For Frontend),统一代理
第三方服务的 Token 不能暴露在前端Token 全部存在 Worker 环境变量中
需要后端数据库但不想运维D1 零运维,自动扩缩容
AI 功能需要模型部署Workers AI 一行代码集成
想要自己的域名邮箱Email Routing 免费搞定
流量统计不想用第三方GraphQL Analytics API 直接取 CDN 数据

最后想说的

Cloudflare 最适合的场景是个人项目 / 小团队工具 / 轻量 API。它不是万能的,但在它擅长的领域里,提供了极其出色的开发者体验。

对我而言,选 Cloudflare 不是因为它是"最好的",而是因为它让我用最小的成本验证想法、运行服务,把精力放在真正的产品逻辑上。

架构选择没有银弹,只有最合适的。


🌐 欢迎关注我的其他平台:

📧 联系我:mail@lxpavilion.top