为了进行 Web 开发,我在我的 中指定了几个域名/etc/hosts
。这些域名代表在本地运行的几个不同的网站。
127.0.0.1 site1.local
127.0.0.1 site2.local
127.0.0.1 site3.local
一切正常,但我发现从这些域加载页面时会有 5 秒的延迟。浏览器开发人员工具将此延迟归因于 DNS,并且延迟时间始终恰好为 5 秒。
奇怪的是,这也只发生在 Chrome 和 Firefox 中。Safari 完全没有延迟。
我认为浏览器可能在返回到 hosts 文件之前查询了正常的 DNS 服务器。执行 DNS 查询没有dig site1.local
返回任何结果(正如您所期望的那样),但返回结果的速度非常快(17 毫秒),因此情况似乎并非如此。
是什么原因导致在文件中查找主机时出现 5 秒延迟/etc/hosts
,以及如何减少或消除这种延迟?
答案1
访问以 结尾的主机名时出现 5 秒延迟.local
是由于 Bonjour 造成的,并进行了解释在这个关于 Stack Overflow 上另一个问题的回答中。
我能够使用该答案中建议的解决方法,为每个服务器添加一个 IPv6 条目,从而避免 5 秒的延迟。不清楚为什么添加 IPv4 和 IPv6 条目会导致避免 Bonjour,但它确实有效。
127.0.0.1 site1.local
127.0.0.1 site2.local
127.0.0.1 site3.local
::1 site1.local
::1 site2.local
::1 site3.local
答案2
如果您正在使用 Apache,那么 Apache 很可能正在挂起对您本地开发站点主机名的 DNS 查找。
“我认为浏览器可能在回退到 hosts 文件之前查询了正常的 DNS 服务器。执行 DNS 查询没有
dig site1.local
返回任何结果(正如您所预料的那样),但返回结果的速度非常快(17 毫秒),因此情况似乎并非如此。”
在我看来,这听起来像是网络问题,延迟似乎是与 DNS 查找相关的问题。Apache 正在尝试解析site1.local
、site2.local
和的主机名site3.local
,由于 DNS 查找这些主机名失败而挂起。然后,当 Apache 最终放弃并获取文件时/etc/hosts/
,网站终于加载了。
我更详细地我对这里另一个问题的回答,但HostnameLookups
对于 Apache 来说基本上是一个缓慢的过程,当它成为 Apache 配置指令的一部分时,HostnameLookups
会打开即使在其他地方被禁用。因此它确实可以解决localhost
并且只是挂起并挂起。
Allow
这解决了使用/指令的 Apache 服务器上的许多“神秘”挂起问题Deny
。