🟢 入门

Cloudflare 工具地图:除了域名解析,剩下那 130 多个东西哪个跟你有关

不教你点哪个按钮。教你看到一个陌生的 Cloudflare 名词时,先判断它站在「一个请求的哪一段路上」,再决定要不要理它——以及知道免费层会在哪三个地方撞墙

📅 更新于 2026-09-16

本文校对于 2026-09-16 的额度快照 · 官方源:developers.cloudflare.com / cloudflare.com/plans(额度与价格变动频繁,复核方法见文末「来源与证据边界」)

6
一个请求会被拆成 6 段,每段它都能插一手
约 135
官方产品目录的条目数,绝大多数你永远不用点
5 条
免费版 WAF 自定义规则上限(限流更少,只有 1 条)
10 GB
R2 免费存储额度,且出站流量不收钱

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 的产品名不携带它属于哪一层的信息。看这三组:

按名字猜,你会猜错

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 有两个边界值得知道:

另一个是加密模式。这个设置决定了「访客到 Cloudflare」和「Cloudflare 到你的服务器」这两段各自的加密强度,一共五个选项:

模式访客 → CloudflareCloudflare → 你的服务器什么时候用
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 起」。这个说法现在只对了一半:

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 条,而且它比你想的笨

免费版的限流规则被砍得很厉害,值得单独说,因为很多人以为它能干很多事:

能力免费版付费版
能建几条规则1Pro 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 是两个面板,别找错

它们都能拦请求,但入口不同: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 条宽松,而且缓存规则本身是全计划都有的功能,不需要额外付费——只要你的域名开着代理(小黄云)。

计划缓存规则条数
Free10
Pro25
Business50
Enterprise300

一条典型规则——「把 /img/ 下的图片缓存一年」——在界面里是这样填的:

# 缓存规则:给图片和字体设长期缓存
当传入请求匹配时: URI 路径 包含 /img/ 或 /fonts/

则:
  · 缓存资格 (Cache eligibility)  →  符合条件 (Eligible for cache)
  · 边缘 TTL (Edge TTL)           →  覆盖原始值 → 1 年
  · 浏览器 TTL (Browser TTL)      →  覆盖原始值 → 1 年
💡 TTL 是什么

TTL 是「这份缓存算数多久」。边缘 TTL = Cloudflare 机房存多久;浏览器 TTL = 访客自己的电脑存多久。浏览器 TTL 设长了,你改了文件,老访客要等很久才看到新版——所以它该用在「内容不会变」的路径上(图片、字体、带哈希值的文件名),别用在 HTML 上。

「我改了,线上还是旧的」——按这个顺序查

1
先确认请求到底走没走 Cloudflare

curl -I https://你的域名,看返回头里有没有 cf-cache-status 这一行。没有,说明这条记录没开代理,或者你查的是没走 CDN 的路径。

2
看 cf-cache-status 的值

HIT = 用的是缓存(所以你看到旧的);MISS = 缓存里没有,回源拿了新的(「回源」就是回到你的源站去取);DYNAMIC = 这条路径根本没进缓存。

3
去清缓存

面板 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 包装不上。

❌ 误解:它是一台很小很小的 Node 服务器

你会去找「怎么装依赖」「怎么开一个长期运行的进程」「怎么做定时任务」。你会发现这些问题的答案在 Cloudflare 上长得完全不一样,甚至有些根本没有答案。

✅ 实际:它是一个「来了一个请求,就跑一次函数」的环境

它跑在一种叫 isolate 的轻量沙箱里(V8 是 Chrome 浏览器里跑 JavaScript 的那个引擎;isolate 是它的一个隔离实例,理解成「一个随时能起、用完就扔的迷你运行环境」)。它遵循的是网页标准(fetch、Request、Response 这些浏览器里就有的东西),不是 Node 的那套文件、进程 API。

没有「服务器」这个概念,所以也没有「服务器关机了/重启了」这回事。代码只在有请求时运行。

这个设计的直接后果是:

这一段有五个东西,用一句话分开它们

产品一句话免费额度什么时候用它
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 那个地址

你的项目.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);
  },
};
⚠️ 2026 年的新变化:部分前沿模型免费版用不了

官方现在明确了一批「前沿模型」(包括 @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 的官方定位写得很直白:它靠「最终一致」来换取高性能。这句话翻译成人话是:

⚠️ 三条会让你踩坑的 KV 限制

① 同一个键,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 存在的理由)
⚠️ 两个关于 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 把这四件事全砍掉了,靠的是一个反直觉的设计:不是让外面连进来,是让你的机器连出去。

cloudflared 你机器上的小程序,主动往外连
→
Cloudflare 边缘 接住这条线,并在同一位置准备好了 HTTPS 入口
→
访客 访问你的域名,流量顺着那条线回到你机器

因为是「只出不进」,你路由器上一个端口都不用开,也不需要公网 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 的流程是:

1
建一个 Access 应用

Zero Trust 面板 → Access → Applications → Add an application → Self-hosted,域名填你刚才那个 app.example.com(必须和隧道里的 hostname 完全一致)。

2
加一条策略

动作选 Allow,条件选 Emails,填你自己的邮箱。以后访问时,你会收到一封 6 位验证码的邮件。

3
知道它的边界

原生手机 App(比如电视机上的媒体播放器)完不成这个网页登录,所以浏览器能用、App 不能。对这类服务,建议只把管理界面放进 Access,媒体访问保留服务自己的鉴权。

Tunnel 不是 VPN,这一点必须说清

Cloudflare TunnelVPN(如 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 Routing 只能收不能发」

这是旧信息。官方现行规定是:向「已验证的目标地址」发信,所有计划都免费,而且不计入任何配额——即使你只配置了收信转发,也照样能发。限制是只能从你登记过的域名发出。

而「向任意收件人发信」(把它当正经邮件服务用)是另一件事,属于 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);
}

这个方案里,哪些地方是你会踩的坑

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 / PostgresD1 是 SQLite,单库最大 500 MB 且官方说不可再提高你把它当主数据库用,写了半年发现到上限了,而且没有「升配」这个选项
Turnstile vs reCAPTCHATurnstile 通常不弹任何东西,reCAPTCHA 常要你点图你担心「免费的是不是有次数限制」。真正该担心的是 20 个组件的上限
Zero Trust Access vs WAFAccess 要求证明你是谁,WAF 只判断这个请求长得像不像坏人你给公开站点加了 Access,结果所有访客都被挡在门外——它本来就不是干这个的
Tunnel vs VPN / 端口转发 / DDNSTunnel 是把一个服务发布出去,VPN 是把整台设备接进内网你想「反正都是内网穿透」,结果发现访问者要装客户端(VPN)或者流量没加密(端口转发)
Cache Rules vs Page RulesPage Rules 是上一代产品,一条规则只能匹配一个 URL 模式你照着老教程去找 Page Rules,发现免费版只有 3 条;而 Cache Rules 免费给 10 条且能力更强
Workers 免费版 vs Workers 付费版$5/月买到的不只是更多请求,还买到 CPU 上限从 10 ms 变成 5 分钟你以为付费只是「量更大」。实际上有些事(长时间计算、Containers、部分 AI 模型)免费版根本做不到
Universal SSL vs Total TLSUniversal 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 的预算提醒只发邮件,不会自动停服。所以「设置个提醒兜底」这件事,你得自己做——但提醒本身拦不住账单。

主力产品速查

产品免费额度付费起步这条最该记住的边界
Workers10 万请求/天 · 10 ms CPU/次 · 100 个 Worker · 128 MB 内存$5/月:1,000 万请求 + 3,000 万 CPU 毫秒付费买到的关键是 CPU 上限从 10 ms 变成 5 分钟,不只是量
Pages500 次构建/月 · 20,000 文件/站 · 单文件 25 MiB · 静态请求不计 Workers 配额Pro $25/月(5,000 次构建)每账号 100 个项目,官方说不会例行提高
R210 GB · 100 万次写 · 1,000 万次读 · 出站免费无月租,纯按量免费额度只覆盖标准存储,不含低频访问档
D15 GB · 500 万行读/天 · 10 万行写/天 · 10 个库含在 $5/月内行读按扫描行数算,单库 500 MB 不可再提高
KV10 万读/天 · 1,000 写/天 · 1 GB含在 $5/月内最终一致,其他机房最多等 60 秒;同键 1 秒只能写 1 次
Queues10,000 次操作/天 · 消息保留 24 小时含在 $5/月内一条消息走完算 3 次操作,实际约 3,300 条/天
Durable Objects有,但只能用 SQLite 后端含在 $5/月内KV 后端是付费专属;DO 存储从 2026-01 起开始计费
Containers无免费额度必须先有 $5/月 Workers 付费版这是唯一一个「免费版完全用不了」的计算产品
Workers AI10,000 Neurons/天$0.011 / 1,000 Neurons部分前沿模型(kimi、glm、deepseek 等)免费版不可调用
Zero Trust50 用户$7/用户/月起日志只留 24 小时——出事第二天来查就没了
Tunnel免费 · 1,000 隧道/账号 · 1,000 路由/账号—出站只必需 7844(TCP+UDP),443 是可选的
Turnstile验证次数不限 · 20 个组件/账号—真正的墙是组件数,不是验证次数
Email Routing200 条规则/域 · 200 个目标地址/账号—不能存邮件;但向已验证地址发信免费且不计配额
WAF自定义规则 5 条 · 免费版有 Cloudflare Free Managed RulesetPro 起 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 的命名其实比它看起来有规律,只是没人告诉过你:

第三步:去官方目录确认它到底是「产品」还是「功能」

这一步能省掉大量困惑。因为 Cloudflare 把产品和功能混在同一个导航里,而两者的问题性质完全不同:

它是……特征例子你该问的问题
产品在官方产品目录里能搜到,有自己的定价页Workers、R2、D1、Turnstile「它要花钱吗?额度多少?」
功能目录里搜不到,它是某个产品的一个设置项CNAME flattening、Automatic SSL/TLS、Proxied「它属于哪个产品的设置页?」

判断方法很简单:去产品目录搜一下,搜不到就是功能。「CNAME flattening 怎么收费」这种问题之所以没人回答,是因为它压根不是一个产品。

求助 AI 的时候,直接把这三步写进问题里

新手问 AI 时最容易犯的错,是问「R2 是什么」——你会得到一段和官网 README 差不多的介绍,看完还是不知道要不要用。换成这个模板,答案质量会完全不同:

# 可直接粘贴的提问模板
我想做的是:【用一句话说你的目标,比如"给博客加图片上传"】

我的现状:【比如"静态站托管在 Pages,没有后端,每月预算 0 元"】

请按这个结构回答:
1. 这个需求会落在「请求的哪一段路」上(找路 / 设卡 / 抄近道 / 现做 / 取料 / 回连)
2. 为此我需要的产品是哪几个,哪些是免费额度内够用的
3. 免费层在这个方案里会在哪里撞墙(条数上限 / 每日配额 / 要绑卡)
4. 给我最小的可运行示例,包括要敲的命令

如果我提到的某个词其实是「某个产品的功能」而不是独立产品,请指出来。

最后一句是关键——它逼着回答者区分产品和功能,而不是笼统地把名词堆给你。

14六个常见误解

误解一:Cloudflare 就是一个免费的 CDN / 免费域名解析

这是十年前的定位。它现在更准确的说法是一个跑代码的平台,CDN 和 DNS 只是它的入口业务。证据很直接:官方产品目录里约 135 个条目,其中 DNS 和缓存类占不到十分之一,剩下的全是计算、存储、安全、AI。

这个误解的实际代价是:你会默认「它就是个锦上添花的东西」,从而错过那些真正能替代你服务器的部分。

误解二:免费版带宽不限,随便用

我在官方源里没能核实到这句话(细节见抄近道那一节的提示框)。这里只说它为什么会流传这么广——因为它曾经是对的:早年 Cloudflare 的招牌卖点就是「不限流量的 CDN」,这句话被反复转载,却没人跟着它后来的产品定位一起更新。

对你有实际影响的其实不是带宽,而是另一件很少有人提的事:免费版没有可用性承诺。既然没有承诺,你的架构里就不该有「反正 Cloudflare 不会挂」这个隐含前提。

误解三:超额之后会被限速

这个预期之所以错,是因为它把「云服务超额」想象成了「手机流量超了降速」。Cloudflare 不是这个模型:大多数超额的结局是那一次操作直接失败,不是排队、不是变慢。

它真正影响的是你的监控习惯:你习惯盯着「变慢」这个信号,但这里根本不会变慢——它会一切正常,然后突然开始报错。所以在 Cloudflare 上,主动盯用量比等报警重要得多。

误解四:Workers 就是一个跑 Node.js 的免费服务器

这是新手最贵的一脚。它不是 Node,是一个遵循网页标准的轻量运行时,跑在叫 isolate 的沙箱里。后果是:没有文件系统、很多 npm 包装不上、没有常驻进程、CPU 时间被卡死在每次 10 毫秒(免费版)。

要判断你的代码能不能搬过去,最快的办法是:看它有没有用到 fs、child_process、原生扩展、或者常驻内存状态。用到任何一样,就得改造,或者改用 Containers。

误解五:Tunnel 就是个内网穿透工具,跟开源的那些差不多

功能上确实相似,但有个关键差别会被忽略:Tunnel 默认对所有人生效。你建好隧道、绑好域名的那一刻,那个服务就对着整个互联网开放了——因为「穿透出来了」不等于「只给我看」。

开源穿透工具通常默认要你设密码;Tunnel 的访问控制是另一个产品(Zero Trust Access)。这个设计上的分工,是很多人把内网服务暴露到公网却毫不知情的原因。建完隧道之后必须做的一件事,就是去加 Access。

误解六:所有云厂商的免费额度都差不多,随便挑一个

Cloudflare 免费层有两个别家少见的特征,值得单独知道:

一是 R2 的出站流量不收钱。传统对象存储里,取数据的钱常常比存数据的钱多几倍——这一条差异会直接改变你的架构选择(比如「图片要不要放 CDN」这个问题在 R2 上答案不同)。

二是它的免费版没有 SLA。这不是 Cloudflare 特别小气,而是免费层的通用现实,但它意味着:你不能把「有可用性承诺」当作选型前提。要承诺,Business 起。

15名词速查表(按段分)

按六段路排列。第三列回答的是「你什么时候会需要它、别把它当成什么」——这才是有用的那一列。

名词属于哪一段 · 它是什么何时用它 · 别当什么用
DNS0 · 找路:域名 → 地址的翻译服务你已经在用。别把它当成能加速的东西——它只负责找到,不负责快
Proxied(小黄云)0 · 找路:让流量先经过 Cloudflare开了才能用后面几段。别以为它只是「加速开关」——它更接近「总开关」
Universal SSL0 · 找路:免费 HTTPS 证书你不用管,自动续期。别以为它覆盖所有子域名——只到第一级
WAF1 · 设卡:按规则拦请求有公开站点迟早要用。免费只有 5 条,当配额规划
Rate Limiting1 · 设卡:按频率拦守住你最贵的那个接口。免费只有 1 条且非常粗糙
Turnstile1 · 设卡:人机验证有表单/登录就用。别只放前端——必须后端二次验证
Zero Trust Access1 · 设卡 + 5 · 回连:身份登录墙给内部工具用。别用在公开站点上,它会把所有人挡外面
Cache Rules2 · 抄近道:决定什么能缓存、缓存多久站上有静态资源就要配。别用它管动态接口
cf-cache-status2 · 抄近道:一个响应头,告诉你这次用了缓存没「改了不生效」的第一诊断工具。别忽视它
Workers3 · 现做:你手写的边缘函数写接口、做代理时用。别当成 Node 服务器
Pages3 · 现做:静态站托管 + 自动部署博客、文档站用。别以为它和 Workers 是两套东西
Durable Objects3 · 现做:有唯一身份和存储的小进程做聊天室、协作编辑时用。免费版只能用 SQLite 后端
Containers3 · 现做:真正的容器需要完整 Linux 环境时。没有免费额度
Workers AI3 · 现做:在边缘跑开源模型摘要、翻译、轻量分类。前沿模型免费版调不了
R24 · 取料:对象存储,存文件图片、视频、备份。出站免费是它的全部理由
D14 · 取料:SQLite 关系型数据库用户、订单、留言。行读按扫描行数算,索引就是额度
KV4 · 取料:键值存储配置、开关、会话。最终一致,别当强一致数据库用
Queues4 · 取料:消息队列把慢活丢到后台。一条消息算 3 次操作
Vectorize4 · 取料:向量数据库做 AI 检索(RAG:先让模型查一段资料,再让它照资料回答)时用。新手暂时用不到
Cloudflare Tunnel5 · 回连:把本地服务发布出去想让外面访问你家的机器时用。建完必须加 Access
cloudflared5 · 回连:跑在你机器上的那个程序就是它去主动连 Cloudflare。别和 Tunnel 混为一谈(一个是产品,一个是客户端)
Email Routing另一条入口 · 信箱:邮件转发注册网站用专用别名。它不存邮件
Vectorize / AI Gateway / Hyperdrive 等分散在第 3、4 段它们是给特定场景用的进阶组件。不需要现在就搞懂——先知道它们存在、属于哪一段就够了

16来源与证据边界

本文的每个数字,来自哪里

本篇的额度与价格全部核对自 Cloudflare 官方一手源。规律是:「能干什么」看 /limits/,「多少额度、多少钱」看 /pricing/。

产品主要官方来源
Workersworkers/platform/limits · workers/platform/pricing
Pagespages/platform/limits · pages/functions/pricing
R2r2/pricing
D1d1/platform/limits · d1/platform/pricing
KVkv/platform/limits · kv/concepts/how-kv-works
Durable Objects / Containers / Workers AIdurable-objects/pricing · containers/pricing · workers-ai/pricing
Tunnel / cloudflaredcloudflare-one/account-limits · TryCloudflare 文档
WAF / 限流waf/custom-rules · waf/rate-limiting-rules
DNS / SSLdns/manage-dns-records · ssl/universal-ssl
Turnstile / Email Routingturnstile/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 能解决,而它需要企业套餐。

本文的证据边界

99一句话总结

🎯 核心要点

Cloudflare 不是一堆并列的工具,而是一个请求会经过的六段路——找路、设卡、抄近道、现做、取料、回连;看到一个陌生名词时,先判断它守在哪一段上,再决定要不要理它,这比记住它的定义有用得多;而免费层真正会咬你的地方不是「不够用」,是三类性质完全不同的墙:条数上限(WAF 5 条、限流 1 条)、直接报错的每日配额(D1 按扫描行数算的那 500 万行)、以及不绑付款方式就开不了门(R2、Containers)。

最后一件事留给你自己验——这也是本篇唯一无法替你验证的一条:拿你自己的一个真实需求,走一遍六段路。

比如「我想给站点加个搜索框」或者「我想让同事能看我的本地报表」。先别查任何文档,就在纸上把六段写下来,标出这个需求落在哪几段、哪几段用不上。然后再去对照 场景索引那一节,看你标的和我建议的差在哪。

如果你能不看本文就把那六段默出来、并且说清哪几段在这个需求里是空的——这篇地图就长在你脑子里了。

⌂