Apache HTTP Server — VirtualHost Examples Этот документ пытается ответить на часто задаваемые вопросы о настройке виртуальных хостов.
Этот документ пытается ответить на часто задаваемые вопросы о настройке виртуальных хостов . Эти сценарии включают несколько веб-сайтов, работающих на одном сервере через виртуальные хосты на основе имен или IP .
Запуск нескольких сайтов с именами на одном IP-адресе.
Ваш сервер имеет несколько имен хостов, которые разрешаются по одному адресу, и вы хотите по-разному отвечать для www.example.com
и www.example.org
.
Note
Создание конфигураций виртуальных хостов на вашем сервере Apache магическим образом не приводит к созданию записей DNS для этих имен хостов. У вас должны быть имена в DNS, разрешающие ваш IP-адрес, иначе никто не сможет увидеть ваш веб-сайт. Вы можете поместить записи в ваш файл hosts
для локального тестирования, но это будет работать только с компьютера с этими записями hosts
.
# Убедитесь, что Apache прослушивает порт 80 Listen 80 <VirtualHost *:80> DocumentRoot "/www/example1" ServerName www.example.com # Другие директивы здесь </VirtualHost> <VirtualHost *:80> DocumentRoot "/www/example2" ServerName www.example.org # Другие директивы здесь </VirtualHost>
Звездочки соответствуют всем адресам, поэтому главный сервер не обслуживает запросы. В связи с тем, что виртуальный хост с ServerName www.example.com
находится первым в файле конфигурации, он имеет самый высокий приоритет и может рассматриваться какdefaultorprimaryсервер. Это означает, что если получен запрос, который не соответствует одной из указанных директив ServerName
, он будет обслуживаться этим первым <VirtualHost>
.
Вышеуказанная конфигурация-это то,что вы захотите использовать практически во всех ситуациях виртуального хостинга на основе имен.Единственное,на что эта конфигурация не будет работать,на самом деле,это когда вы обслуживаете различный контент,основанный на разных IP-адресах или портах.
Note
Вы можете заменить *
конкретным IP-адресом в системе. Такие виртуальные хосты будут использоваться только для HTTP-запросов, полученных при подключении к указанному IP-адресу.
Однако дополнительно полезно использовать *
в системах, где IP-адрес непредсказуем — например, если у вас есть динамический IP-адрес с вашим Интернет-провайдером, и вы используете какое-то множество динамических DNS-решений. Поскольку *
соответствует любому IP-адресу, эта конфигурация будет работать без изменений при каждом изменении вашего IP-адреса.
Хосты,основанные на именах,на нескольких IP-адресах.
Note
Любая из рассмотренных здесь методик может быть расширена на любое количество IP-адресов.
Сервер имеет два IP-адреса. На одном ( 172.20.30.40
) мы будем обслуживать «основной» сервер server.example.com
, а на другом ( 172.20.30.50
) мы будем обслуживать два или более виртуальных хоста.
Listen 80 # Это "основной" сервер, работающий на 172.20.30.40 ServerName server.example.com DocumentRoot "/www/mainserver" <VirtualHost 172.20.30.50> DocumentRoot "/www/example1" ServerName www.example.com # Остальные директивы здесь ... </VirtualHost> <VirtualHost 172.20.30.50> DocumentRoot "/www/example2" ServerName www.example.org # Остальные директивы здесь ... </VirtualHost>
Любой запрос по адресу, отличному от 172.20.30.50
, будет обслуживаться с главного сервера. Запрос к 172.20.30.50
с неизвестным именем хоста или без заголовка Host:
будет отправлен с www.example.com
.
Серверный компьютер имеет два 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>
.
Note:
Во внутренней сети можно просто использовать 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-адресах
Любой адрес,упомянутый в аргументе виртуальному хосту,который никогда не появляется на другом виртуальном хосте,является строго 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
использование 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_
vhosts_default_
vhosts для всех портовПерехват каждого запроса на любой неуказанный IP-адрес и порт, т. Е. Комбинацию адрес / порт, которая не используется ни для какого другого виртуального хоста.
<VirtualHost _default_:*> DocumentRoot "/www/default" </VirtualHost>
Использование такого флага по умолчанию с подстановочным портом эффективно предотвращает любой запрос,поступающий к основному серверу.
Vhost по умолчанию никогда не обслуживает запрос, отправленный на адрес / порт, который используется для vhosts на основе имени. Если запрос содержал неизвестный заголовок Host:
или его отсутствовал, он всегда обслуживался от основного vhost на основе имени (vhost для этого адреса / порта появлялся первым в файле конфигурации).
Вы можете использовать AliasMatch
или RewriteRule
, чтобы переписать любой запрос на одну информационную страницу (или скрипт).
_default_
vhosts для разных портовТо же, что и в настройке 1, но сервер прослушивает несколько портов, и мы хотим использовать второй _default_
vhost для порта 80.
<VirtualHost _default_:80> DocumentRoot "/www/default80" # ... </VirtualHost> <VirtualHost _default_:*> DocumentRoot "/www/default" # ... </VirtualHost>
Vhost по умолчанию для порта 80 (который должен появляться перед любым vhost по умолчанию с подстановочным портом) перехватывает все запросы, которые были отправлены на неуказанный IP-адрес. Главный сервер никогда не используется для обслуживания запроса.
_default_
vhosts для одного портаМы хотим иметь фрост по умолчанию для порта 80,но никаких других фрост по умолчанию.
<VirtualHost _default_:80> DocumentRoot "/www/default" ... </VirtualHost>
Запрос на неопределенный адрес на порту 80 обслуживается из vhost по умолчанию.Любой другой запрос на неопределенный адрес и порт обслуживается с основного сервера.
Любое использование *
в объявлении виртуального хоста будет иметь более высокий приоритет, чем _default_
.
Миграция фантома,основанного на имени,на фантома,основанного на IP.
Основанный на имени www.example.org
с именем хоста 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
У нас есть сервер с двумя именами vhosts. Чтобы соответствовать правильному виртуальному хосту, клиент должен отправить правильный заголовок Host:
. Старые клиенты HTTP / 1.0 не отправляют такой заголовок, и Apache не имеет ни малейшего представления о том, к какому vhost клиент попытался обратиться (и обслуживает запрос от основного vhost). Чтобы обеспечить как можно большую обратную совместимость, мы создаем основной vhost, который возвращает одну страницу, содержащую ссылки с префиксом URL, на виртуальные хосты на основе имен. (/sub2/.*)» «/www/subdomain$1»
# …
</VirtualHost>
В соответствии с директивой ServerPath
запрос к URL-адресу http://www.sub1.domain.tld/sub1/
всегда обслуживается с sub1-vhost.
Запрос к URL-адресу http://www.sub1.domain.tld/
подается только от sub1-vhost, если клиент отправил правильный заголовок Host:
. Если заголовок Host:
не отправлен, клиент получает информационную страницу от основного хоста.
Обратите внимание, что есть одна странность: запрос к http://www.sub2.domain.tld/sub1/
также подается от sub1-vhost, если клиент не отправил заголовок Host:
.
Директивы RewriteRule
используются, чтобы гарантировать, что клиент, отправивший правильный заголовок Host:
, может использовать оба варианта URL, т . е . с префиксом URL или без него.
- 1
- …
- 284
- 285
- 286
- 287
- 288
- …
- 291
- Next
Пределы описания файлов
Apache: примеры создания VirtualHost
Apache: примеры создания VirtualHostЧто такое VirtualHost можно почитать на Wiki.
Все примеры приведены в системе FreeBSD 8.2 и Apache 2.2, но подойдут для любой другой ОС (учтите только другие пути к файлам конфигурации).
В статье не будут рассмотрены вопросы создания и настройки доменов и субдоменов на DNS – это совсем другая тема. Если вы не используете свой собственный DNS и не знаете как настроить домен – проще всего воспользоваться этой>>> ссылкой или спросить совета у вашего регистратора доменного имени.
Для примеров используются следующие данные:
2 IP-адреса:
77.120.106.40
77.120.106.52
2 домена и 1 субдомен:
it-news.in.ua
website.co.ua
vhost1.website.co.ua
Для простоты, все пути к служебным каталогам остаются по-умолчанию, т.е. такими, какие они были после установки Apache:
ServerRoot “/usr/local”
DocumentRoot “/usr/local/www/apache22/data”
Если планируется создание только одного VirtualHost-а, то все записи можно производить прямо в файле /usr/local/etc/apache22/httpd. conf. Но правильнее будет все настройки виртуалов хранить в файле
/usr/local/etc/apache22/httpd-vhosts.conf
. Для этого, в конце файла /usr/local/etc/apache22/httpd.conf раскомментируйте строку:
#Virtual hosts
#Include etc/apache22/extra/httpd-vhosts.conf
Содержание
Запуск нескольких name-based виртуалов на одном IP-адресе
#Укажем Apache слушать порт 80
Listen 80
#Слушать запросы к виртуалам на всех IP-адресах:
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot www/apache22/data/website.co.ua
ServerName www.example.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot www/apache22/data/it-news.in.ua
ServerName www.example.org
</VirtualHost>
В этом примере website.co.ua находится первым в списке виртуалхостов, поэтому в случае, если к серверу придет запрос без определённого ServerName, то будет показано содержимое website.co.ua.
Если вы хотите, то можно указать реальный IP-адрес сервера, в таком случае параметр VirtualHost должен совпадать с NameVirtualHost:
NameVirtualHost 77.120.106.40
<VirtualHost 77.120.106.40:80>
…
</VirtualHost>
Но, как правило, используется параметр *, обозначающий любой IP-адрес. Это полезно, например, если вы используете услугу типа No-Ip, позволяющую привязать динамический IP-адрес к домену.
Name-based хосты на сервере с несколькими IP-адресами
У сервера есть два IP-адреса: 77.120.106.40 и 77.120.106.52. Запустим 1 “главный” сайт, и несколько “вторичных”:
Listen 80
# Это “главный” сайт, работающий на IP-адресе 77.120.106.40
ServerName website.co.ua
DocumentRoot www/apache22/data/website.co.ua
# А это “вторичные” сайты:
NameVirtualHost 172.20.30.50
<VirtualHost 77.120.106.52>
DocumentRoot www/apache22/data/vhost1. website.co.ua
ServerName vhost1.website.co.ua
</VirtualHost>
<VirtualHost 77.120.106.52>
DocumentRoot www/apache22/data/it-news.in.ua
ServerName it-news.in.ua
</VirtualHost>
Все запросы на адреса, отличные от 77.120.106.52 будут переданы “главному” сайту. Все запросы к 77.120.106.52 с неуказанным HostName будут переданы к website.co.ua.
Обслуживание одного виртуала по разным IP-адресам (например, локальной и внешней сети)
У сервера есть две сети с двумя разными адресами – 77.120.106.40 (внешняя сеть) и 192.168.0.1 (внутренняя сеть). Из мира адрес website.co.ua направлен на 77.120.106.40, а изнутри имя server направлено на 192.168.0.1. По обоим запросам, как из внешней сети, так и из внутренней, сервер будет выдавать содержимое одного и того же виртуалхоста:
NameVirtualHost 192.168.0.1
NameVirtualHost 77.120.106.40
<VirtualHost 192. 168.0.1 77.120.106.40>
DocumentRoot www/apache22/data/website.co.ua
ServerName website.co.ua
ServerAlias server
</VirtualHost>
Обслуживание разных сайтов на разных портах
Можно обрабатывать запросы к разным и/или одинаковым доменам на разные порты, выдавая разное содержимое:
Listen 80
Listen 8080
NameVirtualHost 77.120.106.40:80
NameVirtualHost 77.120.106.40:8080
#по запросу website.co.ua и стандартному http-порту 80 выдаем
#содержимое каталога /usr/local/www/apache22/data/www/website.co.ua-80
<VirtualHost 77.120.106.40:80>
ServerName website.co.ua
DocumentRoot www/apache22/data/www/website.co.ua-80
</VirtualHost>
#по запросу website.co.ua и не-стандартному http-порту 8080 выдаем
#содержимое каталога /usr/local/www/apache22/data/www/website.co.ua-8080
<VirtualHost 77.120.106.40:8080>
ServerName website.co.ua
DocumentRoot www/apache22/data/www/website.co.ua-8080
</VirtualHost>
#то же самое, на том же сервере, но для домена it-news. in.ua
<VirtualHost 77.120.106.40:80>
ServerName it-news.in.ua
DocumentRoot www/apache22/data/www/it-news.in.ua-80
</VirtualHost>
<VirtualHost 77.120.106.40:8080>
ServerName it-news.in.ua
DocumentRoot www/apache22/data/www/it-news.in.ua-8080
</VirtualHost>
IP-based виртуалхосты
У сервера есть два IP-адреса и два домена: it-news.in.ua с адресом 77.120.106.40 и website.co.ua с адресом 77.120.106.52:
Listen 80
<VirtualHost 77.120.106.40>
DocumentRoot www/apache22/data/www/it-news.in.ua
ServerName it-news.in.ua
</VirtualHost>
<VirtualHost 77.120.106.52>
DocumentRoot www/apache22/data/www/website.co.ua
ServerName website.co.ua
</VirtualHost>
Смешанные port-based и ip-based виртуалхосты
Listen 77.120.106.40:80
Listen 77.120.106.40:8080
Listen 77.120.106.52:80
Listen 77.120.106.52:8080
<VirtualHost 77. 120.106.40:80>
DocumentRoot www/apache22/data/www/website.co.ua-80
ServerName website.co.ua
</VirtualHost>
<VirtualHost 77.120.106.40:8080>
DocumentRoot www/apache22/data/www/website.co.ua-8080
ServerName website.co.ua
</VirtualHost>
<VirtualHost 77.120.106.52:80>
DocumentRoot www/apache22/data/www/it-news.in.ua-80
ServerName it-news.in.ua
</VirtualHost>
<VirtualHost 77.120.106.52:8080>
DocumentRoot www/apache22/data/www/it-news.in.ua-8080
ServerName it-news.in.ua
</VirtualHost>
В статье использовалась документация с официального сайта веб-сервера Apache.
Раздел: Apache HTTP Server HOWTO’s Метки: Apache HTTP Server, VirtualHost
More results…
Exact matches only
Exact matches only
Search in title
Search in title
Search in content
Search in content
Search in excerpt
Hidden
Hidden
Navigation
aСамое читаемое
- CentOS: установка, настройка Zabbix-agent и добавление нового хоста в мониторинг — 507 195 views
- MySQL/MariaDB: наиболее используемые команды, примеры — 289 268 views
- BASH: описание циклов for, while, until и примеры использования — 152 257 views
- Команда find и её опции в примерах — 139 703 views
- Карта сайта — 131 688 views
Архив месяца
Пн | Вт | Ср | Чт | Пт | Сб | Вс |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Архивы по годам
Архивы по годам Выберите месяц Октябрь 2022 (4) Сентябрь 2022 (1) Июнь 2022 (1) Май 2022 (1) Апрель 2022 (1) Март 2022 (2) Январь 2022 (1) Декабрь 2021 (3) Ноябрь 2021 (8) Октябрь 2021 (4) Сентябрь 2021 (5) Август 2021 (5) Июль 2021 (6) Июнь 2021 (6) Май 2021 (6) Апрель 2021 (11) Март 2021 (8) Февраль 2021 (6) Январь 2021 (1) Декабрь 2020 (1) Ноябрь 2020 (9) Октябрь 2020 (9) Сентябрь 2020 (4) Август 2020 (8) Июль 2020 (4) Июнь 2020 (3) Май 2020 (5) Апрель 2020 (9) Март 2020 (8) Февраль 2020 (9) Январь 2020 (2) Декабрь 2019 (9) Ноябрь 2019 (9) Октябрь 2019 (11) Сентябрь 2019 (11) Август 2019 (10) Июль 2019 (2) Июнь 2019 (4) Май 2019 (9) Апрель 2019 (13) Март 2019 (32) Февраль 2019 (20) Январь 2019 (10) Декабрь 2018 (9) Ноябрь 2018 (12) Октябрь 2018 (15) Сентябрь 2018 (12) Август 2018 (14) Июль 2018 (17) Июнь 2018 (18) Май 2018 (21) Апрель 2018 (6) Март 2018 (18) Февраль 2018 (7) Январь 2018 (13) Декабрь 2017 (14) Ноябрь 2017 (6) Октябрь 2017 (24) Сентябрь 2017 (13) Август 2017 (15) Июль 2017 (11) Июнь 2017 (11) Май 2017 (11) Апрель 2017 (7) Март 2017 (18) Февраль 2017 (13) Январь 2017 (14) Декабрь 2016 (12) Ноябрь 2016 (15) Октябрь 2016 (13) Сентябрь 2016 (21) Август 2016 (19) Июль 2016 (14) Июнь 2016 (8) Май 2016 (24) Апрель 2016 (15) Март 2016 (19) Февраль 2016 (21) Январь 2016 (19) Декабрь 2015 (17) Ноябрь 2015 (17) Октябрь 2015 (14) Сентябрь 2015 (13) Август 2015 (1) Июль 2015 (20) Июнь 2015 (23) Май 2015 (26) Апрель 2015 (28) Март 2015 (30) Февраль 2015 (26) Январь 2015 (24) Декабрь 2014 (31) Ноябрь 2014 (21) Октябрь 2014 (28) Сентябрь 2014 (23) Август 2014 (31) Июль 2014 (23) Июнь 2014 (11) Май 2014 (14) Апрель 2014 (8) Март 2014 (11) Февраль 2014 (11) Январь 2014 (11) Декабрь 2013 (12) Ноябрь 2013 (23) Октябрь 2013 (20) Сентябрь 2013 (30) Август 2013 (20) Июль 2013 (6) Июнь 2013 (9) Май 2013 (5) Апрель 2013 (13) Март 2013 (22) Февраль 2013 (36) Январь 2013 (10) Декабрь 2012 (4) Ноябрь 2012 (8) Октябрь 2012 (13) Сентябрь 2012 (29) Август 2012 (24) Июль 2012 (18) Июнь 2012 (2) Май 2012 (4) Март 2012 (5) Февраль 2012 (5) Январь 2012 (25) Декабрь 2011 (15) Ноябрь 2011 (6) Август 2011 (13)Iconic One Theme | Powered by WordPress
Подробное обсуждение сопоставления виртуальных хостов
HTTP-сервер Apache, версия 2. 4
Доступные языки: en | фр | ко | tr
Этот документ пытается объяснить именно то, что делает Apache HTTP Server при выборе виртуального хоста служить запрос от.
Большинство пользователей должны прочитать о Виртуальные хосты на основе имени и на основе IP, чтобы решить, какой тип они хотите использовать, то узнайте больше о основанных на именах или виртуальные хосты на основе IP, а затем см. Некоторые примеры.
Если вы хотите разобраться во всех деталях, то можете вернуться на эту страницу.
- Файл конфигурации
- Соответствие виртуального хоста
- Советы
См. также
- Поддержка виртуальных хостов на основе IP
- Поддержка виртуальных хостов на основе имен
- Примеры виртуальных хостов для общих настроек
- Динамически настроенный массовый виртуальный хостинг состоит из всех
определения, выходящие за рамки
Есть виртуальные серверы, называемые vhosts , которые определяются
<Виртуальный хост>
разделы.Каждая директива
VirtualHost
включает один или более адресов и дополнительных портов.Имена хостов могут использоваться вместо IP-адресов в виртуальном определение хоста, но они разрешаются при запуске и если любое имя разрешения не выполняются, эти определения виртуальных хостов игнорируются. Поэтому это не рекомендуется.
Адрес может быть указан как
*
, что будет соответствовать запросу, если нет другой виртуальный хост имеет явный адрес, на который был отправлен запрос полученный.Адрес, появляющийся в
VirtualHost
директива может иметь необязательный порт. Если порт не указан, он рассматривается как подстановочный порт, который также может быть указан явно используя*
. Порт с подстановочным знаком соответствует любому порту.(Номера портов указаны в
VirtualHost
директива сделать не влияют на то, какие номера портов будет прослушивать Apache, они только контролируют которыйVirtualHost
будет выбран для обработки запроса. Используйте директивуListen
для контролировать адреса и порты, на которых сервер прослушивает.)В совокупности весь набор адресов (включая несколько результаты поиска DNS) называются набор адресов .
Apache автоматически различает основа HTTP
Заголовок узла
, предоставленный клиентом всякий раз, когда наиболее конкретное совпадение для комбинации IP-адреса и порта указан в нескольких виртуальных хостах.Имя_сервера
директива может появиться где угодно в пределах определения сервера. Однако, каждое появление переопределяет предыдущее появление (в пределах этого сервер). ЕслиServerName
не указано, сервер пытается вывести его из IP-адреса сервера.Первый виртуальный хост на основе имени в файле конфигурации для заданная пара IP:порт важна, потому что она используется для всех запросы, полученные на тот адрес и порт, для которых нет других vhost для этой пары IP:порт имеет соответствующее имя сервера или Псевдоним сервера. Он также используется для всех SSL-соединений, если server не поддерживает индикацию имени сервера.
Полный список имен в
VirtualHost
директивы обрабатываются так же, как (без подстановочных знаков)ServerAlias
(но не переопределяются какой-либо инструкциейServerAlias
).Для каждого виртуального хоста устанавливаются различные значения по умолчанию. В в частности:
- Если vhost не имеет
ServerAdmin
,Время ожидания
,KeepAliveTimeout
,KeepAlive
,MaxKeepAliveRequests
,ReceiveBufferSize
, илиSendBufferSize
директива, то соответствующее значение наследуется от основной сервер.(То есть, унаследованное от любого конечного установка этого значения находится на основном сервере.)
- «Поиск по умолчанию», определяющий каталог по умолчанию. разрешения для виртуального хоста объединяются с разрешениями основной сервер. Это включает в себя любую конфигурацию для каждого каталога информация для любого модуля.
- Конфигурации каждого сервера для каждого модуля из основной сервер объединен с сервером vhost.
По сути, главный сервер рассматривается как «по умолчанию» или «база», на которой будет строиться каждый виртуальный хост. Но позиционирование эти основные определения сервера в файле конфигурации в значительной степени неактуально — вся конфигурация основного сервера была анализируется, когда происходит это окончательное слияние. Так что даже если главный сервер определение появляется после определения виртуального хоста, это может повлиять на определение виртуального хоста.
Если на основном сервере нет
ServerName
на данный момент точка, затем имя хоста машины, котораяhttpd
вместо этого используется. Назовем адрес основного сервера установить те IP-адреса, которые возвращаются поиском DNS наServerName
главного сервера.Для любых неопределенных
ServerName
полей vhost на основе имени по умолчанию использует адрес, указанный первым вОператор VirtualHost
, определяющий vhost.Любой виртуальный хост, включающий магию
_default_
подстановочный знак получает тот жеServerName
, что и основной сервер.Сервер определяет, какой виртуальный хост использовать для запроса, как следующим образом:
Поиск IP-адреса
Когда соединение впервые получено по какому-либо адресу и порту, сервер ищет все определения
VirtualHost
которые имеют одинаковый IP-адрес и порт.Если нет точного совпадения адреса и порта, то подстановочный знак (
*
) учитываются совпадения.Если совпадений не найдено, запрос обслуживается основной сервер.
Если есть определения
VirtualHost
для IP-адрес, следующим шагом будет решить, должны ли мы иметь дело с виртуальным хостом на основе IP или имени.Vhost на основе IP
Если имеется ровно одна директива
VirtualHost
перечисление комбинации IP-адреса и порта, которая была определена для наилучшего совпадения, никаких дальнейших действий не выполняется и запрос обслуживается с соответствующего виртуального хоста.vhost на основе имени
Если имеется несколько директив
VirtualHost
комбинация IP-адреса и порта, которая была определена как наилучшее совпадение, «список» в оставшихся шагах относится к списку vhosts которые совпали, в том порядке, в котором они были в файле конфигурации.Если соединение использует SSL, сервер поддерживает указание имени сервера и рукопожатие клиента SSL включает расширение TLS с запрошенное имя хоста, то это имя хоста используется ниже точно так же, как
Хост: заголовок
будет использоваться для соединения без SSL. В противном случае первый виртуальный хост на основе имени, адрес которого совпадает, используется для SSL-соединений. Это важно, потому что vhost определяет, какой сертификат сервер будет использовать для связь.Если запрос содержит поле заголовка
Host:
, list ищется первый vhost с совпадающимServerName
илиServerAlias
и запрос обслуживается с этого виртуального хоста. АХост: заголовок
поле может содержать номер порта, но Apache всегда его игнорирует и соответствует реальному порту, на который клиент отправил запрос.Первый vhost в конфиге файл с указанным IP-адресом имеет наивысший приоритет и перехватывает любой запрос к неизвестному имени сервера или запрос без поля заголовка
Host:
(например, HTTP/1.0 запрос).
Постоянные соединения
Поиск IP , описанный выше, выполняется только один раз на конкретный сеанс TCP/IP, в то время как поиск имени выполняется на каждые запросов во время KeepAlive/persistent связь. Другими словами, клиент может запросить страницы из разные виртуальные хосты на основе имен в течение одного постоянного связь.
Абсолютный URI
Если URI из запроса является абсолютным URI и его имя хоста и порт соответствуют основному серверу или одному из настроенные виртуальные хосты и совпадают по адресу и порт, на который клиент отправил запрос, то префикс схемы/имени хоста/порта удаляется, а оставшийся относительный URI обслуживается соответствующим основным сервером или виртуальный хост. Если не совпадает, остается URI нетронутым, и запрос считается прокси-запросом.
Наблюдения
- Виртуальный хостинг на основе имени — это процесс, применяемый после
сервер выбрал наиболее подходящий виртуальный IP-адрес.
хозяин.
- Если вам все равно, к какому IP-адресу подключился клиент, используйте «*» в качестве адреса каждого виртуального хоста и виртуального хостинга на основе имени применяется ко всем настроенным виртуальным хостам.
-
Имя_сервера
иПсевдоним сервера
проверки никогда не выполняются для виртуального хоста на основе IP. - Только заказ виртуальные хосты на основе имени для определенного набора адресов имеют большое значение. Один виртуальный хост на основе имени, который идет первым в конфигурационный файл имеет наивысший приоритет для своего установлен соответствующий адрес.
- Любой порт в поле заголовка
Host:
никогда не используется во время процесс сопоставления. Apache всегда использует реальный порт, к которому клиент отправил запрос. - Если два виртуальных хоста имеют общий адрес, эти общие адреса
действовать как виртуальные хосты на основе имени неявно.
Это новое поведение с 2.3.11.
- Основной сервер используется только для обслуживания запроса, если IP-адрес
адрес и номер порта, к которому подключился клиент
не соответствует ни одному виртуальному хосту (включая
*
vhost). Другими словами, основной сервер ловит только запрос на неуказанный адрес/порт комбинация (если нет_default_
vhost который соответствует этому порту). - Никогда не следует указывать DNS-имена в
Директивы VirtualHost
, потому что это заставит ваш сервер, чтобы полагаться на DNS для загрузки. Кроме того, это создает угроза безопасности, если вы не контролируете DNS для всех перечислены домены. Есть больше информация, доступная по этому и следующим двум темы. -
Имя_сервера
должно всегда устанавливаться для каждого вхост. В противном случае требуется поиск DNS для каждого вхост.
В дополнение к советам на странице проблем с DNS, здесь еще несколько советов:
- Поместите все определения основных серверов перед любыми
определений VirtualHost
. (Это в помощь удобочитаемость конфигурации — слияние после конфигурации процесс делает неочевидным, что определения смешиваются вокруг виртуальные хосты могут повлиять на все виртуальные хосты.)
Примечание:
Это не раздел вопросов и ответов. Комментарии, размещенные здесь, должны указывать на предложения по улучшению документации или сервера и могут быть удалены нашими модераторами, если они либо реализованы, либо считаются недействительными/не по теме. Вопросы о том, как управлять HTTP-сервером Apache, следует направлять либо на наш IRC-канал #httpd, на Libera.chat, либо в наши списки рассылки.Как настроить виртуальный хост Apache
В Apache (httpd) виртуальные хосты используются для размещения веб-контента для нескольких доменов за пределами одного сервера в зависимости от используемого IP-адреса или доменного имени.
В зависимости от полученного запроса могут применяться различные конфигурации виртуального хоста, что приводит к тому, что разные настройки и веб-контент обслуживаются с одного веб-сервера. Например, веб-сервер с одним IP-адресом может содержать несколько доменных имен, таких как example.com, example.org и многие другие.
Здесь мы расскажем, как настроить виртуальные хосты для Apache 2.4, чтобы у нас было несколько доменов, обслуживающих разные веб-сайты в зависимости от того, что запрашивается.
Готовитесь к сертификации RHCE? Посмотрите наш видеокурс RHCE на Udemy со скидкой 20% при использовании кода ROOTUSER.Пример конфигурации виртуального хоста Apache
Конфигурация виртуального хоста обычно находится в файле /etc/httpd/conf/httpd.conf, а также в уникальных файлах .conf в каталоге /etc/httpd/conf.d. Хорошей практикой является создание нового файла .conf в файле /etc/httpd/conf.d, если вы добавляете несколько веб-сайтов для размещения на одном и том же веб-сервере, так как это обеспечивает чистоту конфигурации и упрощает управление.
В нашем примере мы будем работать с файлами /etc/httpd/conf.d/example1.conf для веб-сайта www.example.com и /etc/httpd/conf.d/example2.conf для веб-сайта. www.example.org.
Сначала мы начнем с примера конфигурации виртуального хоста, а затем обсудим, что на самом деле делает каждая строка. Дополнительные примеры см. в документации Apache.
Приведенный ниже пример конфигурации виртуального хоста был сохранен в файле /etc/httpd/conf.d/example1.conf.
<Каталог /var/www/html/example1> Требовать все предоставленные <Виртуальный хост *:80> DocumentRoot "/var/www/html/example1" Имя сервера www.example.com Псевдоним сервера example.com ServerAdmin [email защищен] ErrorLog "/var/log/httpd/error_log_example1" CustomLog "/var/log/httpd/access_log_example1" в сочетании
Приведенный ниже пример конфигурации виртуального хоста был сохранен в файле /etc/httpd/conf.d/example2.conf.
<Каталог /var/www/html/example2> Требовать все предоставленные <Виртуальный хост *:80> DocumentRoot "/var/www/html/example2" Имя сервера www.
example.org Псевдоним сервера example.org ServerAdmin [email защищен] ErrorLog "/var/log/httpd/error_log_example2" CustomLog "/var/log/httpd/access_log_example2" в сочетании
В приведенных выше примерах у нас есть два блока конфигурации виртуального хоста. Первый для www.example.com, а второй для www.example.org. Ниже мы объясним каждую строку для виртуального хоста example1/example.com, поскольку конфигурация между ними в основном одинакова.
-
- Требовать все разрешено — Это необходимо для предоставления доступа, без него в журналах Apache будет отображаться «authz_core: ошибка», поскольку конфигурация по умолчанию в файле /etc/http/conf/httpd.conf определяет каталог «/» с «Требовать все запрещенные ».
- — закрывает тег каталога.
-
- DocumentRoot «/var/www/example1» — Корень документа — это каталог, в котором существует контент, который Apache должен обслуживать при посещении доменного имени, в этом случае переход на www.example.com направит нас к файлам внутри каталог /var/www/example1 на веб-сервере. Указанный каталог должен существовать и в идеале содержать содержимое.
- ServerName www.example.com — это уникальное имя, для которого предназначен виртуальный хост, в данном случае блок конфигурации виртуального хоста предназначен для веб-сайта www.example.com.
- ServerAlias example.
com — Альтернативные имена могут использоваться при сопоставлении запроса и указываются с помощью ServerAlias. Это позволяет нам предоставлять другие псевдонимы на основе имен, поскольку для каждого виртуального хоста разрешено только одно имя сервера.
- ServerAdmin [email protected] — это адрес электронной почты, который указывается в сообщениях об ошибках, что позволяет пользователям связываться с веб-мастером веб-сервера.
- ErrorLog «/var/log/httpd/error_log_example1» — это файл, в котором хранятся журналы ошибок, связанные с этим виртуальным хостом, которые полезны при устранении неполадок.
- CustomLog «/var/log/httpd/access_log_example1» в сочетании — здесь хранятся журналы доступа, например, когда клиент просматривает веб-страницу, запросы на доступ будут регистрироваться здесь.
- — это закрывающий тег блока виртуального хоста, указывающий на завершение настройки конкретного виртуального хоста.
Если какая-либо конфигурация виртуального хоста отсутствует, вместо нее будут использоваться значения по умолчанию, указанные в основном файле /etc/httpd/conf/httpd.conf.
Второй блок виртуального хоста в файле example2.conf почти такой же, за исключением того, что он отвечает за запросы к www.example.org и example.org, обслуживающим содержимое в /var/www/html/example2. Ошибки регистрируются в /var/log/httpd/error_log_example2, а запросы доступа регистрируются в /var/log/httpd/access_log_example2.
Синтаксис двух наших файлов .conf можно проверить с помощью команды «apachectl configtest», как показано ниже. В этом случае корневые каталоги документов еще не созданы, поэтому мы получаем предупреждение и должны их создать.
[[электронная почта защищена] ~]# apachectl configtest AH00112: Предупреждение: DocumentRoot [/var/www/html/example1] не существует AH00112: Предупреждение: DocumentRoot [/var/www/html/example2] не существует Синтаксис ОК
Каталоги можно создать с помощью mkdir, как показано ниже.
мкдир /var/www/html/example1 mkdir /var/www/html/example2
Теперь, когда наши каталоги существуют, предупреждение больше не должно появляться. В этом примере я создал два файла index.html с помощью текстового редактора в обоих каталогах, содержимое показано ниже.
[[email protected] ~]# cat /var/www/html/example1/index.html сайт example.com [[электронная почта защищена] ~]# cat /var/www/html/example2/index.html веб-сайт example.org
Перед тестированием нашей конфигурации виртуального хоста любые изменения в файлах конфигурации Apache, такие как изменение виртуальных хостов, потребуют перезапуска или перезагрузки службы httpd, чтобы принять изменения конфигурации. Apache можно перезагрузить, чтобы использовать изменения конфигурации с помощью «systemctl reload httpd», для получения дополнительной информации см. наше руководство по управлению службами.
Тестирование виртуальных хостов
После настройки виртуального хоста и перезагрузки Apache необходимо создать соответствующие записи DNS, чтобы домены разрешались на веб-сервере.
В качестве альтернативы вы можете проверить, изменив файл hosts. В этом примере мы можем изменить файл /etc/hosts и добавить следующую запись.
127.0.0.1 example.com www.example.com example.org www.example.org
Это заставит эти домены разрешаться в localhost, теперь мы можем просмотреть содержимое и убедиться, что наши виртуальные хосты работают правильно. В этом случае мы собираемся использовать команду curl для просмотра содержимого каждого веб-сайта.
[[электронная почта защищена] ~]# curl example.com сайт example.com [[электронная почта защищена] ~]# curl example.org веб-сайт example.org
Это подтверждает, что правильные страницы index.html в /var/www/html/example1 и /var/www/html/example2 успешно извлекаются для каждого домена, как определено в конфигурации виртуального хоста.
Дополнительная информация
Если вы застряли или не можете вспомнить что-либо из этого, вспомните пакет httpd-manual, который можно установить и просмотреть по адресу http://localhost/manual.
- Если vhost не имеет