实现网站国内外分流(境外接入 Cloudflare)
前不久我在 站内文章这篇文章 中提到我的 uuanqin.top
域名 DNS 全线接入 Cloudflare,很多小伙伴反馈说 cf 国内访问速度很不稳定,时快时慢(有一部分是我乱套 CDN 的原因),于是我打算这段时间就致力于解决这个问题。
通过不同方案的探索并结合自己的实际情况终于试出来了,现记录操作思路。
效果预览
分流方式 | 境内访问 | 境外访问 | 备注 |
---|---|---|---|
只使用腾讯云 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 到源站。
通过观察上图,你可以为境内外线路配置各种选择。比如,博主的选择为:
- 境内线路:国内 CDN -> 国内云服务器
- 境外线路:Cloudflare CDN -> 国内云服务器
至于国内 CDN 或源站的选择看你自己的情况,文章主要将介绍两个操作重点:
- 使用腾讯云 DNSPod 进行线路选择
- CNAME 方式接入 Cloudflare
简要介绍 Cloudflare for SaaS
「软件即服务」简称 SaaS。假设当前一个用户想建设自己的网站或电子邮箱,传统方式为需要用户自己准备机器与应用并自己维护。而在 SaaS 方式下,服务商自己搞定了机器和应用程序,SaaS 用户通过订阅的方式获得服务商提供的应用程序服务。
用户使用 SaaS 服务建设自己的网站后,可能还有自定义域名的需求。这些自定义域名最终指向的就是 SaaS 服务商的服务器。Cloudflare 为 SaaS 服务商提供类似的功能,即 Cloudflare for SaaS。这样不管用户自定义的域名是什么,最终会回退到托管在 Cloudflare 上的域名(回退源),从而让用户享受到 Cloudflare 的防护服务。
在本文中,qinq.us.kg
扮演的是 SaaS 服务商的角色,blog.uuanqin.top
扮演的是用户的角色。
准备材料
一堆账号直接劝退
在开始之前,我们需要准备以下账号或服务:
- Cloudflare 账号。用于使用 Cloudflare SaaS 服务。
- 阿里云云解析 DNS / 腾讯云 DNSPod 账号。用于实现境内外自动分流。下文将以腾讯云 DNSPod 进行演示。
- PayPal 账号。用于使用 Cloudflare for SaaS 服务。注册材料涉及:身份证、银联借记卡/信用卡。注册方式自行网络搜索。请放心,Cloudflare 免费额度管够,本文操作过程不会花 1 分钱。
- 2 个域名。
- 1 个是正式的博客访问域名,对访客可见。这里以
uuanqin.top
为例。 - 1 个用于中间域名,对外不可见。域名能正常用就行。这里以免费域名
qinq.us.kg
为例。免费域名.us.kg
注册方式详看 @秋风于渭水 的文章。注册材料可能涉及:- GitHub 账号
- Gmail 账号/Outlook 账号。
- 1 个是正式的博客访问域名,对访客可见。这里以
- 【可选】CDN 服务商。用于国内加速。
- 【可选】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 解析。
Cloudflare 的「代理状态」为「仅 DNS」(也就是没有点亮小黄云)时速度不会有太大影响。
添加 DNS 记录
Cloudflare 中加入一条记录用于中间域名,必须点上小黄云。这里我就设置为 cname.qinq.us.kg
,指向境外源站(或者境内服务器也行,反正使用小黄云代理相当于套了一层 CDN)。
DNSPod 配置 3 条线路类型:国内、国外、默认。
使用 Cloudflare for SaaS
回到 Cloudflare,点开中间域名 qinq.us.kg
下的 SSL/TLS->自定义主机名。开通并使用 Cloudflare for SaaS,这个过程需要 PayPal 订购。免费额度详看:Plans — Cloudflare for SaaS · Cloudflare for Platforms docs,反正用不完。
设置回退源并添加自定义主机名:
注意:
- 回退源必须点亮小黄云
- 自定义主机名需要对证书和主机名验证,根据提示在 DNSPod 中添加两条
TXT
记录即可。注意,由于 DNSPod 的特性,主机记录域名部分需要省略。
成功了
等待所有 DNS 生效后,你可以测测网站速度有没有提升。
直接访问中间域名 cname.qinq.us.kg
会怎么样?
后续内容可选择性观看。
【可选】GitHub Page 作为源站
在 Cloudflare 配置 DNS 记录指向 xxx.github.io
。然后来到项目设置,验证中间域名 cname.qinq.us.kg
的 DNS 记录即可。
如果我们访问自己的博客网站出现「重定向次数过多」的问题时,修改 Cloudflare 中 SSL 加密模式为【完全】即可。
这种情况一般出现于源服务器配置好 HTTPS 的情况。比如 GitHub Page 强制 HTTPS 选项勾上时。
GitHub Pages 中只存在 cname.qinq.us.kg
这个站点,它通过检查请求头中的 Host 字段判断应该请求哪个站点。但是境外机器使用爬虫爬取时,携带的请求中 Host 字段为 blog.uuanqin.top
,这会导致部分境外自动化程序找不到境外源站而引发 404 错误。
关于 GitHub Page 自动化爬虫 404 的问题尝试了很多办法没有解决。原因:
- GitHub Page 不支持多自定义域名。即使换成 Vercel 支持多域名也不一定有用,因为 DNS 在当前文章情景下不好验证。
- Cloudflare「重写规则」中 不允许重写 Host 请求头。
【可选】Hexo 中部署时增加 GitHub Page 的部署
在 _config.yml
中配置一个新的仓库。
1 | # Deployment |
如果前面在 GitHub Page 中设置了自定义域名,你会发现仓库自动增加一个 CNAME
文件。为了避免上传时将这个文件覆盖掉,我们需要在博客项目 source
文件夹下手动增加 CNAME
文件。保险起见,我们可以在 _config.yml
设置其为无需渲染的文件:
1 | skip_render: |
【可选】Cloudflare 缓存策略调整
有时候点了小黄云,感觉境外没提升多少速度啊?各种速度配置赶紧上一下,并检查一下有没有配置缓存策略吧。
后记
站长必修课又补上一了个课时!该折腾的还是得折腾。
本文参考
- 【网络】双域名同时托管Cloudflare SaaS加速解决方案_网络存储_什么值得买
- 常见免费、便宜域名注册渠道一览 - 秋风于渭水
- 顶级域名和二级域名的区别-CSDN博客
- Cloudflare for SaaS · Cloudflare for Platforms docs
- 一键部署 | Hexo
- 管理 GitHub Pages 站点的自定义域 - GitHub 文档
- 网站用上CloudFlare SaaS回源优选教程 - 半日闲
- 什么是 SaaS?| SaaS 定义 | Cloudflare
- SaaS 提供商的安全性
- ⭐Dooongの教程 通过CloudFlare+SaaS回源优选IP使国内用户高速访问网站