![使用 /etc/hosts 条目联系本地主机上的服务时出现长时间延迟](https://linux22.com/image/1285393/%E4%BD%BF%E7%94%A8%20%2Fetc%2Fhosts%20%E6%9D%A1%E7%9B%AE%E8%81%94%E7%B3%BB%E6%9C%AC%E5%9C%B0%E4%B8%BB%E6%9C%BA%E4%B8%8A%E7%9A%84%E6%9C%8D%E5%8A%A1%E6%97%B6%E5%87%BA%E7%8E%B0%E9%95%BF%E6%97%B6%E9%97%B4%E5%BB%B6%E8%BF%9F.png)
我在本地计算机上运行一个 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 - 不要用于.local
Lion 中的开发域。
答案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/了解更多详情。那里有详细介绍。