Cloudflare 免费服务使用指南
Cloudflare 的免费套餐因其慷慨的额度,在开发者社区中常被戏称为“赛博大善人”,它提供的服务远不止基础的 CDN 加速。
Cloudflare 提供的免费服务

Cloudflare 免费层能覆盖的内容,按「值得用」排序:
| 优先级 | 用途 | 免费层是否够用 | 关键限制 |
| 1 | 域名 DNS 托管 + 免费 HTTPS | 完全够用 | 无实质限制 |
| 2 | CDN 缓存 + 基础 DDoS 防护 | 完全够用 | 无流量计费 |
| 3 | 静态站托管(Pages) | 完全够用 | 500 次构建/月 |
| 4 | 内网服务暴露(Tunnel + Access) | 完全够用 | 50 用户上限 |
| 5 | 域名邮箱转发(Email Routing) | 完全够用 | 只能转发,不能发信 |
| 6 | 反爬 / 验证码(Turnstile) | 完全够用 | 20 个 widget |
| 7 | 边缘 API(Workers) | 小流量够用 | 10 万请求/天、10ms CPU |
| 8 | 对象存储(R2) | 小文件量够用 | 10 GB 存储、零出口费 |
| 9 | 数据库(D1 + KV) | 原型够用 | 500 万行读/天 |
| 10 | AI 推理(Workers AI) | 只够试玩 | 1 万 Neurons/天 |
一句话判断标准: 只分发不计算,免费层几乎无限;一旦要算、要存、要实时,就会撞墙。
为什么值得用:免费层的底层逻辑
理解 Cloudflare 的定价哲学,比背额度表有用得多。
它把成本结构拆成两块:
| 成本类型 | 定价态度 | 原因 |
| 带宽 / 分发 / 连接 | 几乎免费送 | 边缘节点带宽边际成本极低,且流量能反哺网络规模 |
| CPU 时间 / 存储 / 写入 | 严格按量计费 | 这是真实的可变成本 |
这解释了为什么 Pages 敢写「无限带宽、无限请求」,而 Workers 只给 10 毫秒 CPU——带宽对它来说接近免费,CPU 不是。
对应的三条推论:
- 静态内容越重,越占便宜。图片站、文档站、博客、下载站放在这里,成本趋近于零。
- 动态逻辑越重,越容易付费。视频转码、爬虫、长任务、复杂数据库查询,很快就会越过免费线。
- 免费层的天花板由并发而非流量决定。1000 请求/分钟的突发限制,比每天 10 万次的总量更早撞上。
免费额度是硬限制。超出后请求直接失败并返回错误码(Workers 是 1015 / 1027),不是排队也不是降速。这意味着它适合个人站、演示、原型,不适合当作有 SLA 承诺的生产依赖。
免费产品地图
Cloudflare 免费层大致分五层。理解分层,就知道该在哪个位置放什么。
域名层:DNS + TLS + CDN + DDoS
| 能力 | 免费层说明 | 核实状态 |
| 权威 DNS | Anycast 全网解析,支持 API 与常见记录类型 | 已核实 |
| 免费 TLS 证书 | 自动签发、自动续期,覆盖根域与泛域名(泛域名需付费) | 已核实 |
| CDN 缓存 | 静态资源缓存、缓存规则、Cache Rules 基本能力 | 已核实 |
| DDoS 防护 | L3/L4 不限量清洗,L7 基础防护 | 已核实 |
| WAF | 自定义规则、免费托管规则集、IP 访问规则、UA 封禁 | 已核实 |
| 速率限制 | Free 计划 1 条规则 | 已核实 |
这一层是免费层的入口,也是性价比最高的一层。绝大多数人只需要做一件事:把域名 nameserver 改成 Cloudflare 的。
托管层:Pages + Workers
| 项目 | Workers Free | Pages Free |
| 请求 | 100,000 次/天(账号内所有脚本合计) | 静态请求不限量 |
| CPU 时间 | 10 ms / 次调用 | 静态资源无 CPU 消耗 |
| 突发限制 | 1,000 请求/分钟 | 静态资源不适用 |
| 脚本 / 项目数 | 最多 100 个 Worker 脚本 | 每账号 100 个项目 |
| 内存 | 每 isolate 128 MB | — |
| 构建 | — | 500 次/月,1 并发,单次超时 20 分钟 |
| 自定义域名 | 可用 | 每项目 100 个 |
| 站点文件数 | — | 20,000 个,单文件 ≤ 25 MiB |
| 日志 | 200,000 条/天 | — |
关键点:Pages 的静态资源请求不占用 Workers 配额;只有 Pages Functions 才计入 Workers 那 10 万次/天。
数据层:KV + D1 + R2 + Queues + Durable Objects
| 服务 | 免费额度 | 定位 | 核实状态 |
| Workers KV | 读 100,000/天、写 1,000/天、删除 1,000/天、列表 1,000/天、存储 1 GB | 配置、会话、读多写少的缓存 | 已核实 |
| D1 | 读 500 万行/天、写 100,000 行/天、总存储 5 GB | SQLite 兼容关系库 | 已核实 |
| R2 | 存储 10 GB-month/月、A 类操作 100 万/月、B 类操作 1000 万/月、出口流量免费 | 对象存储,对标 S3 | 已核实 |
| Queues | 10,000 次操作/天、消息保留 24 小时 | 异步任务、削峰 | 已核实 |
| Hyperdrive | 100,000 次数据库查询/天 | 加速访问外部 Postgres/MySQL | 已核实 |
| Durable Objects | 请求 100,000/天、时长 13,000 GB-s/天 | 有状态协作、WebSocket | 已核实 |
| Workflows | 步骤 3,000/天、存储 1 GB-month | 多步骤任务编排 | 已核实 |
三个容易踩的坑:
- D1 的「读 500 万行」是按扫描行数算,不是返回行数。一条没有索引的 SELECT * FROM t 在 5 万行的表上跑一次就是 5 万行读取,跑 100 次当天额度就没了。索引不是优化项,是配额保护。
- R2 的 10 GB 免费额度只适用于标准存储。低频访问存储不享受免费额度(官方明确写了 free tier only applies to Standard storage)。
- Queues 的免费额度实际比看上去小。一条消息完整走完要 3 次操作(写、读、删),1 万次/天大约只够 3000 条消息。
安全与身份层:Access + Tunnel + Turnstile
| 服务 | 免费额度 | 替代了什么 |
| Cloudflare Tunnel | 免费,隧道与路由不限量 | ngrok、frp、DDNS + 端口转发 |
| Zero Trust Access | 50 用户上限,永久免费 | VPN、跳板机、内网鉴权 |
| Gateway | DNS / HTTP 过滤,免费 | 企业 DNS 过滤 |
| Turnstile | 免费,20 个 widget,验证次数不限 | reCAPTCHA、hCaptcha |
| WARP 客户端 | 个人版免费 | 加密 DNS + 私网接入 |
Tunnel + Access 是免费层里最被低估的组合:它一次性干掉了动态 DNS、端口转发、Nginx 反代配置、certbot 证书续期这四件麻烦事,而且路由器上不需要开任何入站端口。
观测与效率层
| 服务 | 免费额度 |
| Web Analytics | 免费,无 Cookie、无指纹追踪 |
| Email Routing | 免费,域名邮箱转发 |
| Workers AI | 10,000 Neurons/天 |
| AI Gateway | 核心功能免费 |
| Registrar | 按成本价注册,无加价 |
| Vectorize | 口径存疑:文档中同时存在「需 Workers Paid」与部分 Free 行,不要作为稳定免费依赖 |
| Browser Rendering | 免费额度很小且口径不一,上线前需核对官方文档 |
Cloudflare的使用场景
场景一:把域名接入 Cloudflare(DNS + TLS + CDN)
这是所有后续操作的前提。根域名要挂 Pages、要开 Tunnel,都必须先让域名成为 Cloudflare 的一个 zone。
前置条件
- 一个已注册的域名,能修改 nameserver
- 一个 Cloudflare 账号(免费,不需要信用卡)
步骤
- 登录cloudflare.com,选择 Add a site,输入根域名。
- 选择 Free 计划。
- Cloudflare 会自动扫描现有 DNS 记录。这里要做的第一件事是核对扫描结果——自动扫描经常漏掉 MX、TXT、CNAME 记录。改 nameserver 之前,先把原 DNS 服务商的所有记录导出或截图留档。Cloudflare 自动扫描不是 100% 完整,漏一条 MX 记录就意味着域名邮箱立刻失效。
- 去域名注册商处,把 nameserver 改成 Cloudflare 分配的两个地址。
- 等待生效,通常几分钟到 24 小时。
- 进入 SSL/TLS,把加密模式设为 Full (strict)。如果源站没有有效证书,先用 Full,但不要用 Flexible。
- 进入 Speed → Optimization,开启 Brotli 与 Early Hints;Auto Minify 已被弃用,不需要设。
- 验证:
# 确认 nameserver 已切换 dig NS example.com +short # 确认解析走的是 Cloudflare dig A example.com +short # 确认证书与 HTTP 版本 curl -sI https://example.com | head -n 5
三个高频坑
| 现象 | 原因 | 处理 |
| 522 连接超时 | 源站没有放行 Cloudflare 回源 IP,或回源端口不通 | 放行官方 IP 段,确认 443 可达 |
| 无限重定向 | SSL 模式用 Flexible,源站又强制 HTTPS | 改为 Full (strict) |
| 邮件收不到 | 自动扫描漏了 MX 记录 | 手动补 MX,且必须保持 DNS only(灰云) |
橙色云(代理)与灰色云(仅 DNS)的区别要记住:邮件相关记录必须是灰云,否则收不到信。
场景二:静态站部署到 Pages
Pages 是免费层里最慷慨的产品:无限站点、无限席位、无限静态请求、无限带宽,只有 500 次/月的构建次数是硬限制。
三种部署方式对比
| 方式 | 适用场景 | 限制 |
| Git 集成 | 长期维护的项目 | 一次提交触发一次构建,消耗构建配额 |
| Wrangler CLI | 本地已有构建流程 | 需要 Node 环境,最灵活 |
| 拖拽上传 | 一次性静态页 | 最多 1000 个文件,不支持 functions/ 目录编译 |
方式一:Git 集成
- 进入 Workers & Pages → Create → Pages → Connect to Git。
- 授权 GitHub / GitLab,选择仓库。
- 配置构建参数:
| 字段 | 说明 |
| Project name | 决定 <name>.pages.dev 子域名 |
| Production branch | 一般为 main |
| Framework preset | 按框架选择,纯静态 HTML 选 None |
| Build command | 例如 npm run build |
| Build output directory | 例如 dist / out / public |
| Root directory | monorepo 必填 |
| Environment variables | 敏感配置与 NODE_VERSION |
- 保存并部署。之后每次 push 会自动构建,每个 PR 会生成独立的预览链接。
方式二:Wrangler CLI
npm install -g wrangler wrangler login npm run build wrangler pages project create my-site wrangler pages deploy dist
注意 wrangler pages deploy 消耗的是构建配额之外的直接上传通道,但仍受每站点 20,000 文件上限约束。
三个构建期陷阱
| 报错 | 根因 | 修复 |
| npm ci 直接失败 | lockfile 与 package.json 不同步 | 本地重跑 npm install 提交新 lockfile |
| Failed to load SWC binary for linux/x64 | macOS 生成的 lockfile 只含 darwin 平台可选依赖 | 在 Linux 环境重新生成 lockfile,或显式加 @next/swc-linux-x64-gnu 到 optionalDependencies |
| 修完依赖仍报同样错 | 构建缓存复用了旧的 node_modules | 加 postinstall 兜底,或关闭构建缓存 |
这三条都是同一个根源:构建发生在 Cloudflare 的 Linux 容器里,而你的 lockfile 是本地平台生成的。
不要用 <project>.pages.dev 裸域名面向国内用户。该域名段长期存在 DNS 污染与针对性阻断的社区实测反馈,属于不稳定而非完全不可用。绑自定义域名能明显改善,最稳的做法是前置一家国内可用的 CDN。
场景三:Tunnel + Access 暴露内网服务
替代方案是 DDNS + 端口转发 + Nginx 反代 + certbot 四件套。用 Cloudflare 只需要一条出站连接。
架构
本地服务 → cloudflared 出站连接 → Cloudflare 边缘 → 用户 路由器上不需要任何入站端口。
步骤
- 安装 cloudflared(Windows 用 winget 或直接下载 exe)。
- 登录并授权:cloudflared tunnel login
- 创建隧道:cloudflared tunnel create homelab
- 配置 DNS 路由:cloudflared tunnel route dns homelab nas.example.com
- 写配置文件yml:
tunnel: homelab
credentials-file: C:/Users/you/.cloudflared/<tunnel-id>.json
ingress:
- hostname: nas.example.com
service: http://localhost:5000
- hostname: grafana.example.com
service: http://localhost:3000
- service: http_status:404
- 前台验证:cloudflared tunnel run homelab
- 确认可访问后,注册为系统服务:cloudflared service install
加上 Access 鉴权
隧道本身只是把服务接上公网,任何知道域名的人都能访问,所以鉴权这一步不能省。
- 进入 Zero Trust → Access → Applications → Add an application → Self-hosted。
- 填入受保护的域名。
- 创建策略:Action 选 Allow,Include 选 Emails 或 GitHub 组织,填入允许的账号。
- 保存。免费层支持 50 个用户,个人和家庭场景完全够用。
验证方式:用未授权的浏览器或无痕窗口访问,应该被拦截到登录页。
注意点
- yml 里最后一条 service: http_status:404 是兜底规则,不能省,否则未匹配的 hostname 会报配置错误。
- 隧道服务运行在后台时,日志不会自动输出,排查问题先用前台模式跑。
- Access 的免费层日志保留期只有 24 小时。
场景四:免费域名邮箱(Email Routing)
免费层能把 [email protected] 转发到你的常用邮箱,但它不是邮箱托管——只能收,不能发。
步骤
- 进入 Email → Email Routing,点击启用。
- Cloudflare 会自动添加所需 MX 与 TXT(SPF)记录,确认添加即可。
- 添加目标邮箱,去该邮箱点击验证链接。
- 创建自定义地址:[email protected] → 转发到目标邮箱。
- 可选:启用 Catch-all 规则,把所有未匹配地址统一转发。
限制
| 项目 | 说明 |
| 发信 | 不支持,需要 SMTP 服务商 |
| 邮件内容 | Cloudflare 声明不存储、不访问邮件正文 |
| 已有 MX 记录 | 会冲突,启用前需确认没有现存的邮箱服务 |
如果需要在域名邮箱里回复,方案是转发到 Gmail 后在 Gmail 里添加「以别名发送」,需要该 SMTP 服务商(如 Zoho Mail 免费版)配合。
场景五:纯免费的全栈小应用
把 Workers + D1 + R2 组合起来,可以搭一个没有固定成本的小后端。
初始化
npm create cloudflare@latest my-api cd my-api wrangler d1 create my-db
绑定配置 wrangler.jsonc
{
"name": "my-api",
"main": "src/index.ts",
"compatibility_date": "2026-09-01",
"d1_databases": [
{ "binding": "DB", "database_name": "my-db", "database_id": "<上一步返回的 id>" }
],
"r2_buckets": [
{ "binding": "BUCKET", "bucket_name": "my-files" }
]
}
示例代码 src/index.ts
export interface Env {
DB: D1Database;
BUCKET: R2Bucket;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
if (url.pathname === "/items" && request.method === "GET") {
const { results } = await env.DB
.prepare("SELECT id, name FROM items WHERE id = ?1")
.bind(Number(url.searchParams.get("id")))
.all();
return Response.json(results);
}
if (url.pathname === "/upload" && request.method === "PUT") {
const key = crypto.randomUUID();
await env.BUCKET.put(key, request.body);
return Response.json({ key });
}
return new Response("Not Found", { status: 404 });
},
};
建表与部署
注意示例里 WHERE id = ?1 命中了主键,只读 1 行。如果换成无索引列的条件查询,读取行数会按扫描量暴涨,直接吃掉 D1 的每日配额。这是免费层里最容易被忽略的隐形消耗。
wrangler d1 execute my-db --remote --command \ "CREATE TABLE items (id INTEGER PRIMARY KEY, name TEXT NOT NULL);" wrangler d1 execute my-db --remote --command \ "CREATE INDEX idx_items_id ON items(id);" wrangler deploy
| 组件 | 免费额度 | 这个应用的实际消耗 |
| Workers 请求 | 10 万/天 | 按访问量计 |
| D1 读取 | 500 万行/天 | 命中索引时每查询 1 行 |
| D1 写入 | 10 万行/天 | 每次新增 1 行 |
| R2 存储 | 10 GB | 按文件大小计 |
| R2 出口 | 免费 | 下载不产生费用 |
只要按索引查询、上传文件控制在 10 GB 内、日请求低于 10 万次,这个应用的月成本是 0。
免费额度总表
| 类别 | 服务 | 免费额度 | 核实状态 |
| 域名 | DNS / TLS / DDoS | 无实质限制 | 已核实 |
| 域名 | Registrar | 成本价注册,无加价 | 已核实 |
| 托管 | Pages | 无限带宽、无限请求、500 构建/月、100 域名/项目 | 已核实 |
| 托管 | Workers | 10 万请求/天、10ms CPU、100 脚本 | 已核实 |
| 数据 | KV | 读 10 万/天、写 1000/天、1 GB | 已核实 |
| 数据 | D1 | 读 500 万行/天、写 10 万行/天、5 GB | 已核实 |
| 数据 | R2 | 10 GB-month、A 类 100 万/月、B 类 1000 万/月、出口免费 | 已核实 |
| 数据 | Queues | 10,000 操作/天、保留 24h | 已核实 |
| 数据 | Hyperdrive | 10 万查询/天 | 已核实 |
| 数据 | Durable Objects | 10 万请求/天、13,000 GB-s/天 | 已核实 |
| 数据 | Workflows | 3,000 步骤/天、1 GB-month | 已核实 |
| 安全 | WAF | 自定义规则 + 免费托管规则集 | 已核实 |
| 安全 | 速率限制 | 1 条规则 | 已核实 |
| 安全 | Turnstile | 20 widget,验证次数不限 | 已核实 |
| 安全 | Zero Trust Access | 50 用户 | 已核实 |
| 安全 | Tunnel | 隧道与路由不限量 | 已核实 |
| 观测 | Web Analytics | 免费 | 已核实 |
| 邮件 | Email Routing | 免费转发 | 已核实 |
| AI | Workers AI | 10,000 Neurons/天 | 已核实 |
| AI | Vectorize | 口径存在冲突,勿依赖 | 口径存疑 |
| AI | Browser Rendering | 免费额度小且口径不一 | 未核实 |
| 媒体 | Images / Stream | 不属于免费核心能力 | 已核实 |
风险与坑
免费层没有 SLA
免费计划不提供服务等级承诺,也没有工单支持通道。把关键业务押在免费层上,等于接受「可能突然不可用且无人负责」。
免费额度是硬中断
| 错误码 | 含义 | 表现 |
| 1015 | 触发突发速率限制 | 1000 请求/分钟以上,被拦截 |
| 1027 | Worker 因超日限额被暂停 | 路由默认 fail open(绕过 Worker),可改为 fail closed |
| 1016 | 源站 DNS 解析错误 | 回源域名解析失败 |
| 522 | 回源连接超时 | 源站未放行或端口不通 |
fail open 与 fail closed 的选择很关键:安全类 Worker(鉴权、校验)应该设成 fail closed,否则额度耗尽时请求会直接穿透到源站,等于安全策略失效。
CDN 代理非 HTML 内容有条款限制
Cloudflare 服务条款第 2.8 节限制用 CDN 代理大比例的流媒体与部分非 HTML 内容。个人博客、文档站、图片站没有风险,但把它当免费视频 CDN 用会违反条款。视频走 R2 或 Stream 是合规路径。
构建环境与本地环境不一致
前面提到的 lockfile 平台差异问题,本质是所有云端构建的通病。对策是锁定 NODE_VERSION、显式声明平台相关可选依赖、必要时关闭构建缓存。
新账号的隐性限制
新注册账号在最初一段时间创建项目可能受限(防滥用机制)。如果第一天就报错,通常不是配置问题,等一等即可。
国内访问不稳定
pages.dev 与 workers.dev 裸域名长期存在解析异常反馈。生产域名必须绑自定义域名,主要面向国内用户时建议前置国内可用的 CDN。
容易误判的免费项
以下几项常被当成免费能力,实际不是或口径不明:Images、Stream、Argo Smart Routing、Load Balancing、高级 Bot Management、Containers、Vectorize。规划架构时不要把它们算进免费方案。
什么时候该付那 5 美元
Workers Paid 是每月 5 美元,包含 1000 万请求、3000 万 CPU 毫秒、1000 万 KV 读取。判断标准很清晰:
| 信号 | 说明 |
| 日请求逼近 10 万 | 免费层没有弹性,超了直接 1027 |
| 单次任务 CPU 超 10ms | 免费层的 CPU 上限锁死了计算类任务 |
| 需要 Durable Objects 完整能力 | WebSocket 与有状态场景 |
| 需要有意义的技术支持 | 免费层只有社区论坛 |
| 业务不能接受无 SLA | 这是最实际的付费理由 |
反过来说,如果只是博客、文档站、家庭内网、小工具 API,免费层可以长期稳定运行,没有必须付费的理由。
参考资料
- Cloudflare 开发者平台定价:https://www.cloudflare.com/plans/developer-platform
- Workers 定价与限制:https://developers.cloudflare.com/workers/platform/pricing
- Workers 限制文档:https://developers.cloudflare.com/workers/platform/limits
- Pages 定价:https://pages.cloudflare.com
- R2 定价:https://developers.cloudflare.com/r2/pricing
- D1 产品页:https://www.cloudflare.com/developer-platform/products/d1
- Zero Trust 定价: https://www.cloudflare.com/plans/zero-trust-services