CentOS7下CURL多次请求先报“无法解析主机”后成功的问题排查
解决CentOS7下CURL间歇性DNS解析失败的问题
这种前几次请求报Could not resolve host、后续自动恢复的情况,我在CentOS7环境里碰到过好几次,大多和DNS解析的缓存机制、服务初始化延迟有关,整理几个排查和解决的方向:
1. 检查本地DNS缓存服务状态
CentOS7常用的本地DNS缓存服务是nscd,如果它没有正常启动或者初始化较慢,就会导致前几次请求无法命中缓存、解析超时。
- 先查看服务状态:
systemctl status nscd - 如果服务未运行,启动并设置开机自启:
systemctl start nscd systemctl enable nscd
重启服务后再测试curl请求,大概率能解决这种间歇性解析问题。
2. 更换稳定的公共DNS服务器
如果默认的DNS服务器响应延迟高或者不稳定,也会出现前几次解析失败、后续重试成功的情况。
- 临时测试可以指定curl用公共DNS:
curl --dns-servers 223.5.5.5 http://example.com/welcome/ - 如果测试有效,修改系统DNS配置:编辑
/etc/resolv.conf,替换原有nameserver为:
注意:如果用NetworkManager管理网络,修改nameserver 223.5.5.5 nameserver 8.8.8.8resolv.conf可能会被覆盖,需要在NetworkManager配置里锁定DNS,或者直接修改/etc/NetworkManager/NetworkManager.conf,添加dns=none后重启NetworkManager。
3. 调整NetworkManager的DNS缓存设置
部分CentOS7系统依赖NetworkManager的DNS缓存功能,缓存初始化延迟可能导致解析失败:
- 重启NetworkManager服务:
systemctl restart NetworkManager - 或者禁用NetworkManager的DNS缓存,编辑
/etc/NetworkManager/conf.d/dns.conf,添加:
保存后重启NetworkManager生效。[main] dns=default
4. 检查系统解析配置
查看/etc/nsswitch.conf里的hosts配置项,确保解析顺序正确:
cat /etc/nsswitch.conf | grep hosts
正常配置应该是:
hosts: files dns myhostname
如果有多余的解析源(比如mdns4_minimal),可以注释掉,避免干扰DNS解析流程。
补充说明
你最后一次请求返回{"detail":"Authentication credentials were not provided."},说明此时DNS解析已经正常,只是目标服务需要认证,这也验证了解析问题是间歇性的,而非目标服务本身不可达。
内容的提问来源于stack exchange,提问作者Caterina Dmitrieva




