起因

众所周知jsdelivr的加速出现了一些问题,导致速度并不会向当初那样。再此期间也尝试了各种奇淫技巧,例如:

  • sw 前端竞速并缓存(参考于 ChenYFan)
  • sw 前端竞速(参考于乐特)
  • 白嫖 TianLi 的 CDN

但是用来用去给我的感觉并不像当初使用 jsdelivr 那种感觉舒服,例如 sw 同时发送大量请求,在我的"小破手机"中每次打开都会有一些卡顿;至于 TianLi 的 CDN,速度很舒服,不过终归是白嫖。我个人的观点可能也会像当初的晚风图床。

因此,我决定自己反代 JSD 实现自己个人使用的 CDN。

我的需求

  1. 个人使用,不希望别人使用
  2. 不存储源文件
  3. 访问不是自己定义的仓库(路径)则跳转某个地址

如何反代

对于上述需求,前两个很简单,防盗链加上后,也没啥好办法可以防护了;不存储源文件那么就依靠 CDN 的缓存即可。至于第三点则需要反代。

与其说是反代,其实我认为说是重写更合适。

首先我原本是想只部署在 vercel,利用其vercel.json配置文件直接对路由进行定义及过滤实现我的需求。

image-20220325180125246

将源站做好后就是 CDN,CDN 回源站设置为 vercel 的地址,并开启跟随重定向打开 CDN 缓存即可。这里我设置的 CDN 缓存为跟随源站即跟随 JSD 的缓存设置。

image-20220325182046804

image-20220325182100991

至于为什么使用 vercel.json 配置文件,因为我认为这个需求使用其配置文件的redirects即可。个人认为与其写程序去判断,不如直接在入口处判断方案。

大概配置文件参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"redirects": [
{
"source": "/npm/kang-static(.*)",
"destination": "https://cdn.jsdelivr.net/npm/kang-static$1",
"statusCode": 302
}
{
"source": "/(.*)",
"destination": "https://blog.antmoe.com",
"statusCode": 307
}
]
}

以上表示,如果访问路径匹配/npm/kang-static(.*)则将链接重定向到 jsd 响应的链接。

服务器&Workers

由于 vercel 在国外,因此使用国内 CDN 回源时会有一点点的速度慢。

例如:CDN 回源到 Vercel,在重定向到 JSD 则会出现两次链接,因此为了降低第一次链接的速度,我决定在腾讯云函数和轻服务部署试一试,顺便部署下 cf worker 作为备用使用。

在这个环境中无法像 vercel 那样 0 代码实现需要,因此只能小写一点代码实现部署。

代码参考仓库:jsd-proxy

弊端

包括但不限于以下几点

  1. 如果不套用那么就是减速器
  2. 关于缓存问题没有一个合理的刷新机制
    • dogecloud 刷新 cdn 有每次次数限制