Мультидоменность в Apache без лишних хлопот на локальном хосте
19:02Интернет пестрит руководствами по настройке виртуальных хостов в Apache.
Но, в большинстве случаев, создание такого поддомена представляется
хлопотным делом.
По «стандартной» инструкции предлагается сделать следующее:
- Создать папку для сайта
- Создать конфигурационный файл с именем будущего домена
- Включить сайт специальной опцией
- Перезагрузить Apache
- Прописать наш домен в файле hosts
Некоторые пытаются оптимизировать данный процесс различными скриптами, но проблемы это, по сути, не решает.
Итак, попробуем добиться, чтобы процесс создания поддомена сводился
лишь к созданию папки для сайта. Возможно ли это? Проверим...
Как устанавливать LAMP я рассказывать не буду, так как вы, скорее
всего, можете сделать это с закрытыми глазами (смайл). Перейдем к самому
интересному.
Настройка vhost_alias
Включаем модуль vhost_alias. Он то и будет главным действующим лицом.
sudo a2enmod vhost_alias
Включаем, если нужно, mod_rewrite.
sudo a2enmod rewrite
Открываем файл httpd.conf и приступаем к непосредственной настройке.
#Подставляем имя сервера из заголовка запроса пользователя UseCanonicalName Off # Формируем логи так, чтобы в них указывалось имя виртуального хоста LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon CustomLog /home/%username%/web/access_log vcommon # Нужно для работы mod_rewrite <Directory /home/%username%/web> Options FollowSymLinks AllowOverride All </Directory> # Собственно правило, по которому будет искаться нужный нам сайт VirtualDocumentRoot /home/%username%/web/%-2
%-2 означает, что по хост будет выбран по предпоследней части доменного имени. Другими словами, создав директорию /home/%username%/web/habrahabr, мы сможем обратиться к ней как habrahabr.ru (или habrahabr.com, или даже habrahabr.xxx).
Можно также задать свои параметры выбора имени хоста:
- %0 Полное имя
- %1 Первая часть имени
- %2 Вторая часть имени
- %3 Третья часть имени
- %-1 Последняя часть
- %-2 Предпоследняя часть
- %2+ Вторая и все последующие части
- %-2+ Предпоследняя и все последующие части
Рестартуем Apache.
sudo service apache2 restart
Наш сервер уже работает. Убедиться в этом мы можем, создав папку с нужным именем, например test и поместив туда index.php с каким-нибудь содержимым, например "<?php phpinfo(); ?>".
Ах да, нужно ведь еще прописать наш домен в файлике /etc/hosts.
127.0.0.1 test.loc
Все, теперь можно открывать в браузере страничку.
Стоп, мы так не договаривались! Создание сайта должно сводиться к созданию директории под него. Ну что ж, давайте сделаем…
Настройка DNS-сервера
Для этого мы будем использовать DNS-сервер bind9. Все домены с суффиксом *.loc будут смотреть на нашу локальную машину.
Устанавливаем DNS-сервер
sudo apt-get install bind9
Открываем конфигурационный файл named.conf.options и добавляем
acl "home" {192.168.1.0/24; 127.0.0.1;}; options { directory "/var/cache/bind"; auth-nxdomain no; listen-on-v6 { none; }; listen-on { 127.0.0.1; }; allow-transfer { none; }; allow-query {"home";}; forward first; # Указываем DNS-адреса провайдера forwarders { 192.168.1.2; 8.8.8.8; }; };
Создаем файлы для доменной зоны.
cd /etc/bind/
sudo touch db.loc
Содержание db.loc
$TTL 86400 $ORIGIN loc. @ IN SOA skywrtr.loc. admin.skywrtr.loc. ( 2010050100; Serial 14400; Refresh 7200; Retry 3600000; Expire 86400 ); Minimum @ IN NS localhost. * IN A 127.0.0.1
Наконец, открываем файл named.conf.local и дописываем туда
zone "loc" { type master; file "/etc/bind/db.loc"; allow-transfer { 127.0.0.1; }; notify no; };
Остальсь подключиться к нашему DNS-серверу. Либо через файл /etc/resolv.conf, дописав строчку
nameserver 127.0.0.1
либо через стандартный менеджер сетевых соединений. В свойствах
подключения, на вкладке «Параметры IPv4» дописать адрес 127.0.0.1 в поле
«Серверы DNS».
Для удобства создадим локальный хост для phpmyadmin
ln -s /usr/share/phpmyadmin/ /home/alex/web/phpmyadmin
Теперь он доступен по адресу phpmyadmin.loc.
Некоторые замечания
Есть пара замечаний по работе с vhost_alias.
- Неправильные данные дает переменная $_SERVER['DOCUMENT_ROOT'], поэтому приходится использовать либо dirname(__FILE__), либо realpath(). Смотря что нужно.
- Если перестал работать mod_rewrite, не паникуем. В файле .htaccess после строчки
RewriteEngine on
Вставляем
RewriteBase /
Ссылки по теме:
httpd.apache.org/docs/2.0/ru/vhosts/mass.html
www.softtime.ru/info/apache.php?id_article=103
P.S. Спасибо Wott за любезно предоставленные конфиги bind.