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

Bar*_*obs 25 mac-osx virtualhost apache-2.2

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

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

Apache 的主机文件如下所示:

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
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

这可能看起来是一个小问题,但是当您每天访问虚拟主机数百次时,正如您想象的那样,这会浪费大量时间。

ada*_*ptr 24

长时间的 DNS 超时几乎总是 IPv6 问题的迹象。

你需要 IPv6 连接到 apache 吗?

如果没有,我建议改变

<VirtualHost *:80>
Run Code Online (Sandbox Code Playgroud)

进入

<VirtualHost 0.0.0.0:80>
Run Code Online (Sandbox Code Playgroud)

或者完全禁用 IPv6 连接。

  • +1:ipv6 DNS 查找是 OSX 上的一个主要问题。由于某些晦涩的原因,OSX 首先进行 ipv6 查找。如果超时(30 秒左右),它将继续使用 v4。OSX 似乎不会首先检查 /etc/hosts vor v6,它会检查 v4,但只有在 v6 超时之后才会检查。如果您不能更好地禁用 v6,请确保您有一个完整的 v6 设置,包括 v6 DNS。 (4认同)

Dal*_*lus 22

我刚才也遇到了这个。

这会将网络配置中的 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
Run Code Online (Sandbox Code Playgroud)

但是.. 不幸的是,这并没有为我解决 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
Run Code Online (Sandbox Code Playgroud)

wget http://project.local现在立即显示

Resolving project.local... 127.0.0.1
Connecting to project.local|127.0.0.1|:80... connected.
Run Code Online (Sandbox Code Playgroud)

而不是在 Resolving project.local 上挂起 5 秒钟。


Art*_*era 12

MacOSX 上,Lion .local域已为多播 DNS 解析器(bonjour)“保留”。

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

修复:

  1. 将您的测试域更改为其他一些 TLD(即.dev
  2. 使用 dscl 工具添加例外。