文章摘要
GPT 4
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结

前言

有人可能会说CloudFlare在境内各种限速丢包,用CloudFlare测速怎么可能准确,但其实这个测速网站并不是平时测速用的,而是用于优选IP上的
之前写的一个小程序FastCDNFastCDN说明文档)或者使用CloudflareSpeedTest进行优选IP可能会遇到下载速度都是0MB/s,这是因为默认的测速https://cf.xiu2.xyz/url使用的人太多了,而这个测速地址也是搭建在CF Works上的,每天有一定的限额,用的人多了自然就用不了,所以这里推荐大家自建一个

测速网站原理

其实CloudflareSpeedTest对测速网站的要求很简单:

  1. 可以直接下载、文件大小超过 200MB
  2. 用的是 Cloudflare CDN
    所以我们就先找一个源下载地址,这个源地址于CloudFlare之间最好是访问通畅的(这个一般境外的网站都可以做到),然后用CF Works反代这个下载地址就好

搭建教程

登入CloudFlare账号后,在侧边栏有一个选项是Workers和Pages,点击后我们再选择创建Works
创建CF Works
然后随便设置一个名称,我这里就写speedtest,然后点击编辑代码,然后将我提供的代码复制上去

1
2
3
4
5
6
7
8
addEventListener("fetch", event => {  
let url = new URL(event.request.url);
if (url.pathname == "/" && url.search == "") {
url.href="https://download.parallels.com/desktop/v17/17.1.1-51537/ParallelsDesktop-17.1.1-51537.dmg"
let request = new Request(url, event.request);
event.respondWith(fetch(request));
}
})

配置好后回到speedtest中,点击触发器添加自定义域然后添加域名就好,这里我假设添加的是st.example.com
配置域名

尝试使用

可以尝试访问你的域名,如果跳出一个下载的文件就说明已经部署完成了,可以在FastCDN或者CloudflareSpeedTest中使用了

(设置FastCDN的配置文件)

1
2
3
setting:
CFST:
https://st.example.com/ # 记得换成你自己的域名

(在CloudflareSpeedTest中使用)

1
CloudflareST -url https://st.example.com/

补充

后续我的使用改成了cmliu的方案:cmliu/CF-Workers-SpeedTestURL
并且我把代码中的并不那么准确的1000进位换成1024进位

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
export default {
  async fetch(request) {
    let url = new URL(request.url);
    let path = url.pathname.substring(1);
    let isSecure = url.protocol.startsWith("https");
    let bytes;
    if (!path) {
      bytes = 200000000;
    } else if (path === "locations") {
      let targetUrl = `http${isSecure ? 's' : ''}://speed.cloudflare.com/locations`;
      let cfRequest = new Request(targetUrl, request);
      let response = await fetch(cfRequest);
      return response;
    } else {
      const regex = /^(\d+)([a-z]?)$/i;
      const match = path.match(regex);
      if (!match) {
        return new Response("路径格式不正确", {
          status: 400,
        });
      }
      const bytesStr = match[1];
      const unit = match[2].toLowerCase();
      bytes = parseInt(bytesStr, 10);
      if (unit === "k") {
        bytes *= 1024;
      } else if (unit === "m") {
        bytes *= 1024 ** 2;
      } else if (unit === "g") {
        bytes *= 1024 ** 3;
      }
    }
    let targetUrl = `http${isSecure ? 's' : ''}://speed.cloudflare.com/__down?bytes=${bytes}`;
    let cfRequest = new Request(targetUrl, request);
    let response = await fetch(cfRequest);
    return response;
  }
};

这样就可以根据url的路径参数指定测速文件的大小,例如:

  • 1024K 测试下载地址: https://speedtest.akimio.top/1024k
  • 200M 测试下载地址: https://speedtest.akimio.top/200m
  • 1G 测试下载地址: https://speedtest.akimio.top/1g
    如果不指定则默认下载200M的文件进行测速