我在本地计算机上运行一个 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/了解更多详情。那里有详细介绍。