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  

Пункт 30. Динамически настраиваемый массовый виртуальный хостинг

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

Мотивация

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

 <Виртуальный хост 111.22.33.44>
 имя_сервера customer-1.example.com
 DocumentRoot "/www/hosts/customer-1.example.com/docs"
 ScriptAlias "/cgi-bin/" "/www/hosts/customer-1.example.com/cgi-bin"
</ виртуальный хост>
<Виртуальный хост 111.22.33.44>
 имя_сервера customer-2.example.com
 DocumentRoot "/www/hosts/customer-2.example.com/docs"
 ScriptAlias "/cgi-bin/" "/www/hosts/customer-2.example.com/cgi-bin"
</ виртуальный хост>
<Виртуальный хост 111.22.33.44>
 Имя_сервера клиент-N.example.com
 DocumentRoot "/www/hosts/customer-N.example.com/docs"
 ScriptAlias "/cgi-bin/" "/www/hosts/customer-N.example.com/cgi-bin"
</ виртуальный хост> 

Мы хотим заменить эти несколько <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 не может определить имя сервера из-за отсутствия заголовка или сбоя поиска DNS, вместо этого используется Host: значение, настроенное с помощью . ServerName

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

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

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

 # получить имя сервера из заголовка Host:
UseCanonicalName Выкл.
# этот формат журнала может быть разделен для каждого виртуального хоста на основе первого поля
# с помощью утилиты split-logfile.
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog "logs/access_log" vcommon
# включить имя сервера в имена файлов, используемых для удовлетворения запросов
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 Выкл.
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
Журналы CustomLog/access_log vcommon
# включить часть имени сервера в имена файлов
VirtualDocumentRoot "/home/%2/www"
# один каталог cgi-bin
ScriptAlias "/cgi-bin/" "/www/std-cgi/" 

VirtualDocumentRoot В документации есть примеры более сложных настроек mod_vhost_alias .

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

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

 UseCanonicalName Выкл.
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
<Каталог "/www/commercial">
 Параметры
 Разрешить переопределить все
</Каталог>
<Каталог "/www/homepages">
 Параметры
 Аллововеррайд
</Каталог>
<Виртуальный хост 111.22.33.44>
 Имя сервера www.commercial.example.com
 
 CustomLog "logs/access_log.commercial" vcommon
 
 VirtualDocumentRoot "/www/commercial/%0/docs"
 VirtualScriptAlias "/www/commercial/%0/cgi-bin"
</ виртуальный хост>
<Виртуальный хост 111.22.33.45>
 Имя сервера www.homepages.example.com
 
 CustomLog "logs/access_log.homepages" vcommon
 
 VirtualDocumentRoot "/www/homepages/%0/docs"
 ScriptAlias "/cgi-bin/" "/www/std-cgi/"
</ виртуальный хост> 

Примечание

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

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

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

 # получить имя сервера из обратного DNS IP-адреса
UseCanonicalName DNS
# включить IP-адрес в журналы, чтобы они могли быть разделены
LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon
CustomLog "logs/access_log" vcommon
# включить IP-адрес в имена файлов
VirtualDocumentRootIP "/www/hosts/%0/docs"
VirtualScriptAliasIP "/www/hosts/%0/cgi-bin" 

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

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



 <         > 

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

Рейтинг@Mail.ru