Apache. Документация на русском


Разделы:   1    2      3      4    5    6    7    8    9    10    11    12    13    14    15    16  

Раздел 3. Документация по виртуальному хосту Apache

Пункты:   28    29    30    31      32      33  

 <         > 
  RU            EN  

Пункт 32. Подробное обсуждение сопоставления виртуальных хостов

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

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

Если вы хотите разобраться во всех деталях, то можете вернуться на эту страницу.

Конфигурационный файл

Существует основной сервер , который состоит из всех определений, появляющихся вне <VirtualHost> разделов.

Существуют виртуальные серверы, называемые vhosts , которые определяются <VirtualHost> разделами.

Каждая VirtualHost директива включает один или несколько адресов и необязательных портов.

Имена хостов можно использовать вместо IP-адресов в определении виртуального хоста, но они разрешаются при запуске, и если какое-либо разрешение имен не удается, эти определения виртуальных хостов игнорируются. Поэтому это не рекомендуется.

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

Адрес, указанный в VirtualHost директиве, может иметь необязательный порт. Если порт не указан, он рассматривается как порт с подстановочными знаками, который также можно явно указать с помощью * . Порт с подстановочным знаком соответствует любому порту.

(Номера портов, указанные в VirtualHost директиве, не влияют на то, какие номера портов будет прослушивать Apache, они только управляют тем, какие из них VirtualHost будут выбраны для обработки запроса. Используйте директиву Listen для управления адресами и портами, которые прослушивает сервер.)

В совокупности весь набор адресов (включая несколько результатов поиска DNS) называется набором адресов виртуального хоста .

Apache автоматически различает на основе HTTP- Host заголовка, предоставленного клиентом, всякий раз, когда наиболее конкретное совпадение для комбинации IP-адреса и порта указано на нескольких виртуальных хостах.

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

Первый виртуальный хост на основе имени в файле конфигурации для данной пары IP:порт имеет важное значение, поскольку он используется для всех запросов, полученных на этот адрес и порт, для которых ни один другой виртуальный хост для этой пары IP:порт не имеет соответствующего имени сервера или псевдонима сервера. Он также используется для всех соединений SSL, если сервер не поддерживает индикацию имени сервера .

Полный список имен в VirtualHost директиве обрабатывается так же, как (без подстановочного знака) ServerAlias (но не переопределяется никаким ServerAlias оператором).

Для каждого виртуального хоста устанавливаются различные значения по умолчанию. В частности:

  1. Если vhost не имеет директивы ServerAdmin , Timeout , KeepAliveTimeout , , , или , KeepAlive то соответствующее значение наследуется от основного сервера. (То есть, унаследовано от любого конечного значения этого значения на главном сервере.) MaxKeepAliveRequests ReceiveBufferSize SendBufferSize
  2. «Значения поиска по умолчанию», которые определяют разрешения каталога по умолчанию для виртуального хоста, объединяются с разрешениями основного сервера. Это включает в себя любую информацию о конфигурации каждого каталога для любого модуля.
  3. Конфигурации каждого сервера для каждого модуля с основного сервера объединяются в сервер vhost.

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

Если на этом этапе у основного сервера нет ServerName , то вместо этого используется имя хоста машины, httpd на которой работает. Мы будем называть набором адресов основного сервера те IP-адреса, которые возвращаются при поиске DNS на ServerName основном сервере.

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

Любой виртуальный хост, который включает в себя волшебный _default_ подстановочный знак, назначается так же, ServerName как и основной сервер.

Сопоставление виртуального хоста

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

Поиск IP-адреса

Когда соединение впервые получено по некоторому адресу и порту, сервер ищет все VirtualHost определения, которые имеют тот же IP-адрес и порт.

Если нет точных совпадений для адреса и порта, то * учитываются совпадения с подстановочными знаками ( ).

Если совпадений не найдено, запрос обслуживается основным сервером.

Если есть VirtualHost определения для IP-адреса, следующим шагом будет решить, будем ли мы иметь дело с виртуальным хостом на основе IP или на основе имени.

виртуальный хост на основе IP

Если существует ровно одна VirtualHost директива, в которой указана комбинация IP-адреса и порта, которая была определена как наилучшая, дальнейшие действия не выполняются, и запрос обслуживается с соответствующего виртуального хоста.

Vhost на основе имени

Если имеется несколько VirtualHost директив, в которых перечислены комбинации IP-адресов и портов, которые были определены как наиболее подходящие, «список» в оставшихся шагах относится к списку совпадающих виртуальных хостов в том порядке, в котором они были указаны в файле конфигурации.

Если соединение использует SSL, сервер поддерживает указание имени сервера , а рукопожатие клиента SSL включает расширение TLS с запрошенным именем хоста, то это имя хоста используется ниже точно так же, как заголовок Host: использовался бы для соединения без SSL. В противном случае для соединений SSL используется первый виртуальный хост на основе имени, адрес которого совпадает. Это важно, потому что vhost определяет, какой сертификат сервер будет использовать для подключения.

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

Первый виртуальный хост в файле конфигурации с указанным IP-адресом имеет наивысший приоритет и перехватывает любой запрос к неизвестному имени сервера или запрос без поля заголовка Host: (например, запрос HTTP/1.0).

Постоянные соединения

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

Абсолютный URI

Если URI из запроса является абсолютным URI, а его имя хоста и порт совпадают с основным сервером или одним из настроенных виртуальных хостов и совпадают с адресом и портом, на который клиент отправил запрос, то префикс схемы/имени хоста/порта удаляется, а оставшийся относительный URI обслуживается соответствующим основным сервером или виртуальным хостом. Если он не совпадает, то URI остается нетронутым, и запрос воспринимается как прокси-запрос.

Наблюдения

  • Виртуальный хостинг на основе имени — это процесс, применяемый после того, как сервер выбрал наиболее подходящий виртуальный хост на основе IP.
  • Если вам все равно, к какому IP-адресу подключился клиент, используйте «*» в качестве адреса каждого виртуального хоста, и виртуальный хостинг на основе имени применяется ко всем настроенным виртуальным хостам.
  • ServerName и ServerAlias проверки никогда не выполняются для виртуального хоста на основе IP.
  • Имеет значение только порядок виртуальных хостов на основе имени для определенного набора адресов. Один виртуальный хост на основе имени, который идет первым в файле конфигурации, имеет наивысший приоритет для соответствующего набора адресов.
  • Любой порт в Host: поле заголовка никогда не используется в процессе сопоставления. Apache всегда использует реальный порт, на который клиент отправил запрос.
  • Если два виртуальных хоста имеют общий адрес, эти общие адреса неявно действуют как виртуальные хосты на основе имени. Это новое поведение с версии 2.3.11.
  • Основной сервер используется для обслуживания запроса только в том случае, если IP-адрес и номер порта, к которому подключен клиент, не совпадают ни с одним виртуальным хостом (включая виртуальный хост * ). Другими словами, главный сервер перехватывает только запрос на неуказанную комбинацию адреса/порта (если только нет виртуального хоста, _default_ соответствующего этому порту).
  • Вы никогда не должны указывать DNS-имена в VirtualHost директивах, потому что это заставит ваш сервер полагаться на DNS для загрузки. Кроме того, это представляет угрозу безопасности, если вы не контролируете DNS для всех перечисленных доменов. Доступна дополнительная информация по этой и двум следующим темам.
  • ServerName всегда должен быть установлен для каждого виртуального хоста. В противном случае для каждого виртуального хоста требуется поиск DNS.

Советы

В дополнение к советам на странице проблем с DNS, вот еще несколько советов:

  • Поместите все основные определения сервера перед любыми VirtualHost определениями. (Это делается для облегчения чтения конфигурации — процесс слияния после конфигурации делает неочевидным тот факт, что определения, смешанные вокруг виртуальных хостов, могут повлиять на все виртуальные хосты.)


 <         > 

Пункты:   28    29    30    31      32      33  

Рейтинг@Mail.ru