Skip to main content
目前使用的 CDN 方案来自:https://www.eallion.com/cdn-cname-cloudflare/ 一下是 CDN 结构图,目的就是解决全球 CDN 并且成本低 cdn_dns 前文备份

前言

国内、境外分流,不光能削减成本,还能提高网站性能,优化 TTFB。 不记得是什么时候开始有了一个这样的闪念,然后就去搜索了一下。 结果发现网上的教程都比较老旧。其中讲得比较多的是通过 CloudFlare for SaaS 接入 CNAME,但是都支持普通的域名,并不能接入 R2 或者 Worker。 从功能的优先级上来说,我最需要的是分区解析功能,这就导致不能把域名的 NS 转入 Cloudflare。 Cloudflare 的 DNS 确实非常优秀,但 Cloudflare 不能分区解析,它有 CNAME 拉平功能,不过它会把所有中国大陆地区的 IP 解析到联通。 相反国内的 DNS 服务商的分区解析就做得好,可能也是因为国内的域名更需要这种功能吧。 无法全心全意付出,又想去贴贴 Cloudflare,那就只能搞些奇技淫巧。 2022 年 3 月份,CloudFlare 宣布更改了 CloudFlare for SaaS 的收费策略,每个账户可以有 100 个域名免费额度,而且超额后每个域名按 0.1 USD/月 收取费用。我们就利用 CloudFlare for SaaS 把域名通过 CNAME 接入 Cloudflare,享受 Cloudflare 强大的边缘计算能力。 对于小网站,比如本博客,以上服务都是免费的,免费额度:
  • DNSPod:用的专业版,但免费版本也有分区解析
  • 腾讯云 COS:50G/月;200 万请求
  • 腾讯云 CDN:10G/月
  • Cloudflare CDN:正常使用无上限
  • Cloudflare R2: 10G/月; 100 万/1000 万请求
  • Backblaze B2: 10G/月; 与 Cloudflare 有 流量联盟
关于腾讯云的配置略过,这里只讲 Cloudflare 的部分。 前提需要 Cloudflare 账号中已经有一个可用的域名。 这个域名用来提供 回退源 (Fallback Origin),假设这个域名是 example.com 。

创建 R2 并绑定自定义域名

  1. 登录控制面板:https://dash.cloudflare.com/ ,Cloudflare 已支持中文;
  2. 创建 R2 存储桶的方法这里略过,如创建:r2-blog-test;
  3. 在 R2 设置 公开访问 自定义域 连接域 为刚才创建的 R2 添加自定义域名:
/assets/images/posts/2023/07/r2_custom_hostname.png 然后该域名的 DNS 就会自动出现一条解析: /assets/images/posts/2023/07/custom_hostname_dns.png

订阅 CloudFlare for SaaS

  1. 在 Zones 中选择 example.com 这个域名;
  2. 在该域名的 SSL/TLS 中选择 自定义主机名;
  3. 选择 Enable 订阅。可以使用 Paypal 订阅。
/assets/images/posts/2023/07/enable_cloudflare_saas.png

添加自定义域名

订阅成功后,先添加 回退源:images.example.com,这个回源域名是绑定在 R2 上的自定义域名。 /assets/images/posts/2023/07/cf_callback_hostname.png 然后点击 添加自定义主机名 ,填入 CDN 域名,如 images.eallion.com ,验证方式推荐 TXT 验证。 /assets/images/posts/2023/07/add_custom_hostname.png 添加后,需要验证域名,去自己的域名解析控制台,如 DNSPod ,添加 2 条 TXT 记录。 等待 证书状态 和 主机名状态 都变成 有效。 /assets/images/posts/2023/07/cf_dns_txt_records.png

解析 CNAME

回退源状态 证书状态 和 主机名状态 都变成 有效 后,就去自己的域名解析控制台添加 CNAME 解析。 把用于生产环境的 images.eallion.com CNAME 指向 images.example.com。 /assets/images/posts/2023/07/dns_cname_records.png 一般的教程到这里就结束了。 但是这样是访问不了 R2 里面的资源的。 最重要的一步,用 Worker 代理 R2。

新建 Worker 代理 R2

官方有文档介绍怎么通过 Worker 访问 R2: Use R2 from Workers:https://developers.cloudflare.com/r2/api/workers/workers-api-usage/ 按照文档教程一步一步来就可以了。 如果比较懒,也不想鉴权。那用我的精简代码就可以了。 直接去掉了 DELETE 和 PUT 的代码,只保留了 GET。 不用 Wrangle CLI 脚本也可以在后台手动创建 Worker。 左侧切换到 Worker 和 Pages 分栏,创建应用程序,随便取个名字,随便选个模板部署就可以了,后面再改代码。 点击 快速编辑 把以下代码复制到 worker.js 中,保存并部署:
部署成功后返回。 在当前 Worker 的设置中,变量 R2 存储桶绑定 添加绑定:
  • 变量名称:MY_BUCKET
  • R2 存储桶:选择对应的桶
/assets/images/posts/2023/07/r2_binding.png

Workers 路由

回到 Zones 中,选择域名,添加 Workers 路由:
  • 路由:一定要填生产环境用的域名,不要填 Cloudflare 的源域名,如:images.eallion.com/*;
  • Worker:选择上一步创建的 Worker;
  • 环境:Production。
/assets/images/posts/2023/07/r2_worker_router.png 至此,你应该就能以 CNAME 的方式访问 Cloudflare R2 里面的内容了。

Worker 代理 Backblaze B2

其实有 R2 就够了,但是可能会因为各种各样的原因需要用到 B2。 其实是差不多的。 Backblaze 官方也有文档介绍如何通过 Cloudflare Worker 访问 B2。 Docs:Integrate Cloudflare Workers with Backblaze B2 简要介绍一下怎么做吧:(还是建议看官方文档比较好。)
1、新建 Cloudflare Worker,worker.js
2、设置 Worker 环境变量
  • ALLOW_LIST_BUCKET:true
  • B2_APPLICATION_KEY:K004WJZP11111111111111111111Q
  • B2_APPLICATION_KEY_ID:0042e9999999920000000001
  • B2_ENDPOINT:s3.us-west-004.backblazeb2.com
  • BUCKET_NAME:eallion-static
APP KEY 和 ID 要去 Backblaze 后台生成,B2_ENDPOINT 要去自己的 B2 存储桶里查看。
3、手动添加 CNAME 解析到 B2
/assets/images/posts/2023/07/b2_cf_record.png
  • 类型:选 CNAME
  • 名称:用于 回退源,如:b2.example.com ,就填入 b2
  • 内容:填入自己 B2 存储桶分配的 S3 URL ,有的教程这里写的是 Friendly URL ,没必要,还要多一步反代。
/assets/images/posts/2023/07/backblaze_url.png
4、配置回退源
Zones 中的域名为 Backblaze B2 设置的 CNAME 名称是什么,那回退源就填什么,如:b2.example.com。 参考前文即可。
5、配置自定义主机名
参考前文。
6、配置 Worker 路由
  • 路由:一定要填生产环境用的域名,不要填 Cloudflare 的源域名;
  • Worker:选择上一步创建的 Worker;
  • 环境:Production。
为 Backblaze B2 添加 Worker 路由与 Cloudflare R2 不同,需要添加 2 条:
  • b2.example.com/* 也需要加入 Worker 路由中
  • images.eallion.com/*
::: CDN 证书自动更换 以上算是解决了基本的问题,但是还有一个痛点就是 SSL 证书问题,CF 是提供免费续签更新永不过期证书的,但是国内 CDN 厂商一般都需要手动上传自己申请的证书。。。这个确实不太方便,所以想着能不能找个解决方案: ::: details 自动更新证书脚本 起因:因为配置国内 CDN 基本都是需要手动上传证书,但是我申请的域名证书都是基本三个月保质期的,所以就想着写个自动脚本自动更新证书。 环境: 1panel(国产面板,自动申请证书,还有其他强大功能,挺方便的) 以我用的多吉云为例,其他厂家都可以去找到相应的 SDK。 代码如下:
基本实现思路就是先删除现有证书,然后添加读取的证书,然后上传并激活上传后的证书,这样就实现 CDN 证书自动配置了。可以利用 1panel 自动定时执行脚本功能每隔一个月执行一次,以此更新证书。真是又实现了一个奇奇怪怪的使用小技巧 ✊✊✊ :::
最后修改于 2026年4月19日