深色模式
/etc/hosts 与解析优先级
摘要:上线前想让某台机器临时指向新服务器?改
/etc/hosts最快。本文讲清解析顺序,并用它安全地做灰度/回滚测试。
适用环境
bash
# 需要 root 修改 /etc/hosts
id -u # 输出 0 表示 root
ls -l /etc/hosts1
2
3
2
3
操作步骤
1. 先看解析顺序由谁决定
bash
grep hosts /etc/nsswitch.conf
# 典型输出:hosts: files dns1
2
2
files dns 表示先查 /etc/hosts(files),再查 DNS。这就是 hosts 能「覆盖」DNS 的原因。
2. 临时把域名指向测试服务器
bash
# 备份
sudo cp /etc/hosts /etc/hosts.bak.$(date +%F)
# 追加一行(IP + 空格 + 域名)
echo "10.0.0.50 www.example.com" | sudo tee -a /etc/hosts1
2
3
4
5
2
3
4
5
3. 验证确实命中了 hosts
bash
getent hosts www.example.com
# 应返回 10.0.0.50,而不是公网 IP1
2
2
getent 走的是系统完整解析流程,能真实反映应用拿到的 IP。
4. 测试完成后撤销
bash
sudo sed -i '/10.0.0.50 www.example.com/d' /etc/hosts
# 或恢复备份
sudo cp /etc/hosts.bak.$(date +%F) /etc/hosts1
2
3
2
3
验证
bash
# 对比 dig(只看 DNS)与 getent(看系统结果)
dig +short www.example.com @223.5.5.5 # 公网真实 IP
getent hosts www.example.com # 命中 hosts 的 10.0.0.501
2
3
2
3
两者不同,说明 hosts 已生效,应用层请求会走向 10.0.0.50。
常见坑
WARNING
只改 hosts 但用 dig/nslookup 验证是没用的——这两个工具绕过 hosts。务必用 getent hosts 或实际访问应用来验证。
DANGER
/etc/hosts 是本机单点覆盖,不会影响其它机器。若误把生产域名指向错误 IP 且忘记清理,重启服务后可能引发诡异的「只有这台机器异常」。测试完务必删除对应行。