前不久我在 站内文章这篇文章 中提到我的 uuanqin.top 域名 DNS 全线接入 Cloudflare,很多小伙伴反馈说 cf 国内访问速度很不稳定,时快时慢(有一部分是我乱套 CDN 的原因),于是我打算这段时间就致力于解决这个问题。

通过不同方案的探索并结合自己的实际情况终于试出来了,现记录操作思路。

效果预览

image.png

分流方式 境内访问 境外访问 备注
只使用腾讯云 CDN(境内加速) 🟩<50 ms 🟧300ms
🔴部分超时
没买境外套餐包的话,境外加速流量 按量计费
只使用 Cloudflare 代理 🟨200ms
🔴部分超时
🟩<50 ms 国内访问极其不稳定,忽快忽慢。「减速 CDN」果然名不虚传。
双线自动分流后 🟩<50 ms 🎉 访客对于分线过程无感知

境内用境内 CDN,境外用境外 CDN,取长补短。为了更加节省开支或避免由于攻击造成的高额账单,国内线路可以不用 CDN,直接连接国内源站。

数据来源:blog.uuanqin.top_在线ping-ITDOG

原理简述

思路浓缩在这里了

阿里云云解析 DNS / 腾讯云 DNSPod 支持境内外分线解析,blog.uuanqin.top 将根据用户 IP 选择合适的线路。由于 blog.uuanqin.top 配置的是 CNAME 的记录类型,访客对于分线过程无感知,浏览器地址栏不变。

利用 Cloudflare for SaaS 实现 blog.uuanqin.top CNAME 指向中间域名 cname.qinq.us.kg,进而通过 Cloudflare 管理其 DNS 记录,再 CNAME/A 到源站。

image.png

通过观察上图,你可以为境内外线路配置各种选择。比如,博主的选择为:

  • 境内线路:国内 CDN -> 国内云服务器
  • 境外线路:Cloudflare CDN -> 国内云服务器

至于国内 CDN 或源站的选择看你自己的情况,文章主要将介绍两个操作重点:

  • 使用腾讯云 DNSPod 进行线路选择
  • CNAME 方式接入 Cloudflare
简要介绍 Cloudflare for SaaS

「软件即服务」简称 SaaS。假设当前一个用户想建设自己的网站或电子邮箱,传统方式为需要用户自己准备机器与应用并自己维护。而在 SaaS 方式下,服务商自己搞定了机器和应用程序,SaaS 用户通过订阅的方式获得服务商提供的应用程序服务。
saas-application-vs-on-premises.svg
用户使用 SaaS 服务建设自己的网站后,可能还有自定义域名的需求。这些自定义域名最终指向的就是 SaaS 服务商的服务器。Cloudflare 为 SaaS 服务商提供类似的功能,即 Cloudflare for SaaS。这样不管用户自定义的域名是什么,最终会回退到托管在 Cloudflare 上的域名(回退源),从而让用户享受到 Cloudflare 的防护服务。

image.png

在本文中,qinq.us.kg 扮演的是 SaaS 服务商的角色,blog.uuanqin.top 扮演的是用户的角色。

准备材料

一堆账号直接劝退

在开始之前,我们需要准备以下账号或服务:

  1. Cloudflare 账号。用于使用 Cloudflare SaaS 服务。
  2. 阿里云云解析 DNS / 腾讯云 DNSPod 账号。用于实现境内外自动分流。下文将以腾讯云 DNSPod 进行演示。
  3. PayPal 账号。用于使用 Cloudflare for SaaS 服务。注册材料涉及:身份证、银联借记卡/信用卡。注册方式自行网络搜索。请放心,Cloudflare 免费额度管够,本文操作过程不会花 1 分钱。
  4. 2 个域名。
    1. 1 个是正式的博客访问域名,对访客可见。这里以 uuanqin.top 为例。
    2. 1 个用于中间域名,对外不可见。域名能正常用就行。这里以免费域名 qinq.us.kg 为例。免费域名 .us.kg 注册方式详看 @秋风于渭水 的文章。注册材料可能涉及:
      1. GitHub 账号
      2. Gmail 账号/Outlook 账号。
  5. 【可选】CDN 服务商。用于国内加速。
  6. 【可选】GitHub Page。用于境外源站。

选择 DNS 解析商

两个域名应该交给谁解析:

域名 用途 DNS 解析商 选择这个 DNS 的理由
uuanqin.top 公共访问 阿里云云解析
腾讯云 DNSPod
我们必须使用这两家服务商的智能分线功能
qinq.us.kg 中间媒介 Cloudflare 我们必须使用 Cloudflare for SaaS 服务
我们也可以只将子域名 blog.uuanqin.top 交给 DNSPod 解析

因为 Cloudflare 留有太多东西了,不好迁移。我打算只将 blog.uuanqin.top 交给 DNSPod 解析。

NS 解析梳理:在 uuanqin.top 域名注册商中指定 NS 为 Cloudflare,然后在 Cloudflare 中新增两条 NS 记录,将 blog.uuanqin.top 交给 DNSPod 解析。
image.png

Cloudflare 的「代理状态」为「仅 DNS」(也就是没有点亮小黄云)时速度不会有太大影响。

添加 DNS 记录

Cloudflare 中加入一条记录用于中间域名,必须点上小黄云。这里我就设置为 cname.qinq.us.kg,指向境外源站(或者境内服务器也行,反正使用小黄云代理相当于套了一层 CDN)。

image.png

DNSPod 配置 3 条线路类型:国内、国外、默认。

image.png

使用 Cloudflare for SaaS

回到 Cloudflare,点开中间域名 qinq.us.kg 下的 SSL/TLS->自定义主机名。开通并使用 Cloudflare for SaaS,这个过程需要 PayPal 订购。免费额度详看:Plans — Cloudflare for SaaS · Cloudflare for Platforms docs,反正用不完。

设置回退源并添加自定义主机名:

image.png

注意:

  • 回退源必须点亮小黄云
  • 自定义主机名需要对证书和主机名验证,根据提示在 DNSPod 中添加两条 TXT 记录即可。注意,由于 DNSPod 的特性,主机记录域名部分需要省略。

image.png

成功了

等待所有 DNS 生效后,你可以测测网站速度有没有提升。

直接访问中间域名 cname.qinq.us.kg 会怎么样?

后续内容可选择性观看。

【可选】GitHub Page 作为源站

在 Cloudflare 配置 DNS 记录指向 xxx.github.io。然后来到项目设置,验证中间域名 cname.qinq.us.kg 的 DNS 记录即可。

网站出现「重定向次数过多」问题的解决

如果我们访问自己的博客网站出现「重定向次数过多」的问题时,修改 Cloudflare 中 SSL 加密模式为【完全】即可。

image.png

这种情况一般出现于源服务器配置好 HTTPS 的情况。比如 GitHub Page 强制 HTTPS 选项勾上时。

参考:解决使用Cloudflare出现重定向次过多问题 - 【NUTSWP】

境外自动化程序可能会找不到 GitHub Page 的内容

GitHub Pages 中只存在 cname.qinq.us.kg 这个站点,它通过检查请求头中的 Host 字段判断应该请求哪个站点。但是境外机器使用爬虫爬取时,携带的请求中 Host 字段为 blog.uuanqin.top,这会导致部分境外自动化程序找不到境外源站而引发 404 错误。

关于 GitHub Page 自动化爬虫 404 的问题尝试了很多办法没有解决。原因:

【可选】Hexo 中部署时增加 GitHub Page 的部署

_config.yml 中配置一个新的仓库。

1
2
3
4
5
6
7
8
9
10
# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
- type: git
repo: [email protected]:/home/git/hexo_repo/hexo.git
branch: master
# GitHub Page
- type: git
repo: [email protected]:uuanqin/uuanqin.github.io.git
branch: master

如果前面在 GitHub Page 中设置了自定义域名,你会发现仓库自动增加一个 CNAME 文件。为了避免上传时将这个文件覆盖掉,我们需要在博客项目 source 文件夹下手动增加 CNAME 文件。保险起见,我们可以在 _config.yml 设置其为无需渲染的文件:

1
2
skip_render:
- CNAME # GitHub Page 自定义域名的配置

【可选】Cloudflare 缓存策略调整

有时候点了小黄云,感觉境外没提升多少速度啊?各种速度配置赶紧上一下,并检查一下有没有配置缓存策略吧。

image.png

后记

站长必修课又补上一了个课时!该折腾的还是得折腾。

本文参考

推荐阅读:Understanding Round Robin DNS - by Zsolt Ero