<-
Apache > HTTP Server > Documentation > Version 2.0 > Virtual Hosts

Всестороннее Обсуждение Действительного Соответствия Хозяина

действительный кодекс хозяина был полностью переписан в Apache 1.3 . этот документ пытается объяснить точно, что Apache делает, решая какой действительного хозяина служить хиту от. С помощью нового NameVirtualHost директива действительная конфигурация хозяина должна быть намного легче и более безопасной чем с версиями до 1.3.

если Вы только хотите к заставить это работать не понимая, как, вот some examples .

top

Config File Parsing

есть a main_server который состоит из всех определений, появляющихся вне <VirtualHost> секции. Есть действительные серверы, названные vhosts , которые определены <VirtualHost> секции.

директивы Listen , ServerName , ServerPath , и ServerAlias может появиться где-нибудь в пределах определения сервера. Однако, каждое появление отвергает предыдущее появление (в пределах того сервера).

ценность по умолчанию Listen область для main_server - 80. main_server не имеет никакого неплатежа ServerPath , или ServerAlias . неплатеж ServerName выведен из IP адреса сервера.

main_server Слушают, директива имеет две функции. Одна функция должна решить, что Apache порта сети по умолчанию свяжет с. Вторая функция должна определить число порта, которое используется в абсолютном URIs в течение, переадресовывает.

в отличие от main_server, vhost порты не делать затронуть, каков держит Apacheа в строевой стойке, прислушивается к связям на.

каждый адрес, появляющийся в VirtualHost директива может иметь дополнительный порт. Если порт неуказан это неплатежи к ценности main_server's нового Listen утверждение. Специальный порт * указывает групповой символ, который соответствует любому порту. Все вместе весь набор адресов (включая многократный A сделать запись следствий поисков DNS), называются vhost's набор адреса .

если a NameVirtualHost директива используется для определенного адреса IP, первый vhost с тем адресом рассматривают как vhost на основе IP. IP адрес может также быть групповым символом * .

если на основе названия vhosts должен использоваться a NameVirtualHost директива должен кажется, с IP набором адреса использовались для vhosts на основе названия. Другими словами, Вы должны определить IP адрес, который держит hostname псевдонимы (CNAMEs) для вашего vhosts на основе названия через a NameVirtualHost директива в вашем файле конфигурации.

многократный NameVirtualHost директивы могут использоваться каждый с рядом VirtualHost директивы, но только один NameVirtualHost директива должна использоваться для каждой определенной пары IP:port.

заказ NameVirtualHost и VirtualHost директивы не важны, который делает следующие два примера идентичными (только заказ VirtualHost директивы для один набор адреса важен, видеть ниже):

NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
# server A
...
</VirtualHost>
<VirtualHost 111.22.33.44>
# server B
...
</VirtualHost>

NameVirtualHost 111.22.33.55
<VirtualHost 111.22.33.55>
# server C
...
</VirtualHost>
<VirtualHost 111.22.33.55>
# server D
...
</VirtualHost>

<VirtualHost 111.22.33.44>
# server A
</VirtualHost>
<VirtualHost 111.22.33.55>
# server C
...
</VirtualHost>
<VirtualHost 111.22.33.44>
# server B
...
</VirtualHost>
<VirtualHost 111.22.33.55>
# server D
...
</VirtualHost>

NameVirtualHost 111.22.33.44
NameVirtualHost 111.22.33.55

(чтобы помогать удобочитаемости вашей конфигурации, Вы должны предпочесть левый вариант.)

после парсинга VirtualHost директива, vhost серверу дают неплатеж Listen равняйтесь порту, назначенному на имя в VirtualHost директива.

полный список названий в VirtualHost директиву рассматривают точно так же как a ServerAlias (но не отвергнуты никем ServerAlias утверждение), если все названия решают к тому же самому набору адреса. Отметьте что последующий Listen утверждения на этот vhost не будут затрагивать порты, назначенные в наборе адреса.

в течение инициализации список для каждого IP адреса произведен и вставлен в стол мешанины. Если IP адрес используется в a NameVirtualHost директива список содержит весь vhosts на основе названия для данного IP адреса. Если нет никаких vhosts, определенных для того адреса NameVirtualHost директива игнорируется, и ошибка зарегистрирована. Для vhost на основе IP список в столе мешанины пуст.

из-за быстрой функции hashing верхний из hashing IP адрес в течение запроса является минимальным и почти не существующим. Дополнительно стол оптимизирован для IP адресов, которые изменяются по последнему октету.

поскольку каждые vhost различные ценности по умолчанию установлены. В особенности:

  1. если vhost имеет нет ServerAdmin , ResourceConfig , AccessConfig , Timeout , KeepAliveTimeout , KeepAlive , MaxKeepAliveRequests , ReceiveBufferSize , или SendBufferSize директива тогда соответствующая ценность унаследована от main_server. (Таким образом, унаследованный от того, что заключительное урегулирование той ценности находится в main_server.)
  2. "неплатежи поиска", которые определяют директивные разрешения по умолчанию для vhost, слиты с таковыми из main_server. Это включает любую в-справочник информацию конфигурации для любого модуля.
  3. в-сервер configs для каждого модуля от main_server слиты в vhost сервер.

по существу, main_server рассматривают как "неплатежи" или "основа", чтобы строить каждый vhost. Но расположение этих main_server определений config файл является в значительной степени несоответствующим - весь config main_server был разобран, когда это заключительное слияние происходит. Так, даже если main_server определение появляется после vhost определения, это могло бы затронуть vhost определение.

если main_server имеет нет ServerName в этом пункте, тогда hostname машины это httpd продолжается используется вместо этого. Мы будем звонить набор адреса main_server те IP адреса, возвращенные поиском DNS на ServerName из main_server.

для любого неопределенный ServerName области, vhost неплатежи на основе названия к адресу, данному сначала в VirtualHost утверждение, определяющее vhost.

любой vhost, который включает волшебство _default_ групповому символу дают то же самое ServerName как main_server.

top

Virtual Host Matching

сервер определяет который vhost использовать для запроса следующим образом:

Hash table lookup

когда связь сначала сделана клиентом, IP адрес, к которому связанный клиент ищется во внутреннем IP столе мешанины.

если поиск терпит неудачу (IP адрес не был найден), запросу служат от _default_ vhost, если есть такой vhost для порта, которому клиент послал запрос. Если нет никакого соответствия _default_ vhost запрос служат от main_server.

если IP адрес не найден в столе мешанины тогда, состязание против числа порта может также привести к входу, соответствующему a NameVirtualHost * , который впоследствии обработан как другой vhosts на основе названия.

если поиск преуспел (соответствующий список для IP адреса был найден), следующий шаг должен решить, должны ли мы иметь дело с на основе IP или основой названия vhost.

IP-based vhost

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

Name-based vhost

если вход соответствует vhost на основе названия, список названия содержит одну или более vhost структур. Этот список содержит vhosts в том же самом заказе как VirtualHost директивы появляются в config файле.

первый vhost в этом списке (первый vhost в config файле с указанным IP адресом) имеет самый высокий приоритет и ловит любой запрос к неизвестному названию сервера или запросу без a Host: область удара головой.

если клиент обеспечил a Host: область удара головой список обыскана соответствие vhost и первый хит на a ServerName или ServerAlias взят и запросу служат от этого vhost. A Host: область удара головой может содержать число порта, но Apache всегда соответствует против реального порта, которому клиент послал запрос.

если клиент представил запрос HTTP/1.0 без Host: область удара головой, которую мы не знаем, с каким сервером клиент пробовал соединить и любого существующий ServerPath подобран против ТУРОВ от запроса. Первая дорожка соответствия в списке используется, и запросу служат от этого vhost.

если никакое соответствие vhost не могло бы быть найдено, что запросу служат спереди vhost с числом порта соответствия, которое находится в списке для IP, с которым клиент соединился (как уже упомянуто прежде).

Persistent connections

IP поиск, описанный выше только сделан однажды для специфической сессии TCP/IP, в то время как поиск названия сделан на каждый запрос в течение связи KeepAlive/persistent. Другими словами клиент может просить страницы от различного vhosts на основе названия в течение единственной постоянной связи.

Absolute URI

если ТУРЫ от запроса - абсолютные ТУРЫ, и его hostname и порт соответствуют главному серверу или одному из формируемых действительных хозяев и соответствовать адресу и порту, которому клиент послал запрос, тогда scheme/hostname/port приставка раздета прочь, и остающиеся относительные ТУРЫ служится соответствующим главным сервером или действительным хозяином. Если это не соответствует, то ТУРЫ остаются нетронутыми, и запрос взят, чтобы быть запросом по доверенности.

Observations

top

Tips

в дополнение к подсказкам на DNS Issues страница, вот - некоторые дальнейшие подсказки: