一年前我把个人项目从一台 2C4G 的云服务器迁到了 Cloudflare,账单从每月 60 元变成 0 元。但省钱不是重点,重点是运维时间从每周两小时变成了零。这篇文章说说真实体验。

免费额度到底有多少

产品 免费额度 个人项目够用吗
Workers 每天 10 万次请求,10ms CPU/请求 绰绰有余
D1 5GB 存储,每天 500 万行读 存十万篇文章都没问题
R2 10GB 存储,出站流量免费 图片站的核心优势
KV 1GB 存储,每天 10 万次读 适合配置、会话、小文件

关键点在于:R2 不收出站流量费。传统对象存储最贵的往往就是流量,一个被爬虫盯上的图片站,一个月能烧掉几百块。

一次请求到底发生了什么

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);

    // 1. 静态资源直接由边缘网络返回,不进入 Worker
    // 2. 动态请求命中最近的边缘节点(全球 300+)
    if (url.pathname === '/api/posts') {
      const { results } = await env.DB
        .prepare('SELECT id, title, slug FROM posts WHERE status = ? ORDER BY published_at DESC LIMIT 20')
        .bind('published')
        .all();
      return Response.json({ posts: results });
    }

    return new Response('Not Found', { status: 404 });
  },
};

请求不会回到某个「源站」,而是在离用户最近的节点上执行。上海用户访问的是香港或新加坡节点,延迟从 200ms 掉到 30ms 以内。

三个必须提前接受的限制

1. CPU 时间只有 10ms(免费版)

注意是 CPU 时间,不是墙钟时间。等待 D1 查询、等待 fetch 返回都不算——但纯计算算。

这也是为什么在这种平台上做密码哈希要小心:

// PBKDF2 10 万次迭代大约要几十毫秒 CPU
// 免费版可能直接抛 "Worker exceeded CPU time limit"
// 解决方式:降低迭代次数,或者把认证放到需要付费的计划上
const bits = await crypto.subtle.deriveBits(
  { name: 'PBKDF2', salt, iterations: 50000, hash: 'SHA-256' },
  key,
  256,
);

2. 没有常驻进程

不能开一个长连接的后台线程。需要「定时」就用 Cron Triggers:

# wrangler.toml
[triggers]
crons = ["0 2 * * *"]   # 每天凌晨 2 点
export default {
  async scheduled(event, env, ctx) {
    ctx.waitUntil(cleanupExpiredSessions(env));
  },
};

3. 数据库不是 Postgres

D1 是 SQLite。没有存储过程、没有复杂的并发控制、ALTER TABLE 能力有限。

好消息是:对读多写少的博客、文档站、小工具,SQLite 完全够用。坏消息是:如果你的业务需要频繁的事务冲突处理,会很难受。

适合与不适合的清单

适合:

  • 内容站、博客、文档站
  • API 网关、鉴权层、BFF
  • 图片/文件处理与分发
  • Webhook 接收与转发

不适合:

  • 长连接、WebSocket 聊天室(虽然 Durable Objects 能做,但复杂度陡增)
  • 视频转码、PDF 生成这类重 CPU 任务
  • 需要 Postgres 扩展能力的复杂业务

迁移时踩过的坑

  1. ctx.waitUntil 是异步统计的关键。浏览量自增不该阻塞响应:
if (post.status === 'published') {
  ctx.waitUntil(incrementViews(env.DB, post.id));
}
  1. 环境变量与本地开发要分离。wrangler dev 用 .dev.vars,线上用 wrangler secret put,不要把密钥写进 vars。

  2. 数据库迁移一定要版本化。D1 的 migrations 目录配合 wrangler d1 migrations apply 是最省心的方式,别手动改线上表结构。

小结

如果你的项目是「读多写少 + 不需要长连接 + 计算不重」,那 Cloudflare 这套组合是目前性价比最高的选择:没有服务器要打补丁,没有磁盘要扩容,也没有流量账单。

反过来,如果你的业务核心是复杂的写入事务或者长连接状态,那还是老老实实用一台 VPS 更省心。