域名解析从 DNSPod 到 Cloudflare

个人博客托管在 Github pages,居然也快 8 年了。省事,不花钱。
前几年我又给它配了域名,解析用的免费 DNSPod 。(被腾讯收购是后来的事)

近期折腾技术上的事,了解到 Cloudflare 也有免费域名解析,而且居然带免费 CDN 和 DDOS 保护,有点动心。

换 Cloudflare 的念头

必须说,CDN 可有可无。虽然 github.io 服务器在国外,有时访问确实有点卡,CDN 可能改善一下,但也没到非缓存不可。而且 CDN 的缓存,会让修改和发布时,生效有延迟,不能马上看到。

至于 DDOS,谁有空攻击我呢。

这多出来的功能,属于 鸡肋。为什么我还是动心,折腾了呢?

  1. Cloudflare (以下简称 CF)作为盛名在外的服务商,它的解析服务不至于太烂。

    我只用过 DNSPod (以下简称 DP)的服务,如果以后需要用别家的,容易抓瞎。花点时间换个差不多的免费服务,可以了解一下各家的差别。

  2. CDN 和 DDOS 保护,暂时鸡肋,但是开了也不至于有害(搞不好真香)。那么体验一下,日后需要这些功能时,值不值得弄、要怎么操作心里也有底。

说白了,这是我做事的习惯:在不紧迫时,多折腾不同方案,建立起判断的基线。最坏也不过得出一个『CF 真烂,DP 真香』的结论,然后迁回去。

动手

注册 CF 帐号,选择免费方案,输入域名,很快就导入了当前的 DNS 记录(但是不全)。

然后会提醒 Name-server 不是他们家,给出他们的两个 Name-server 地址。每个人拿到的地址可能不一样,以 CF 给的为准。据说不用他们家的解析,也能用 CDN,我没研究。

去到域名注册商,把 Name-server 改过来。等了一下,刷新,注册商那边显示生效了。

回到 CF ,因为注册时刚检测过 DNS,下一次自动检测还要好久,可以手动点一下检测,然后就开始排队。过了不久,检测之后发现 Name-server 记录已经指过来了,就显示域名已经在 CF 的保护下。

上面一排功能按钮,起码看起来是比 DP 厉害的样子(当然不排除 DP 也有类似功能,只是它没摆出来,我也没探索过)。

首先把 DNS 记录缺的照抄过来(已经忘了缺哪几条了),DP 那边的记录有这些

类型 域名 目标
CNAME @ jaycechant.github.io
CNAME * jaycechant.github.io
CNAME www jaycechant.github.io
CNAME qqmailxxxxx (这串码每个人不同) mail.qq.com
MX @ mxdomain.qq.com (priority:5)
MX @ mxdomain.qq.com (priority:10)
  • @ 代表根域名。同时注册 @ , * , www ,是因为这个地址暂时只有博客,当时希望访客就算自动补上 www,或者输了随便哪个子域名,也能访问到(当然这个配置也是当年不求甚解抄网上的)。
  • 也注册了域名邮箱。不要问我为什么一样的内容,要添加不同优先级的两条记录,QQ 邮箱教程这样写,照做而已。(现在 QQ 域名邮箱已经停止注册和新增邮箱了,已经注册的还能用,但新注册或者新增只能注册一个企业微信用企业邮箱。)

把记录都抄过来之后,看起来差别只有两个地方:

  • CF 有一项功能叫 CNAME flatterning,会自动把 @ 替换成实际的根域名(jaycechant.info ,记录 Name 栏显示的就是完整域名),然后把指向的域名解析成实际的地址(但记录 target 栏显示的还是域名)。声称加快 30% 解析速度。只有根域名会这样做,相当于帮你生成了 根域名的 A 记录。
  • 右边多了一列图标,点击在两种状态切换:箭头穿过黄色的云(Proxied)表示开启了 CDN 缓存,箭头绕过灰色的云(DNS only)表示关闭。MX 记录不能打开缓存。想体验一下,就把 CDN 打开了。

配置完等了一会,博客还能访问。不确定是缓存还在起效,还是新的设置已经生效(其实也没差别)。于是去 DP 把原来的域名解析删掉。

redirect loop 和 1016

再等了一会,终于能看到差别:博客访问不了。错误是 ERR_TOO_MANY_REDIRECTS。

(参考 https://kinsta.com/blog/err_too_many_redirects/)

按照 Chrome 提示和找到的建议,清浏览器缓存,清 CF 缓存,都没有用。可能是有 redirect loop。

于是我先关掉了 CDN,删了根记录(我也不知道当时为什么想到删根记录,可能当时还没理解好),好了,报新的错误了 Error 1016 ……

在好好学习,终于理解 1016 是什么意思之后,终于也知道根记录的重要性,加回去,继续 ERR_TOO_MANY_REDIRECTS……

问题似乎出在 通配符(wildcard)记录。根据查到的说法,每个服务商对 wildcard 的支持会不一样。我想,好像也没必要支持除了 www 以外的二级域名,就把这条记录删了(鬼知道当年跟哪里抄的做法),好了。

注:敲下这些文字已经是第二天,我尝试找到背后的原因。重新按照之前的配置,加上 wildcard record,关掉 CDN ,清掉各种缓存,甚至尝试换个浏览器,用 curl 跟踪,都没能重现 ERR_TOO_MANY_REDIRECTS。

有可能这是两个 DNS 服务部分失效部分生效时产生的 edge case。可惜当时没想到跟踪 redirect ,了解具体是哪几个地址形成了 loop。

不过即使 wildcard record 不会引起错误,随便输一个子域名跳转到 jaycechant.github.io 还是 404,这条记录没有实际意义,最后还是删掉了。

Page Rules

然后测试 www 记录。(由于是默认主机名,有些人会习惯加,这条记录还是有用的)

结果是能访问,但会报安全提醒。这是因为证书是颁发给 jaycechant.info 而不是通配符域名 *.jaycechant.infowww.jaycechant.info 不在范围内。

为什么不直接签一个通配符证书呢?因为证书不是自己申请的,而是在 Github pages 配置时,输入域名,Github 代为申请的。Github 官方的文档看这里:https://help.github.com/en/github/working-with-github-pages/about-custom-domains-and-github-pages。

这时发现了 CF 提供的 Page Rules 功能,可以编写规则,对满足特定条件的地址,应用某些功能,包括 Always Online (通过缓存实现)、Always use HTTPS (估计通过 301 实现)、Auto Minify 等等 20+ 个功能。

这里用到 Forwarding URL,可选 301(Permanent)和 302(Temporary):

www.jaycechant.info/* -> https://jaycechant.info/$1,支持通配符,而且可以通过 $1 , $2 这样的变量按顺序引用。

免费版仅提供 3 条规则,目前来看,不搞复杂的规则,够了。

CDN

说回 CDN。

从我有限的尝试看,结果基本如我所料,开启 CDN 会让页面加载变快,同时修改应用有延迟。但必须说,这两个效果起码在这两天,差距都不算很大。

据官方说,国内他们是和百度 CDN 合作的,确实也是秒加载,不明显只能说原来直连 Github 还不够卡。

延迟方面,从上传完毕开始计时,一直刷新,到刷出更新的内容停止,大约 45 s。这个数字看着很大。但是要知道,上传完到 Github 发现变更,然后部署生效,也是有延迟的。而且 CF 还提供 Development Mode 开关,临时绕过缓存。(这个开关是 3小时自动关闭的,不用自己手动关。非要说麻烦的地方,就是还得登录 CF。)

总结下来,开没开 CDN 最明显的差异就是……证书不一样:没有 CDN 时,证书是颁发给 jaycechant.info 本身的,开了之后证书是颁发给 sni.cloudflaressl.com 。(那为什么证书地址和博客地址不一样居然能通过名称验证呢?这就要提到 SNI 了 :服务器名称指示

综合下来最后还是没开 CDN。如果有一天直连 Github 卡得不行了,我再回来。

Cloudflare workers

最后提一个意外发现,Cloudflare 支持 edge computing workers,从一开始只有 js,到现在支持 js, Rust, C, C++,相当于一个 FaaS。提供了两种方案。

免费方案:

  • Includes 100,000 requests per day (UTC+0)
  • Up to 10ms CPU time per request
  • Lowest latency after the first request
  • Up to 30 Workers

每个月花 5刀:

  • Includes 10 million requests per month
  • Up to 50ms CPU time per request
  • Always lowest latency
  • Up to 30 Workers
  • Key-value storage:
    • Up to 100 namespaces
    • 1 GB of storage
    • 10 million read operations, 1 million write, 1 million delete, and 1 million list operations

这能用来干嘛呢?要知道 Github pages 是静态托管,有限动态部分只能是浏览器端的 js,像评论这种功能就要引入额外的服务器和储存。所以第一反应就是可以运行一个评论服务,然后作为插件加入博客中。

它不限流量,限请求次数和每次请求的 CPU 时间。免费版每天 10 W requests ,完全够用了。

等等,带储存的吧,好像有 workers KV 服务。哦,KV 只有收费版才有啊,那打扰了,等我想到新的应用场景再回来……

工具

最后列一下用到的工具和命令,备忘(如无备注,均是 Windows 下)

  • 清除 DNS 缓存 ipconfig /flushdns
  • 查找当前 dns 指向 nslookup <domain>
  • 输出详细解析和重定向过程 curl -v -L <domain> (Windows 不带,需要额外安装)

知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议
本文为本人原创,采用知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议进行许可。
本作品可自由复制、传播及基于本作品进行演绎创作。如有以上需要,请留言告知,在文章开头明显位置加上署名(Jayce Chant)、原链接及许可协议信息,并明确指出修改(如有),不得用于商业用途。谢谢合作。
请点击查看协议的中文摘要。