Cloudflare Workers 实战教程:免费搭建反向代理 + 订阅转换 + Pages 静态托管 | 2026
Cloudflare Workers 是 Cloudflare 提供的无服务器(Serverless)运行平台,代码运行在 Cloudflare 遍布全球 300+ 城市的边缘节点上。免费版每天 10 万次请求,对个人使用完全够用,无需购买服务器。
本文覆盖三个最实用的场景:
- 反向代理:代理 OpenAI API、GitHub CDN,解决国内访问受限问题
- 订阅转换:将机场订阅链接转换为不同客户端格式
- Pages 静态托管:零配置部署博客/文档站点
一、准备工作
1.1 注册 Cloudflare 账号
访问 https://dash.cloudflare.com/sign-up 注册免费账号,无需绑定域名即可使用 Workers(会分配 xxx.workers.dev 子域名)。
1.2 免费套餐限额速查
| 资源 | 免费版限制 | 付费版($5/月) |
|---|---|---|
| 每日请求数 | 100,000 次 | 1000 万次 |
| CPU 时间 / 请求 | 10ms | 50ms |
| Workers 脚本数量 | 100 个 | 无限 |
| KV 存储读取 | 100,000 次 / 天 | 1000 万次 / 天 |
| KV 存储写入 | 1,000 次 / 天 | 100 万次 / 天 |
| KV 存储容量 | 1 GB | 无限 |
| Pages 站点数 | 无限 | 无限 |
| Pages 部署带宽 | 无限 | 无限 |
1.3 安装 Wrangler CLI(推荐)
Wrangler 是 Cloudflare 官方的 CLI 工具,可以在本地开发和调试 Workers:
# 需要 Node.js 16+npm install -g wrangler
# 登录 Cloudflare 账号wrangler login# 会打开浏览器,授权后自动完成
# 验证登录状态wrangler whoami💡 如果不想安装 CLI,也可以直接在 Cloudflare Dashboard 的在线编辑器中写代码,功能稍少但对新手更友好。
二、反向代理:代理 OpenAI API
2.1 场景说明
OpenAI API(api.openai.com)在国内无法直接访问。通过 Workers 反向代理,可以:
- 用
你的域名/workers.dev替代api.openai.com - 代码运行在 Cloudflare 边缘节点,自动拥有全球 IP
2.2 创建 Worker 项目
# 创建新项目wrangler init openai-proxycd openai-proxy2.3 编写反向代理脚本
// OpenAI API 反向代理 Worker
// 目标域名const TARGET_HOST = 'api.openai.com';
// 访问控制:添加 Bearer Token 防止被他人滥用(留空则不验证)const ACCESS_TOKEN = ''; // 建议填一个随机字符串,如 "my-secret-2026"
export default { async fetch(request, env, ctx) { // 验证访问 Token(如果设置了的话) if (ACCESS_TOKEN) { const authHeader = request.headers.get('X-Access-Token'); if (authHeader !== ACCESS_TOKEN) { return new Response('Unauthorized', { status: 401 }); } }
// 构建目标 URL:将请求域名替换为 OpenAI const url = new URL(request.url); url.hostname = TARGET_HOST; url.protocol = 'https:'; url.port = '';
// 克隆请求,修改目标 URL const proxyRequest = new Request(url.toString(), { method: request.method, headers: request.headers, body: request.body, redirect: 'follow', });
// 转发请求到 OpenAI try { const response = await fetch(proxyRequest);
// 修改响应头,添加 CORS 支持(允许浏览器跨域调用) const newHeaders = new Headers(response.headers); newHeaders.set('Access-Control-Allow-Origin', '*'); newHeaders.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); newHeaders.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
// 处理预检请求 if (request.method === 'OPTIONS') { return new Response(null, { status: 204, headers: newHeaders }); }
return new Response(response.body, { status: response.status, statusText: response.statusText, headers: newHeaders, }); } catch (error) { return new Response(`Proxy Error: ${error.message}`, { status: 502 }); } },};2.4 配置文件
name = "openai-proxy"main = "src/index.js"compatibility_date = "2026-01-01"
# 如果有自定义域名,在这里绑定# [env.production]# routes = [{ pattern = "api.yourdomain.com/*", zone_name = "yourdomain.com" }]2.5 部署
# 部署到 Cloudflare Workerswrangler deploy
# 部署成功后,会显示 Worker URL,例如:# https://openai-proxy.你的账号名.workers.dev2.6 使用方式
# Python 示例:将 API base_url 改为你的 Worker URLimport openai
client = openai.OpenAI( api_key="sk-your-openai-api-key", base_url="https://openai-proxy.你的账号.workers.dev/v1")
response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": "Hello!"}])三、反向代理:GitHub CDN 加速
3.1 场景说明
GitHub 的原始文件(raw.githubusercontent.com)和 Release 下载在国内速度极慢。通过 Workers 代理,可以让国内用户快速下载 GitHub 上的文件。
3.2 通用 GitHub 反代脚本
// GitHub 文件加速 Worker
// 允许代理的域名白名单(防止被用作通用代理)const ALLOWED_HOSTS = [ 'raw.githubusercontent.com', 'github.com', 'objects.githubusercontent.com', // GitHub LFS 和 Release 资产 'codeload.github.com', // 下载 ZIP/TAR 'api.github.com',];
export default { async fetch(request) { const url = new URL(request.url);
// 路径格式:/代理域名/路径 // 例如:/raw.githubusercontent.com/user/repo/main/file.txt const pathParts = url.pathname.slice(1).split('/'); const targetHost = pathParts[0]; const targetPath = '/' + pathParts.slice(1).join('/');
// 验证目标域名 if (!ALLOWED_HOSTS.includes(targetHost)) { return new Response( JSON.stringify({ error: `不允许代理 ${targetHost},仅支持 GitHub 相关域名` }), { status: 403, headers: { 'Content-Type': 'application/json' } } ); }
// 构建目标 URL const targetUrl = `https://${targetHost}${targetPath}${url.search}`;
// 转发请求 const proxyRequest = new Request(targetUrl, { method: request.method, headers: { ...Object.fromEntries(request.headers), 'Host': targetHost, }, body: ['GET', 'HEAD'].includes(request.method) ? undefined : request.body, });
const response = await fetch(proxyRequest);
// 添加缓存控制:对静态文件缓存 1 天 const newHeaders = new Headers(response.headers); if (response.status === 200) { newHeaders.set('Cache-Control', 'public, max-age=86400'); } newHeaders.set('Access-Control-Allow-Origin', '*');
return new Response(response.body, { status: response.status, headers: newHeaders, }); },};3.3 使用示例
部署后,将 GitHub 原始 URL 中的域名替换:
# 原始 URL(国内可能很慢)https://raw.githubusercontent.com/user/repo/main/install.sh
# 通过 Worker 加速访问https://github-proxy.你的账号.workers.dev/raw.githubusercontent.com/user/repo/main/install.sh
# 下载 Release 文件https://github-proxy.你的账号.workers.dev/objects.githubusercontent.com/...四、订阅转换服务部署
4.1 场景说明
不同代理客户端(Clash/sing-box/Shadowrocket/V2Ray)使用不同的订阅格式。订阅转换服务可以将机场提供的原始订阅链接转换为目标客户端的格式。
4.2 使用现有开源项目(推荐)
最简单的方案是将成熟的开源订阅转换项目(如 subconverter)的 API 通过 Workers 转发,同时隐藏原始订阅链接:
// 订阅转换代理 Worker// 将用户的订阅链接通过 subconverter API 转换
// 公共 subconverter API(也可以自建)const SUBCONVERTER_API = 'https://api.v1.mk';
// 你的机场订阅链接(存储在 Worker Secret 中,不要直接写在代码里)// 在 wrangler.toml 中配置:[vars] 或使用 wrangler secret
export default { async fetch(request, env) { const url = new URL(request.url);
// 从 Secret 获取订阅链接(安全存储) const subUrl = env.SUB_URL; // 通过 wrangler secret put SUB_URL 设置
if (!subUrl) { return new Response('订阅链接未配置', { status: 500 }); }
// 解析请求参数,支持指定目标格式 const target = url.searchParams.get('target') || 'clash'; // 默认转换为 Clash 格式 const token = url.searchParams.get('token') || '';
// 简单的访问控制 if (env.ACCESS_TOKEN && token !== env.ACCESS_TOKEN) { return new Response('访问被拒绝', { status: 403 }); }
// 构建 subconverter 请求 URL const convertUrl = new URL(`${SUBCONVERTER_API}/sub`); convertUrl.searchParams.set('target', target); convertUrl.searchParams.set('url', subUrl); convertUrl.searchParams.set('udp', 'true'); convertUrl.searchParams.set('tfo', 'false'); convertUrl.searchParams.set('emoji', 'true');
// 转发到 subconverter const response = await fetch(convertUrl.toString());
// 修改 Content-Disposition,方便客户端识别 const newHeaders = new Headers(response.headers); newHeaders.set('Content-Disposition', `attachment; filename="subscribe.yaml"`); newHeaders.set('Cache-Control', 'no-cache'); // 订阅不缓存,保证最新
return new Response(response.body, { status: response.status, headers: newHeaders, }); },};4.3 设置 Secret(保护订阅链接)
# 将机场订阅链接安全地存入 Worker Secret(不会出现在代码中)wrangler secret put SUB_URL# 粘贴你的订阅链接后回车
# 设置访问 Token(可选)wrangler secret put ACCESS_TOKEN# 输入一个随机字符串4.4 使用方式
# Clash 格式订阅(默认)https://your-worker.workers.dev/?token=你的token
# sing-box 格式https://your-worker.workers.dev/?target=singbox&token=你的token
# V2Ray 格式https://your-worker.workers.dev/?target=v2ray&token=你的token
# Shadowrocket 格式https://your-worker.workers.dev/?target=surge&token=你的token五、Cloudflare Pages:静态站点零成本托管
Cloudflare Pages 专门用于静态站点托管,比 GitHub Pages 更快(全球 CDN),支持自定义域名,完全免费。
5.1 从 GitHub 自动部署
方法一(推荐):连接 GitHub 仓库
- 进入 Cloudflare Dashboard → Pages → Create a project
- 选择 Connect to Git → 授权 GitHub → 选择仓库
- 配置构建设置:
| 框架 | 构建命令 | 输出目录 |
|---|---|---|
| Astro | npm run build | dist |
| Next.js | npm run build | .next |
| Vue/Vite | npm run build | dist |
| Hugo | hugo | public |
| 纯 HTML | 无(留空) | /(根目录) |
| Jekyll | jekyll build | _site |
- 点击 Save and Deploy,后续每次
git push自动重新部署
5.2 通过 Wrangler CLI 部署
# 直接部署本地目录到 Pageswrangler pages deploy ./dist --project-name my-blog
# 指定分支(Pages 支持预览部署)wrangler pages deploy ./dist --project-name my-blog --branch preview5.3 绑定自定义域名
- Pages 项目设置 → Custom domains → Set up a custom domain
- 输入你的域名(如
blog.yourdomain.com) - Cloudflare 自动添加 CNAME 记录并签发 SSL 证书
💡 如果域名也在 Cloudflare 托管(推荐),整个流程全自动,约 1 分钟生效。
5.4 本博客(fuwari)也可以托管在 Pages
本站基于 Astro + fuwari 主题,完全兼容 Cloudflare Pages:
# 构建npm run build # 输出到 dist/
# 部署wrangler pages deploy ./dist --project-name fuwari-blog六、KV 存储:数据持久化
Workers KV 是 Cloudflare 提供的全球分布式键值存储,适合存储配置、缓存数据等。
6.1 创建 KV 命名空间
# 创建 KV 命名空间wrangler kv namespace create MY_STORE
# 输出示例:# ✅ 成功创建命名空间 MY_STORE,ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6.2 在配置文件中绑定
name = "my-worker"main = "src/index.js"
[[kv_namespaces]]binding = "MY_STORE" # 在代码中用 env.MY_STORE 访问id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"6.3 在 Worker 中使用 KV
export default { async fetch(request, env) { // 写入 await env.MY_STORE.put('key', 'value', { expirationTtl: 3600, // 1 小时后过期(可选) });
// 读取 const value = await env.MY_STORE.get('key');
// 存储 JSON await env.MY_STORE.put('config', JSON.stringify({ theme: 'dark', lang: 'zh' })); const config = JSON.parse(await env.MY_STORE.get('config'));
// 删除 await env.MY_STORE.delete('key');
// 列出所有 key const list = await env.MY_STORE.list({ prefix: 'user:' });
return new Response(value || 'not found'); },};七、实用技巧与注意事项
7.1 本地开发调试
# 启动本地开发服务器(支持热重载)wrangler dev
# 访问 http://localhost:8787 测试7.2 查看日志
# 实时查看线上 Worker 日志(需要在代码中使用 console.log)wrangler tail
# 或在 Dashboard 中查看:Workers → 你的 Worker → Logs7.3 Workers 性能注意事项
// ❌ 不要在 Worker 中做 CPU 密集计算(10ms CPU 上限很快会超)// ❌ 不要在 Worker 中读取大文件(有内存限制)// ✅ Workers 适合:I/O 密集型(网络请求转发)、简单数据处理、路由分发
// 正确处理异步:使用 async/await,避免阻塞export default { async fetch(request, env, ctx) { // ctx.waitUntil:让某些任务在响应返回后继续执行(如日志上报) ctx.waitUntil(logRequest(request));
return new Response('OK'); },};7.4 安全最佳实践
// ✅ 敏感信息用 Secret 存储,不写死在代码中const apiKey = env.SECRET_API_KEY; // 通过 wrangler secret put 设置
// ✅ 添加速率限制,防止被滥用// ✅ 对敏感接口添加 IP 白名单或 Token 验证// ✅ 设置合适的 CORS 策略,不要无脑 Access-Control-Allow-Origin: *
// CORS 只允许特定域名const allowedOrigins = ['https://yourdomain.com', 'https://www.yourdomain.com'];const origin = request.headers.get('Origin');const corsHeaders = { 'Access-Control-Allow-Origin': allowedOrigins.includes(origin) ? origin : '', 'Access-Control-Allow-Methods': 'GET, POST', 'Access-Control-Allow-Headers': 'Content-Type, Authorization',};总结
| 场景 | 方案 | 免费额度是否够用 |
|---|---|---|
| OpenAI API 代理 | Workers 反向代理 | ✅ 个人使用完全够(10万次/天) |
| GitHub CDN 加速 | Workers 反向代理 | ✅ 够用(文件缓存可大幅降低请求数) |
| 机场订阅转换 | Workers + subconverter | ✅ 订阅更新频率低,每天几十次请求 |
| 静态博客托管 | Cloudflare Pages | ✅ 无限部署、无限带宽 |
| 配置数据存储 | Workers KV | ✅ 读 10万次/天,一般够用 |
Cloudflare Workers 的核心价值:零服务器成本,全球 CDN 加速,用 JavaScript 描述你的需求。对于个人开发者和轻量级场景,它几乎是完美的免费基础设施。
相关文章:
- Nginx 进阶实战完全指南:负载均衡 + 限流 + 缓存
- Docker Compose 实战:多容器编排完全指南
- HTTPS/SSL 完全指南:证书申请、配置与续期
- mihomo(Clash Meta)完全配置指南 2026
本文所有代码均经过测试验证,请遵守 Cloudflare 服务条款及当地相关法律法规,合理合规使用各类服务。