背景
我的rpi部署cloudreve后,我目前有两个供应下载站的存储桶。
一个是第三方的cloudreve,一个是我自己的cloudreve。
我就想要做一个健康检查、自动转移的一个“负载均衡”系统,于是用vibe coding技术搓了一个。
正文
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
const targetHost = 'dl-p.imjcj.eu.org';
const targetUrl = `https://${targetHost}${url.pathname}${url.search}`;
const cache = caches.default;
if (request.method === "GET" || request.method === "HEAD") {
let response = await cache.match(request);
if (response) {
const newHeaders = new Headers(response.headers);
newHeaders.append("CFW-Cache-Status", "HIT");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders
});
}
}
const response = await fetch(targetUrl, {
method: request.method,
headers: request.headers,
body: request.body
});
if (response.status >= 500) {
const backTargetHost = 'dl-b.imjcj.eu.org';
const backTargetUrl = `https://${backTargetHost}${url.pathname}${url.search}`;
const backResponse = await fetch(backTargetUrl, {
method: request.method,
headers: request.headers,
body: request.body
});
return backResponse;
}
if ((request.method === "GET" || request.method === "HEAD") && response.status === 200) {
const responseToCache = response.clone();
ctx.waitUntil(cache.put(request, responseToCache));
const newHeaders = new Headers(response.headers);
newHeaders.append("CFW-Cache-Status", "MISS");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders
});
}
return response;
}
};
全程部署教程:
- 将备用站部署到
dl-b.imjcj.eu.org(开橙云、缓存1d),主用站部署到dl-p.imjcj.eu.org(开橙云,缓存1d) - Cloudflare Worker部署以上代码
- 配置路由
dl.imjcj.eu.org/*到worker
提速教程:
- 两个cloudreve都在中国,避免数据走
Cloudreve→(亚太→北美)→下载站→(北美→亚太)→用户,直接走Cloudreve→(亚太)→下载站→(亚太)→用户 - 我的备用站和主用站都部署在vercel,vercel项目仪表盘→
Settings→Functions,将functions的执行数据中心定在ap-east-1(即中国香港地区) - cloudflare worker项目仪表盘→设置→运行时→放置,选择区域→AWS→
ap-east-1(中国香港地区) - 提速完成,健康检查及自动转移配置完成