2661 字
13 分钟

Cloudflare Workers 实战教程:免费搭建反向代理 + 订阅转换 + Pages 静态托管 | 2026

Cloudflare Workers 是 Cloudflare 提供的无服务器(Serverless)运行平台,代码运行在 Cloudflare 遍布全球 300+ 城市的边缘节点上。免费版每天 10 万次请求,对个人使用完全够用,无需购买服务器。

本文覆盖三个最实用的场景:

  1. 反向代理:代理 OpenAI API、GitHub CDN,解决国内访问受限问题
  2. 订阅转换:将机场订阅链接转换为不同客户端格式
  3. Pages 静态托管:零配置部署博客/文档站点

一、准备工作#

1.1 注册 Cloudflare 账号#

访问 https://dash.cloudflare.com/sign-up 注册免费账号,无需绑定域名即可使用 Workers(会分配 xxx.workers.dev 子域名)。

1.2 免费套餐限额速查#

资源免费版限制付费版($5/月)
每日请求数100,000 次1000 万次
CPU 时间 / 请求10ms50ms
Workers 脚本数量100 个无限
KV 存储读取100,000 次 / 天1000 万次 / 天
KV 存储写入1,000 次 / 天100 万次 / 天
KV 存储容量1 GB无限
Pages 站点数无限无限
Pages 部署带宽无限无限

1.3 安装 Wrangler CLI(推荐)#

Wrangler 是 Cloudflare 官方的 CLI 工具,可以在本地开发和调试 Workers:

Terminal window
# 需要 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 项目#

Terminal window
# 创建新项目
wrangler init openai-proxy
cd openai-proxy

2.3 编写反向代理脚本#

src/index.js
// 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 配置文件#

wrangler.toml
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 部署#

Terminal window
# 部署到 Cloudflare Workers
wrangler deploy
# 部署成功后,会显示 Worker URL,例如:
# https://openai-proxy.你的账号名.workers.dev

2.6 使用方式#

# Python 示例:将 API base_url 改为你的 Worker URL
import 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 反代脚本#

src/index.js
// 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 中的域名替换:

Terminal window
# 原始 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 转发,同时隐藏原始订阅链接:

src/index.js
// 订阅转换代理 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(保护订阅链接)#

Terminal window
# 将机场订阅链接安全地存入 Worker Secret(不会出现在代码中)
wrangler secret put SUB_URL
# 粘贴你的订阅链接后回车
# 设置访问 Token(可选)
wrangler secret put ACCESS_TOKEN
# 输入一个随机字符串

4.4 使用方式#

Terminal window
# 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 仓库

  1. 进入 Cloudflare DashboardPagesCreate a project
  2. 选择 Connect to Git → 授权 GitHub → 选择仓库
  3. 配置构建设置:
框架构建命令输出目录
Astronpm run builddist
Next.jsnpm run build.next
Vue/Vitenpm run builddist
Hugohugopublic
纯 HTML无(留空)/(根目录)
Jekylljekyll build_site
  1. 点击 Save and Deploy,后续每次 git push 自动重新部署

5.2 通过 Wrangler CLI 部署#

Terminal window
# 直接部署本地目录到 Pages
wrangler pages deploy ./dist --project-name my-blog
# 指定分支(Pages 支持预览部署)
wrangler pages deploy ./dist --project-name my-blog --branch preview

5.3 绑定自定义域名#

  1. Pages 项目设置 → Custom domainsSet up a custom domain
  2. 输入你的域名(如 blog.yourdomain.com
  3. Cloudflare 自动添加 CNAME 记录并签发 SSL 证书

💡 如果域名也在 Cloudflare 托管(推荐),整个流程全自动,约 1 分钟生效。

5.4 本博客(fuwari)也可以托管在 Pages#

本站基于 Astro + fuwari 主题,完全兼容 Cloudflare Pages:

Terminal window
# 构建
npm run build # 输出到 dist/
# 部署
wrangler pages deploy ./dist --project-name fuwari-blog

六、KV 存储:数据持久化#

Workers KV 是 Cloudflare 提供的全球分布式键值存储,适合存储配置、缓存数据等。

6.1 创建 KV 命名空间#

Terminal window
# 创建 KV 命名空间
wrangler kv namespace create MY_STORE
# 输出示例:
# ✅ 成功创建命名空间 MY_STORE,ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

6.2 在配置文件中绑定#

wrangler.toml
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 本地开发调试#

Terminal window
# 启动本地开发服务器(支持热重载)
wrangler dev
# 访问 http://localhost:8787 测试

7.2 查看日志#

Terminal window
# 实时查看线上 Worker 日志(需要在代码中使用 console.log)
wrangler tail
# 或在 Dashboard 中查看:Workers → 你的 Worker → Logs

7.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 描述你的需求。对于个人开发者和轻量级场景,它几乎是完美的免费基础设施。


相关文章

本文所有代码均经过测试验证,请遵守 Cloudflare 服务条款及当地相关法律法规,合理合规使用各类服务。

Cloudflare Workers 实战教程:免费搭建反向代理 + 订阅转换 + Pages 静态托管 | 2026
https://971918.xyz/posts/docs/cloudflare-workers-guide/
作者
九所长
发布于
2026-07-10
许可协议
CC BY-NC-SA 4.0