Зачем нужен виртуальный хост?
Термин «Виртуальный хост» относится к практике запуска более одного веб-сайта (например, company1.example.com и company2.example.com) на одной машине (сервере или виртуальной машине под управлением гипервизора).
Вы купили один сервер и хотите, чтобы на нём работал сайт вашей организации по продаже морской капусты. Для этого вы покупаете у провайдера интернета выделенный статический IP-адрес и пробрасываете порты на ваш сервер при помощи маршрутизатора. Устанавливаете одну операционную систему и один веб-сервер. Складываете файлы сайта в нужную папку в операционной системе и он начинает работать. Один сайт работает на одном железе.
Предположим ваш бизнес развивается и вы открываете новое направление услуг по грузоперевозкам морепродуктов. Пихать всё на один сайт не правильно т. к. там товары, а тут услуги. Начнётся путаница. В этом случае нужно будет повторить первоначальные покупки (сервер, ip-адрес, домен). Но это же накладно.
Вот тут приходят на помощь виртуальные хосты. Создаются дополнительные папки для новых сайтов на старом сервере, прописываются правила чтения папок при входящих веб-запросах. То есть на один ip-адрес ломятся все запросы ко всем сайтам, а благодаря заголовкам запросов веб-сервер понимает в какие директории нужно перенаправлять их.
Современные сервера имеют высокие производительные мощности. Загрузить одну машину запросами — это весьма сложная задача. Это значит, что виртуальные хосты помогают правильно управлять нагрузкой на оборудование.
Зависимости виртуальных хостов
Виртуальные хосты могут быть «IP-based (стр. 123)», что означает, что у вас есть другой IP-адрес для каждого веб-сайта или «name-based» (основанный на имени (стр. 120))», что означает, что у вас есть несколько имен, запущенных на каждом IP-адресе адрес. Тот факт, что они работают на одном и том же физическом сервере, не является очевидным для конечного пользователя.
Apache был одним из первых серверов для поддержки виртуальных хостов на базе IP прямо из коробки. Версии 1.1 и более поздние версии Apache поддерживают как виртуальные хосты на основе IP, так и имена (vhosts). Последний вариант виртуальных хостов иногда также называют host-based virtual hosts (на основе хоста) или non-IP virtual hosts (не IP).
Ниже приведен список страниц документации, в которых объясняются все детали поддержки виртуального хоста в Apache HTTP Server:
- MOD_VHOST_ALIAS
- Name-based virtual hosts (p. 120)
- IP-based virtual hosts (p. 123)
- Virtual host examples (p. 129)
- File descriptor limits (p. 139)
- Mass virtual hosting (p. 125)
- Details of host matching (p. 136)
Поддержка виртуального хоста
- Name-based Virtual Hosts (p. 120) (Более одного веб-сайта на IP-адрес)
- IP-based Virtual Hosts (p. 123) (IP-адрес для каждого веб-сайта)
- Virtual Host examples for common setups (p. 129) (Примеры виртуального хоста для общих настроек)
- File Descriptor Limits (p. 139) (или, слишком много файлов журнала)
- Dynamically Configured Mass Virtual Hosting (p. 125) (Динамически настроенный массовый виртуальный хостинг)
- In-Depth Discussion of Virtual Host Matching (p. 136) (Глубокое обсуждение соответствия виртуального хоста)
Конфигурационные директивы
- <VIRTUALHOST>
- SERVERNAME
- SERVERALIAS
- SERVERPATH
Если вы пытаетесь отладить конфигурацию своего виртуального хоста, вы можете найти ключ командной строки -S полезным.
Пример на Unix системах:
apachectl -S
Пример на Windows системах:
httpd.exe -S
Эта команда выведет описание того, как Apache проанализировал файл конфигурации. Тщательное изучение IP-адресов и имен серверов может помочь выявить ошибки конфигурации. (См. Документы для программы httpd для других параметров командной строки)
Поддержка виртуального хоста на основе имени
В этом документе описывается, когда и как использовать виртуальные хосты на основе имен.
Виртуальные хосты на основе имен и виртуальных хостов на базе IP
Виртуальные хосты на базе IP (стр. 123) используют IP-адрес соединения для определения правильного виртуального хоста для обслуживания. Поэтому вам нужно иметь отдельный IP-адрес для каждого хоста.
При использовании виртуального хостинга на основе имени сервер полагается на клиенту, чтобы сообщить имя хоста как часть заголовков HTTP. Используя этот метод, многие разные хосты могут использовать один и тот же IP-адрес.
Виртуальный хостинг на основе имени обычно проще, так как вам нужно настроить ваш DNS-сервер для сопоставления каждого имени хоста с правильным IP-адресом, а затем настроить HTTP-сервер Apache для распознавания разных имен хостов. Виртуальный хостинг на основе имени также снижает потребность в ограниченных IP-адресах. Поэтому вы должны использовать виртуальный хостинг на основе имени, если вы не используете оборудование, которое явно требует хостинг на основе IP. Исторические причины виртуального хостинга на основе IP на основе поддержки клиентов больше не применимы к универсальному веб-серверу.
Виртуальный хостинг на основе имени основывается на алгоритме выбора виртуального хоста на основе IP, что означает, что поиск правильного имени сервера происходит только между виртуальными хостами, которые имеют лучший IP-адрес.
Как сервер выбирает собственный виртуальный хост на основе имени?
Важно признать, что первый шаг в разрешении виртуального хоста на основе имен — это разрешение на основе IP. Разрешение виртуального хоста на основе имени выбирает наиболее подходящий виртуальный хост на основе имени после сужения кандидатов на лучшее соответствие на основе IP. Использование подстановочного знака (*) для IP-адреса во всех директивах VirtualHost делает это отображение на основе IP неактуальным.
Когда запрос поступит, сервер найдет лучший (наиболее конкретный) соответствующий <VIRTUALHOST> аргумент на основе IP-адреса и порта, используемого в запросе. Если имеется более одного виртуального хоста, содержащего этот адрес наилучшего соответствия и комбинации портов, Apache будет дополнительно сравнивать директивы SERVERNAME и SERVERALIAS с именем сервера, присутствующим в запросе.
Если вы укажете директиву SERVERNAME с любого виртуального хоста на основе имени, сервер по умолчанию будет иметь полное доменное имя (FQDN), полученное из системного имени хоста. Это неявное задание имени сервера может привести к встречному интуитивному сопоставлению виртуального хоста и не рекомендуется.
По умолчанию именуемый vhost для комбинации IP и портов
Если в наборе виртуальных хостов, содержащих наиболее подходящий IP-адрес и комбинацию портов, не найдено ни одного соответствующего имени сервера или 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>
Вы также можете указать явный IP-адрес вместо директив * в <VIRTUALHOST>. Например, вы можете сделать это, чтобы запустить некоторые виртуальные хосты на основе имени на одном 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>. Большинство директив могут быть помещены в эти контейнеры и затем будут изменять конфигурацию только соответствующего виртуального хоста. Чтобы узнать, разрешена ли какая-либо конкретная директива, проверьте контекст (стр. 369) этой директивы. Директивы конфигурации, установленные в main server context (вне любого контейнера <VIRTUALHOST>), будут использоваться только в том случае, если они не переопределены параметрами виртуального хоста.