Spec-Zone.ru › Apache HTTP Server

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

В данном документе объясняется, как сервер Apache HTTP Server определяет, какой виртуальный хост должен обработать запрос.

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

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

Файл конфигурации

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Постоянные подключения

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

Абсолютный URI

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

Примечания

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

Советы

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

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

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/vhosts/details.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API