域名与 DNS(下):配置实操、生效迁移与排障工具箱
以朋友好学 pygood.com 为样本,手把手讲主站/接口/邮箱/证书验证的记录怎么配,TTL 怎么设、迁移怎么平滑,并用 dig/nslookup 定位「解析不生效、指向错误、被劫持」等真实问题
- 会为网站、接口、H5、邮箱、证书验证配置正确的 DNS 记录
- 掌握 TTL 调优与零停机切换服务器的解析迁移方法
- 会用 dig/nslookup/host 等工具验证解析、判断卡在哪一层
- 理解公共 DNS、DNS 劫持/污染与 HTTPDNS 的来龙去脉
会配解析,才算真正会用域名
上一课讲了原理,这一课落到操作:一个真实项目要配哪些记录、改了多久生效、出问题怎么查。我们以朋友好学 pygood.com、服务器公网 IP 为 134.175.44.210 做样本(IP 仅为教学示例,以你实际为准)。
一个项目典型要配哪些记录
# 主站与接口(A 记录直接指 IP)
@ A 134.175.44.210 # @ 代表根域 pygood.com
www A 134.175.44.210 # www 子域
api A 134.175.44.210 # 接口(也可用 Nginx 按路径统一分流)
# 静态/H5 若用 CDN 或对象存储,一般给 CNAME
h5 CNAME xxx.cdn-provider.net
# 邮箱(MX + TXT 反垃圾,值由你的邮箱服务商提供)
@ MX 10 mx.mail-provider.net
@ TXT "v=spf1 include:... ~all"
# 申请 HTTPS 证书 / 验证域名所有权时,按 CA 或平台要求加一条 TXT
_acme-challenge TXT "随机校验值"用户有时输 pygood.com、有时输 www.pygood.com,两者都要能打开。常见做法是两个都配 A 记录指到同一服务器,再由 Nginx 把其中一个 301 跳转到另一个(统一成一个主域名,对 SEO 和 Cookie 作用域都更干净)。跳转在 Web 服务器层做,DNS 本身只负责把两个名字都解析到 IP。
TTL 与平滑迁移:把「等待生效」变成可控
TTL 告诉各级缓存「这条记录存多少秒」。常见默认 600 秒或 3600 秒。要换服务器 IP 时,正确节奏是:迁移前一两天,先把相关记录 TTL 调小(如 60~300 秒),等旧的长 TTL 缓存自然过期;上线时把 A 记录改到新 IP,因为 TTL 已很短,全球很快收敛;验证稳定后再把 TTL 调回较大值以减少解析开销。这样能把「部分用户还在旧机」的窗口从几小时压到几分钟。
迁移时间线
T-2天 把 @/www 的 TTL 从 3600 降到 300,等待旧缓存过期
T 0 新服务器就绪并验证后,A 记录改指新 IP
T+10分 全球递归解析基本收敛,观察流量与日志
T+1天 确认无回退需求,TTL 调回 600/3600,旧机保留几天再下线面向大陆:域名要先实名、大陆服务器要完成 ICP 备案,80/443 才会被正常放行(详见 Stage14);换服务器 IP 后,备案接入商若变化要做接入备案。技术上还要确认新服务器上该域名的 HTTPS 证书已就位,否则解析一切过去浏览器就报证书错误——DNS、备案、证书三件事要在同一时间点对齐。
排障工具箱:dig / nslookup / host
「打不开、解析不对、没生效」要靠工具看清楚解析到底返回了什么,而不是反复刷新。最常用的是 dig(Linux/macOS,Windows 可装或用 nslookup):
# 查某域名当前解析到哪(指定向公共DNS 223.5.5.5 问,排除本机缓存)
dig @223.5.5.5 www.pygood.com
# 关键看 ANSWER SECTION 里的记录与 TTL
# 一路跟踪根->TLD->权威的迭代过程,看是哪一层给错
dig +trace pygood.com
# 查指定类型记录
dig pygood.com MX
dig _acme-challenge.pygood.com TXT
# Windows 自带
nslookup www.pygood.com 8.8.8.8排查思路:向多个公共 DNS(国内 223.5.5.5/119.29.29.29、国外 8.8.8.8/1.1.1.1)分别查询,若结果不一致,多半是缓存未收敛或配置没全网同步;dig +trace 看权威服务器返回是否正确,权威对了但递归不对=缓存问题,权威本身就错=你配置有误;本机结果和公共 DNS 不一致,先查本机 hosts 与系统缓存(Windows 用 ipconfig /flushdns 刷新)。
公共 DNS、劫持污染与 HTTPDNS
设备默认用运营商 DNS,也可手动改成公共 DNS。国内常用阿里 223.5.5.5、腾讯 119.29.29.29、114 的 114.114.114.114;国外常用 Google 8.8.8.8、Cloudflare 1.1.1.1。两类安全问题要知道:DNS 劫持(攻击者/中间网络把域名解析到伪造 IP,常见于公共 Wi-Fi 或恶意路由器)和 DNS 污染(查询在网络途中被注入错误答案)。因为传统 DNS 查询默认明文、可被中间设备看见和篡改,所以才有了 DNS over HTTPS/TLS(DoH/DoT,加密 DNS 查询);移动端还常用 HTTPDNS——App 不走系统 DNS、直接通过 HTTPS 向可信 HTTPDNS 服务要 IP,规避劫持并实现更精准的就近调度。
新手最容易焦虑「我都改了怎么还没生效」。要接受一个事实:DNS 是全球成千上万台缓存服务器组成的分布式系统,没有任何一个按钮能让全世界同时更新,你能控制的只有 TTL 和权威记录的正确性。所以专业做法永远是「迁移前降 TTL、切换时改权威、切换后观察、稳定后回 TTL」,并保留旧服务器做一段时间回滚兜底。把变更当成有收敛窗口的灰度过程,而不是瞬时开关,绝大多数「解析事故」都能避免。
计划周末把网站迁到新服务器,为了让全球解析最快、最平滑地切到新 IP,较稳妥的做法是?
本节小结
典型记录:根域@与 www 配 A 指服务器并在 Nginx 统一跳转、CDN/H5 用 CNAME、邮箱配 MX 加 SPF/DKIM 的 TXT、证书验证按要求加 TXT。迁移靠 TTL 控制收敛:提前降到 60~300 秒、切换改权威、观察后调回、旧机兜底,同时让 DNS、备案接入、证书三件事对齐。排障用 dig @公共DNS 看当前结果、dig +trace 看迭代链路、dig 名字 类型 看具体记录,本机异常先查 hosts 和 ipconfig /flushdns;多公共 DNS 结果不一致多为缓存未收敛。公共 DNS 有 223.5.5.5/119.29.29.29/8.8.8.8/1.1.1.1;传统 DNS 明文可被劫持污染,DoH/DoT 加密查询,移动端用 HTTPDNS 走 HTTPS 取 IP 防劫持、做精准调度。
资深工程师加餐
底层原理 · 大厂视角 · 工程经验,点卡片展开
把会话、上传文件、定时任务状态从应用进程里挪到 Redis、对象存储或数据库后,任何一台应用实例都能处理任何请求,扩容就是多开几个实例挂到负载均衡后面。反过来,只要状态留在某台机器的内存里,它就既无法横向扩容,也无法滚动更新(一重启用户就掉线)。面试答「如何支撑更高并发」,先讲无状态化,再谈加机器和缓存。