域名问题复盘


本次域名备案遇到了非常多的用户反馈,非常影响体验,在这里复盘一下自己犯的错误。

缘起

这个域名第一次备案已经是 16 年了,当时还需要快递幕布,依稀记得再实验室拍照的场景。天,16 年还在读研一。

印象中当时的域名备案仅仅是域名,跟服务器没关系。就是说哪怕没有服务器也可以进行域名备案。

在这之后的几年,这个域名基本没怎么用到,也就一直没管。大概是最近两年,我把它的解析换成了 cloudflare,cf 可玩性高一点。

这是我的第一个误区:

❌备案和服务器无关

接入准确性核查

天有不测风云,突然有一天就收到接入准确性核查的通知。大概意思是说,阿里备案的域名,就一定要解析到阿里的服务器。我记得备案当初没这规矩呀?

而且之前好好的,为什么有问题呢?

网上查了查,似乎只要主域名解析到随便一个阿里服务器就好,不是自己的也行。于是按这样的步骤操作了一下,确实通过了。

然而并没有那么简单,两个月后,又收到了通知。

在此期间,我可能确实改过解析。具体的细节记不清了。

第二次解决这个问题,我好像是开了阿里的 esa(其实就是边缘节点加速),这玩意基础版倒也不贵。然后又过了。

但很坑爹的是阿里的 esa 的 cdn 自动压缩不支持 wasm 格式。我真是黑人问号了。我又迁移到腾讯的 eo。然后不出意料又出问题了。

我吐了,实在不想再遇到这问题了。干脆不要备案了!

不要备案可行吗?按个人经验来说,确实是可行的。我的 .com 域名没有备案,cf 解析,自己用确实没有遇到过 dns 失败。按网上的说法,也是可行的,我看到不少人这么说了。那就这么干吧!

但这是我的第二个误区:

❌不备案,国内也能解析到

dns 失败

于是就收到了大量的网页打不开的反馈。

不备案能不能解析到?从结果来看全是玄学。用户拿到的 dns 是运营商给的,各地运营商的政策天差地别。就深圳而言,我几乎没有遇到过 dns 失败。

但是像反馈里的重灾区,泉州,当地实行白名单策略,可谓是墙中墙。网上可以查到一些信息:

https://gaj.quanzhou.gov.cn/hdjl/zxzx/index_6346.htm?id=170387

以及解决方案的讨论:

https://blog.tsinbei.com/archives/1293/

总而言之,这种问题只能我自己解决。大部分用户都是电脑小白,我不可能让他们改 dns 服务器吧?

补救措施

一切只能重来。

我先是买了腾讯的服务器(原价买的,心疼),把服务搭在服务器上,这样至少可以告知用户通过公网 ip 访问。算是缓解了一下。

然后立马开始备案流程:

备案就真的只能等待了,不清楚为什么要这么久。好在顺利通过了。

通过之后,在 cf 把 eo 的 cname 设置好,国内解析基本就没问题了。但我又需要引导用户使用域名。

但你以为这就完了吗?

备案了,然后呢?

第三个误区:

❌备案了,就一定能解析到

因为我的部分服务仍然是放在 cf worker 上的,这部分域名解析仍然需要 cf 的 dns。我以为,只要域名已经备案了,哪怕不是国内服务商的解析,也行吧?

实际情况:用户能打开网页,但是部分服务用不了。一查就是无法连接,超时。

于是乎,我又把这部分服务迁移到 eo 边缘函数,或者通过边缘函数反代到 cf worker。因为按我的理解,网页本身和边缘函数都是用 cname 解析的,这样网页能打开,边缘函数就能被触发。

是吗?

EO 边缘函数

腾讯这个边缘基本是个 cf worker 的低配,用法基本一样,只是功能少了点。

第四个误区:

❌EO 节点,总不会 dns 失败吧?

我在云服务上实测过,是可以正常访问 cf worker 的。这也符合我的预期,服务商应该不受运营商限制,毕竟是商业行为。那理论上 eo 节点也是一样。

实际情况是,eo 节点仍然有可能 dns 失败。很难想象,不同的 eo 节点会有这种区别。

最终解决方案

cf worker 暂时是丢不掉的,还得留着。边缘函数是指望不上了,自己做反代吧。

于是就有了现在这套拓扑,网页挂在服务器上,域名解析到服务器。用 caddy 服务静态内容,再对部分 path 进行配置,触发反代,反代到 cf worker。

x.p1gd0g.cc {
        root * /home/ubuntu/x.p1gd0g.cc/web
        encode
        file_server

        import cors {header.origin}
        log {
                output file /home/ubuntu/x.p1gd0g.cc/caddy.log
        }

        reverse_proxy /api https://api.p1gd0g.cc {
                header_up Host {upstream_hostport}
                transport http {
                        dial_timeout 20s
                }
        }
}

结语

在国内做独开,真难。