Apache: примеры создания VirtualHost

Автор: | 20/12/2011
 

Что такое 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.