У меня несколько компьютеров, подключенных к сети. Внутри этой сети есть сервер, на котором размещен WAMP (Windows + Apache + PHP + MySQL). На нем установлена Windows 7 x32 Pro. Я могу пинговать этот сервер с моего беспроводного сервера, все пинги составляют 1 мс. Что интересно, когда я просматриваю свое веб-приложение на самом сервере, оно загружается в мгновение ока. Я могу просматривать подстраницы, как будто это изображения, которые я просто переключаю.
Однако на других компьютерах он работает медленнее. Это не трагично, но заметно медленнее. В некоторых случаях браузер показывает «Ожидание…», которое длится одну-две секунды, и это самое мучительное.
Я понял, что гораздо быстрее использовать приложение на сервере, когда я подключен через удаленный рабочий стол, чем на любом другом компьютере. Было бы здорово, если бы я мог получить тот же эффект на них.
Когда я заглядываю в консоль разработчика в Chrome, я вижу следующее: DOMContentLoaded занимает около 400–600 мс на сервере и 1400 мс на всех остальных компьютерах.
Что я могу сделать в этой ситуации?
решение1
Убедитесь, что в Apache установлено значение HostnameLookups Off
.
Вы говорите, что сервер работает под управлением Apache через настройку WAMP (эквивалент LAMP в Windows), верно? Ну, если это так, откройте httpd.conf
или apache2.conf
(все зависит от того, как он был установлен в вашей настройке; оба файла в основном одинаковы) и найдите строку конфигурации с HostnameLookups
. По умолчанию HostnameLookups
установлено, Off
как объяснено в комментарии, который должен быть прямо над HostnameLookups
настройкой в этом файле; жирный шрифт выделен мной:
HostnameLookups: регистрирует имена клиентов или только их IP-адреса, например, www.apache.org (вкл.) или 204.62.129.132 (выкл.).По умолчанию эта функция отключена, поскольку для сети в целом было бы лучше, если бы людям пришлось сознательно включать эту функцию, поскольку ее включение означает, что каждый клиентский запрос приведет КАК МИНИМУМ к одному запросу на поиск к серверу имен.
Иофициальная документация Apacheтакже приводится более подробная информация; жирный шрифт снова мой:
По умолчанию установлено значение «Выкл.», чтобы сэкономить сетевой трафик для тех сайтов, которым на самом деле не требуется выполнение обратного поиска.Это также лучше для конечных пользователей, поскольку им не приходится терпеть дополнительные задержки, связанные с поиском.Для сайтов с высокой нагрузкой эту директиву следует отключить, поскольку поиск DNS может занять значительное время.
Не используйте имена хостов для директив Allow from
/ .Deny from
Также, есть ли у вас какие-либо каталоги или директивы, которые используют Apache Basic Auth? Какую простую защиту паролем можно установить в Apache? Я припоминаю, что в некоторых случаях были замедления, связанные с поиском имени хоста, связанным с Allow from
полями, такими как Allow from localhost
. Закомментирование Allow from localhost
или установка этого значения Allow from 127.0.0.1 ::1
и последующий перезапуск Apache проясняли бы это.
Как объяснено вофициальная документация Apacheдаже если в директивах / HostnameLookups
установлено Off
использование полных имен хостов, это вызовет целую цепочку DNS-поиска, что может замедлить доступ; жирный шрифт выделен мной:Allow from
Deny from
Хостам, чьи имена совпадают или заканчиваются на эту строку, разрешен доступ. Сопоставляются только полные компоненты, поэтому приведенный выше пример будет соответствовать foo.apache.org, но не будет соответствовать fooapache.org.Эта конфигурация заставит Apache выполнить двойной обратный поиск DNS по клиентскому IP-адресу, независимо от настройки директивы HostnameLookups. Он выполнит обратный поиск DNS по IP-адресу, чтобы найти связанное имя хоста, а затем выполнит прямой поиск по имени хоста, чтобы убедиться, что оно соответствует исходному IP-адресу. Доступ будет разрешен только в том случае, если прямой и обратный DNS согласованы и имя хоста совпадает.
Этотпост в блоге также хорошо это объясняетесли вы хотите прочитать более подробную информацию о том, как записи Allow from
/ Deny from
, содержащие имя хоста (вместо чистого IP-адреса), могут замедлить доступ Apache из-за множественных поисков DNS:
Однако недавно я столкнулся с ситуацией, когда мы непреднамеренно делали то же самое, не включив явно HostnameLookups. Как? Ограничивая доступ на основе имени удаленного хоста! Прочтите документацию по директиве Allow в разделе "A (partial) domain-name":
Эта конфигурация заставит Apache выполнить двойной обратный DNS-поиск по клиентскому IP-адресу, независимо от настройки директивы HostnameLookups. Он выполнит обратный DNS-поиск по IP-адресу, чтобы найти связанное имя хоста, а затем выполнит прямой поиск по имени хоста, чтобы убедиться, что оно соответствует исходному IP-адресу. Только если прямой и обратный DNS согласованы и имя хоста совпадает, доступ будет разрешен. Это имеет смысл, но это довольно большой, вероятный неожиданный побочный эффект использования чего-то вроде:
Allow from .example.com
В нашем случае это был еще менее очевидный случай, который вообще не заставил нас задуматься об именах хостов:
Allow from localhost
Здесь было написано localhost, возможно, для экономии усилий или, может быть, для повышения ясности по сравнению с написанием 127.0.0.1 (IPv4) и ::1 (IPv6). Мысленно так легко увидеть, что "localhost" - это прямой псевдоним для 127.0.0.1 и ::1, что мы можем забыть, что имя "localhost" - это просто соглашение, и требует поиска, как и любое другое имя. Те, кто знаком с базой данных MySQL, могут знать, что на самом деле она присваивает особое запутанное значение слову "localhost", чтобы создать соединение сокета UNIX вместо соединения TCP с 127.0.0.1 или как там "localhost" определен в системе!
Вы также можете подумать, что поиск 127.0.0.1 быстрый, потому что он обычно отображается на "localhost" в /etc/hosts. Это так, но каждый второй посетитель, который не находится в /etc/hosts, получает медленный поиск DNS PTR вместо этого! И в зависимости от операционной системы вы можете увидеть "ip6-localhost" или "ip6-loopback" (Debian 7, Ubuntu 12.04), "localhost6" (RHEL 5/6, Fedora 19) в /etc/hosts или что-то еще. Поэтому важно прописать адреса:
Allow from 127.0.0.1 Allow from ::1
Это немедленно останавливает неявное поведение HostnameLookups и ускоряет работу веб-сайта. В данном случае это не было проблемой, поскольку это был частный внутренний веб-сайт, который не мог посещать никто, не получивший предварительного разрешения через брандмауэр, поэтому уровень трафика был относительно низким. Этот контроль доступа является частью того, почему localhost должен был быть разрешен в первую очередь. Но это было бы очень плохо в общедоступной производственной системе из-за замедления обслуживания трафика.