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

Столкнулся с странной проблемой — после переезда на 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. Перезагружаемся и проверяем.

 

windows → Запуск приложений до входа в Windows

Самый простой способ запустить приложение, или что-либо другое, сразу после загрузки системы — использовать встроенный в windows планировщик заданий. Расскажу на примере Windows Server 2003. Предположим, нам нужно запустить Денвер, причём именно до входа пользователя в систему.

Открываем «Назначенные задания» (Пуск → Все программы → Стандартные → Служебные → Назначенные задания), там нажимаем «Добавить задание». В окне выбора приложения нажимаем «Обзор» и выбираем файл run.exe в папке c:/webservers/denwer/ (путь по-умолчанию, у вас может быть другим).

Затем нажимаем «Далее» и переходим к выбору режима запуска. Тут нас интересует режим «при загрузке компьютера».

После этого снова нажимаем «Далее» и указываем имя и пароль пользователя, от имени которого вы хотите выполнить запуск приложения. Для денвера лучше использовать аккаунт администратора, чтобы избежать проблем с подключением дисков и изменением hosts-файла. Затем осталось лишь нажать «Готово», и проверить задание, перезагрузив компьютер.

P.S. Несмотря на то, что в статье, в качестве примера, используется денвер, я крайне не рекомендую использовать его на «боевых» серверах. По крайней мере без должной кропотливой настройки его компонентов.