记使用华为云DNS+CNAME接入Cloudflare加速R2存储桶

作者:Stevie0427 发布时间: 2024-09-10 阅读量:187

前言及背景

在Cloudflare CDN到国内访问速度不理想的情况下,CDN可以通过SaaS实现CNAME接入以自定义节点IP,Pages本就支持CNAME接入,但Workers和R2存储桶却不支持,不过由于Workers可以通过Pages Function使用,故本文讨论关于R2的自选IP加速方法

方案概述

有以下几种方案备选

  1. 使用Pages调用R2自建Restful API并使用CNAME接入的域名调用

  2. 直接使用Pages反代R2存储桶的自定义域名

  3. 使用Pages反代R2的xxx.r2.dev公共域名

经过实际操作后,1会因为出现R2跨域鉴权的问题,xxx.pages.dev 域名可用,但使用CNAME接入的域名会404的情况,2也会出现与1相同的情况,均不可用,所以本文使用3方法

实际操作

准备事项

  1. 一个Cloudflare R2存储桶

  2. 一个华为云账户(仅使用DNS功能,国际版无需实名使用邮箱注册即可)

  3. 一些到国内速度较好的Cloudflare Anycast IP

  4. 一个Github账户

操作

1.开启R2存储桶的公共访问(xxx.r2.dev 域名)

2.在绑定了Cloudflare账户的Github账户中新建一个仓库,新建_worker.js 文件,写入如下代码

export default {
  async fetch(request, env) {
    let url = new URL(request.url);
    if (url.pathname.startsWith('/')) {
      url.hostname = 'example.r2.dev'//替换为你的存储桶给出的域名
      let new_request = new Request(url, request);
      return fetch(new_request);
    }
    return env.ASSETS.fetch(request);
  },
};

3.在Cloudflare中部署Pages并添加自定义域名

4.将要解析的自定义域名NS记录到华为云并设置优选,国内使用优选IP,国外CNAME到Cloudflare给出的xxx.pages.dev域名

效果

50MB世界地图

不足与改进思路

1.xxx.r2.dev 域名始终可以访问,此域名无优化且无法使用R2和Cloudflare的其他访问控制功能,理论上可通过前文中1与2方案解决,但需解决R2跨域鉴权的问题

2.Pages Function内存限制125MB,导致大于125MB的文件无法传输,据Cloudflare官方文档,可使用流式传输解决