Spec-Zone.ru › Apache HTTP Server

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

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

Запуск нескольких веб-сайтов на основе имени на одном IP-адресе.

Ваш сервер имеет несколько имен хостов, которые разрешаются на один адрес, и вы хотите по-разному реагировать на www.example.com и www.example.org.

Примечание

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

# Ensure that Apache listens on port 80
Listen 80
<VirtualHost *:80>
    DocumentRoot "/www/example1"
    ServerName www.example.com

    # Other directives here
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/www/example2"
    ServerName www.example.org

    # Other directives here
</VirtualHost>

Звездочки соответствуют всем адресам, поэтому основной сервер не обрабатывает запросы. Поскольку виртуальный хост с ServerName www.example.com стоит первым в файле конфигурации, он имеет наивысший приоритет и может рассматриваться как по умолчанию или первичный сервер. Это означает, что если получен запрос, который не соответствует одному из указанных ServerName директив, он будет обработаться этим первым <VirtualHost>.

Вышеприведенная конфигурация — то, что вам нужно использовать практически во всех ситуациях с виртуальными хостами на основе имени. Фактически, эта конфигурация не будет работать только тогда, когда вы предоставляете различное содержимое на основе различных IP-адресов или портов.

Примечание

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

Однако полезно использовать * на системах, где IP-адрес непредсказуем — например, если у вас динамический IP-адрес от вашего интернет-провайдера, и вы используете какой-либо вид решения динамического DNS. Поскольку * соответствует любому IP-адресу, эта конфигурация будет работать без изменений при изменении вашего IP-адреса.

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

Примечание

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

Сервер имеет два IP-адреса. На одном (172.20.30.40), мы будем обслуживать "главный" сервер, server.example.com, а на другом (172.20.30.50), мы будем обслуживать два или более виртуальных хостов.

Listen 80

# This is the "main" server running on 172.20.30.40
ServerName server.example.com
DocumentRoot "/www/mainserver"

<VirtualHost 172.20.30.50>
    DocumentRoot "/www/example1"
    ServerName www.example.com

    # Other directives here ...
</VirtualHost>

<VirtualHost 172.20.30.50>
    DocumentRoot "/www/example2"
    ServerName www.example.org

    # Other directives here ...
</VirtualHost>

Любой запрос на адрес, отличный от 172.20.30.50, будет обрабатываться с главного сервера. Запрос на 172.20.30.50 с неизвестным именем хоста или без заголовка Host: будет обрабатываться с www.example.com.

Предоставление одинакового содержимого на разных IP-адресах (например, внутреннего и внешнего адреса).

Серверная машина имеет два IP-адреса (192.168.1.1 и 172.20.30.40). Машина находится между внутренней (интранет) сетью и внешней (интернет) сетью. Внешняя сеть имя server.example.com разрешается на внешний адрес (172.20.30.40), а внутри сети это же имя разрешается на внутренний адрес (192.168.1.1).

Сервер может отвечать на внутренние и внешние запросы с тем же содержимым, используя только один раздел <VirtualHost>.

<VirtualHost 192.168.1.1 172.20.30.40>
    DocumentRoot "/www/server1"
    ServerName server.example.com
    ServerAlias server
</VirtualHost>

Теперь запросы из обеих сетей будут обрабатываться с того же <VirtualHost>.

Примечание:

Внутри сети можно просто использовать имя server вместо полное имени хоста server.example.com.

Обратите также внимание, что в приведенном примере можно заменить список IP-адресов на *, что заставит сервер отвечать одинаково на всех адресах.

Запуск разных сайтов на разных портах.

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

Listen 80
Listen 8080

<VirtualHost 172.20.30.40:80>
    ServerName www.example.com
    DocumentRoot "/www/domain-80"
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
    ServerName www.example.com
    DocumentRoot "/www/domain-8080"
</VirtualHost>

<VirtualHost 172.20.30.40:80>
    ServerName www.example.org
    DocumentRoot "/www/otherdomain-80"
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
    ServerName www.example.org
    DocumentRoot "/www/otherdomain-8080"
</VirtualHost>

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

Сервер имеет два IP-адреса (172.20.30.40 и 172.20.30.50) которые разрешаются на имена www.example.com и www.example.org соответственно.

Listen 80

<VirtualHost 172.20.30.40>
    DocumentRoot "/www/example1"
    ServerName www.example.com
</VirtualHost>

<VirtualHost 172.20.30.50>
    DocumentRoot "/www/example2"
    ServerName www.example.org
</VirtualHost>

Запросы на любой адрес, не указанный в одной из <VirtualHost> директив (например, localhost), попадут на главный сервер, если он есть.

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

Серверная машина имеет два IP-адреса (172.20.30.40 и 172.20.30.50) которые разрешаются на имена www.example.com и www.example.org соответственно. В каждом случае мы хотим запустить хосты на портах 80 и 8080.

Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080

<VirtualHost 172.20.30.40:80>
    DocumentRoot "/www/example1-80"
    ServerName www.example.com
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
    DocumentRoot "/www/example1-8080"
    ServerName www.example.com
</VirtualHost>

<VirtualHost 172.20.30.50:80>
    DocumentRoot "/www/example2-80"
    ServerName www.example.org
</VirtualHost>

<VirtualHost 172.20.30.50:8080>
    DocumentRoot "/www/example2-8080"
    ServerName www.example.org
</VirtualHost>

Смешанные виртуальные хосты на основе имени и IP

Любой адрес, упомянутый в аргументе virtualhost, который никогда не появляется в другом виртуальном хосте, является строго виртуальным хостом на основе IP.

Listen 80
<VirtualHost 172.20.30.40>
    DocumentRoot "/www/example1"
    ServerName www.example.com
</VirtualHost>

<VirtualHost 172.20.30.40>
    DocumentRoot "/www/example2"
    ServerName www.example.org
</VirtualHost>

<VirtualHost 172.20.30.40>
    DocumentRoot "/www/example3"
    ServerName www.example.net
</VirtualHost>

# IP-based
<VirtualHost 172.20.30.50>
    DocumentRoot "/www/example4"
    ServerName www.example.edu
</VirtualHost>

<VirtualHost 172.20.30.60>
    DocumentRoot "/www/example5"
    ServerName www.example.gov
</VirtualHost>

Использование Virtual_host и mod_proxy вместе

Следующий пример позволяет переднему узлу проксировать виртуальный хост на сервер, работающий на другой машине. В примере виртуальный хост с таким же именем настроен на машине по адресу 192.168.111.2. Директива ProxyPreserveHost On используется для того, чтобы желаемое имя хоста передавалось, в случае, если мы проксируем несколько имен хостов на одну машину.

<VirtualHost *:*>
    ProxyPreserveHost On
    ProxyPass        "/" "http://192.168.111.2/"
    ProxyPassReverse "/" "http://192.168.111.2/"
    ServerName hostname.example.com
</VirtualHost>

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

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

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

<VirtualHost _default_:*>
    DocumentRoot "/www/default"
</VirtualHost>

Использование такого виртуального хоста по умолчанию с подстановочным знаком порта фактически предотвращает любые запросы к главному серверу.

Виртуальный хост по умолчанию никогда не обрабатывает запрос, отправленный на адрес/порт, используемый для виртуальных хостов на основе имени. Если запрос содержал неизвестный или отсутствующий заголовок Host:, он всегда обрабатывается с первичного виртуального хоста на основе имени (виртуального хоста для этого адреса/порта, появляющегося первым в файле конфигурации).

Можно использовать AliasMatch или RewriteRule для перенаправления любого запроса на отдельную информационную страницу (или скрипт).

_default_ виртуальные хосты для разных портов

То же, что и в настройке 1, но сервер прослушивает на нескольких портах, и мы хотим использовать второй виртуальный хост по умолчанию для порта 80.

<VirtualHost _default_:80>
    DocumentRoot "/www/default80"
    # ...
</VirtualHost>

<VirtualHost _default_:*>
    DocumentRoot "/www/default"
    # ...
</VirtualHost>

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

_default_ виртуальные хосты для одного порта

Мы хотим иметь виртуальный хост по умолчанию для порта 80, но не других виртуальных хостов по умолчанию.

<VirtualHost _default_:80>
    DocumentRoot "/www/default"
...
</VirtualHost>

Запрос на неопределенный адрес на порту 80 обрабатывается с виртуального хоста по умолчанию. Любой другой запрос на неопределенный адрес и порт обрабатывается с главного сервера.

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

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

Виртуальный хост на основе имени с именем хоста www.example.org (из нашего примера на основе имени, настройка 2) должен получить собственный IP-адрес. Чтобы избежать проблем с серверами имен или прокси, которые кэшировали старый IP-адрес для виртуального хоста на основе имени, мы хотим предоставить оба варианта во время фазы миграции.

Решение простое, так как мы можем просто добавить новый IP-адрес (172.20.30.50) к директиве VirtualHost.

Listen 80
ServerName www.example.com
DocumentRoot "/www/example1"

<VirtualHost 172.20.30.40 172.20.30.50>
    DocumentRoot "/www/example2"
    ServerName www.example.org
    # ...
</VirtualHost>

<VirtualHost 172.20.30.40>
    DocumentRoot "/www/example3"
    ServerName www.example.net
    ServerAlias *.example.net
    # ...
</VirtualHost>

Теперь к виртуальному хосту можно получить доступ по новому адресу (как виртуальному хосту на основе IP) и по старому адресу (как виртуальному хосту на основе имени).

Использование директивы ServerPath

У нас есть сервер с двумя виртуальными хостами на основе имени. Для соответствия правильному виртуальному хосту клиент должен отправить правильный заголовок Host:. Старые клиенты HTTP/1.0 не отправляют такого заголовка, и Apache не знает, к какому виртуальному хосту клиент пытался подключиться (и обрабатывает запрос с первичного виртуального хоста). Чтобы обеспечить максимальную обратную совместимость, мы создаем первичный виртуальный хост, который возвращает одну страницу с ссылками с префиксом URL к виртуальным хостам на основе имени.

<VirtualHost 172.20.30.40>
    # primary vhost
    DocumentRoot "/www/subdomain"
    RewriteEngine On
    RewriteRule "." "/www/subdomain/index.html"
    # ...
</VirtualHost>

<VirtualHost 172.20.30.40>
    DocumentRoot "/www/subdomain/sub1"
    ServerName www.sub1.domain.tld
    ServerPath "/sub1/"
    RewriteEngine On
    RewriteRule "^(/sub1/.*)" "/www/subdomain$1"
    # ...
</VirtualHost>

<VirtualHost 172.20.30.40>
    DocumentRoot "/www/subdomain/sub2"
    ServerName www.sub2.domain.tld
    ServerPath "/sub2/"
    RewriteEngine On
    RewriteRule "^(/sub2/.*)" "/www/subdomain$1"
    # ...
</VirtualHost>

Благодаря директиве ServerPath запрос к URL http://www.sub1.domain.tld/sub1/ всегда обрабатывается с подхоста sub1.
Запрос к URL http://www.sub1.domain.tld/ обрабатывается с подхоста sub1 только если клиент отправил правильный заголовок Host:. Если заголовок Host: не отправлен, клиент получает страницу информации с первичного хоста.

Обратите внимание на одну особенность: запрос к http://www.sub2.domain.tld/sub1/ также обрабатывается с подхоста sub1, если клиент не отправил заголовок Host:.

Директивы RewriteRule используются для того, чтобы клиент, который отправил правильный заголовок Host: мог использовать оба варианта URL, т. е., с префиксом URL или без него.

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

Spec-Zone.ru

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