Spec-Zone.ru › Apache HTTP Server

Поддержка виртуальных хостов на основе имени

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

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

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

При размещении виртуальных хостов на основе имени сервер полагается на клиента, который передаёт имя хоста в HTTP-заголовках. Благодаря этому приёму множество разных хостов могут использовать один и тот же IP-адрес.

Размещение виртуальных хостов на основе имени обычно проще, поскольку нужно лишь настроить DNS-сервер, чтобы он сопоставлял каждому имени хоста правильный IP-адрес, а затем настроить Apache HTTP Server для распознавания разных имён хостов. Размещение виртуальных хостов на основе имени также позволяет экономнее расходовать дефицитные IP-адреса. Поэтому следует использовать размещение виртуальных хостов на основе имени, если только вы не используете оборудование, которое явно требует размещения на основе IP-адреса. Исторические причины, связанные с поддержкой клиентами размещения виртуальных хостов на основе IP-адреса, больше не актуальны для веб-сервера общего назначения.

Размещение виртуальных хостов на основе имени опирается на алгоритм выбора виртуального хоста на основе IP-адреса: поиск подходящего имени сервера выполняется только среди виртуальных хостов с наилучшим совпадением IP-адреса.

Как сервер выбирает подходящий виртуальный хост на основе имени

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

Когда поступает запрос, сервер найдёт наиболее подходящий (наиболее специфичный) аргумент <VirtualHost> с учётом IP-адреса и порта, использованных в запросе. Если несколько виртуальных хостов содержат это наилучшее совпадение адреса и порта, Apache дополнительно сравнит директивы ServerName и ServerAlias с именем сервера, указанным в запросе.

Если опустить директиву ServerName в любом виртуальном хосте на основе имени, сервер по умолчанию использует полное доменное имя (FQDN), полученное из имени хоста системы. Такое неявно заданное имя сервера может привести к неожиданному выбору виртуального хоста, поэтому этот вариант не рекомендуется.

Виртуальный хост по умолчанию на основе имени для сочетания IP-адреса и порта

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

Использование виртуальных хостов на основе имени

Связанные модули Связанные директивы
  • core
  • DocumentRoot
  • ServerAlias
  • ServerName
  • <VirtualHost>

Сначала создайте блок <VirtualHost> для каждого хоста, который требуется обслуживать. В каждом блоке <VirtualHost> необходимо как минимум указать директиву ServerName, задающую обслуживаемый хост, и директиву DocumentRoot, указывающую расположение содержимого этого хоста в файловой системе.

Основной хост перестаёт обслуживаться

Любой запрос, который не соответствует существующему <VirtualHost>, обрабатывается глобальной конфигурацией сервера независимо от имени хоста или ServerName.

Когда вы добавляете виртуальный хост на основе имени к существующему серверу и аргументы виртуального хоста совпадают с уже имеющимися сочетаниями IP-адреса и порта, запросы теперь будут обрабатываться явно заданным виртуальным хостом. В этом случае обычно разумно создать виртуальный хост по умолчанию с директивой ServerName, значение которой совпадает со значением для базового сервера. Затем можно добавлять новые домены на том же интерфейсе и порту, которым требуются отдельные настройки, в виде последующих (не используемых по умолчанию) виртуальных хостов.

Наследование ServerName

Лучше всегда явно указывать ServerName в каждом виртуальном хосте на основе имени.

Если в VirtualHost не указана директива ServerName, имя сервера будет унаследовано из базовой конфигурации сервера. Если имя сервера не задано глобально, при запуске оно определяется посредством обратного разрешения DNS для первого прослушиваемого адреса. В обоих случаях унаследованное имя сервера влияет на выбор виртуального хоста на основе имени, поэтому лучше всегда явно указывать ServerName в каждом таком виртуальном хосте.

Например, предположим, что вы обслуживаете домен www.example.com и хотите добавить виртуальный хост other.example.com, указывающий на тот же IP-адрес. Тогда просто добавьте следующий фрагмент в httpd.conf:

<VirtualHost *:80>
    # This first-listed virtual host is also the default for *:80
    ServerName www.example.com
    ServerAlias example.com 
    DocumentRoot "/www/domain"
</VirtualHost>

<VirtualHost *:80>
    ServerName other.example.com
    DocumentRoot "/www/otherdomain"
</VirtualHost>

Вместо * в директивах <VirtualHost> можно указать явный IP-адрес. Например, это может понадобиться, если вы хотите разместить несколько виртуальных хостов на основе имени на одном IP-адресе, а виртуальные хосты на основе IP-адреса или другой набор виртуальных хостов на основе имени — на другом адресе.

Многие серверы должны быть доступны по нескольким именам. Это можно сделать с помощью директивы ServerAlias, размещённой внутри раздела <VirtualHost>. Например, в первом блоке <VirtualHost> выше директива ServerAlias указывает дополнительные имена, по которым пользователи могут обращаться к тому же веб-сайту:

ServerAlias example.com *.example.com

тогда запросы ко всем хостам в домене example.com будут обслуживаться виртуальным хостом www.example.com. Для сопоставления имён можно использовать подстановочные символы * и ?. Разумеется, нельзя просто придумать имена и добавить их в ServerName или ServerAlias. Сначала нужно правильно настроить DNS-сервер, чтобы он сопоставлял эти имена с IP-адресом, связанным с вашим сервером.

Виртуальные хосты на основе имени для наиболее подходящего набора <virtualhost> обрабатываются в порядке их появления в конфигурации. Используется первое совпадение ServerName или ServerAlias; подстановочные знаки не имеют приоритета, как и ServerName по отношению к ServerAlias.

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

Наконец, можно уточнить конфигурацию виртуальных хостов, разместив другие директивы внутри контейнеров <VirtualHost>. Большинство директив можно размещать в этих контейнерах; в этом случае они будут менять конфигурацию только соответствующего виртуального хоста. Чтобы узнать, разрешено ли использовать конкретную директиву, проверьте её контекст. Директивы конфигурации, заданные в контексте основного сервера (вне любого контейнера <VirtualHost>), будут использоваться только в том случае, если их не переопределяют настройки виртуального хоста.

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

Spec-Zone.ru

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