使用 /etc/hosts 条目联系本地主机上的服务时出现长时间延迟

使用 /etc/hosts 条目联系本地主机上的服务时出现长时间延迟

我在本地计算机上运行一个 Web 服务器,当我使用该localhost地址对其执行 cURL 请求时,它执行得非常快。但是,当我添加如下 /etc/hosts 时

127.0.0.1 test.local

然后执行相同的 cURL 请求:

curl -I http://test.local:3002/images/logo.png

它会延迟整整 2-3 秒。将 cURL 请求改回localhost不会产生任何延迟。

每次都可以重现这种情况。

我尝试运行慢速请求,dtruss看看能否找到导致延迟的系统调用。没有发现任何异常。

我尝试过通过netcat它创建一个虚拟服务,它只会返回结果HTTP/1.0 200 OK,因此我可以保证问题不是由我的网络服务器引起的。同样,没有区别:localhost速度如您预期的那样快,但test.local有延迟。

此时我认为 DNS 存在某种问题。也就是说,/etc/hosts首先没有被查询,也就是说,我的上游 DNS 正在被检查,但失败了,然后/etc/hosts被查询,最终成功了。

这可能吗?是否会在解析器链中以OS X Lion某种方式咨询我?/etc/hosts

答案1

好的,我明白了。我在一篇博客文章上发现了这条评论:

问题在于 Lion 对 .local TLD 的处理方式不同,因为它是为某些多播 DNS 功能保留的(Bonjour 使用)。我发现解决此问题的唯一方法是为开发主机使用不同的 TLD(即:.dev)。对我来说,它工作得很好,希望它对其他人有帮助!

将我的开发域切换至以正常工作结束.dev

tl;dr - 不要用于.localLion 中的开发域。

答案2

OSX lion 有这个已知错误。它会先咨询 DNS 服务器,然后再使用 /etc/hosts 条目。此行为仅在 OSX lion 中发现,在 snow leopard 甚至 tiger 中均未发现。

可能的选择:

  • 安装 DNSMasq
  • 等待 macosx 补丁
  • 暂时使用 snow leopard

另请参阅http://www.justincarmony.com/blog/2011/07/27/mac-os-x-lion-etc-hosts-bugs-and-dns-resolution/了解更多详情。那里有详细介绍。

相关内容