Spec-Zone.ru › Apache HTTP Server

Динамически настроенные виртуальные хосты

Этот документ описывает, как эффективно обслуживать произвольное количество виртуальных хостов с помощью сервера Apache HTTP. В отдельном документе рассматривается использование mod_rewrite для создания динамических виртуальных хостов.

Мотивация

Эти техники представляют интерес, если ваш httpd.conf содержит много <VirtualHost> разделов, которые существенно одинаковы, например:

<VirtualHost 111.22.33.44>
    ServerName                 customer-1.example.com
    DocumentRoot        "/www/hosts/customer-1.example.com/docs"
    ScriptAlias  "/cgi-bin/"  "/www/hosts/customer-1.example.com/cgi-bin"
</VirtualHost>

<VirtualHost 111.22.33.44>
    ServerName                 customer-2.example.com
    DocumentRoot        "/www/hosts/customer-2.example.com/docs"
    ScriptAlias  "/cgi-bin/"  "/www/hosts/customer-2.example.com/cgi-bin"
</VirtualHost>

<VirtualHost 111.22.33.44>
    ServerName                 customer-N.example.com
    DocumentRoot        "/www/hosts/customer-N.example.com/docs"
    ScriptAlias  "/cgi-bin/"  "/www/hosts/customer-N.example.com/cgi-bin"
</VirtualHost>

Мы хотим заменить эти несколько <VirtualHost> блоков механизмом, который вычисляет их динамически. Это имеет ряд преимуществ:

  1. Ваш файл конфигурации меньше, поэтому Apache запускается быстрее и использует меньше памяти. Возможно, что еще важнее, меньшая конфигурация проще в обслуживании и оставляет меньше места для ошибок.
  2. Добавление виртуальных хостов — это просто вопрос создания соответствующих каталогов в файловой системе и записей в DNS — вам не нужно переконфигурировать или перезапускать Apache.

Основной недостаток заключается в том, что у каждого виртуального хоста не может быть отдельного файла логов; однако, если у вас много виртуальных хостов, делать это может быть плохой идеей, из-за количества дескрипторов файлов, необходимых. Лучше записывать в канал или fifo, и организовать процесс на другом конце, чтобы разделить файлы логов на один файл на виртуальный хост. Один пример такого процесса можно найти в утилите split-logfile.

Обзор

Виртуальный хост определяется двумя фрагментами информации: его IP-адресом и содержимым заголовка Host: в запросе HTTP. Применяемая здесь динамическая техника массовых виртуальных хостов основана на автоматическом вставке этой информации в имя пути файла, используемого для удовлетворения запроса. Это можно наиболее просто сделать, используя mod_vhost_alias с Apache httpd. В качестве альтернативы, можно использовать mod_rewrite.

Оба этих модуля отключены по умолчанию; вам необходимо включить один из них при конфигурации и сборке Apache httpd, если вы хотите использовать эту технику.

Необходимо определить несколько вещей из запроса, чтобы сделать динамический виртуальный хост похожим на обычный. Самое важное — имя сервера, которое используется сервером для генерации самоссылочных URL-адресов и т. д. Оно настраивается с помощью директивы ServerName, и доступно CGI-скриптам через переменную среды SERVER_NAME. Фактическое значение, используемое во время выполнения, контролируется параметром UseCanonicalName. С UseCanonicalName Off, имя сервера берется из содержимого заголовка Host: в запросе. С UseCanonicalName DNS, оно берется из обратного поиска DNS IP-адреса виртуального хоста. Первый параметр используется для динамического виртуального хостинга на основе имени, а второй — для хостинга на основе IP-адреса. Если httpd не может определить имя сервера, поскольку нет заголовка Host:, или поиск DNS не удается, используется значение, настроенное с помощью ServerName.

Другая вещь, которую нужно определить, это корневой каталог документа (настроенный с помощью DocumentRoot и доступный CGI-скриптам через переменную среды DOCUMENT_ROOT). В обычной конфигурации это используется основным модулем при сопоставлении URI с именами файлов, но когда сервер настроен на динамический виртуальный хостинг, эту задачу должен выполнить другой модуль (либо mod_vhost_alias или mod_rewrite), который имеет другой способ выполнения сопоставления. Ни один из этих модулей не отвечает за установку переменной среды DOCUMENT_ROOT, поэтому, если какие-либо CGI или SSI документы используют её, они получат вводящее в заблуждение значение.

Динамические виртуальные хосты с mod_vhost_alias

Этот фрагмент из httpd.conf реализует схему виртуальных хостов, описанную в разделе Мотивация, с использованием mod_vhost_alias.

# get the server name from the Host: header
UseCanonicalName Off

# this log format can be split per-virtual-host based on the first field
# using the split-logfile utility.
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog "logs/access_log" vcommon

# include the server name in the filenames used to satisfy requests
VirtualDocumentRoot "/www/hosts/%0/docs"
VirtualScriptAlias  "/www/hosts/%0/cgi-bin"

Эта конфигурация может быть преобразована в решение виртуального хостинга на основе IP-адреса, просто изменив UseCanonicalName Off на UseCanonicalName DNS. Имя сервера, которое вставляется в имя файла, затем выводится из IP-адреса виртуального хоста. Переменная %0 ссылается на запрашиваемое имя сервера, как указано в заголовке Host:.

См. документацию mod_vhost_alias для получения дополнительных примеров использования.

Упрощенные динамические виртуальные хосты

Это изменение вышеупомянутой системы, адаптированное для веб-сервера провайдера хостинга. Используя %2, мы можем выбрать подстроки имени сервера, чтобы использовать их в имени файла, чтобы, например, документы для www.user.example.com находились в /home/user/www. Используется один каталог cgi-bin вместо одного на виртуальный хост.

UseCanonicalName Off

LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog "logs/access_log" vcommon

# include part of the server name in the filenames
VirtualDocumentRoot "/home/%2/www"

# single cgi-bin directory
ScriptAlias  "/cgi-bin/"  "/www/std-cgi/"

Примеры более сложных настроек VirtualDocumentRoot содержатся в документации mod_vhost_alias.

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

В более сложных конфигурациях можно использовать обычные директивы httpd <VirtualHost> для управления областью действия различных конфигураций виртуального хостинга. Например, можно использовать один IP-адрес для домашней страницы обычных клиентов и другой для коммерческих клиентов с настройкой, показанной ниже. Это можно комбинировать с обычными секциями конфигурации <VirtualHost>, как показано ниже.

UseCanonicalName Off

LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon

<Directory "/www/commercial">
    Options FollowSymLinks
    AllowOverride All
</Directory>

<Directory "/www/homepages">
    Options FollowSymLinks
    AllowOverride None
</Directory>

<VirtualHost 111.22.33.44>
    ServerName www.commercial.example.com

    CustomLog "logs/access_log.commercial" vcommon

    VirtualDocumentRoot "/www/commercial/%0/docs"
    VirtualScriptAlias  "/www/commercial/%0/cgi-bin"
</VirtualHost>

<VirtualHost 111.22.33.45>
    ServerName www.homepages.example.com

    CustomLog "logs/access_log.homepages" vcommon

    VirtualDocumentRoot "/www/homepages/%0/docs"
    ScriptAlias         "/cgi-bin/" "/www/std-cgi/"
</VirtualHost>

Примечание

Если первый блок VirtualHost не содержит директивы ServerName, вместо этого будет использоваться обратный DNS соответствующего IP-адреса. Если это не то имя сервера, которое вы хотите использовать, можно добавить подставную запись (например, ServerName none.example.com), чтобы обойти это поведение.

Более эффективная виртуальный хостинг на основе IP

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

# get the server name from the reverse DNS of the IP address
UseCanonicalName DNS

# include the IP address in the logs so they may be split
LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon
CustomLog "logs/access_log" vcommon

# include the IP address in the filenames
VirtualDocumentRootIP "/www/hosts/%0/docs"
VirtualScriptAliasIP  "/www/hosts/%0/cgi-bin"

Массовые виртуальные хосты с mod_rewrite

Массовый виртуальный хостинг также может быть реализован с помощью mod_rewrite, используя простые директивы RewriteRule или более сложные техники, такие как хранение определений vhost вне и доступ к ним через RewriteMap. Эти техники обсуждаются в документации по переписыванию.

Массовые виртуальные хосты с mod_macro

Ещё один вариант для динамически генерируемых виртуальных хостов — mod_macro, с помощью которого вы можете создать шаблон виртуального хоста и вызвать его для нескольких имён хостов. Пример этого приведён в разделе Использование документации модуля.

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

Spec-Zone.ru

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