它到底解决了什么问题
服务器之间认的是 IP 地址,一串数字。人记不住,也没法换。DNS 就是中间那层翻译:你输入域名,它给你一个当前对应的 IP,请求才发得出去。
这套系统几十年前就定型了,特点是没有中心数据库。全球无数台服务器分层协作,各自负责一小块,谁也不能单独说了算。好处是能扛住整个互联网的量,代价是改动要一层层传开,不可能瞬间生效。
一次解析要经过哪些环节
你敲下网址到拿到 IP,中间其实过了好几道手。按顺序是这样的。
先查浏览器自己的缓存。Chrome、Edge 都有内部 DNS 缓存,有效期通常几分钟。这一步命中就连请求都不发。
然后查操作系统缓存,以及本机的 hosts 文件。hosts 是本地手写的一张表,优先级很高,很多开发时把域名临时指到本地就是改这里。它的记录永不过期,改完忘了删会让人排查半天。
系统缓存也没有,就去问配置的 DNS 服务器。这个通常是运营商给的,或者你自己设的公共 DNS,比如 223.5.5.5、8.8.8.8。它是递归解析器,会替你跑完后面的流程。
递归解析器如果没缓存,就从头查起:先问根服务器这个顶级域归谁管,再问对应的顶级域服务器,最后问到存放你这条记录的权威服务器。拿到结果后逐级返回,顺便在各层缓存下来。
浏览器缓存
-> 系统缓存 / hosts
-> 本地配置的 DNS(运营商或公共 DNS)
-> 根服务器(.)
-> 顶级域服务器(.cn / .com)
-> 权威服务器(你域名注册商或 DNS 服务商那台)
<- 返回 A 记录,逐级缓存
所以「解析改了没生效」的真实含义通常是:你改的是最后一环的权威记录,前面几层的缓存还活着。
常用记录类型各自干什么
| 类型 | 作用 | 常见用法 |
|---|---|---|
| A | 域名指向一个 IPv4 地址 | 最基础的解析,指向服务器 IP |
| AAAA | 域名指向一个 IPv6 地址 | 支持 IPv6 访问 |
| CNAME | 域名指向另一个域名 | 接 CDN、把 www 指到主域 |
| MX | 指定收邮件的服务器 | 企业邮箱,通常带优先级数字 |
| TXT | 存一段文本 | 域名验证、SPF 防伪造 |
| NS | 指定这个域由谁来解析 | 把解析托管给某家服务商 |
| SRV | 指定某服务的主机和端口 | 游戏服务器、部分即时通讯 |
日常最常碰到的是 A 和 CNAME。要记住一条硬规则:同一个主机名上,CNAME 不能和其他记录共存。它的语义是「这个名字全部交给另一个名字处理」,再挂 A 记录或 MX 记录逻辑上就冲突了。有些服务商会直接报错,有些会静默忽略其中一条,后者排查起来特别费劲。
TTL 决定了你要等多久
每条记录都带一个 TTL,单位秒,意思是「这个结果可以被缓存多久」。
TTL 设 600,就是各级缓存十分钟内都直接用旧结果。设 3600 就是一小时。设得很小会让解析更及时,但查询量上去了,权威服务器压力大,解析速度也可能变慢。设得大则相反。
所以做迁移的时候有个标准动作:提前一天把 TTL 调小,比如调到 300,等旧缓存过期。然后再改 IP,这样生效时间能压缩到五分钟级别。改完稳定了再把 TTL 调回正常值。跳过这一步直接从 3600 改 IP,就得老老实实等一小时,还可能长尾更久。
怎么自己查
命令行里的 dig 最好用,信息全。没有 dig 的话 nslookup 也能凑合,Windows 自带。
# 最基本的查询,看返回的 A 记录和 TTL
dig example.com
# 只想要答案,去掉一堆说明
dig +short example.com
# 指定查某类记录
dig example.com MX
dig example.com TXT
dig example.com CNAME
# 指定用哪个 DNS 服务器查(对比不同来源的结果)
dig @223.5.5.5 example.com
dig @8.8.8.8 example.com
# 从权威服务器直接查,绕过所有缓存
dig @ns1.yourdns.com example.com
# Windows 上
nslookup example.com
nslookup example.com 223.5.5.5
判断方法很直接:如果权威服务器上已经是新 IP,而某个公共 DNS 返回的还是旧的,那就是缓存没到期,等着就行。如果权威服务器上还是旧的,说明你改的地方不对,或者保存没成功。
还有个容易忽略的点:查自己电脑改完 hosts 后的结果会骗人。测解析要确保 hosts 里没有相关条目,否则永远看到本地那张表的内容。
几个实际的坑
- 改了但忘了点保存。不少 DNS 服务商的后台分「编辑」和「提交」两步,改完不提交等于没改。也有需要审核的,审核期间不生效。
- 记录填错了主机名。@ 表示根域名本身,www 表示 www 子域,这两者完全不同。想覆盖所有子域要用通配符 *,但通配符和具体记录同时存在时,具体记录优先。
- 运营商 DNS 缓存特别长。有些不完全遵守 TTL,能把结果留好几天。这种只能等,或者让用户换 DNS。
- 接了 CDN 之后查到的不是自己的 IP。这是正常的,解析指向的是 CDN 的节点。想确认源站状态得看 CDN 控制台。
- IPv6 记录配错导致部分用户打不开。有人 A 记录没问题但 AAAA 指了个不通的地址,支持 IPv6 的网络会优先用 AAAA,于是打不开。排查时可以临时删掉 AAAA 验证。
排查顺序
网站打不开又怀疑是解析问题,按这个顺序走。
第一步,dig 一下域名看有没有返回。完全没记录说明解析丢了或者过期了。第二步,看返回的 IP 是不是你要的那台。第三步,直接拿这个 IP 访问,绕过域名。IP 能通说明解析没问题,问题在 Web 服务配置;IP 也不通说明服务器或网络的事。第四步,对比不同 DNS 服务器的结果,确认是不是缓存不一致。第五步,确认 hosts 文件干净。
这套流程能把「解析问题」和「服务器问题」快速切开,省得在两个方向之间来回猜。
常见问题 FAQ
域名解析改了,为什么半小时了还没生效?
因为各级 DNS 都会按 TTL 缓存结果。你改的是权威服务器上的记录,但本地运营商 DNS、公共 DNS、甚至你电脑系统里都还存着旧记录,要等缓存过期才会重新去问。TTL 设的是多久就得等多久,常见值是十分钟到一小时,也有设几小时的。想快一点,可以在改之前先把 TTL 调小。
CNAME 和 A 记录能同时存在吗?
同一个主机名上不能既有 CNAME 又有其他记录。CNAME 的含义是这个名字完全指向另一个名字,它的所有查询都交给那个名字处理,所以再挂 A 记录或 MX 记录会冲突。实践中给同一主机名同时配 CNAME 和 A,不同 DNS 服务商表现不一样,有的报错有的静默忽略,很难排查。想同时要多个目标地址,用多条 A 记录。
为什么我家能打开,同事那边打不开?
多半是两边用的 DNS 服务器不同,缓存状态也不一样。运营商 DNS 更新慢是常态,有些地方的缓存能留很久。让打不开的同事换个公共 DNS 试试,或者用在线工具从多个地区测解析结果。如果各地解析结果不一致,说明还没同步完;如果某个地区长期解析到旧地址,那就是那家运营商的问题。
接入 CDN 后域名的 A 记录变成别人的 IP 了,正常吗?
正常。接入 CDN 的标准做法就是把域名的解析指向 CDN 提供的 CNAME 地址,之后你查到的 IP 是 CDN 边缘节点的地址,不是你自己服务器的。这也是为什么查 IP 判断网站托管在哪会失效。要确认源站是否正常,得在 CDN 控制台看回源状态,或者直接用源站 IP 测试。