← 数字花园读书 › Cloudflare 从 0 到 1 · 自学教程🚀 部署园
自学手册

Cloudflare 从 0 到 1

一份面向自学者的系统路线图:从注册账号、接入域名,一路走到用 Workers 写边缘函数、用 KV / D1 / R2 存数据、用 Tunnel 把内网服务安全暴露出去。全程免费套餐即可完成。

DNS · CDN · SSL Pages Workers KV / D1 / R2 Zero Trust Tunnel WAF
怎么用这份教程:按阶段顺序走,每个阶段都是「目标 → 动手步骤 → 验证 → 常见坑」。建议边读边做,不要只看。免费额度数字采用 2026-10 实测口径,最终以 官方定价页 为准。
阶段主题学完你能做耗时
0概念扫盲看懂产品地图,知道每个产品解决什么30 分钟
1账户 + 域名接入接入域名,获免费 CDN / SSL / DDoS1 小时
2第一个静态站点(Pages)部署前端项目成公网站点,自动 HTTPS1 小时
3第一个边缘函数(Workers)写并上线 API / 代理,跑通 Wrangler1–2 小时
4数据存储怎么选按场景选对 KV/D1/R2 并绑定 Worker2–3 小时
5内网穿透(Tunnel)不开端口安全暴露内网服务1 小时
6安全与性能实践配得快又稳,避开最常见坑1 小时
0

概念扫盲

What is Cloudflare

一句话定位

Cloudflare 是一张覆盖全球的边缘网络,站在「访客」和「你的服务器/源站」之间。它最初是 CDN(加速 + 缓存),如今已长成一套完整开发平台:能在节点上跑代码(Workers)、存数据(KV/D1/R2)、做身份认证(Zero Trust)、防攻击(WAF)。

三个核心心智模型

  1. 代理流量(Proxy):域名 NS 改成 Cloudflare 后,请求先到 CF 再回源。这就是「橙云 / 灰云」图标——橙云=流量经过 CF(受保护、可缓存);灰云=仅 DNS 解析、直连源站。
  2. 边缘网络(Edge):代码和数据不是跑在固定服务器,而是尽量跑在离访客最近的节点,延迟低、跨地域一致。
  3. 免费套餐够起步:个人项目、学习、小流量原型几乎都能在 Free 跑(见附录 A)。

产品地图(先混脸熟)

类别产品一句话用途类比
网络/安全DNS·CDN·SSL·WAF·DDoS解析、加速、加密、防攻击门面 + 保安
计算Workers边缘跑服务端代码(API/鉴权/代理)云函数
站点Pages前端项目一键部署成网站静态托管
存储KV键值存储,读多写少、最终一致全局配置表
存储D1边缘 SQLite 关系型库轻型 MySQL
存储R2对象存储,无出口费S3 替代品
存储Durable Objects强一致单点协调(聊天室/计数器)协调器
网络Zero Trust Tunnel不开端口暴露内网服务内网穿透
AIWorkers AI·Vectorize跑模型、存向量做语义检索AI 底座
关键提醒:产品不是越多越好。先定义 workloads(要解决什么问题),再选最小够用的产品,别反过来「手里有锤子看什么都像钉子」。
1

账户与域名接入

DNS · SSL · CDN
目标:把已有域名接进 Cloudflare,免费获得 CDN 加速、SSL 证书、DDoS 防护。
  1. 注册并添加站点。打开 dash.cloudflare.com 注册(免费足够)→ Add a Site → 输入根域名(裸域,不带 www/https)→ 选 Free。CF 自动扫描现有 DNS 记录,逐条核对 A / CNAME / MX / TXT。
  2. 修改 NS。CF 分配两个 NS(形如 xxx.ns.cloudflare.com)。到域名注册商后台替换掉旧 NS。通常 10 分钟–数小时生效,状态变 Active 并收到邮件。校验:dig +short ns yourdomain.com。
  3. 配置 SSL 模式。路径 SSL/TLS → Overview,选 Full (Strict)(源站有有效证书时)。源站无证书先选 Full,装好 Let's Encrypt 再升 Strict。
  4. 开安全/性能开关。Always Use HTTPS、Brotli、HTTP/3、Bot Fight Mode、Security Level Medium、Always Online 全部打开。

SSL 模式怎么选(最容易踩坑)

模式浏览器↔CFCF↔源站建议
Off明文明文别用
FlexibleHTTPSHTTP易重定向循环,不推荐
FullHTTPSHTTPS(不校验)源站自签证书时
Full (Strict)HTTPSHTTPS(校验)推荐
常见坑:① 邮件收不到——MX 与 mail.yourdomain.com 必须保持灰云(DNS only);② 后台登录重定向循环——SSL 用了 Flexible,改 Strict;③ 后台被缓存——给 /admin/* 设 Bypass;④ 源站看到的全是 CF IP——Nginx 配 set_real_ip_from + real_ip_header CF-Connecting-IP(IP 段见 cloudflare.com/ips-v4)。
2

第一个静态站点 · Pages

Deploy a static site
目标:把前端项目部署成公网网站,绑定自定义域名、自动 HTTPS、每次 push 自动上线。

三种部署方式

Git 连接(最推荐)
连 GitHub/GitLab,push 即部署,每个 PR 自动生成预览链接。
C3 脚手架 / 直接上传
命令行创建部署,或本地构建完拖到 Dashboard。

动手(以 C3 + 框架为例)

# 需要 Node.js 16.17+,建议 nvm/volta 管理版本
npm create cloudflare@latest -- my-static-site
# 选项:Hello World → Static site → TypeScript → git Yes → deploy No
cd my-static-site
npx wrangler dev      # 本地预览 http://localhost:8787
npx wrangler deploy   # 部署(首次会让你登录 Cloudflare)

绑定自定义域名

Pages 项目 → Custom domains → Set up a custom domain,输入 www.yourdomain.com 或裸域。CF 自动加 CNAME 并签发证书,几分钟生效。建议把 www 与裸域都接上,用 Redirect Rules 统一跳转。

Pages 免费额度:站点数不限、每月 500 次构建、每站最多 2 万文件(单文件 25MB)、静态资源无限带宽、允许商用。
3

第一个边缘函数 · Workers

Write & deploy a Worker
目标:写并上线一个能处理路由的 Worker(API / 反向代理 / 鉴权中间层)。

步骤 1:装好工具链

Workers 用 Wrangler(CF 的 CLI),官方推荐用 C3 创建项目,需 Node.js ≥ 16.17。

npm create cloudflare@latest -- my-first-worker
# 选项:Hello World → Worker only → JavaScript → git Yes → deploy No
cd my-first-worker

C3 生成:wrangler.jsonc(配置)、src/index.js(入口)、package.json。

步骤 2:写一个多路由 Worker

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

    if (url.pathname === "/") {
      return new Response("Hello from Cloudflare Workers!", {
        headers: { "content-type": "text/plain; charset=utf-8" },
      });
    }

    if (url.pathname === "/api/time") {
      return Response.json({
        timestamp: Date.now(),
        iso: new Date().toISOString(),
        region: request.cf?.colo || "unknown", // 边缘节点代码
      });
    }

    if (url.pathname === "/api/echo" && request.method === "POST") {
      const body = await request.json();
      return Response.json({ received: body, method: request.method });
    }

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

fetch(request, env, ctx) 是核心:每次请求都调用它,三参数分别是「请求 / 环境变量·bindings / 运行上下文」。

步骤 3:本地开发 + 部署

npx wrangler dev       # 首次会开浏览器登录
curl http://localhost:8787/
curl http://localhost:8787/api/time
npx wrangler deploy    # 首次让你创建 *.workers.dev 子域

步骤 4:环境变量与密钥

普通变量写进 wrangler.jsonc 的 vars(会进代码,别放密钥);密钥用 Secrets,绝不进仓库:

npx wrangler secret put MY_SECRET   # 代码里读 env.MY_SECRET
需要 Node.js API(部分框架)时,在 wrangler.jsonc 加 "compatibility_flags": ["nodejs_compat"]。
4

数据存储怎么选

KV · D1 · R2
目标:按访问模式和一致性需求选对存储,并绑定到 Worker。

决策表(先想清楚再选产品)

你要存什么用哪个一句话理由
配置 / 特性开关 / A-B / 读多写少KV全局分布、读极快、容忍短暂不一致
用户 / 订单 / 文章等结构化数据D1真·关系型:表/索引/事务/联表
图片 / 视频 / 备份 / 大文件R2对象存储、无出口费
已有 PostgreSQL / MySQLHyperdrive复用现有库、加速连接
聊天室 / 精确计数器(强一致)Durable Objects单实体强一致协调
心智口诀:KV 答「这个 key 对应什么值」;D1 答「哪些行匹配这个查询」;R2 答「存/取这个文件」。

KV 上手(配置 / 特性开关)

npx wrangler kv namespace create CONFIG   # 记下返回的 ID
// wrangler.jsonc 绑定: { "kv_namespaces": [{ "binding":"CONFIG", "id":"" }] }
const flags = await env.CONFIG.get("flags", "json");
await env.CONFIG.put("flags", JSON.stringify({ newUI: true }));

D1 上手(边缘 SQLite)

npx wrangler d1 create mydb
npx wrangler d1 execute mydb --remote --sql "CREATE TABLE posts (id INTEGER PRIMARY KEY, slug TEXT UNIQUE, body TEXT)"
// 注意:过滤列一定要建索引,否则全表扫描按扫描行数计费
const post = await env.DB.prepare("SELECT * FROM posts WHERE slug = ?").bind(slug).first();
D1 计费陷阱:按「扫描行数」不是按查询数。1 万行无索引查询 = 读 1 万行;有索引 = 读几行。索引建好,免费额度能撑约 500 倍流量(实测)。

R2 上手(无出口费的对象存储)

# 先在 Dashboard 启用 R2(免费额度需手动开启)
npx wrangler r2 bucket create my-assets
// wrangler.jsonc: { "r2_buckets": [{ "binding":"ASSETS", "bucket_name":"my-assets" }] }
await env.ASSETS.put("avatar.png", fileData);
const obj = await env.ASSETS.get("avatar.png");
bindings 是统一入口:无论 KV/D1/R2/Durable Objects,代码里都通过 env.XXX 访问。一个 Worker 可同时绑多个,但每多一个产品就多一个要运维的部件,按需添加。
5

内网穿透 · Tunnel

Zero Trust Tunnel
目标:不开路由器端口、不暴露公网 IP,把家里/内网服务(仪表盘、Nextcloud、SSH)安全发布到公网,免费获 DDoS 防护与 HTTPS。

它解决什么

传统端口转发三大痛点:要开端口、家宽 IP 暴露、自己管证书。Tunnel 反过来——由你服务器主动向外连一条加密隧道到 CF,外部用户先到 CF 再经隧道回源。源站零入站端口、零公网 IP 暴露。

方式 A:Dashboard(远程托管,推荐新手)

  1. 打开 Zero Trust 控制台 → Networks → Tunnels → Create a tunnel → 选 Cloudflared。
  2. 命名隧道,复制安装命令(含令牌)在服务器跑,注册成系统服务(开机自启、崩溃重启)。
  3. 看到 Healthy 绿标即连接成功。
  4. Public Hostname → Add:填子域(如 app)、域名、Service: http://localhost:8080。
  5. 访问 https://app.yourdomain.com 即可——CF 自动发证书,源站无需配 TLS。

方式 B:CLI(config-as-code,多服务 / 进版本库)

cloudflared tunnel login
cloudflared tunnel create my-tunnel
cloudflared tunnel route dns my-tunnel app.yourdomain.com
# ~/.cloudflared/config.yml
tunnel: my-tunnel
credentials-file: /root/.cloudflared/my-tunnel.json
ingress:
  - hostname: app.yourdomain.com
    service: http://localhost:8080
  - hostname: files.yourdomain.com
    service: http://localhost:80
  - service: http_status:404   # 必填兜底,放最后
cloudflared tunnel run my-tunnel      # 前台测试
sudo cloudflared service install      # 装成系统服务

快速验证(无需账号)

cloudflared tunnel --url http://localhost:8080
# 生成随机 https://xxx.trycloudflare.com,关掉即失效,仅演示/Webhook 测试

加一层访问控制(很重要)

Tunnel 本身让服务人人可访问。加 Zero Trust Access 收口:

  • 邮箱登录:Access → Applications → 设域名 → 策略 Allow 邮箱后缀 @yourdomain.com,用户先看 CF 登录页。
  • 一次性 PIN:策略 Allow 指定邮箱 → 认证方式 One-time PIN,输入邮箱收码即进,免密免注册。
  • Service Token:给程序调用,请求带 CF-Access-Client-Id / CF-Access-Client-Secret 头。
还能穿透非 HTTP:SSH(ssh://localhost:22)、TCP(tcp://localhost:5432)、数据库等。
6

安全与性能实践

Best practices

加密与身份

  • SSL 永远 Full (Strict)(源站有有效证书时)。
  • 开 Always Use HTTPS + 谨慎开 HSTS。
  • 邮件相关记录保持灰云(DNS only)。

WAF(免费也够用)

Free 含 Cloudflare Free Managed Ruleset(OWASP Top 10 如 SQL 注入、XSS 子集)+ 自定义规则(按 IP / 国家 / UA / 路径拦截)。

缓存策略

免费 3 条 Page Rules(或新版 Cache Rules):*/uploads/* → Cache Everything;*/admin/* → Bypass;全站 → 总是 HTTPS。校验命中看响应头 CF-Cache-Status(HIT/MISS/BYPASS/DYNAMIC)。源站设 Cache-Control: private 则 CF 不缓存。

防 Bot 与限速

  • 开 Bot Fight Mode(免费)。
  • 对外表单/登录用 Turnstile(隐私友好验证码)替代手写验证。
  • 防火墙规则给敏感路径限流或挑战。

架构纪律(免费额度不被打爆)

实测教训:KV 写(1000/天)比 Worker 请求(10 万/天)小 100 倍——计数器/会话/访问日志这类写重场景别用 KV,改 D1 或外部队列。静态内容优先 Pages;只有边缘逻辑真正加分才用 Workers;别把重计算塞进请求路径(单请求 CPU 上限 10ms 免费)。
A

免费额度速查

Free tier · 2026-10
截至 2026-10 实测口径,最终以 官方定价页 为准。每日额度 UTC 00:00 重置。
产品免费额度关键项超限后果
Workers10 万请求/天;10ms CPU/请求;50 子请求;128MB;最多 100 脚本;脚本 3MB请求失败 429
Pages站点不限;500 构建/月;每站 2 万文件(单文件 25MB);静态无限带宽构建排队
D110 库/账户;每库 500MB(共 5GB);500 万行读/天;10 万行写/天;7 天 Time Travel查询失败至重置
KV10 万读/天;1000 写-删-列/天;1GB 存储读/写失败
R210GB 存储;100 万 A 类/月;1000 万 B 类/月;无出口费(需先启用)超出计费
WAFFree Managed Ruleset + 自定义规则—
其他免费3 条 Page Rules、Email Routing、Tunnel、Turnstile、Zaraz—

付费起步:Workers Paid $5/月,含 1000 万请求 + 3000 万 CPU-ms,解除大部分限制;R2 存储 $0.015/GB/月;D1 读 250 亿行/月后 $0.001/百万行。无出口/带宽费是相较 AWS S3 的最大优势(S3 出流量约 $0.09/GB,R2 为 $0)。

B

学习资源清单

Where to go deeper

官方文档(首选)

社区好文(概念通俗)

资料来源

最后建议:最稳起步路线——① Pages 先把网站跑起来 → ② 需要 API/代理再加 Workers → ③ 数据按需求选 KV/D1/R2 → ④ 内网服务用 Tunnel + Zero Trust Access 收口。遇到报错先抓「公开页 / 响应头 / 日志」做最终判据,再查对应官方文档。
↑