域名DNS配置避坑指南:从3小时到10分钟搞定

先说说最基础的吧——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。

那怎么办? 有两种解决方案:

  • 对于根域名,用A记录指向IP(需要固定IP)
  • 如果服务器IP会变,用DNS提供商的"CNAME扁平化"功能,比如Cloudflare的"Proxy"模式
  • 看这个配置示例:

    `

    传统方式(需要固定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的问题,还取决于:

  • 上游DNS服务器:你的域名注册商的DNS服务器更新了吗?
  • 递归DNS服务器:比如Google的8.8.8.8,它们缓存了多久?
  • 本地DNS缓存:你的电脑和路由器的缓存清了吗?
  • 所以当你说"改了配置但没生效"时,先检查这三步:

    `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到显示页面,标记每个环节可能的故障点和排查工具)

    总结一下,你可以立刻用的三个点

  • 改配置前,先把TTL降到最低(比如120秒),等配置稳定后再改回正常值(比如1小时)。这样你改配置时不用等24小时,这个技巧至少能帮你省2小时。
  • 根域名用A记录或CNAME扁平化,千万别在根域名上同时配CNAME和其他记录,否则DNS会直接崩溃。用Cloudflare的Proxy模式最省心。
  • 配邮件服务器时,优先级的数字越小越优先,而且必须配SPF和DKIM记录,不然你的邮件会被当作垃圾邮件。先测试再上线,用mxtoolbox.com免费检查配置是否正确。
  • 最后提醒一句:改完DNS配置后,别急着骂娘。先喝杯咖啡,等5分钟,再清一次缓存。如果还不行,用dnschecker.org`看看全球状态。大多数时候,问题就是你没等够。

    滚动至顶部