Перейти к содержанию
  1. Блог/

Исправление задержки в подключении к локальным сервисам в Windows Vista, 7, 8 и Windows Server 2008

·2 минуты
Назад в будущее Эта статья из старого блога и, возможно, устарела.

Столкнулся с странной проблемой — после переезда на Windows 8 RP появилась задержка в работе всех сайтов на локальном веб-сервере. После некоторых проверок стало понятно, что задержка возникает только если скрипты используют какие-то сторонние сервисы, будь то MySQL база, MongoDB, Memcached или что-то другое, к чему скрипт подключается по сети. После ещё пары экспериментов стало понятно, что задержка именно на этапе подключения, так как сами запросы и обмен данными осуществлялись быстро.

После непродолжительного поиска причин и решения в гугле, наткнулся на несколько записей на StackOverflow и ServerFault, где у людей была похожая проблема. Связано это было, чаще всего, с проблемами в DNS, а именно с тем, что, начиная с Windows Vista у IPv6 приоритет выше, чем у IPv4 (интересно, что до переезда на восьмёрку я использовал и висту, и семёрку, подобных проблем не было) . Это означает, что при резолве адреса «localhost», сервис сначала получал локальный IPv6 адрес (::1), и только потом, поняв что по этому адресу сервиса нет (так как и MySQL, и Memcached по-умолчанию слушают IPv4-адрес), нужный нам 127.0.0.1. Чтобы проверить, в этом ли проблема, можно просто попробовать подключиться не к домену «localhost», а напрямую по IP-адресу 127.0.0.1. Когда я изменил в конфигах домен на прямой адрес, проблема исчезла, что означает, что проблема была действительно в медленном (а точнее, неправильном) резолве.

Когда мы знаем конкретную проблему — найти её решение уже проще, и мы быстро находим эту статью на сайте Майкрософта, из которой и узнаём решение. Для удобства, приведу его здесь.

Открываем редактор реестра (Win+R, затем пишем regedit и нажимаем Enter), находим ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters. Находим там параметр DisabledComponents, или создаём его, в случае если его нет (тип параметра — DWORD), и меняем его значение на 0x20, что установит приоритет IPv4 над IPv6. Перезагружаемся и проверяем.