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