Cloudflare Workers 入门:零成本搭建你的第一个 Serverless 应用
你有了一台 VPS,在上面跑了 Nginx、MySQL、几个网站,偶尔还要重启一下因为内存炸了。然后你听说"Serverless 不用管服务器",但 AWS Lambda 那套 IAM 权限差点把你送走。你只是想写几行 JS 做个 API,能不能别那么重?能。Cloudflare Workers 免费额度一天 10 万次请求,零服务器、零运维,代码 push 上去就跑。
Workers 到底是什么
一句话:把 JavaScript 跑在 Cloudflare 全球 300+ 边缘节点上。用户请求过来,就近的节点执行你的代码然后返回结果,全球延迟 50ms 以内。
对比一下你已有的方案:
| 方案 | 部署位置 | 延迟 | 成本 | 运维 |
|---|---|---|---|---|
| VPS + Nginx | 单机房 | 看机房位置 | 月付几十 | 要管 |
| Cloudflare Pages | 全球边缘 | 低 | 免费 | 零 |
| Cloudflare Workers | 全球边缘 | 极低 | 免费 10万次/天 | 零 |
Pages 适合静态网站,Workers 适合动态逻辑——API、A/B 测试、请求改写、简易后端,这些 Pages 做不了。
环境准备
你需要一个 Cloudflare 账号和一个 Node.js 环境。用 npm 装 wrangler(Cloudflare 官方 CLI):
npm install -g wrangler
登录授权:
wrangler login
浏览器弹窗确认后,你的终端就能直接操作用 Cloudflare 账号下的 Workers 了。
第一个 Worker:IP 归属地查询
创建一个项目:
mkdir geo-api && cd geo-api
wrangler init geo-api
编辑 src/index.js:
export default {
async fetch(request) {
// Cloudflare 自动注入 request.cf 对象,包含请求的地理信息
const { country, city, region, timezone, colo } = request.cf;
return new Response(JSON.stringify({
ip: request.headers.get('cf-connecting-ip'),
country: country || '未知',
city: city || '未知',
region: region || '未知',
timezone: timezone || '未知',
colo: colo || '未知', // 处理请求的边缘节点
}, null, 2), {
headers: { 'content-type': 'application/json;charset=UTF-8' },
});
},
};
request.cf 是 Cloudflare 免费送的数据,不需要调用任何第三方 API。部署:
wrangler deploy
10 秒后访问 https://geo-api.你的子域名.workers.dev,返回:
{
"ip": "123.45.67.89",
"country": "CN",
"city": "Shanghai",
"region": "Shanghai",
"timezone": "Asia/Shanghai",
"colo": "SHA"
}
这就是一个零成本、全球低延迟的 IP 查询 API。你不需要买服务器、装 Nginx、配 SSL——Cloudflare 全包了。
实用场景二:为你的博客做 A/B 测试
假设你想测试两种不同的导航栏样式,Worker 可以按 50% 概率分流:
export default {
async fetch(request) {
// 根据 cookie 或随机数决定走哪个版本
const cookie = request.headers.get('cookie') || '';
let variant;
if (cookie.includes('variant=b')) {
variant = 'b';
} else if (cookie.includes('variant=a')) {
variant = 'a';
} else {
variant = Math.random() < 0.5 ? 'a' : 'b';
}
const url = new URL(request.url);
// 转发到不同的 A/B 页面(可以是两个 Pages 部署或两个路径)
url.pathname = variant === 'a' ? '/index-a.html' : '/index-b.html';
const response = await fetch(url.toString());
const newResponse = new Response(response.body, response);
// 写入 cookie 保证同一用户看到一致版本
newResponse.headers.set('set-cookie', `variant=${variant}; path=/; max-age=86400`);
return newResponse;
},
};
不用装 Nginx split_clients 模块,不用改 DNS,几行 JS 搞定。
实用场景三:短链接跳转
你之前写过自建短链接服务(用 PHP + MySQL),用 Workers + KV 可以更轻:
export default {
async fetch(request, env) {
const url = new URL(request.url);
const slug = url.pathname.slice(1); // 去掉开头的 /
if (!slug) {
return new Response('短链接服务', { status: 200 });
}
// 从 KV 存储查原始链接
const target = await env.LINKS.get(slug);
if (target) {
return Response.redirect(target, 301);
}
return new Response('404 Not Found', { status: 404 });
},
};
配一个 KV 命名空间:
wrangler kv:namespace create LINKS
然后在 wrangler.toml 绑定:
kv_namespaces = [
{ binding = "LINKS", id = "你的KV_ID" }
]
写入短链:
wrangler kv:key put --binding=LINKS "gh" "https://github.com/zjunwei"
这方案的优势:全球 301 跳转延迟极低,没有数据库,没有 PHP,KV 免费额度每天百万次读写。
Workers 的边界:什么能做,什么不能做
| 能做 | 不能做 / 不适合 |
|---|---|
| API 代理与聚合 | WebSocket 长连接(有 30 秒超时) |
| HTML Rewrite / A/B 测试 | 大文件上传下载(单次 100MB 限制) |
| 请求鉴权 / 防火墙逻辑 | 复杂数据库操作(无 SQL) |
| 简单的 KV 存储读写 | CPU 密集型计算(单请求 30 秒 wall time) |
| 定时任务(Cron Triggers) | 需要保持长连接的服务 |
对于博客场景——短链跳转、A/B 测试、API 聚合、评论反垃圾过滤、图片水印实时处理——Workers 完全够用,而且是免费的。
一个月能省下什么
假设你现在有一台 5 美元/月的 VPS 专门跑几个轻量 API:
| 项目 | VPS 方案 | Workers 方案 |
|---|---|---|
| IP 归属 API | 装 Nginx + Python Flask | 一个 Worker,0 元 |
| 短链接跳转 | PHP + MySQL | Workers + KV,0 元 |
| 博客访客统计 | 自建 Umami | Worker + KV 计数器,0 元 |
| SSL 证书 | Let's Encrypt 自动续 | Cloudflare 自带 |
| 服务器监控 | Uptime Kuma | 不需要,Workers 永不宕机 |
把轻量 API 迁到 Workers,VPS 只跑 WordPress 和数据库,负载降一半,说不定还能降配省钱。
Q&A
Q:Workers 和 Cloudflare Pages Functions 有什么区别?
Pages Functions 本质是 Workers 的封装,放在 Pages 项目目录里自动部署。如果你已经有 Cloudflare Pages 网站,加一个 functions/ 目录就行,不用单独建 Worker 项目。纯 API 场景用 Workers 更干净。
Q:免费额度够用吗?
每天 10 万次请求,KV 每天百万次读写。大多数个人博客一天几百到几千 PV,完全用不完。超出后按 $0.30/百万次计费,也比 VPS 便宜。
Q:Workers 能连数据库吗?
不能直连 MySQL/PostgreSQL,但可以用 Cloudflare D1(Serverless SQLite,原生兼容)或者通过 HTTP API 代理连外部数据库。小规模数据直接用 KV 就够了。
Q:部署后怎么绑定自己的域名?
在 Cloudflare 控制台 Workers 页面 → Triggers → Custom Domains,添加你的域名路由,比如 api.zjunwei.com/*。前提是域名已接入 Cloudflare DNS。
一次部署,全球生效。不写 nginx.conf,不看 syslog,没有半夜的 "Disk Full" 告警。这就是 Workers ——免费的东西,做到好用才是真本事。 (内容由AI生成,仅供参考)