先说说最基础的吧——DNS到底是个啥。简单说,DNS就是把域名翻译成IP地址的”电话本”。你输入example.com,DNS服务器告诉你”这个域名对应的IP是1.2.3.4″。但如果你以为就这么点事儿,那你很快就会踩坑。
(开篇配图:一张DNS解析流程图,展示从浏览器输入域名到获取IP的完整链条,突出不同层级DNS服务器的角色)
第一个坑:TTL缓存,你改了配置但没生效
这是我最常遇到的坑。有一次我把网站从旧服务器迁移到新服务器,改了A记录指向新IP,然后等了半小时网站还打不开。我当时就懵了,查了半天配置,最后发现是TTL(Time To Live)的问题。
TTL就是DNS记录在缓存中的存活时间。如果你之前设置的是24小时,那么改了记录后,全球的DNS缓存都要24小时才能更新。这个设计真的反人类,但这就是DNS的工作原理。
看这段代码,这是我在Cloudflare的DNS配置:
“`
example.com A 192.168.1.1 TTL: 120
www.example.com CNAME example.com TTL: 120
mail.example.com MX 10 mail.example.com TTL: 120
为什么要这么写? 因为在进行迁移之前,我提前把TTL从24小时改成了120秒(2分钟)。这样等我真正修改IP时,最多等2分钟就能生效,而不是24小时。这个技巧帮我从3小时的工作量缩短到了10分钟。
第二个坑:CNAME记录和根域名不能共存
另一个我踩过的坑是,想给example.com(根域名)配一个指向服务器的CNAME记录,结果死活配不上。官方文档这段文档不够清晰,后来我才搞明白——CNAME记录不能和任何其他记录共存于同一个域名下,而根域名必须有一个SOA记录(Start of Authority,权威起始记录),所以根域名不能用CNAME。
那怎么办? 有两种解决方案:
看这个配置示例:
`
传统方式(需要固定IP)
example.com A 203.0.113.1
www.example.com CNAME example.com
使用CNAME扁平化(IP可以变)
example.com CNAME proxy.example.com # Cloudflare自动处理
www.example.com CNAME example.com
`
为什么要这么写? 第一种适合有固定IP的VPS,第二种适合使用CDN或负载均衡的场景。我现在个人博客就用的第二种,因为我的服务器IP经常随着迁移而变化,但域名配置不需要改动。
核心:邮件服务器的MX记录配置
如果你以为DNS只是配个网站,那你离翻车不远了。最折磨人的是邮件服务器配置。一次我给客户配企业邮箱,配完发现邮件发不出去,查了半天是MX记录优先级搞反了。
先看正确配置:
`
主邮件服务器(优先级低,数值小)
example.com MX 10 mail1.example.com
备用邮件服务器(优先级高,数值大)
example.com MX 20 mail2.example.com
邮件服务器的A记录
mail1.example.com A 203.0.113.10
mail2.example.com A 203.0.113.20
SPF记录(防止被当作垃圾邮件)
example.com TXT "v=spf1 mx include:_spf.google.com ~all"
DKIM记录(邮件签名验证)
google._domainkey.example.com TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBg..."
`
这个配置里有个隐藏坑: MX记录的优先级是数字越小优先级越高。如果你只有一台邮件服务器,记得配两个相同的MX记录作为冗余,但优先级要不同。我有个朋友只配了一个MX记录,结果服务器挂了,邮件全丢。
(核心配图:DNS记录类型对比表,展示A、CNAME、MX、TXT、NS等记录的使用场景和配置示例,用颜色区分常见错误配置)
另一个坑:DNS传播延迟
你以为改了TTL到120秒就万事大吉?太天真了。DNS传播延迟不仅仅是TTL的问题,还取决于:
所以当你说"改了配置但没生效"时,先检查这三步:
`bash
检查本地DNS缓存
sudo systemd-resolve --flush-caches # Linux
sudo killall -HUP mDNSResponder # macOS
ipconfig /flushdns # Windows
直接查询权威DNS服务器(跳过缓存)
nslookup example.com 8.8.8.8
dig example.com @8.8.8.8
检查DNS记录更新情况
dig example.com +short
`
为什么要用@8.8.8.8? 因为这样可以查询Google的公共DNS,看到全球大部分用户能看到的结果。如果这里显示的是旧IP,说明你的权威DNS还没更新,而不是缓存问题。
还有个技巧:用DNS做健康检查
很多人不知道,DNS还可以用来做简单的健康检查和故障转移。比如你可以配多个A记录,DNS会自动轮询:
``
example.com A 203.0.113.1
example.com A 203.0.113.2
example.com A 203.0.113.3
但注意:标准的DNS轮询不支持自动故障转移。如果第一个IP的服务器挂了,DNS还是会继续返回这个IP。高级一点的解决方案是用DNS服务商的"健康检查"功能,比如Cloudflare的负载均衡、AWS Route 53的故障转移。
看这个AWS Route 53的配置示例:
`
主服务器(配置健康检查)
example.com A 203.0.113.1 Failover: PRIMARY HealthCheck: 123456
备用服务器(没有健康检查,主服务器挂了才用)
example.com A 203.0.113.2 Failover: SECONDARY
`
这个配置能做什么? 如果主服务器挂了,DNS自动返回备用服务器的IP,整个切换过程用户无感知。我有个电商客户就用这个方案,从服务器宕机到自动切换,平均只需要30秒。
(总结前配图:一张DNS故障排查流程图,从浏览器输入URL到显示页面,标记每个环节可能的故障点和排查工具)
总结一下,你可以立刻用的三个点
免费检查配置是否正确。最后提醒一句:改完DNS配置后,别急着骂娘。先喝杯咖啡,等5分钟,再清一次缓存。如果还不行,用dnschecker.org`看看全球状态。大多数时候,问题就是你没等够。