Допустим на нашем сервере должны располагаться несколько сайтов и необходимо, чтобы при переходе по имени сайта открывались соответствующие этому сайту страницы, а при переходе по IP-адресу или по любому другому имени, кроме избранных, открывался сайт-заглушка, например со списком имеющихся сайтов или просто предупреждением. Все это можно организовать с помощью так называемых виртуальных хостов.
Установка В Red-Hat-based дистрибутивах Apache называют httpd, в Debian и Ubuntu – apache2.
Команды установки:
Fedora
yum install httpd
Debian
apt-get install apache2
Основным конфигурационным файлом web-сервера является /etc/httpd/conf/httpd.conf и /etc/apache2/conf/apache2.conf соответственно.
В конфигурационный файл свежеустановленного web-сервера можно внести некоторые косметические исправления. Для этого среди многочисленных (и полезных) комментариев находим и раскомментируем директивы
ServerAdmin admin@mysite.ru # почтовый адрес администратора
ServerName mysite.ru:80 # имя сервера
в строке LanguagePriority переставляем ru на первое место
LanguagePriority ru en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl...
Структура
Сайты на сервере размещаются в отдельных каталогах. Удобнее, да и правильнее с точки зрения безпасности, создать для каждого сайта подкаталоги для хранения самих страниц, временных файлов, возможно cgi-скриптов и других полезностей.
Можно пойти ещё дальше и организовать для каждого сайта отдельного SSH-пользователя. В таком случае удобно размещать сайт в домашнем каталоге этого пользователя. Соответственно каталоги сайта будут иметь вид:
/home/site_user/mysite.ru/httpdocs # для страниц
/home/site_user/mysite.ru/tmp # для хранения сессий и временных файлов
/home/site_user/user/mysite.ru/cgi-bin # для скриптов
Однако в небольших системах, где SSH-доступом обычно пользуется только администратор сервера, в этом нет необходимости. Поэтому сайты размещают внутри папки /var/www, которую по умолчанию использует web-сервер.
/var/www/vhosts/mysite.ru/httpdocs # для страниц
/var/www/vhosts/mysite.ru/tmp # для хранения сессий и временных файлов
/var/www/vhosts/mysite.ru/cgi-bin # для скриптов
Собственно HOW-TO
Допустим наши сайты называются first.ru и second.ru. Раскомментируем директиву
NameVirtualHost *:80
в третьей секции конфигурационного файла.
Создаем папки
общую
$ mkdir /var/www/vhosts
для первого сайта
$ mkdir /var/www/vhosts/first.ru
$ mkdir /var/www/vhosts/first.ru/httpdocs
и для второго
$ mkdir /var/www/vhosts/second.ru
$ mkdir /var/www/vhosts/second.ru/httpdocs
Для каждого сайта в конфигурационный файл добавляем отдельную секцию
ServerName first.ru ServerAlias www.first.ru DocumentRoot /var/www/vhosts/first.ru/httpdocs ErrorLog logs/first.ru-error.log
ServerName second.ru ServerAlias www.second.ru DocumentRoot /var/www/vhosts/second.ru/httpdocs ErrorLog logs/second.ru-error.log
С реальными сайтами разобрались, теперь что произойдет с обращении к серверу по несуществующему адресу или при обращении по IP ?
Если оставить все как есть, то будет открываться первый сайт first.ru , потому что, как ни странно:
The first VirtualHost section is used for requests without a known server name.
Поэтому перед секциями реальных сайтов добавляем секцию-ловушку, получается примерно так:
ServerName default
Теперь все запросы с неправильными именами сайтов и обращения по IP направляются в папку /var/www/html, где можно разместить простейшую индексную страницу.
Для вступления всех изменений в силу перезапускаем сервер
$ service httpd restart
или
$ /etc/init.d/apache2 restart
Дальше больше
Приведенные выше секции содержат минимальный набор директив. Со временем возникает необходимость в дополнениях, которые описывают, например, свойства PHP или возможности .htaccess.
Apache позволяет управлять достаточно большим количеством настроек. При необходимости следует обращаться к официальной документации http://httpd.apache.org
Приведу пример секции VirtualHost для сайта domain.tld с синонимом another_domain.tld одного реально действующего сервера
ServerName domain.tld ServerAlias www.domain.tld another_domain.tld www.another_domain.tld DocumentRoot /var/www/vhosts/domain.tld/httpdocs ErrorLog logs/domain.tld.error_log CustomLog logs/domain.tld.access_log SymLinksBaseDir /var/www/vhosts/ ScriptAlias /cgi-bin/ /var/www/vhosts/domain.tld/cgi-bin// AllowOverride All Options +Includes php_admin_value open_basedir /var/www/vhosts/domain.tld/ php_admin_value doc_root /var/www/vhosts/domain.tld/httpdocs php_admin_value upload_tmp_dir /var/www/vhosts/domain.tld/tmp/ php_admin_value sendmail_path “/usr/sbin/sendmail -t -i -fphp-sender@domain.tld”