Назад | Перейти на главную страницу

Очень медленное преобразование в виртуальный хост в Mac OS X Lion

После обновления до Mac OS X Lion (от Snow Leopard) я заметил, что преобразование в виртуальный хост происходит очень медленно (около 3 секунд). Я нашел несколько советов (например, отказ от использования TLD .local), которые могут решить эту проблему, но они не применимы к моей настройке.

Моя установка довольно проста: - Apache 2 (поставляется с Lion) - включен PHP - добавлено несколько виртуальных хостов - установлены пакеты Mail и SMTP Pear

Файл hosts 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

А файл виртуальных хостов 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.

Это может показаться небольшой проблемой, но когда вы обращаетесь к виртуальным хостам несколько сотен раз в день, это, как вы можете себе представить, приводит к значительной трате времени.

Длительные тайм-ауты DNS почти всегда являются признаком проблем с IPv6.

Вам нужно подключение IPv6 к apache?

Если нет, предлагаю изменить

<VirtualHost *:80>

в

<VirtualHost 0.0.0.0:80>

Или вообще отключите соединение IPv6.

Я тоже столкнулся с этим только сейчас.

Это отключит 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 (возможно, после перезапуска системы). Что действительно помогло, так это добавление IP-адресов в стиле ipv6 в / 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

wget http: //project.local теперь отображается мгновенно

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

вместо зависания на 5 секунд при разрешении project.local.

На MacOSX Lion .local домен был «зарезервирован» для Multicast DNS Resolver (bonjour).

Это означает, что поиск любого домена, заканчивающегося на .local, приведет к поиску mDNS (до 5 секунд). перед / etc / hosts.

Исправления:

  1. Измените свои тестовые домены на другие TLD (т. Е. .dev)
  2. Используйте инструмент dscl добавить исключение.

Посмотри на этот блог чтобы узнать, помогает ли это, особенно выделив проблему №2:

По-видимому, терминал и некоторые инструменты BSD Unix правильно используют /etc/resolv.conf и правильный порядок сначала / etc / hosts, а затем DNS-серверов. Однако все остальное в OS X Lion, включая все ваши приложения, делает это наоборот!

Оно работает.

Я использую это решение

##
# 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

Та же ошибка на Mavericks.

Устранено, когда я помещаю определения моих локальных хостов в начало /etc/hosts, как это:

127.0.0.1 localhost project1.dev project2.dev
127.0.0.1 project3.dev project4.dev
255.255.255.255 broadcasthost
::1             localhost
fe80::1%lo0     localhost

Попробую поменять:

::1             localhost 
fe80::1%lo0 localhost

к

::1             localhost6 
fe80::1%lo0 localhost6