Cloudflare 工具地图:除了域名解析,剩下那 130 多个东西哪个跟你有关
不教你点哪个按钮。教你看到一个陌生的 Cloudflare 名词时,先判断它站在「一个请求的哪一段路上」,再决定要不要理它——以及知道免费层会在哪三个地方撞墙
📅 更新于 2026-09-16
本文校对于 2026-09-16 的额度快照 · 官方源:developers.cloudflare.com / cloudflare.com/plans(额度与价格变动频繁,复核方法见文末「来源与证据边界」)
0030 秒速览:三句话,然后决定你从哪一节开始
先说清这篇是什么。它不是一份功能清单,是一张地图。Cloudflare 官方产品目录里躺着约 135 个条目,配了 13 个分类标签(AI、Analytics、Application security、Developer platform、Storage……),但那个页面根本不告诉你哪个产品属于哪个分类——它只是一张按字母排的扁平清单。所以「这堆东西跟我有什么关系」这个问题,官方没有回答,得你自己建地图。
如果只记三句话
① Cloudflare 不是一堆并列的工具,是一段路。一个请求从「你在地址栏敲网址」到「看见页面」,中间有六段。每一段它都能插一手,每一段塞着几个产品。看懂这六段,你就有地方安放任何一个陌生名词了。
② 「它属于哪一段」比「它是干什么的」更重要。归错段,你就会去错面板、找错文档、问错人。而这两件事在 Cloudflare 里格外容易搞混——因为同一个词(比如「Workers」)会横跨好几段。
③ 免费层是真的能用,但它有三类硬墙,性质完全不同:「条数上限」(WAF 只能写 5 条规则、限流只有 1 条)、「每日配额」(D1 每天 500 万行读,按扫描行数算)、「要绑付款方式才给你开」(R2、Containers)。撞上前两类是报错,不是限速;第三类是你连门都进不去。
如果你只有 5 分钟:跑通这一条
本篇是地图,理论上不需要你动手。但有一条命令,能让你在 5 分钟内亲眼看见「Cloudflare 在替我干活」是什么感觉——不用注册、不用有域名、不用绑卡:
# 装一个叫 cloudflared 的小程序(macOS)
brew install cloudflared
# 假设你本机 8080 端口上已经跑着个东西(随便什么都行)
cloudflared tunnel --url http://localhost:8080
# 终端会打印一行 https://随机词.trycloudflare.com
# 把这个地址发给自己手机 —— 只要能上网,就能打开你电脑上的服务
这叫快速隧道(Quick Tunnel)。它的工作原理是:你电脑上的 cloudflared 主动向 Cloudflare 架一条只出不进的加密连线,Cloudflare 再把外网的请求顺着这条线送回来。所以你的路由器一个端口都不用开,也不需要公网 IP。
官方写明它「仅供测试和开发」。硬限制是同时最多 200 个在途请求(超了返回 HTTP 429)、不支持 SSE(服务器推送事件,一种让服务器持续往浏览器推数据的技术)、不承诺任何可用性。而且它给的域名每次重启都变。正式用要建「具名隧道」,见 第 5 段 · 回连。
本文的额度数字,你可以自己复核
这篇里出现了几十个数字(免费额度、价格、上限),而它们是会变的。我把这篇标成了时效性最强的一档,并且每个数字都附了官方出处。你想自己核,走这两步:
# 第 1 步:看 Cloudflare 官方计划对比页(已拆成三份)
open https://www.cloudflare.com/plans/
# 第 2 步:查某个产品的准确上限(把 workers 换成 r2 / d1 / kv / pages)
open https://developers.cloudflare.com/workers/platform/limits/
open https://developers.cloudflare.com/workers/platform/pricing/
规律是:「能干什么」看 /limits/,「多少钱、多少额度」看 /pricing/。这两页有时候口径不一致——本篇文末列了三处我实测到的官方自相矛盾,你可以直接去看那三处。
01一个请求的六段路:全篇的骨架
从「你知道的东西」开始:一个陌生人来你家
你已经会的那半件事,其实就是一个完整故事的开头:你租了个门牌号(域名),去物业登了记(域名解析),告诉别人「来这个门牌号找我」。但一个访客真的走过来,中间要经过的关卡远不止「找到门牌号」这一件。
Cloudflare 的位置,可以理解成在这条路上的六个地方设了岗。下表的六段,就是本篇的全部骨架:
| 段 | 它在解决什么问题 | 代表产品 | 你大概会不会用到 |
|---|---|---|---|
| 0 · 找路 | 别人怎么把你那个域名,变成一个能连上的地址 | DNS、代理开关(小黄云)、SSL 证书 | 你已经会用。但有三件事你可能不知道 |
| 1 · 设卡 | 谁可以进来,谁被拦下 | WAF、限流、Turnstile、Zero Trust Access、DDoS 防护 | 有个公开站点就迟早要碰 |
| 2 · 抄近道 | 同一份东西被要了 100 次,怎么只做一次 | Cache Rules、CDN 缓存 | 站上有图片、样式表就会碰到 |
| 3 · 现做 | 没有现成的,谁来现算 | Workers、Pages、Durable Objects、Containers、Workers AI | 想跑自己的代码就必碰 |
| 4 · 取料 | 算出来的东西存哪、下次去哪拿 | R2、D1、KV、Queues、Vectorize | 要存用户数据就必碰 |
| 5 · 回连 | 你的东西在你自己家/公司,怎么接上来 | Cloudflare Tunnel、Zero Trust | 想让别人访问你本机的东西时用 |
另有一条不走网页的入口,单独成一节:信箱(Email Routing)。
这个「六段路」的比喻,到哪里就不准了
按风格要求,类比必须自己说清边界。这个比喻在两处会骗你:
- 它暗示「Cloudflare 只是个门房」,实际上它已经把仓库和车间都搬进来了。在真实架构里,很多站点的页面根本不在你家——它们就住在 Cloudflare 的机房(第 2 段和第 3 段)。你的服务器可能一次都没被碰到。所以「请求走到你家门口」这个画面,对静态站是错的。
- 「设卡」和「抄近道」不是先后关系,是同一次判断的两面。真实顺序是:请求一到 Cloudflare,它先看「这东西我这儿有现成的吗」,有就直接给(第 2 段);没有,再看「这请求该不该放行」(第 1 段),然后才谈现算(第 3 段)。我把设卡排在前面讲,只是因为它更好懂——不是因为线上是这个顺序。
为什么非得先分层,不能直接背产品名
因为 Cloudflare 的产品名不携带它属于哪一层的信息。看这三组:
Pages 和 Workers——听起来一个是「页面」一个是「干活的人」,像是两种不同的东西。实际上它们在架构上是同一套东西的两种包装。
KV、D1、R2——三个都像「存东西的」,但一个只能存配置、一个能跑 SQL、一个能存 5 GB 的视频。
Zero Trust 和 Access——一个是产品线名,一个是产品线里的一个功能,但官网导航里两个都做成大入口。
Pages 和 Workers 都在第 3 段 · 现做。差别只是「代码是你写的,还是构建工具帮你生成的」。
KV、D1、R2 都在第 4 段 · 取料。差别是「存什么形状的数据」——配置、表、文件。
Zero Trust 是一条产品线的名字,Access 是这条线里的登录墙,Tunnel 是这条线里的地道。三个都归第 1 段和第 5 段。
接下来的六节,一节讲一段。每节的写法都一样:这段解决什么问题 → 里面有哪些产品 → 免费层在这里能给你什么、会在哪撞墙 → 你能复制去跑的东西。
02第 0 段 · 找路:你会的那一半,以及你不知道的三件事
这一段你已经在用了。所以我不重讲「怎么加一条 A 记录」,只讲三件大多数人加了三年解析也没搞明白的事。
第一件:那个橙色小云(代理开关),到底改了什么
DNS 记录后面那个小云图标,官方叫代理状态(Proxy status)。点成橙色(Proxied)和点成灰色(DNS only),是你在这个面板上能做的最重大的一个决定,远比填对 IP 重要。
| 状态 | 查询你域名时,对方拿到什么 | 后果 · 什么时候别这么设 |
|---|---|---|
| 灰色 · 仅 DNS | 拿到你填的那个真实 IP | 对方直接连你的服务器。Cloudflare 只是个查号台,看不到流量,也就无法设卡、无法抄近道。你要暴露真实 IP、或你跑的是非 HTTP 服务(如游戏服务器),就用这个 |
| 橙色 · 已代理 | 拿到一个 Cloudflare 的机房 IP | 流量先到 Cloudflare,第 1~5 段才可能介入。**代价**:它只认 HTTP/HTTPS 这一类网页流量 |
官方明确规定:只有 A、AAAA、CNAME 这三种能开代理。其他类型——包括 MX(邮件)、TXT(域名验证)——永远只能是灰色。所以你看到自己的 MX 记录旁边没有云朵图标,不是你点错了,是设计如此。
(A 记录存的是 IPv4 地址,AAAA 存 IPv6 地址,CNAME 存的是「另一个域名」而不是地址。这三个是能找到「一个具体机器」的类型,所以代理才有意义。)
第二件:为什么你的 CNAME 查出来是个 Cloudflare 的 IP
开代理时,Cloudflare 会对 CNAME 记录做一件事叫展平(flattening)。按官方文档:被代理的 CNAME 默认会被展平,DNS 查询返回的不是「它指向的那个域名」,而是 Cloudflare 自己的任播 IP。
(「任播」是指同一个 IP 在全球很多机房同时存在,网络会自动把你送到最近的那个。这就是 Cloudflare 能「就近接入」的物理基础。)
所以你自己 dig 一下,看到返回的是 104.x 或 172.6x 开头的地址,这是对的,不是解析错了:
# 查自己的域名,看返回的是你自己的服务器 IP,还是 Cloudflare 的
dig +short example.com
# 开代理 → 返回 104.x / 172.6x 之类的 Cloudflare 地址(正常)
# 没开代理 → 返回你自己填的那个 IP
# 想看完整链路(CNAME 指向谁、经过几跳)
dig example.com +noall +answer
第三件:免费版的 DNS 记录条数,比你以为的少
流传最广的说法是「免费版能加 3,500 条记录」。这是错的,3,500 是 Pro 和 Business 的额度。官方现行规定是按你创建这个域名的时间切成两档:
| 你的域名何时加进 Cloudflare | 免费版每域名记录上限 |
|---|---|
| 2024-09-01 00:00 UTC 之前 | 1,000 条 |
| 2024-09-01 00:00 UTC 及之后(含所有新域名) | 200 条 |
200 条对个人站绰绰有余,但有两件事要注意:一是其他服务自动建的记录也计入(比如你开了 Email Routing,它自动加的 MX 和 TXT 也占额度);二是这个数字在官方文档里出现过一次「3,500」,那是批量修改记录时的单次条数上限(Free 是 200),跟记录总量是两码事——网上很多文章就是从这里抄错的。
顺带说清:SSL 证书你不用管,但有两个边界
你域名加进来那天,Cloudflare 就送了你一张叫 Universal SSL 的证书,它免费、自动签发、自动续期,全计划都有。你不用买、不用配、不用记得续。
在往下走之前,先统一两个后面会反复出现的词:「源站」就是你自己那台服务器(你现在放在某家云上的那台也算);「边缘」是 Cloudflare 铺在全球、离用户最近的那一圈机房。本文后面说「回源」「边缘节点」,指的都是这两头。
Universal SSL 有两个边界值得知道:
- 它只覆盖根域名和第一级子域。也就是
example.com和www.example.com有证书;a.b.example.com这种更深层级没有,要另外开 Total TLS(付费功能)。这是很多人「子域名打不开 https」的真正原因。
另一个是加密模式。这个设置决定了「访客到 Cloudflare」和「Cloudflare 到你的服务器」这两段各自的加密强度,一共五个选项:
| 模式 | 访客 → Cloudflare | Cloudflare → 你的服务器 | 什么时候用 |
|---|---|---|---|
| Off | 明文 | 明文 | 基本别用 |
| Flexible | 加密 | 明文 | 你的源站根本没证书时的将就方案。**这一段是裸奔的** |
| Full | 加密 | 加密,但**不验证**你证书是不是真的 | 源站用了自签证书 |
| Full (strict) | 加密 | 加密 + 验证证书 | 源站有正经证书时选这个 |
| Strict (SSL-Only Origin Pull) | 忽略访客用什么 | 始终 HTTPS + 验证 | 只允许加密回源 |
好消息是:Cloudflare 现在默认开着 Automatic SSL/TLS,它会自己测你的源站支持到哪一档、自动选、自动灰度切换(先放 1% 流量试,没问题再逐级加到 10%…),失败会自动回滚。而且它承诺不会往更弱的模式降级。所以这个设置你大概率不用动。
03第 1 段 · 设卡:谁可以进来,谁被拦下
这一段解决的是「这个请求该不该放行」。里面的产品差别很大,因为它们拦的是不同的东西——有的拦机器,有的拦人,有的拦频率。
先把四种「拦」分清楚
| 产品 | 它拦的是什么 | 免费额度 | 什么时候用 · 什么时候别用 |
|---|---|---|---|
| DDoS 防护 | 海量垃圾流量(把你带宽打满那种) | 默认开启,无需配置 | 不用管它。有人打你,它自动生效 |
| WAF(Web 应用防火墙) | 按你写的规则拦特定请求 | 自定义规则 5 条 | 要写规则时用。5 条要省着花——这是本段最紧的墙 |
| 限流(Rate Limiting) | 同一个来源来得太频繁 | 只有 1 条,且只能按 IP 计数、周期固定 10 秒 | 防刷接口时用。免费版限制极死,别指望它精细 |
| Turnstile | 真人 vs 机器人 | 免费,挑战次数不限,但只给 20 个组件/账号 | 有表单、有登录时用。它是 reCAPTCHA 的替代品,但不弹红绿灯 |
| Zero Trust Access | 要求访问者证明身份(邮箱验证码 / 单点登录) | 免费版最多 50 个用户 | 你自己的后台、内部工具用。公开站点别用——它会把所有访客挡在门外 |
WAF 那 5 条规则怎么花:先搞清楚免费版到底给你什么
关于 WAF,网上有个流传很广的说法是「托管规则集要 Pro 起」。这个说法现在只对了一半:
- 免费给你的:
Cloudflare Free Managed Ruleset——一套官方维护的、针对已知漏洞的通用规则,全计划可用,你不用写。 - 要 Pro 才有:
Cloudflare Managed Ruleset和OWASP Core Ruleset——这两个是更完整的两套。官方计划表里 Free 那一列明确写着 No。 - 你自己写的:5 条。官方计数器是「
http_request_firewall_custom阶段总量」,免费版还只能有 1 个 zone 级的自定义规则集。
5 条怎么花?一个经过验证的花法是这样分配——每条都写成界面里能填的表达式:
# 规则 1:挡住扫描常见漏洞路径的机器人(这不是真的 WordPress,它在瞎猜)
(http.request.uri.path contains "/wp-admin") or
(http.request.uri.path contains "/.env") or
(http.request.uri.path contains "/.git/")
# 规则 2:只允许你自己的国家/地区访问管理后台
(http.request.uri.path contains "/admin") and (ip.geoip.country ne "CN")
# 规则 3:挡住已知的坏 User-Agent(User-Agent 就是浏览器自报家门的名字)
(http.user_agent contains "sqlmap") or (http.user_agent contains "nikto")
# 规则 4:挡住 Referer 为空的、直接打 API 的请求
# (Referer 是浏览器告诉服务器「我是从哪个页面跳过来的」)
(http.request.uri.path contains "/api/") and not (http.referer contains "example.com")
# 规则 5:留给你的业务特例,先空着 —— 这才是最该留的那一条
限流只有 1 条,而且它比你想的笨
免费版的限流规则被砍得很厉害,值得单独说,因为很多人以为它能干很多事:
| 能力 | 免费版 | 付费版 |
|---|---|---|
| 能建几条规则 | 1 | Pro 2 条、Business 5 条、Enterprise 100 条 |
| 能按什么匹配 | 只有 Path 和 Verified Bot 两个字段 | 完整表达式 |
| 按什么计数 | 只能按 IP | 可自定义(Cookie、Header、令牌…) |
| 计数周期 | 固定 10 秒,改不了 | 可配 |
| 动作 | 只能「进入缓解期后一律拦住」 | 可只拦超出配额的那部分 |
所以免费版这唯一一条,最划算的用法是守住你最贵的那个接口——比如登录接口或发短信接口,别浪费在首页上:
# 路径匹配 /api/login,同一 IP 10 秒内超过 20 次就拦
# 匹配字段:Path 等于 /api/login
# 特征:IP;阈值:20 次 / 10 秒;动作:Block
它们都能拦请求,但入口不同:WAF 在 Security → WAF,限流在 Security → WAF → Rate limiting rules,而更早的「Security Level」「Under Attack Mode」在 Security → Settings。一个请求会按固定顺序依次经过这些检查,所以「我分明拦了它怎么还进来了」这类问题,第一件事是去确认它在哪一关被放过了。
Turnstile:把「证明你是人」这件事,从用户身上挪走
你对「人机验证」的印象大概来自 reCAPTCHA——让你在九宫格里找红绿灯。Turnstile 的设计目标是让你什么都看不见:它在页面加载时在后台跑几项检查(浏览器行为、环境指纹等),大部分真人直接放行,不弹任何东西。
它的免费额度有一个反直觉的点,值得专门记住:
| 指标 | 免费版 | 说明 |
|---|---|---|
| 验证次数 | 不限 | 官方原文是 Unlimited challenges。很多旧文写的「每月 100 万次」已经过期 |
| 组件数量 | 20 个 / 账号 | 这才是真正的墙。一个站点放一个组件,20 个够用;多站点、多环境就要数着来 |
| 每个组件绑的域名 | 10 个 | 测试站 + 正式站 + 预览域名,很容易用满 |
| 分析数据 | 回溯 7 天 | 要看更久要 Enterprise |
用法上,它需要前端和后端配合——前端拿一个令牌(token),后端把令牌送去 Cloudflare 验证真伪。只放前端等于没放,因为攻击者可以跳过你的页面直接打接口:
<!-- 前端:把组件放在表单里,它会自动往表单塞一个隐藏字段 -->
<form action="/api/comment" method="POST">
<textarea name="body"></textarea>
<div class="cf-turnstile" data-sitekey="你的站点密钥"></div>
<button>提交</button>
</form>
<!-- 注意:Turnstile 的加载脚本由 Cloudflare 提供,
它是页面上的第三方脚本,与本站「零外部脚本」的规则无关,属正常用法 -->
后端那一步在 具体场景一节里给出完整写法。
Zero Trust Access:给「自己人」开的门,不是给公众开的
这东西最容易被误解。它的作用是:在请求到达你的服务之前,先要求访问者证明自己是谁——通常是输入邮箱,收到一个 6 位验证码,填对了才放行。
关键是别对公开站点用。它的正确场景是「这个东西只有我和我同事该看」:内部后台、自建的监控面板、测试环境、NAS 的管理界面。
| 免费版 Zero Trust 给你的 | 数字 / 边界 |
|---|---|
| 最多几个用户 | 50 个(这个数字来自 Cloudflare 产品页,开发者文档里没写) |
| 日志保留多久 | 只有 24 小时——这是最容易踩的坑,出事第二天来查就没了 |
| 技术支持 | 只有社区论坛和一个 Discord,没有工单 |
| 免费的登录方式 | 邮箱验证码、一次性 PIN、以及你自带的 Google / GitHub 登录 |
如果访问方是程序而不是人(比如你另一个脚本要调这个接口),邮箱验证码就走不通了,这时要用服务令牌——本质上是一对 ID + 密钥,放进请求头:
# 在 Zero Trust → Access → Service Auth 建一对令牌,然后这样调
curl https://内部工具.example.com/api/status \
-H "CF-Access-Client-Id: 你的ID.access" \
-H "CF-Access-Client-Secret: 你的密钥"
04第 2 段 · 抄近道:有现成的就别重做
这一段只有一个概念,但它解释了你遇到的一半「我改了,线上还是旧的」问题。
「缓存」就是「把做好的东西先放一份在离用户近的地方」
你的网站首页对每个访客都长一样。既然一样,就没必要每个人都回你服务器重新生成一遍——Cloudflare 在全球机房里存一份,谁要就直接从最近的机房给。这就是 CDN(内容分发网络)的全部意思。
中间那段「要不要用缓存」的判断,由缓存规则(Cache Rules)控制。你在面板里写的每条规则,本质上都在回答一句话:这个路径下的东西,能不能存、存多久。
免费版能写 10 条缓存规则
这个额度比 WAF 的 5 条宽松,而且缓存规则本身是全计划都有的功能,不需要额外付费——只要你的域名开着代理(小黄云)。
| 计划 | 缓存规则条数 |
|---|---|
| Free | 10 |
| Pro | 25 |
| Business | 50 |
| Enterprise | 300 |
一条典型规则——「把 /img/ 下的图片缓存一年」——在界面里是这样填的:
# 缓存规则:给图片和字体设长期缓存
当传入请求匹配时: URI 路径 包含 /img/ 或 /fonts/
则:
· 缓存资格 (Cache eligibility) → 符合条件 (Eligible for cache)
· 边缘 TTL (Edge TTL) → 覆盖原始值 → 1 年
· 浏览器 TTL (Browser TTL) → 覆盖原始值 → 1 年
TTL 是「这份缓存算数多久」。边缘 TTL = Cloudflare 机房存多久;浏览器 TTL = 访客自己的电脑存多久。浏览器 TTL 设长了,你改了文件,老访客要等很久才看到新版——所以它该用在「内容不会变」的路径上(图片、字体、带哈希值的文件名),别用在 HTML 上。
「我改了,线上还是旧的」——按这个顺序查
curl -I https://你的域名,看返回头里有没有 cf-cache-status 这一行。没有,说明这条记录没开代理,或者你查的是没走 CDN 的路径。
cf-cache-status 的值HIT = 用的是缓存(所以你看到旧的);MISS = 缓存里没有,回源拿了新的(「回源」就是回到你的源站去取);DYNAMIC = 这条路径根本没进缓存。
面板 Caching → Configuration → Purge Cache。可以清全部,也可以只清某个 URL——先试只清那一个 URL,清全部会让下一个访客变慢。
# 一条命令看到缓存状态和 TTL,比在面板里翻快得多
curl -sI https://你的域名/某个文件 | grep -iE "cf-cache-status|age|cache-control"
这是流传最广的一条说法,但我去翻官方计划对比页时,免费版那一列对 CDN 只写了「Included」,没有出现任何带宽数字,也没有出现「unlimited」这个词。我唯一找到相近表述的地方是官方营销页(且只有部分语言版本),文档站里没有。所以准确的说法是:官方未公布免费版的带宽上限。这不影响你用,但它不等于官方承诺了「不限」——尤其免费版是没有任何可用性承诺的(见下一节的最后一栏)。
05第 3 段 · 现做:没有现成的,谁来现算
这是 Cloudflare 这些年变化最大的一段,也是最容易让人误解的一段——因为这里的每个东西看起来都像「一台服务器」,而它们都不是。
先破一个最贵的误解:Workers 不是 Node.js
这是新手踩得最惨的一脚。你以为「我会写 JavaScript,那我把代码放上去就行」——然后发现 fs.readFile 不存在、很多 npm 包装不上。
你会去找「怎么装依赖」「怎么开一个长期运行的进程」「怎么做定时任务」。你会发现这些问题的答案在 Cloudflare 上长得完全不一样,甚至有些根本没有答案。
它跑在一种叫 isolate 的轻量沙箱里(V8 是 Chrome 浏览器里跑 JavaScript 的那个引擎;isolate 是它的一个隔离实例,理解成「一个随时能起、用完就扔的迷你运行环境」)。它遵循的是网页标准(fetch、Request、Response 这些浏览器里就有的东西),不是 Node 的那套文件、进程 API。
没有「服务器」这个概念,所以也没有「服务器关机了/重启了」这回事。代码只在有请求时运行。
这个设计的直接后果是:
- 启动几乎零延迟——没有传统云函数那个「冷启动」问题(函数很久没人用,下次调用得先把运行环境启动起来,那一下会明显变慢),因为 isolate 启动的成本极低。
- CPU 时间被卡得很死。免费版每次调用只有 10 毫秒的 CPU 时间。注意是 CPU 时间不是墙上时间——你在等网络返回的 500 毫秒不算,但你真的在算的那 10 毫秒算。所以视频转码、图片压缩、大循环,这些都不该放这儿。
- 它不能装 Docker 镜像。想要真正的容器,得用 Containers,那是另一个产品,且没有免费额度。
这一段有五个东西,用一句话分开它们
| 产品 | 一句话 | 免费额度 | 什么时候用它 |
|---|---|---|---|
| Workers | 你自己写的一段代码,来请求就跑 | 10 万请求/天,每次 10 ms CPU,最多 100 个 | 接口、代理、重定向、藏密钥 |
| Pages | 静态网站托管,连上 Git 仓库就自动部署 | 500 次构建/月,静态请求不计入 Workers 配额 | 博客、文档站、纯前端应用 |
| Durable Objects | 有「唯一身份」和持久存储的小进程 | 有,但免费版只能用 SQLite 后端 | 聊天室、协作编辑、需要串行处理的场景 |
| Containers | 真正的容器,能跑 Docker 镜像 | 没有免费额度,必须先开 $5/月付费版 | 需要完整 Linux 环境时 |
| Workers AI | 在 Cloudflare 上直接跑开源大模型 | 每天 10,000 Neurons(神经元,它的计费单位) | 摘要、翻译、轻量分类 |
Workers 与 Pages 的关系,比你以为的近
它们看起来是两个产品,实际上Pages 的函数部分就是跑在 Workers 上的。真正的分界只有一句话:
代码是你手写的,用 Workers;代码是构建工具生成的,用 Pages。
你写 React / Vue / Astro,产出一堆 HTML、CSS、JS 文件——这是「构建工具生成的」,用 Pages,它帮你处理构建、部署、预览环境。你要写一个「接收 POST 请求、查一下数据库、返回 JSON」的接口——这是你手写的,用 Workers。
顺带说:静态资源请求在两者上都是免费不限量的(官方原文 "requests to static assets are free and unlimited")。只有 Pages Functions 的请求才计入 Workers 的每日配额。
上手:三条命令跑通第一个 Worker
# 1. 建项目(它会问你几个问题,选最简单的模板即可)
npm create cloudflare@latest my-worker
# 2. 进去看这个文件 —— 这就是一个完整的 Worker
# src/index.js 内容如下:
export default {
async fetch(request) {
return new Response("你好,这是从 Cloudflare 边缘返回的");
},
};
# 3. 本地预览 → 部署上线
npx wrangler dev # 打开 http://localhost:8787 看效果
npx wrangler deploy # 部署,会给你一个 xxx.workers.dev 地址
那个 async fetch(request) 是整个模型的全部:每个进来的请求,都会调用一次这个函数,你返回什么,访客就收到什么。没有路由注册、没有端口监听、没有启动流程。
你的项目.workers.dev 是送你的测试域名,但它在中国大陆的可达性一直有问题(原因见文末证据边界)。正式上线一定要绑自己的域名——在 wrangler.toml 里加一段路由即可:
# wrangler.toml
name = "my-worker"
main = "src/index.js"
compatibility_date = "2026-09-16"
routes = [
{ pattern = "api.example.com/*", custom_domain = true }
]
Pages:连上仓库,然后你就再也不用管部署了
# 方式一:连 GitHub 仓库(推荐,以后 push 就自动部署)
# 面板 → Workers & Pages → Create → Pages → Connect to Git
# 填:构建命令 npm run build / 输出目录 dist
# 方式二:命令行直接传(适合本地一次性发布)
npm run build
npx wrangler pages deploy dist
Pages 免费版有一个不显眼但会咬人的限制:每个账号 100 个项目,而且官方明确写了这个上限「不会例行提高」。另外官方营销页写的是「无限站点」——这两处是矛盾的,见文末。
Workers AI:免费额度怎么算,以及第一批该用哪几个模型
它的免费额度单位叫 Neuron(神经元),每天 10,000 个。这个单位反直觉的地方在于:它不是「次数」——不同模型每次调用消耗的 Neuron 数不一样,大模型贵、小模型便宜。所以「每天能做多少次」没有统一答案。
绑定和调用长这样:
# wrangler.toml 里加一个绑定
[ai]
binding = "AI"
# 然后在 Worker 里直接调
export default {
async fetch(request, env) {
const answer = await env.AI.run(
"@cf/meta/llama-3.1-8b-instruct",
{ prompt: "用一句话解释什么是 CDN" }
);
return Response.json(answer);
},
};
官方现在明确了一批「前沿模型」(包括 @cf/moonshotai/kimi-k2.6、@cf/zai-org/glm-5.2 / glm-5.3、@cf/deepseek-ai/deepseek-v4-flash-0731 等),必须开通 Workers 付费版或通过 AI Gateway 预付额度才能调用。免费版能用的仍然是 llama 这一类开源小模型。挑模型前先看官方定价页上那张按模型的 Neuron 单价表。
06第 4 段 · 取料:算出来的东西存哪
这一段有四个产品,全都长得像「数据库」,但它们的差别是形状的差别,不是档次的差别。选错形状,你会拧巴很久。
用一个类比分开它们:柜子、账本、仓库、传送带
| 产品 | 类比 | 实际存什么形状 | 免费额度 |
|---|---|---|---|
| KV | 门口的钥匙柜:一格一把钥匙,拿得快,但你不能问「哪些是铜的钥匙」 | 键值对(一个名字 → 一段数据) | 10 万次读/天、1,000 次写/天、1 GB |
| D1 | 账本:能按条件查、能算总数、能建索引 | 关系型表(就是 SQLite) | 5 GB、500 万行读/天、10 万行写/天 |
| R2 | 仓库:存大件,取货不要钱 | 文件 / 对象(图片、视频、备份) | 10 GB,出站流量永不收费 |
| Queues | 传送带:把活儿从快的地方送到慢的地方 | 待处理的消息队列 | 10,000 次操作/天,消息只留 24 小时 |
这个类比的边界:它给不了你「性能」这一维。真实世界里 KV 是最终一致的(改完要过一会儿别处才看得到,下面细说),D1 是强一致的(改完立刻所有人都看得到),它们的取舍一半在形状、一半在一致性,而类比只讲了形状。
KV 最容易被误用,因为它叫「数据库」
KV 的官方定位写得很直白:它靠「最终一致」来换取高性能。这句话翻译成人话是:
- 你在某个地方改了一个值,那个改动所在位置的 Cloudflare 机房通常立刻能看到;
- 但世界上其他机房可能要等最多 60 秒甚至更久才能看到新值。官方原文还特意补了一句:前一句那种「通常立刻可见」不保证,不建议依赖;
- 还有一条更隐蔽的:「这个键不存在」这个结论也会被缓存。你新建了一个键,别的地方可能还在拿着「它不存在」的旧结论。
① 同一个键,1 秒只能写 1 次。免费版付费版都一样。要高频更新同一个键,KV 就是错的工具(该用 Durable Objects)。
② 查一个不存在的键也要计费。官方明确:返回 null 或 404 的读取同样计入额度。
③ 它不是缓存,但它可以当缓存用。正确用途是:站点配置、功能开关、一小段会话数据——读多写少、能容忍几秒延迟的东西。
# 建一个命名空间,拿到 ID 填进 wrangler.toml
npx wrangler kv namespace create MY_KV
[[kv_namespaces]]
binding = "MY_KV"
id = "刚才拿到的ID"
# 在 Worker 里读写(注意:put 是异步生效的)
await env.MY_KV.put("site:banner", "双十一活动", { expirationTtl: 86400 });
const banner = await env.MY_KV.get("site:banner"); // 读不到就是 null
D1:那个「按扫描行数计费」的坑,是本篇最值钱的一条
D1 免费版每天给 500 万行读。看到这个数字,你大概会想「够我用十年」。但它的计数方式决定了这个数字可能一夜之间用完:
"Rows read measure how many rows a query reads (scans), regardless of the size of each row."
翻译过来:行读数的计量单位是「查询扫描了多少行」,不是你最终返回了多少行。
先把「索引」这个词定住:索引就是数据库的目录。一本书没有目录,你要找一个词只能一页页从头翻;数据库没有索引,它也只能一行行从头扫。
于是坑就来了:一张有 5 万行的表,你写 SELECT * FROM users WHERE email = '...' 却忘了给 email 建索引,这一次查询就计 5 万行读——哪怕它只返回了 1 行。这样查 100 次,当天的免费额度就没了。
所以索引在这套体系里不只是「性能优化」,它是「额度保护」。这是 D1 和传统数据库在直觉上最不一样的地方。
# 建库(会返回一个 database_id,填进 wrangler.toml)
npx wrangler d1 create my-db
# 建表 + 建索引 —— 索引这一步千万别省
npx wrangler d1 execute my-db --remote --command \
"CREATE TABLE users (id INTEGER PRIMARY KEY, email TEXT, created_at TEXT);"
npx wrangler d1 execute my-db --remote --command \
"CREATE INDEX idx_users_email ON users(email);"
# 查一下你某条 SQL 到底扫了多少行(这是自查额度的手段)
npx wrangler d1 execute my-db --remote --command \
"EXPLAIN QUERY PLAN SELECT * FROM users WHERE email = 'a@b.com';"
# 在 Worker 里用(绑定名是 DB)
const { results } = await env.DB
.prepare("SELECT * FROM users WHERE email = ?")
.bind(email)
.all();
D1 还有两个硬边界要知道:单个数据库最大 500 MB,官方写明「不可再提高」;每个账号最多 10 个库。所以它适合「配置、用户、订单」这种小表,不适合把日志一股脑灌进去。
R2:它最值钱的一条,是「出站不要钱」
所有云存储都收两种钱:存(按 GB 每月)和取(把数据传出去,专业叫「出站流量」)。传统对象存储里,取的钱常常比存的钱多好几倍——你把 10 GB 图片存一年可能花几块钱,但被下载 1 万次可能花几百块。
R2 最关键的差异就在这:出站流量完全不收费。官方原文说得很彻底——不管你是用 Workers API、S3 API 还是那个测试用的 r2.dev 域名取数据,都不产生流量费。
| 项目 | 免费额度(每月) | 超出后的价格 |
|---|---|---|
| 存储 | 10 GB-月 | $0.015 / GB-月 |
| 写操作(Class A,如上传) | 100 万次 | $4.50 / 百万次 |
| 读操作(Class B,如下载) | 1,000 万次 | $0.36 / 百万次 |
| 出站流量 | 不收钱(这一行是 R2 存在的理由) | |
① 免费额度只覆盖「标准存储」。它后来加了一档更便宜的「低频访问存储」(Infrequent Access),那一档不在免费额度内,而且它要求文件至少存 30 天,取回时还要另收 $0.01/GB。
② 开通 R2 要走一次结算流程。官方没有一句话写「需要信用卡」——它写的是「你需要一个带 R2 订阅的 Cloudflare 账号,完成结算流程」。但结合它的通用计费条款(「更改计划或启用订阅前,请确保你有一个有效的付款方式」),实践上就是需要绑一个付款方式才能开。这是本篇里唯一一条我明确标注为「官方源没有直说、由两处推断」的结论。
# 建桶 + 上传一个文件 + 确认它能被公开读到
npx wrangler r2 bucket create my-images
npx wrangler r2 object put my-images/logo.png --file=./logo.png
npx wrangler r2 bucket list
要在网页里直接引用这些文件,有两条路:开一个公开域名(简单,但谁拿到链接都能下),或者用 Worker 当门卫(在返回文件前先检查权限,然后签一个几分钟后过期的临时链接)。第二种是图床和付费资源的常见做法。
Queues:只在一种情况下你需要它
场景是这样的:用户提交了一个请求,你的 Worker 要干一件慢事(比如调一次大模型、发一封邮件)。用户不想等 10 秒,而 Workers 的 CPU 时间也等不起。这时你把这件事丢进 Queues,立刻返回「收到了」,另一个 Worker 在后台慢慢处理。
它的免费额度有一个容易踩的点:一条消息正常走完(写入 + 读出 + 删除)算 3 次操作,所以每天 10,000 次的额度实际约等于 3,300 条消息。另外免费版消息只保留 24 小时且不可配置。
07第 5 段 · 回连:你自己的机器怎么接上来
前四段的前提都是「你的东西已经在 Cloudflare 上了」。但现实里你总有些东西在你自己家、你公司、你那台常年开着的机器上——想让外面访问它,这就是这一段。
传统做法要你做四件事,Tunnel 让你做零件
在没有这类工具的世界里,「让别人访问我家的服务」意味着:搞一个公网 IP(或者做动态域名解析,因为你家 IP 老变)→ 在路由器上做端口转发 → 配一个 Nginx 做反向代理(反向代理就是站在你的服务前面、替它接客人的那一层:访客连的是它,它再把请求转给你真正在跑的服务)→ 申请并记得续期 HTTPS 证书。四件事,每件都有坑。
Cloudflare Tunnel 把这四件事全砍掉了,靠的是一个反直觉的设计:不是让外面连进来,是让你的机器连出去。
因为是「只出不进」,你路由器上一个端口都不用开,也不需要公网 IP,更不需要 DDNS。证书、HTTPS、DDoS 防护全都自动继承前面几段的能力。
费用:隧道本身免费
这一点值得单独确认,因为早年的 Argo Tunnel 是按带宽计费的。官方现在的说法是「任何组织都可以免费使用这个产品只出不进的连接能力」。额度上:每个账号 1,000 条隧道、1,000 条路由(路由额度与 Cloudflare Mesh 共享),每条隧道最多 25 个活跃副本(副本就是同一条隧道同时跑在几台机器上、互为备份)。带宽方面官方没有给出数字上限。
上手:从快速隧道到正式隧道
快速隧道(速览那节里试过的)够你体验,但正式用要建具名隧道。区别在于:它是常驻的、绑定你自己的域名、不会每次重启换地址。
# 1. 登录(会打开浏览器让你授权,证书存到 ~/.cloudflared/)
cloudflared tunnel login
# 2. 建一条具名隧道(会生成隧道 ID 和凭证文件,凭证等同密码,别提交进 Git)
cloudflared tunnel create my-server
# 3. 让 Cloudflare 自动为它建一条 DNS 记录(CNAME 指向 <隧道ID>.cfargotunnel.com)
cloudflared tunnel route dns my-server app.example.com
# 4. 先在前台跑一遍,确认没报错(排错阶段一定要前台跑)
cloudflared tunnel run my-server
配置文件放在 /etc/cloudflared/config.yml(或 ~/.cloudflared/ 下):
tunnel: 你的隧道ID
credentials-file: /root/.cloudflared/你的隧道ID.json
ingress:
- hostname: app.example.com
service: http://localhost:8080
- hostname: nas.example.com
service: http://192.168.1.50:5000
# 最后这条兜底规则是必需的,漏了隧道起不来
- service: http_status:404
校验配置、装成开机自启的服务:
cloudflared tunnel ingress validate # 先校验,改错了会直接告诉你哪行
sudo cloudflared service install # 装成系统服务
sudo systemctl enable --now cloudflared # 开机自启 + 立刻启动
sudo systemctl status cloudflared # 确认是 active (running)
用 Docker 的话更省事(注意用 expose 而不是 ports——服务端口不要发布到主机,只有 cloudflared 能从内部访问它):
services:
cloudflared:
image: cloudflare/cloudflared:latest
restart: unless-stopped
command: tunnel --no-autoupdate run --token ${TUNNEL_TOKEN}
networks: [tunnel]
app:
image: 你的应用镜像
expose: ["8080"] # 是 expose,不是 ports
networks: [tunnel]
networks:
tunnel:
name: tunnel
Docker 里填服务地址有个对照关系,填错了就会「隧道是健康的,但访问一直 502」:
| 你的服务在哪 | 配置里该填 |
|---|---|
| 和 cloudflared 在同一个 Docker 网络 | http://容器名:端口 |
| 在主机上,但它自己不是容器 | http://host.docker.internal:端口 |
| 在局域网另一台机器上 | http://192.168.x.x:端口 |
防火墙只开一个端口就够:7844
如果你在防火墙很严的环境里(公司内网、只允许白名单出口),这里有个常见的搞错点。官方文档写得很清楚:
| 端口 | 必需吗 | 用途 |
|---|---|---|
| 7844(TCP + UDP) | 必需 | 隧道本体走这里,两个协议都要放行 |
| 443 | 可选 | 不开放只会产生一些日志报错,隧道仍能正常工作 |
需要放行的目标主机是 region1.v2.argotunnel.com 和 region2.v2.argotunnel.com。顺带纠正一个流传很广的说法:官方文档里没有 80 端口的要求。
本能的下一步:加一道登录墙
默认情况下,你刚建好的隧道对所有人开放——只要知道域名就能访问。这是最危险的一步,很多人就停在这里了。加 Access 的流程是:
Zero Trust 面板 → Access → Applications → Add an application → Self-hosted,域名填你刚才那个 app.example.com(必须和隧道里的 hostname 完全一致)。
动作选 Allow,条件选 Emails,填你自己的邮箱。以后访问时,你会收到一封 6 位验证码的邮件。
原生手机 App(比如电视机上的媒体播放器)完不成这个网页登录,所以浏览器能用、App 不能。对这类服务,建议只把管理界面放进 Access,媒体访问保留服务自己的鉴权。
Tunnel 不是 VPN,这一点必须说清
| Cloudflare Tunnel | VPN(如 WireGuard / Tailscale) | |
|---|---|---|
| 解决什么 | 把一个服务发布到公网 | 把整台设备接进一个私有网络 |
| 访问者需要装东西吗 | 不用,浏览器打开就行 | 要装客户端并登录 |
| 流量经过谁 | 经过 Cloudflare(它能看到解密后的内容) | 点对点直连,不经过第三方 |
| 什么时候该用另一个 | 分享一个网页服务给别人看 | 你要像在家一样访问整个内网 |
最后一行值得加粗:所有流量都经过 Cloudflare,它在边缘做 HTTPS 解密。处理高度敏感数据时,这是必须纳入考虑的一条——那种情况下应该用直连方案。
08另一条入口 · 信箱:不走网页的那一半
前面七段讲的都是 HTTP 请求。但你的域名还接着另一个入口:邮件。这一节只讲一个产品,因为对个人用户来说,它是整篇里投入产出比最高的一个。
Email Routing:给每一家网站发一个不同的邮箱
核心用法只有一句:你在网站上注册时填的邮箱,每家都不一样,但全都会转到你真正的邮箱里。
比如你有个域名 example.com,那么 taobao@example.com、github@example.com、某个小网站@example.com 全都能建,全部转到你的 Gmail。哪天 某个小网站@example.com 开始收垃圾邮件,你就知道是谁把你的邮箱卖了——然后一条规则把它删掉,其他全不受影响。
额度与几个反直觉的点
| 项目 | 额度 / 事实 | 说明 |
|---|---|---|
| 能用哪些计划 | Free 和付费版都能 | 这是免费功能 |
| 每域名几条路由规则 | 200 条 | 对个人来说等于无限 |
| 每账号几个目标地址 | 200 个 | 所有域名共享这个池子 |
| 收信大小上限 | 25 MiB | 超了直接拒收 |
| 它能存邮件吗 | 不能 | 它只是转发,没有邮箱功能。要存得自己用 Workers 接 |
| 它能往外发信吗 | 能,而且免费 | 见下方说明 |
这是旧信息。官方现行规定是:向「已验证的目标地址」发信,所有计划都免费,而且不计入任何配额——即使你只配置了收信转发,也照样能发。限制是只能从你登记过的域名发出。
而「向任意收件人发信」(把它当正经邮件服务用)是另一件事,属于 Email Sending,目前是 Beta,且需要 Workers 付费版。
开通过程中会动到你的 DNS
这一步值得单独提,因为它和第 0 段那条配额规则直接相关:开启 Email Routing 时,Cloudflare 会自动往你的 DNS 里加 MX 和 TXT 记录,这些记录也计入你那个 200 条的额度。而且按第 0 段的规则,MX 记录永远不能开小黄云。
# 开启后你的 DNS 会长这样(数值以面板实际给的为准)
# MX 记录 — 告诉全世界「寄给这个域名的邮件送到哪」
MX @ route1.mx.cloudflare.net (优先级 21)
MX @ route2.mx.cloudflare.net (优先级 44)
MX @ route3.mx.cloudflare.net (优先级 87)
# TXT 记录 — 防伪造,声明「只有这些服务器能代表我发信」
TXT @ "v=spf1 include:_spf.mx.cloudflare.net ~all"
# 验证一下(生效可能要几分钟)
dig MX example.com +short
(MX 记录是「邮件该送到哪台服务器」的说明;SPF 是一条写在 TXT 里的声明,用来防止别人假冒你的域名发信。这两个都属于「配好就别动」的东西。)
09一个具体场景:给静态站加一个「留言表单」
前面八节把六段路拆开讲了。现在用一个真实需求把它们串起来——这个需求小到看起来不该动用五个产品,但它恰好每一段都要碰到。
需求:你的站是 Pages 托管的静态站,现在想加一个留言框。要求是:要防机器人、留言要能存下来、你自己要能看。
为什么这件事不简单
静态站的意思是没有后端——一堆 HTML 文件,谁都能改,但没人能处理「提交」这个动作。所以你必须给它补一个后端。按六段路走一遍,就是完整方案:
| 段 | 这一步用什么 | 为什么是它 |
|---|---|---|
| 0 · 找路 | DNS(已经在用) | 不加新东西 |
| 1 · 设卡 | Turnstile | 挡住脚本刷留言,但真人无感 |
| 2 · 抄近道 | 不需要 | 留言是动态的,缓存它反而会出问题 |
| 3 · 现做 | Pages Functions | 它就是跑在 Workers 上的后端,跟静态站同一个项目里 |
| 4 · 取料 | D1 | 留言要按时间查、要能数总数,这是关系型表的形状 |
| 5 · 回连 | 不需要 | 后端已经在 Cloudflare 上了 |
五个产品里用到三个。这就是分层的好处:需求一来,你不需要记住 135 个产品,只需要问「这个活儿落在哪几段上」。
第一步:前端页面
<!-- comments.html 或你站点里的某个页面 -->
<form id="comment-form">
<textarea name="body" required placeholder="说点什么"></textarea>
<!-- Turnstile 组件:渲染后会自动往表单里塞一个隐藏字段 -->
<div class="cf-turnstile"
data-sitekey="你的站点密钥"></div>
<button type="submit">提交</button>
</form>
<div id="comments"></div>
第二步:建数据库(第 4 段)
# 建库,把返回的 database_id 填进 wrangler.toml
npx wrangler d1 create blog-comments
# 建表
npx wrangler d1 execute blog-comments --remote --command \
"CREATE TABLE comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
body TEXT NOT NULL,
created_at TEXT DEFAULT (datetime('now'))
);"
# 建索引 —— 因为列表页要按时间倒序查,没索引就会全表扫描,直接吃你的行读额度
npx wrangler d1 execute blog-comments --remote --command \
"CREATE INDEX idx_comments_created ON comments(created_at DESC);"
wrangler.toml 里要声明这个绑定,Pages Functions 才知道去哪儿找它:
name = "my-blog"
pages_build_output_dir = "dist"
[[d1_databases]]
binding = "DB" # 代码里就用 env.DB 访问
database_name = "blog-comments"
database_id = "刚才返回的ID"
第三步:写后端(第 3 段 + 第 1 段)
在 Pages 项目里建一个 functions/api/comment.js,它就会自动变成 /api/comment 这个接口。这个文件就是所谓「Pages Functions」,它跑的其实就是 Workers。
// functions/api/comment.js
export async function onRequestPost({ request, env }) {
const form = await request.formData();
const body = (form.get("body") || "").trim();
const token = form.get("cf-turnstile-response");
if (!body || body.length > 500) {
return new Response("内容为空或过长", { status: 400 });
}
// 关键一步:把令牌交给 Cloudflare 验证真伪。只放前端等于没放。
const verify = await fetch(
"https://challenges.cloudflare.com/turnstile/v0/siteverify",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
secret: env.TURNSTILE_SECRET, // 用环境变量存,别写进代码
response: token,
}),
}
).then(r => r.json());
if (!verify.success) {
return new Response("人机验证没通过", { status: 403 });
}
await env.DB
.prepare("INSERT INTO comments (body) VALUES (?)")
.bind(body)
.run();
return Response.json({ ok: true });
}
那个 env.TURNSTILE_SECRET 要在面板里设成环境变量(Settings → Environment variables)——环境变量就是一批存在代码之外、运行时才喂给代码的配置项。不能写进代码本身,因为代码迟早会进 Git、会被人看到,写进去就等于把钥匙公开了。
第四步:把留言读出来
// functions/api/comments.js
export async function onRequestGet({ env }) {
// 有了 idx_comments_created 索引,这条查询只扫它要的那几十行
const { results } = await env.DB
.prepare("SELECT id, body, created_at FROM comments ORDER BY created_at DESC LIMIT 50")
.all();
return Response.json(results);
}
这个方案里,哪些地方是你会踩的坑
- Turnstile 的密钥分两半。「站点密钥」是公开的、放前端;「密钥」是私密的、只放后端环境变量。搞反了等于把门钥匙贴在门上。
- 别忘索引。没有
idx_comments_created的话,每次打开留言列表都会全表扫描一遍——留言越多,每次消耗的行读额度越大。这是 D1 那个坑的现场版。 - 不要给
/api/加缓存规则。留言是动态的,被缓存了你会看到「我提交了但它不显示」。 - 免费额度够用吗?算一下:每天 10 万次 Worker 请求、D1 每天 500 万行读。一个有几十条留言的小站,离撞墙非常远。
1012 组最容易混为一谈的名词
这一节是可以直接查的。每组给「一句话分界」和「什么时候你会混」。
| 这一对 | 一句话分界 | 什么时候你会混 · 混淆的代价 |
|---|---|---|
| 仅 DNS vs 已代理(小黄云) | 灰色的返回你的真实 IP,橙色的返回 Cloudflare 的 IP | 你以为开了代理只是「加速」。实际上它决定了第 1~4 段能不能介入——不开,WAF、缓存、Workers 全都用不上 |
| Pages vs Workers | 代码是构建工具生成的用 Pages,是你手写的用 Workers | 你以为它们是两个不同的东西。实际上 Pages 的函数部分就跑在 Workers 上,配额也是共用的 |
| Workers vs 一台 VPS / 一个 Docker 容器 | Workers 没有「一台机器」,只有「来了请求跑一次函数」 | 你会去找「怎么装依赖」「怎么开常驻进程」「怎么读本地文件」。答案是没有,因为模型不一样 |
| KV vs D1 vs R2 | 存配置用 KV,存表格用 D1,存文件用 R2 | 你把文件塞进 KV(有 25 MiB 上限且不好按条件查),或把配置塞进 D1(能跑但没必要) |
| D1 vs 正经的 MySQL / Postgres | D1 是 SQLite,单库最大 500 MB 且官方说不可再提高 | 你把它当主数据库用,写了半年发现到上限了,而且没有「升配」这个选项 |
| Turnstile vs reCAPTCHA | Turnstile 通常不弹任何东西,reCAPTCHA 常要你点图 | 你担心「免费的是不是有次数限制」。真正该担心的是 20 个组件的上限 |
| Zero Trust Access vs WAF | Access 要求证明你是谁,WAF 只判断这个请求长得像不像坏人 | 你给公开站点加了 Access,结果所有访客都被挡在门外——它本来就不是干这个的 |
| Tunnel vs VPN / 端口转发 / DDNS | Tunnel 是把一个服务发布出去,VPN 是把整台设备接进内网 | 你想「反正都是内网穿透」,结果发现访问者要装客户端(VPN)或者流量没加密(端口转发) |
| Cache Rules vs Page Rules | Page Rules 是上一代产品,一条规则只能匹配一个 URL 模式 | 你照着老教程去找 Page Rules,发现免费版只有 3 条;而 Cache Rules 免费给 10 条且能力更强 |
| Workers 免费版 vs Workers 付费版 | $5/月买到的不只是更多请求,还买到 CPU 上限从 10 ms 变成 5 分钟 | 你以为付费只是「量更大」。实际上有些事(长时间计算、Containers、部分 AI 模型)免费版根本做不到 |
| Universal SSL vs Total TLS | Universal SSL 免费但只覆盖根域和第一级子域 | 你建了个 a.b.example.com,发现 https 打不开,以为是配置错了——其实是证书不覆盖 |
| Email Routing vs 域名邮箱(企业邮) | Email Routing 只转发,不存储、没有邮箱界面 | 你以为它能当 Gmail 用。它不能——收进来的邮件直接转到你真实邮箱,Cloudflare 这边不保留 |
11免费额度速查 + 三类硬墙
这一节也是拿来查的。数字全部核对于 2026-09-16,来源见文末。
三类墙的性质完全不同,先分清
| 墙的类型 | 撞上会发生什么 | 举例 |
|---|---|---|
| 条数上限 | 你根本建不了第 N+1 条,界面直接拦你 | WAF 自定义规则 5 条、限流 1 条、缓存规则 10 条、Turnstile 组件 20 个 |
| 每日配额 | 当天那次操作直接报错(不是限速、不是排队),次日 00:00 UTC 重置 | Workers 10 万请求/天、D1 500 万行读/天、KV 10 万读/天 |
| 开通门槛 | 你连门都进不去,跟额度无关 | R2 要走结算流程、Containers 必须先开 $5/月付费版 |
很多人以为超额之后会被降速、请求排队。实际大部分情况是直接失败:Workers 会返回错误码(官方列出了 Error 1027 / 1102),KV 那一类操作直接报错,D1 超限也是报错。
更要注意的是:Cloudflare 的预算提醒只发邮件,不会自动停服。所以「设置个提醒兜底」这件事,你得自己做——但提醒本身拦不住账单。
主力产品速查
| 产品 | 免费额度 | 付费起步 | 这条最该记住的边界 |
|---|---|---|---|
| Workers | 10 万请求/天 · 10 ms CPU/次 · 100 个 Worker · 128 MB 内存 | $5/月:1,000 万请求 + 3,000 万 CPU 毫秒 | 付费买到的关键是 CPU 上限从 10 ms 变成 5 分钟,不只是量 |
| Pages | 500 次构建/月 · 20,000 文件/站 · 单文件 25 MiB · 静态请求不计 Workers 配额 | Pro $25/月(5,000 次构建) | 每账号 100 个项目,官方说不会例行提高 |
| R2 | 10 GB · 100 万次写 · 1,000 万次读 · 出站免费 | 无月租,纯按量 | 免费额度只覆盖标准存储,不含低频访问档 |
| D1 | 5 GB · 500 万行读/天 · 10 万行写/天 · 10 个库 | 含在 $5/月内 | 行读按扫描行数算,单库 500 MB 不可再提高 |
| KV | 10 万读/天 · 1,000 写/天 · 1 GB | 含在 $5/月内 | 最终一致,其他机房最多等 60 秒;同键 1 秒只能写 1 次 |
| Queues | 10,000 次操作/天 · 消息保留 24 小时 | 含在 $5/月内 | 一条消息走完算 3 次操作,实际约 3,300 条/天 |
| Durable Objects | 有,但只能用 SQLite 后端 | 含在 $5/月内 | KV 后端是付费专属;DO 存储从 2026-01 起开始计费 |
| Containers | 无免费额度 | 必须先有 $5/月 Workers 付费版 | 这是唯一一个「免费版完全用不了」的计算产品 |
| Workers AI | 10,000 Neurons/天 | $0.011 / 1,000 Neurons | 部分前沿模型(kimi、glm、deepseek 等)免费版不可调用 |
| Zero Trust | 50 用户 | $7/用户/月起 | 日志只留 24 小时——出事第二天来查就没了 |
| Tunnel | 免费 · 1,000 隧道/账号 · 1,000 路由/账号 | — | 出站只必需 7844(TCP+UDP),443 是可选的 |
| Turnstile | 验证次数不限 · 20 个组件/账号 | — | 真正的墙是组件数,不是验证次数 |
| Email Routing | 200 条规则/域 · 200 个目标地址/账号 | — | 不能存邮件;但向已验证地址发信免费且不计配额 |
| WAF | 自定义规则 5 条 · 免费版有 Cloudflare Free Managed Ruleset | Pro 起 20 条 + 完整托管规则集 | OWASP / Cloudflare Managed Ruleset 免费版没有 |
| 限流 | 1 条,只能按 IP、周期固定 10 秒 | Pro 2 条起 | 全网最紧的一堵墙,别指望它精细 |
| 缓存规则 | 10 条 | Pro 25 条 | 全计划都有这个功能,只要有域名开着代理 |
| DNS 记录 | 老域名 1,000 条 / 2024-09 后新加的域名 200 条 | Pro 3,500 条 | 其他服务自动建的记录也占用这个额度 |
| CDN 带宽 | 官方未公布免费版的带宽上限——没有「不限」的官方原文(见文末) | ||
| 可用性承诺(SLA) | 免费版和 Pro 都没有。只有 Business 起才有 100% uptime 承诺 | ||
最后一行值得单独想一下它的含义:用免费版,等于接受「它挂了不赔」。这不是说它容易挂——而是说你在做架构决定时,不能把「Cloudflare 一定在线」当成前提写进去。
12场景索引:你现在的处境 → 用哪个
如果你不想读全文,直接从这一节找自己的处境。
| 你现在的处境 | 用哪个 | 去哪一节 |
|---|---|---|
| 我本机跑着个东西,想让朋友看一眼 | 快速隧道cloudflared tunnel --url http://localhost:8080 | 30 秒速览 |
| 我想让家里那台常开的机器变成一个正经网址 | 具名 Tunnel + Access 登录墙 | 回连 |
| 我不想暴露真实 IP,也不想被人直接打 | 把记录点成橙色(开代理) | 找路 |
| 我的前端代码里硬编码了 API Key,想藏起来 | Workers 当转发代理 | 现做 |
| 我的网站是静态的,想从 GitHub 换成别处托管 | Pages | 现做 |
| 我的表单老被人用脚本刷 | Turnstile + 那唯一一条限流规则 | 设卡 |
| 我有一堆图片/视频要存,还怕流量费 | R2(出站不要钱) | 取料 |
| 我要存用户数据,还要能按条件查 | D1(记得建索引) | 取料 |
| 我要存站点配置,读得多写得少 | KV | 取料 |
| 我注册各种网站老收垃圾邮件 | Email Routing 建专用别名 | 信箱 |
| 我想在 Cloudflare 上跑个大模型 | Workers AI(注意前沿模型免费版用不了) | 现做 |
| 我改的东西线上没生效 | 先查 cf-cache-status | 抄近道 |
| 我一个人要用,但不想让全网都能访问 | Zero Trust Access(50 用户免费) | 设卡 |
| 我大陆用户多,访问很慢 | 先搞清原因,再决定要不要换方案 | 来源与证据边界 |
| 我看到一个没见过的名词,不知道要不要管 | 三步归位法 | 下一步 |
13遇到陌生名词的三步归位法
这是本篇最想留给你的一样东西。以后你在任何教程、任何 AI 的回答里看到「用 R2 配 Vectorize,前面套一层 AI Gateway」这种句子,按这三步走就不会慌。
第一步:问它是在「搬东西」「做东西」还是「看门」
Cloudflare 的所有产品都能塞进这三个大桶之一,而且塞不进去的很少:
| 大桶 | 判断特征 | 落进这个桶的词 |
|---|---|---|
| 搬东西 | 它让数据从 A 到 B、或者换个地方放 | DNS、Cache、CDN、R2、Queues、Tunnel、Hyperdrive |
| 做东西 | 它执行你的逻辑 | Workers、Pages、Durable Objects、Containers、Workers AI、Workflows |
| 看门 | 它的工作是决定放不放行 | WAF、限流、Turnstile、Access、DDoS、Bots、API Shield |
先归到大桶,你至少知道该去面板的哪一区找,也知道它大概要花你多少精力(看门类的通常配一次就不管了,做东西类的才需要你写代码)。
第二步:看名字里有没有线索
Cloudflare 的命名其实比它看起来有规律,只是没人告诉过你:
- 能「干活」的:
Workers(工人)、Pages(页面)、Workflows(流程)、Agents(代理)——都是有动作含义的词。 - 存东西的:名字都是很短的字母数字代号,像仓库编号——
R2、D1、KV。看到这种短代号,基本可以直接判断它是存储。 - 看门的:
WAF、Access、Turnstile、Shield、Gateway——都是「关口」类词汇。 - 管道类的:带
Network、Tunnel、Mesh、Interconnect的,都是在解决「怎么连上」。
第三步:去官方目录确认它到底是「产品」还是「功能」
这一步能省掉大量困惑。因为 Cloudflare 把产品和功能混在同一个导航里,而两者的问题性质完全不同:
| 它是…… | 特征 | 例子 | 你该问的问题 |
|---|---|---|---|
| 产品 | 在官方产品目录里能搜到,有自己的定价页 | Workers、R2、D1、Turnstile | 「它要花钱吗?额度多少?」 |
| 功能 | 目录里搜不到,它是某个产品的一个设置项 | CNAME flattening、Automatic SSL/TLS、Proxied | 「它属于哪个产品的设置页?」 |
判断方法很简单:去产品目录搜一下,搜不到就是功能。「CNAME flattening 怎么收费」这种问题之所以没人回答,是因为它压根不是一个产品。
求助 AI 的时候,直接把这三步写进问题里
新手问 AI 时最容易犯的错,是问「R2 是什么」——你会得到一段和官网 README 差不多的介绍,看完还是不知道要不要用。换成这个模板,答案质量会完全不同:
# 可直接粘贴的提问模板
我想做的是:【用一句话说你的目标,比如"给博客加图片上传"】
我的现状:【比如"静态站托管在 Pages,没有后端,每月预算 0 元"】
请按这个结构回答:
1. 这个需求会落在「请求的哪一段路」上(找路 / 设卡 / 抄近道 / 现做 / 取料 / 回连)
2. 为此我需要的产品是哪几个,哪些是免费额度内够用的
3. 免费层在这个方案里会在哪里撞墙(条数上限 / 每日配额 / 要绑卡)
4. 给我最小的可运行示例,包括要敲的命令
如果我提到的某个词其实是「某个产品的功能」而不是独立产品,请指出来。
最后一句是关键——它逼着回答者区分产品和功能,而不是笼统地把名词堆给你。
14六个常见误解
这是十年前的定位。它现在更准确的说法是一个跑代码的平台,CDN 和 DNS 只是它的入口业务。证据很直接:官方产品目录里约 135 个条目,其中 DNS 和缓存类占不到十分之一,剩下的全是计算、存储、安全、AI。
这个误解的实际代价是:你会默认「它就是个锦上添花的东西」,从而错过那些真正能替代你服务器的部分。
我在官方源里没能核实到这句话(细节见抄近道那一节的提示框)。这里只说它为什么会流传这么广——因为它曾经是对的:早年 Cloudflare 的招牌卖点就是「不限流量的 CDN」,这句话被反复转载,却没人跟着它后来的产品定位一起更新。
对你有实际影响的其实不是带宽,而是另一件很少有人提的事:免费版没有可用性承诺。既然没有承诺,你的架构里就不该有「反正 Cloudflare 不会挂」这个隐含前提。
这个预期之所以错,是因为它把「云服务超额」想象成了「手机流量超了降速」。Cloudflare 不是这个模型:大多数超额的结局是那一次操作直接失败,不是排队、不是变慢。
它真正影响的是你的监控习惯:你习惯盯着「变慢」这个信号,但这里根本不会变慢——它会一切正常,然后突然开始报错。所以在 Cloudflare 上,主动盯用量比等报警重要得多。
这是新手最贵的一脚。它不是 Node,是一个遵循网页标准的轻量运行时,跑在叫 isolate 的沙箱里。后果是:没有文件系统、很多 npm 包装不上、没有常驻进程、CPU 时间被卡死在每次 10 毫秒(免费版)。
要判断你的代码能不能搬过去,最快的办法是:看它有没有用到 fs、child_process、原生扩展、或者常驻内存状态。用到任何一样,就得改造,或者改用 Containers。
功能上确实相似,但有个关键差别会被忽略:Tunnel 默认对所有人生效。你建好隧道、绑好域名的那一刻,那个服务就对着整个互联网开放了——因为「穿透出来了」不等于「只给我看」。
开源穿透工具通常默认要你设密码;Tunnel 的访问控制是另一个产品(Zero Trust Access)。这个设计上的分工,是很多人把内网服务暴露到公网却毫不知情的原因。建完隧道之后必须做的一件事,就是去加 Access。
Cloudflare 免费层有两个别家少见的特征,值得单独知道:
一是 R2 的出站流量不收钱。传统对象存储里,取数据的钱常常比存数据的钱多几倍——这一条差异会直接改变你的架构选择(比如「图片要不要放 CDN」这个问题在 R2 上答案不同)。
二是它的免费版没有 SLA。这不是 Cloudflare 特别小气,而是免费层的通用现实,但它意味着:你不能把「有可用性承诺」当作选型前提。要承诺,Business 起。
15名词速查表(按段分)
按六段路排列。第三列回答的是「你什么时候会需要它、别把它当成什么」——这才是有用的那一列。
| 名词 | 属于哪一段 · 它是什么 | 何时用它 · 别当什么用 |
|---|---|---|
| DNS | 0 · 找路:域名 → 地址的翻译服务 | 你已经在用。别把它当成能加速的东西——它只负责找到,不负责快 |
| Proxied(小黄云) | 0 · 找路:让流量先经过 Cloudflare | 开了才能用后面几段。别以为它只是「加速开关」——它更接近「总开关」 |
| Universal SSL | 0 · 找路:免费 HTTPS 证书 | 你不用管,自动续期。别以为它覆盖所有子域名——只到第一级 |
| WAF | 1 · 设卡:按规则拦请求 | 有公开站点迟早要用。免费只有 5 条,当配额规划 |
| Rate Limiting | 1 · 设卡:按频率拦 | 守住你最贵的那个接口。免费只有 1 条且非常粗糙 |
| Turnstile | 1 · 设卡:人机验证 | 有表单/登录就用。别只放前端——必须后端二次验证 |
| Zero Trust Access | 1 · 设卡 + 5 · 回连:身份登录墙 | 给内部工具用。别用在公开站点上,它会把所有人挡外面 |
| Cache Rules | 2 · 抄近道:决定什么能缓存、缓存多久 | 站上有静态资源就要配。别用它管动态接口 |
| cf-cache-status | 2 · 抄近道:一个响应头,告诉你这次用了缓存没 | 「改了不生效」的第一诊断工具。别忽视它 |
| Workers | 3 · 现做:你手写的边缘函数 | 写接口、做代理时用。别当成 Node 服务器 |
| Pages | 3 · 现做:静态站托管 + 自动部署 | 博客、文档站用。别以为它和 Workers 是两套东西 |
| Durable Objects | 3 · 现做:有唯一身份和存储的小进程 | 做聊天室、协作编辑时用。免费版只能用 SQLite 后端 |
| Containers | 3 · 现做:真正的容器 | 需要完整 Linux 环境时。没有免费额度 |
| Workers AI | 3 · 现做:在边缘跑开源模型 | 摘要、翻译、轻量分类。前沿模型免费版调不了 |
| R2 | 4 · 取料:对象存储,存文件 | 图片、视频、备份。出站免费是它的全部理由 |
| D1 | 4 · 取料:SQLite 关系型数据库 | 用户、订单、留言。行读按扫描行数算,索引就是额度 |
| KV | 4 · 取料:键值存储 | 配置、开关、会话。最终一致,别当强一致数据库用 |
| Queues | 4 · 取料:消息队列 | 把慢活丢到后台。一条消息算 3 次操作 |
| Vectorize | 4 · 取料:向量数据库 | 做 AI 检索(RAG:先让模型查一段资料,再让它照资料回答)时用。新手暂时用不到 |
| Cloudflare Tunnel | 5 · 回连:把本地服务发布出去 | 想让外面访问你家的机器时用。建完必须加 Access |
| cloudflared | 5 · 回连:跑在你机器上的那个程序 | 就是它去主动连 Cloudflare。别和 Tunnel 混为一谈(一个是产品,一个是客户端) |
| Email Routing | 另一条入口 · 信箱:邮件转发 | 注册网站用专用别名。它不存邮件 |
| Vectorize / AI Gateway / Hyperdrive 等 | 分散在第 3、4 段 | 它们是给特定场景用的进阶组件。不需要现在就搞懂——先知道它们存在、属于哪一段就够了 |
16来源与证据边界
本文的每个数字,来自哪里
本篇的额度与价格全部核对自 Cloudflare 官方一手源。规律是:「能干什么」看 /limits/,「多少额度、多少钱」看 /pricing/。
| 产品 | 主要官方来源 |
|---|---|
| Workers | workers/platform/limits · workers/platform/pricing |
| Pages | pages/platform/limits · pages/functions/pricing |
| R2 | r2/pricing |
| D1 | d1/platform/limits · d1/platform/pricing |
| KV | kv/platform/limits · kv/concepts/how-kv-works |
| Durable Objects / Containers / Workers AI | durable-objects/pricing · containers/pricing · workers-ai/pricing |
| Tunnel / cloudflared | cloudflare-one/account-limits · TryCloudflare 文档 |
| WAF / 限流 | waf/custom-rules · waf/rate-limiting-rules |
| DNS / SSL | dns/manage-dns-records · ssl/universal-ssl |
| Turnstile / Email Routing | turnstile/plans · email-routing/limits |
| 产品目录条目数 | developers.cloudflare.com/products(我抓取时该页列出约 135 个条目与 13 个分类标签,官方未公布权威计数) |
三处官方源自相矛盾的地方(我按原样呈现,不替你选)
这三处是只有真去逐页对过才发现的。我把两边都留着,并标明各自出处——你可以自己去看,也可以拿这个去问官方。
| 矛盾点 | 说法 A 与出处 | 说法 B 与出处 |
|---|---|---|
| Pages 能建几个站点 | 「无限制的网站」——官方营销页(部分语言版本可查到该句) | 100 个项目/账号,且原文注明「不会例行提高」——官方文档 /pages/platform/limits/ |
| 免费版 CDN 带宽 | 「无限带宽」——仅见于官方部分本地化营销页 | 免费版那一列只写 CDN「Included」,无任何带宽数字——官方计划对比页(英文 / .md 源) |
| R2 是否必须绑卡 | 我没有找到任何官方明文说「需要信用卡」 | 官方要求「完成结算流程才能给账号加上 R2 订阅」,加上通用计费条款「启用订阅前请确保有有效付款方式」——两处拼起来才能推断出需要绑付款方式 |
第三行我特意留着,因为它是本篇唯一一条我明确标为「推断而非直引」的结论。其余数字都是官方原文。
关于中国大陆访问:原因是结构性的,不是你配错了
如果你在大陆访问 pages.dev 或 workers.dev 觉得慢或者不稳,那不是你的配置问题。官方对这件事有一句很清楚的说明:
Cloudflare 在中国大陆境内的节点,是随一项叫做 China Network 的独立订阅提供的,仅对 Enterprise 套餐开放。该网络由京东云运营,并且要求:每个顶级域名都必须有有效的 ICP 备案、必须支持 IPv6,且不是所有 Cloudflare 产品都在中国网络里可用。
由此可以推出一条:免费版和普通付费版的流量,不走中国大陆境内的机房。大陆用户会被就近调度到香港、日本、新加坡等境外节点,延迟和稳定性因此受限。这解释了你为什么会觉得「明明有 CDN 怎么还慢」——问题不在 CDN,在于机房位置。
这也是为什么本篇反复强调「正式上线一定要绑自己的域名」:用自己的域名至少不会额外叠加 *.workers.dev 这类共享域名本身的解析问题。但绑域名不能解决机房位置问题——那只有 China Network 能解决,而它需要企业套餐。
本文的证据边界
- 所有额度数字核对于 2026-09-16。这类信息变动频繁,本篇被标为时效性最强的一档。你读到时的实际数字请按上面那张来源表复核。
- 「六段路」这个分层是我建的,不是官方的。Cloudflare 官方产品目录是一张按字母排的扁平清单,并不提供「产品 → 分类」的映射(页面上的 13 个分类标签只是筛选按钮,正文里返回的是无分组的链接列表)。所以本文的分层是按「一个请求的路径」重新组织的,读起来顺,但不要把它当作官方架构。
- 有几处数字只有一个来源。比如 Zero Trust 免费版的「50 用户」来自 Cloudflare 产品页,开发者文档站里没有这个数字;Workers AI 的「10,000 Neurons/天」只在定价页出现,限流页完全不提免费额度。遇到这类数字,建议以产品页为准,或直接在面板里看自己的实际额度。
- 本篇刻意没有展开的:Cloudflare 还有一整个面向企业和大规模场景的产品群(Load Balancing、Magic Transit、Cloudflare One、AI Gateway、Hyperdrive、Vectorize、R2 SQL 等)。它们要么需要企业套餐,要么属于「你已经上手之后自然会碰到」的进阶件。本文只在速查表里点了名、标了段位,没有展开讲——这是刻意的取舍,不是遗漏。
99一句话总结
Cloudflare 不是一堆并列的工具,而是一个请求会经过的六段路——找路、设卡、抄近道、现做、取料、回连;看到一个陌生名词时,先判断它守在哪一段上,再决定要不要理它,这比记住它的定义有用得多;而免费层真正会咬你的地方不是「不够用」,是三类性质完全不同的墙:条数上限(WAF 5 条、限流 1 条)、直接报错的每日配额(D1 按扫描行数算的那 500 万行)、以及不绑付款方式就开不了门(R2、Containers)。
最后一件事留给你自己验——这也是本篇唯一无法替你验证的一条:拿你自己的一个真实需求,走一遍六段路。
比如「我想给站点加个搜索框」或者「我想让同事能看我的本地报表」。先别查任何文档,就在纸上把六段写下来,标出这个需求落在哪几段、哪几段用不上。然后再去对照 场景索引那一节,看你标的和我建议的差在哪。
如果你能不看本文就把那六段默出来、并且说清哪几段在这个需求里是空的——这篇地图就长在你脑子里了。