返回博客列表

零成本架构:用 Cloudflare 免费服务搭建生产级 Web 应用

2026-06-17T20:00:00+08:00
CloudflareServerless架构免费服务WorkersR2D1

零成本架构:用 Cloudflare 免费服务搭建生产级 Web 应用

2026 年了,做一个 Web 应用还需要买服务器吗?

答案是:大部分情况不需要

Cloudflare 的免费套餐已经强大到可以支撑一个中等规模的生产级应用,不需要花一分钱。今天我来分享一套经过验证的完整架构方案:

用户请求 → Cloudflare CDN(边缘节点)
         ↓
    Cloudflare Pages(前端静态资源)
         ↓
    Cloudflare Workers(API 服务)
         ↓
    ┌─────────┬─────────┬─────────┐
    │    KV   │   R2    │   D1    │
    │ 缓存/状态 │ 对象存储 │ 数据库   │
    └─────────┴─────────┴─────────┘
         ↓
    Cloudflare Private Network(私有网络)
         ↓
    自有 VPS / 容器(重任务处理)

这套架构跑起来,月流量不超标的话,成本是 0 元

Cloudflare 免费额度总览

先列一下免费额度,你就知道这玩意儿有多香:

服务 免费额度 能做什么
Workers 10 万请求/天,CPU 时间 10ms/请求 API 服务完全够用
Pages 无限带宽,无限请求 前端静态托管
R2 存储 10GB 存储,100万次读取/月,10万次写入/月 图片、文件存储
KV 1GB 存储,10万次读取/天,1000次写入/天 缓存、会话、小状态
D1 5GB 存储,500万行读取/月,10万次写入/月 SQLite 关系型数据库
Workers AI 10000 Neurons/天 跑 AI 推理
Queue 100万次操作/月 异步任务队列
Cron Triggers 每小时触发一次 定时任务

一个早期产品,月活几万以内,完全在免费额度内。即使超出了,Cloudflare 的收费也非常便宜——Workers 每百万请求才 0.3 美元,比 Vercel、Netlify 厚道太多了。

架构分层详解

第一层:前端部署 — Cloudflare Pages

这是最简单的一层。

把你的 React/Vue/Svelte/Next.js 项目接到 GitHub,Cloudflare Pages 自动构建部署,自带全球 CDN,HTTPS 自动配置,预览部署一键搞定。

最佳实践:

# 安装 Wrangler
npm install -g wrangler

# 本地开发
wrangler pages dev

# 直接部署(甚至不用接 GitHub)
wrangler pages deploy ./.svelte-kit/cloudflare/

优势:

  • ✅ 无限带宽,没有 Vercel 那个恶心的流量限制
  • ✅ 全球 300+ 边缘节点,速度极快
  • ✅ 自动 HTTPS,自动压缩
  • ✅ 预览部署,每个 PR 一个独立 URL
  • ✅ 自定义域名完全免费

坑点提醒:

  • Next.js App Router 的边缘模式支持不如 Vercel 原生
  • SSR 用 Workers 模式即可,不要用 Node.js 模式

第二层:API 层 — Cloudflare Workers

这是整个架构的核心。

Workers 是 Cloudflare 的边缘计算 runtime,用 V8 引擎,冷启动几乎为 0,全球分布,你写的代码自动跑在离用户最近的节点上。

一个最简单的 Worker 示例:

// src/worker.js
export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    
    // 路由分发
    if (url.pathname === '/api/hello') {
      return new Response(JSON.stringify({
        message: 'Hello from Cloudflare Workers!',
        location: request.cf?.colo  // 告诉你这个请求是哪个边缘节点处理的
      }), {
        headers: { 'Content-Type': 'application/json' }
      });
    }
    
    // 其他请求走前端静态资源
    return env.ASSETS.fetch(request);
  }
};

wrangler.toml 配置:

name = "my-app"
compatibility_date = "2026-06-01"

# 绑定 Pages 前端
[assets]
directory = "./static"

# 绑定 KV 命名空间
[[kv_namespaces]]
binding = "CACHE"
id = "your-kv-namespace-id"

# 绑定 R2 存储桶
[[r2_buckets]]
binding = "FILES"
bucket_name = "my-app-files"

# 绑定 D1 数据库
[[d1_databases]]
binding = "DB"
database_name = "my-app-db"
database_id = "your-db-id"

Worker 的核心优势:

  1. 冷启动为 0:不像 AWS Lambda 有冷启动,Worker 永远是热的
  2. 全球分布式:代码自动跑在离用户最近的节点
  3. I/O 不阻塞 CPU:等待响应的时候不占 CPU 时间
  4. 丰富的绑定:KV、R2、D1、Queue 等服务直接用 env 访问,不用 API Key

第三层:数据层 — KV / R2 / D1

这三层各有用途,不要混用。

✅ KV:缓存和轻量状态

KV 是一个全球分布式的键值存储,读多写少的场景用它最合适。

适合:

  • 页面缓存、API 响应缓存
  • 用户会话、JWT 黑名单
  • 配置信息、Feature Flag
  • 计数器、小状态

用法示例:

// 缓存 API 响应
const cacheKey = `posts:${page}`;
let posts = await env.CACHE.get(cacheKey, { type: 'json' });

if (!posts) {
  // 缓存没命中,查数据库
  posts = await getPostsFromDB(page);
  // 写入缓存,TTL 1 分钟
  await env.CACHE.put(cacheKey, JSON.stringify(posts), {
    expirationTtl: 60
  });
}

注意: KV 的写入是最终一致的,写入后可能有 1-2 秒延迟才能读到。不要用来存需要强一致性的数据。

✅ R2:对象存储

R2 是 Cloudflare 的 S3 兼容对象存储,零出口流量费——这是它最大的优势。AWS S3 最贵的不是存储,是流量费,R2 直接把这个费用砍到 0。

适合:

  • 图片、视频、附件存储
  • 静态资源备份
  • 日志存储
  • 任何大文件

用法示例:

// 上传文件
const formData = await request.formData();
const file = formData.get('file');
const key = `uploads/${crypto.randomUUID()}-${file.name}`;

await env.FILES.put(key, file.stream(), {
  httpMetadata: { contentType: file.type }
});

// 返回公开 URL(R2 可以自定义域名)
return new Response(JSON.stringify({
  url: `https://files.yourdomain.com/${key}`
}));

// 下载/访问文件
const object = await env.FILES.get(key);
if (!object) return new Response('Not found', { status: 404 });
return new Response(object.body, {
  headers: { 'Content-Type': object.httpMetadata.contentType }
});

R2 的杀手锏: 零出口费。你存 10GB 图片,哪怕一个月被下载 100TB,流量费也是 0。这在 AWS/阿里云是不敢想的。

✅ D1:关系型数据库

D1 是 Cloudflare 基于 SQLite 做的分布式关系型数据库,原生支持 SQL,适合绝大多数应用场景。

直接在 Worker 里写 SQL:

// 创建用户
const { success } = await env.DB.prepare(`
  INSERT INTO users (id, email, name, created_at)
  VALUES (?, ?, ?, ?)
`)
.bind(crypto.randomUUID(), email, name, Date.now())
.run();

// 查询
const user = await env.DB.prepare(`
  SELECT * FROM users WHERE email = ?
`)
.bind(email)
.first();

// 分页查询
const { results } = await env.DB.prepare(`
  SELECT * FROM posts ORDER BY created_at DESC LIMIT ? OFFSET ?
`)
.bind(limit, offset)
.all();

数据库迁移:

-- migrations/0001_init.sql
CREATE TABLE users (
  id TEXT PRIMARY KEY,
  email TEXT UNIQUE NOT NULL,
  name TEXT,
  created_at INTEGER NOT NULL
);

CREATE INDEX idx_users_email ON users(email);
# 执行迁移
wrangler d1 execute my-app-db --file ./migrations/0001_init.sql

# 本地开发用本地数据库
wrangler dev --local

D1 适合什么:

  • ✅ 用户数据、业务数据
  • ✅ 事务处理(支持 ACID)
  • ✅ 中等规模查询(百万级数据没问题)

D1 不适合什么:

  • ❌ 复杂 JOIN、复杂分析查询
  • ❌ 每秒上万次写入(免费额度够了,性能需要测)
  • ❌ 需要 PostgreSQL 高级特性的场景

如果 D1 不够用怎么办?Cloudflare 现在支持直接连接 Neon/Supabase 的 PostgreSQL,而且走私有网络,不走公网,延迟极低。

第四层:重任务处理 — 自有 VPS/容器

Workers 不是万能的。它有 CPU 时间限制(免费版 10ms,付费版 50ms),不适合跑重任务。

不适合放 Worker 的场景:

  • 图片/视频处理
  • PDF 生成
  • 大数据量运算
  • WebSocket 长连接(虽然 Workers 支持 Durable Objects,但复杂场景还是自己搭方便)
  • 长时间运行的爬虫
  • 需要本地文件系统的服务

解决方案:重任务放在自己的 VPS 上,Worker 通过 Cloudflare Tunnel(私有网络)访问后端。

用户 → Cloudflare → Worker → 私有网络 → 你的 VPS(公网不可见)

配置方法非常简单:

1. 在你的 VPS 上安装 cloudflared:

# 安装
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
dpkg -i cloudflared.deb

# 认证
cloudflared tunnel login

# 创建隧道
cloudflared tunnel create my-backend

2. 配置隧道:

# ~/.cloudflared/config.yml
tunnel: your-tunnel-id
credentials-file: /root/.cloudflared/your-tunnel-id.json

ingress:
  # 后端 API 服务跑在本地 8080
  - hostname: api-internal.yourdomain.com
    service: http://localhost:8080
  - 其他服务...
  - service: http_status:404

3. 在 Worker 里访问后端:

// Worker 里直接通过私有域名访问,走 Cloudflare 内部网络
async function processHeavyTask(taskData) {
  // 这个请求走 Cloudflare 私有网络,不经过公网,延迟极低
  const response = await fetch('https://api-internal.yourdomain.com/process', {
    method: 'POST',
    body: JSON.stringify(taskData),
    headers: { 'Content-Type': 'application/json' }
  });
  return response.json();
}

这个架构的美妙之处在于:

  1. 你的后端 VPS 不需要公网 IP,不需要开放端口,完全隐藏在 Cloudflare 后面
  2. 不需要配置防火墙,DDoS 攻击什么的 Cloudflare 全挡了
  3. Worker 到后端走 Cloudflare 私有网络,延迟比公网还低
  4. 后端挂了 Worker 还能做降级处理,用户体验好

异步任务怎么办?用 Cloudflare Queue!

如果重任务不需要同步返回,用 Cloudflare Queue 做异步队列:

// Producer (Worker):发送任务到队列
async function enqueueTask(taskData) {
  await env.QUEUE.send(taskData, {
    contentType: 'json'
  });
  return { status: 'queued' };
}

// Consumer (Worker):处理队列任务
export default {
  async queue(batch, env) {
    for (const message of batch.messages) {
      const task = message.body;
      // 调用后端处理
      await processHeavyTask(task);
      message.ack();
    }
  }
};

免费额度 100 万次/月,足够用了。

完整的端到端流程示例

以一个图片分享应用为例:

1. 用户上传图片
   ↓
2. Worker 接收请求,把图片原片存到 R2
   ↓
3. 发送消息到 Queue("有新图片需要处理")
   ↓
4. 给用户返回"上传成功"(用户不需要等处理完成)
   ↓
5. Queue Consumer 收到消息
   ↓
6. 消费者通过私有网络调用 VPS 上的图片处理服务
   ↓
7. VPS 生成缩略图、压缩、加水印,存回 R2
   ↓
8. 更新 D1 数据库,把图片状态改为"已处理"
   ↓
9. KV 缓存失效,下次访问时拿到新的缩略图

整个流程:

  • 前端:Cloudflare Pages
  • API:Workers
  • 队列:Queue
  • 存储:R2
  • 数据库:D1
  • 缓存:KV
  • 重任务:自有 VPS,通过 Tunnel 访问

用户感知: 上传秒返回,后台异步处理,体验流畅。 成本: 流量不大的话,0 元。

成本对比

算一笔账,这套架构 vs 传统云服务器架构:

组件 Cloudflare 方案成本 传统云方案成本(阿里云/AWS)
前端托管 $0 CDN + OSS ≈ $5-20/月
API 服务 $0(10万请求/天内) ECS + SLB ≈ $20-50/月
对象存储 $0(10GB 内,零流量费) OSS + CDN 流量 ≈ $10-100+/月(流量贵)
数据库 $0(5GB 内) RDS ≈ $30-100/月
KV/缓存 $0 Redis ≈ $20-50/月
重任务 VPS 一个最便宜的轻量服务器 ≈ $3-5/月 同上
总计 $3-5/月 $88-320+/月

这还不算运维成本——Cloudflare 这套架构你几乎不需要运维,数据库不用管备份,服务器不用管扩容,CDN 不用管配置。

坑点和避坑指南

Cloudflare 免费餐好吃,但有一些坑你需要知道:

1. Workers CPU 时间限制

免费版每个请求 CPU 时间只有 10ms,超过就被杀。注意是 CPU 时间不是等待时间,I/O 等待不算。所以如果你有很多并行 fetch,没问题,因为 await 的时候不占 CPU。

解决:

  • 能异步就异步,不要同步等
  • CPU 密集的任务扔给后端 VPS
  • 实在不行升级付费版($5/月),CPU 时间涨到 50ms

2. D1 的性能

D1 对于简单 CRUD 很快,但复杂查询性能一般。不要把 D1 当成数据仓库用。

解决:

  • 常用查询加缓存(KV)
  • 复杂统计查询定时算好结果存 KV
  • 真的需要复杂查询就用 Neon PostgreSQL(也可以接 Cloudflare 私有网络)

3. KV 的一致性

KV 是最终一致,写入后立即读可能读不到旧值。

解决:

  • 不存需要强一致的东西(比如用户余额)
  • 写入后先在内存里留一份,或者读的时候加个 short delay
  • 强一致需求用 D1

4. R2 没有原生目录列表

R2 是对象存储,没有原生的"列出目录下所有文件"功能,list 操作是按前缀的。

解决:

  • 文件索引存在 D1 里
  • 不要用 list 做生产逻辑

5. 冷启动问题

Workers 本身没有冷启动,但你绑定的服务(D1、R2)在长时间没请求后第一次请求会稍微慢一点(几百毫秒)。

解决:

  • 用 Cron Trigger 每小时打个心跳保活(免费版支持)
# wrangler.toml 加个定时任务保活
[triggers]
crons = ["0 * * * *"]
// Worker 里处理定时任务
async function scheduled(event, env) {
  // 简单访问一下各个服务,保持热状态
  await env.CACHE.get('health-check');
  await env.DB.prepare('SELECT 1').run();
}

什么时候该升级付费?

免费额度够你用到产品有几万月活。什么时候该花钱了?

  1. Workers 请求超过 10 万/天 — 升级 Workers Paid($5/月),变成 1000 万请求/月,CPU 时间 50ms
  2. D1 存储超过 5GB — 很便宜,1GB 才 $0.75/月
  3. R2 存储超过 10GB — 1GB $0.015/月,几乎等于白给
  4. 需要更高的可靠性和性能 — 升级 Paid 版有 SLA

满打满算,一个月活 10 万的产品,全套 Cloudflare 成本也就 $10-20,比单独买个服务器还便宜。

写在最后

Cloudflare 正在做一件很恐怖的事情:它在把整个互联网的基础设施层变成一个公共事业,就像水电一样——你用多少付多少,小用户免费用。

这套架构不是玩具,是真的可以跑生产的。很多几十万甚至百万用户的产品,现在就跑在这套免费/低价架构上。

技术人最大的自由之一,就是可以用极低的成本把想法变成产品。

以前你要做个产品,先得买服务器、配数据库、搭 CDN、搞负载均衡,折腾半天还没开始写业务代码。现在,你只需要专注写代码,剩下的 Cloudflare 帮你搞定,而且前几万用户免费。

这是最好的时代。去做你想做的东西吧。


参考资源

  1. Cloudflare Workers 官方文档https://developers.cloudflare.com/workers/ 最权威的参考,API 文档非常详细

  2. Cloudflare D1 文档https://developers.cloudflare.com/d1/ D1 数据库完整指南,包含 SQL 参考和最佳实践

  3. Cloudflare Tunnel 文档https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/ 私有网络连接后端的详细配置指南

  4. Awesome Cloudflare Workershttps://github.com/ardalanamini/awesome-cloudflare-workers GitHub 上的精选资源列表,包含大量开源项目和模板


作者: itech001 来源: 公众号:AI人工智能时代 网站: https://www.theaiera.cn/ 每日分享最前沿的AI新闻资讯和技术研究。

本文首发于 AI人工智能时代,转载请注明出处。

分享给朋友