在 Mac OS X Lion 上解析虚拟主机非常慢

在 Mac OS X Lion 上解析虚拟主机非常慢

自从升级到 Mac OS X Lion(从 Snow Leopard 升级)以来,我注意到解析虚拟主机非常慢(大约 3 秒)。我发现了许多可能解决此问题的技巧(例如,不使用 .local TLD),但它们不适用于我的设置。

我的设置非常简单: - Apache 2(随 Lion 一起提供) - 启用 PHP - 添加了一些虚拟主机 - 安装了 Mail 和 SMTP Pear 包

Apache 的 hosts 文件如下所示:

127.0.0.1   localhost
255.255.255.255 broadcasthost
::1             localhost 
fe80::1%lo0 localhost
127.0.0.1   tbi.dev
127.0.0.1   www.tbi.dev
127.0.0.1   test1.tbi.dev
127.0.0.1   test2.tbi.dev
127.0.0.1   psa.dev
127.0.0.1   snd.dev

Apache 的虚拟主机文件如下所示:

<VirtualHost *:80>
    DocumentRoot "/Users/Bart/Sites/tbi"
    ServerName tbi.dev
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/Users/Bart/Sites/tbi"
    ServerName tbi.dev
    ServerAlias *.tbi.dev www.tbi.dev
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/Users/Bart/Sites/psa"
    ServerName psa.dev
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/Users/Bart/Sites/sandbox"
    ServerName snd.dev
</VirtualHost>

该设置与我在 Snow Leopard 上的设置基本相同,但 Apache 解析虚拟主机的性能明显不同。我运行的是 Mac OS X Lion 10.7.2,但运行 10.7.1 时就已经存在此问题。

这看起来像是一个小问题,但当您每天访问虚拟主机几百次时,就可以想象这会浪费大量时间。

答案1

较长的 DNS 超时几乎总是 IPv6 问题的征兆。

您需要 IPv6 连接到 Apache 吗?

如果没有,我建议改变

<VirtualHost *:80>

进入

<VirtualHost 0.0.0.0:80>

或者完全禁用 IPv6 连接。

答案2

我刚才也遇到了这个问题。

这会将网络配置中的 IPv6 设置为关闭...

# list all network interfaces to get their names
networksetup -listallnetworkservices
# disable the one you want, in my case it's WiFi
networksetup -setv6off Wi-Fi

但不幸的是,这并没有解决我的 DNS 解析问题(也许在系统重启后)。真正有帮助的是将 ipv6 样式的 IP 添加到 /etc/hosts,如下所示:

# my original /etc/hosts ...
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1             localhost 
fe80::1%lo0 localhost

127.0.0.1 project.local

# adding this solved resolving:
fe80::1%lo0 project.local

获得http://项目.local现在立即显示

Resolving project.local... 127.0.0.1
Connecting to project.local|127.0.0.1|:80... connected.

而不是在解析 project.local 时挂起 5 秒钟。

答案3

MacOSX Lion .local域已被“保留”用于多播 DNS 解析器(bonjour)。

这意味着查找任何以 .local 结尾的域名都将导致 mDNS 查找(最多 5 秒)/etc/hosts。

修复:

  1. 将你的测试域名更改为其他 TLD(例如.dev
  2. 使用 dscl 工具添加例外。

答案4

有用。

我用这个解决方案

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1   localhost
255.255.255.255 broadcasthost
::1             localhost6
fe80::1%lo0 localhost

相关内容