API 中转节点搭建指南

本文介绍如何通过Cloudflare的Workers实现简易的中转节点的搭建。

应用:国内通过API转发调用国外大模型。

设备配置[1]

  • 设备:腾讯云轻量应用服务器(特惠型实例)
  • 系统:Debian 12.13
  • CPU:4 核
  • 内存:4 GB
  • 存储:40 GB SSD

背景

  • 不愿在服务器上安装代理如 mihomo 等。
  • 国内聚合平台要么不稳定,要么不包含 Gemini、OpenAI、Claude 等API。
  • 拥有自己的域名,域名为腾讯云域名[2]

核心原理

  • Cloudflare 提供免费的无服务器计算资源(Workers),可以将国内服务器的请求转发到海外 API。
  • Workers 默认分配的 *.workers.dev 域名在国内无法访问,需要通过自定义域名服务将 Worker 绑定到自定义域名实现国内服务器等直接访问。
  • Cloudflare 需接管域名的 DNS 解析权才可进行自定义域名服务。


flowchart LR
    A[国内服务器] --> B[自定义域名]
    B --> C[Cloudflare Worker]
    C --> D[海外 API]
    E[DNS 解析权] --> F[Cloudflare]
    F --> B
    F --> C
    A -. 不可访问 .-> G[默认域名] 


转发请求这里以转发 OpenRouter API 服务为例,其他镜像站同理。[3]

步骤

将域名添加到Cloudflare

  1. 注册并登录Cloudflare账号
  2. 输入主域名
    • 例如 yourdomain.com
    • 不要 http://www. 前缀
  3. 选择Free套餐
  4. Cloudflare会自动扫描你现有的 DNS 记录
    • 务必将现有 A 记录取消勾选,转变为 DNS only
    • 否则Cloudflare的SSL加密会与你服务器原本的证书发生冲突。

在域名注册商更改Nameservers

  1. 登录你的域名注册商控制台(如腾讯云/阿里云)
  2. 找到域名注册的管理页
    • 搜索「域名注册」而非「域名管理」。
  3. 找到「DNS 服务器」选项
    • 替换为Cloudflare提供的Nameserver。
    • 通常是两个人名格式的地址:
      • 例如:evelyn.ns.cloudflare.com
      • 例如:miguel.ns.cloudflare.com
  4. 保存设置
    • 一般等待几分钟即可生效
    • 成功标志:Your domain is now protected by Cloudflare

创建Cloudflare Worker

本人没有 js 基础,所有代码均由 Gemini 生成并更改,欢迎提出更改意见。

  1. 进入「Workers & Pages」页面
    • 通过点击「Workers Routes」页面中的「Manage Workers」进入「Workers & Pages」页面。
    • 通过点击「Build」分类中的「Computer」选项卡进入「Workers & Pages」页面。
  2. 点击「Create Application」
    • 选择「Start with Hello World!」以便后续更改。
  3. 输入名称并部署
    • 例如 api-proxy,下文均以 api-proxy 为例。
    • 点击「Deploy」部署Worker。
  4. 编写带有「数据清洗功能」的代理代码
    • n8n 在较新版本中调用OpenAI时,会在发送的JSON中塞入一个 store 参数。
    • OpenRouter 等镜像站不支持这个参数,导致「400 Invalid Responses API request」。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
export default {
async fetch(request, env) {
const url = new URL(request.url);
// 这里以 OpenRouter 为例
url.hostname = 'openrouter.ai';

// 处理浏览器的 CORS 跨域预检请求
if (request.method === 'OPTIONS') {
return new Response(null, {
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': '*',
}
});
}

// 清理可能导致被拦截的来源信息
const newHeaders = new Headers(request.headers);
newHeaders.delete('Origin');
newHeaders.delete('Referer');

// 拦截并清洗 store 参数
let modifiedBody = request.body;
if (request.method === 'POST') {
try {
const bodyText = await request.text();
const bodyJson = JSON.parse(bodyText);

if (bodyJson.store !== undefined) {
delete bodyJson.store;
}

modifiedBody = JSON.stringify(bodyJson);
newHeaders.delete('Content-Length');
} catch (e) {
modifiedBody = request.body;
}
}

// 构造并发起最终请求
const modifiedRequest = new Request(url.toString(), {
method: request.method,
headers: newHeaders,
body: modifiedBody,
redirect: 'follow'
});

try {
const response = await fetch(modifiedRequest);
const modifiedResponse = new Response(response.body, response);

// 强制所有响应允许跨域
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
return modifiedResponse;

} catch (e) {
return new Response(`Proxy Error: ${e.message}`, { status: 502 });
}
}
};
  1. 在预览窗口进行测试
    • 在右侧 Preview窗口中,可以看到 Cloudflare分配的默认地址 https://api-proxy.xxx.workers.dev/
    • 不要直接访问主页(502 Bad Gateway)
      • 在地址栏的末尾手动加上API数据获取路径:/api/v1/models
      • 完整地址应类似:https://api-proxy.xxx.workers.dev/api/v1/models
    • 返回包含模型列表的JSON数据

绑定自定义域名到Worker

  1. 进入该Worker的概览界面
    • 在「Workers & Pages」页面中,进入刚刚创建的Worker。
  2. 进入「Settings」并新增一个「Domains & Routes」。
  3. 选择「Custom domain」,并输入自定义域名。
    • 输入规划好的二级域名,如 api.yourdomain.com
  4. 等待状态变为「Active」

测试

1
curl --noproxy "*" -I https://api.yourdomain.com/api/v1/models

其中 --noproxy "*" 是为了防止VS Code配置了代理服务器。 请将 api.yourdomain.com 替换成真实的自定义域名。

Nest Step

在 n8n 中,只需拉取 OpenAI 节点,并修改其「Base URL」为 https://api.yourdomain.com/api/v1,并填上 OpenRouter 的 API 密钥,即可正常使用。


  1. 设备非必须,仅为本人实际应用场景。 ↩︎

  2. 域名为必须,将会作为挂载 API 的地址。但各个域名注册商的解析设置不同,需要根据实际情况调整。以下的文章内容将会以腾讯云域名为例。此外,更建议顶级域名选择 .cn,主要是基于续费成本考虑。 ↩︎

  3. 值得一提的是,由于 OpenAI 和 Anthropic 的政策对中国大陆不够友好,不支持绑定中国大陆银行的 Visa 卡。但是 Google 和 OpenRouter 等支持。 ↩︎