Исходные условияЯ надеюсь, что у читателя уже установлен пакет XAMPP и произведена его первоначальная настройка. По настройке читаем:
Считаем что настройка произведена по описанному во второй ссылке алгоритму и наши сайты будут откликаться по IP 127.0.0.2. Если же это не так, то своевременно вносите корректировки в излагаемый мной материал.
Решаемые задачиВ конце данной статьи мы придем к решению задачи как, работая с XAMPP создавать девелоперские домены для сайтов в директории htdocs просто созданием соответствующей директории, без всевозможных ручных правок файла hosts и ручного создания виртуальных хостов в конфигурационных файлах Apache.
Этап 1. Делаем корневой доменПри запуске пакета Denwer происходит сканирование локальной директории с директориями доменов сайтов и на основе результатов этого сканирования производится создание записей вида 127.0.0.1 mydomen.loc
www.mydomen.loc, и создание виртуальных хостов в конфигах апача. При остановке пакета происходит обратный процесс.
Этот подход содержит одно слабое место, хотя для его решения в Denwer придуманы костыли. Слабое место выражено в том, что если вы забыли остановить Denwer и выключили компьютер, то в следующий раз стартовому скрипту необходимо понять, что пакет не был корректно остановлен, почистить файлы и заново заполнить их корректными значениями.
Всю эту функциональность можно переписать на perl, sh или php, но, как я уже говорил, у нас в руках более мощный инструмент, который позволит нам, однажды настроив окружение, больше не делать операций с соответствующими конфигурационными файлами.
Итак, первое что мы будем делать это создавать коневой домен. В моем случае это .loc, но это может быть и .dev или еще какой-нибудь, не имеющий аналогов в реальном мире
(чтобы не пересекаться с пространством доменов Интернета). Использовать реально существующие зоны не рекомендую в связи с блокировкой этой зоны на вашем компьютере и невозможности зайти на сайты расположенные в этой зоне в Интернет.
К сожалению мы не можем написать в файл
/etc/hosts простую строчку: 127.0.0.1 *.loc и разом решить проблему с изменением этого конфига. Но это можно делать в DNS и именно по такому пути мы пойдем. Вместе с Ubuntu идет DNS сервер, который нужно только установить:
sudo apt-get install bind9
После установки необходимо произвести несколько настроек. Во-первых делаем содержимое файла
/etc/bind/named.conf.options следующим:
options {
directory "/var/cache/bind";
//БОНУС! Раскомментировав строчки ниже и проставив IP DNS
//провайдера будем кешировать его, что может немного
//"ускорить интернет"
// forwarders {
// 10.0.0.1;
// 10.0.0.2;
// };
};
Первые настройки мы сделали. На самом деле там куча всяких опций бывает, но в нашем случае они не нужны. Далее нужно прописать нашу локальную зону, для этого нужно открыть файл
/etc/bind/named.conf.local и вписываем в него следующее:
zone "loc" {
type master;
file "/etc/bind/db.loc";
};
Директива
type master говорит о том, что только мы являемся самым авторитетным источником информации о зоне .loc и опрашивать другие DNS-серверы об этой зоне не нужно. Теперь остается только создать указанный файл
/etc/bind/db.loc, в котором будет содержаться информация о доменной зоне. Создаем файл и вписываем в него следующую информацию:
@ IN SOA loc. root.loc. (
20110202 ; Серийный номер зоны. Обычно - текущая дата
3h ; обновление каждые 3 часа
1h ; повтор каждый час
1w ; информация хранится 1 неделю
1d ) ; TTL записи - 1 день
@ IN NS loc. ; сервер имен. Рекомендую оставить как тут
@ IN A 127.0.0.2 ; A - запись - IP адрес сервера для
; данной зоны (ваш девелоперский
; сервер). @ для имени домена
; означает "корень зоны"
* IN CNAME @ ; CNAME запись. По сути -
; символическая ссылка. * для имени
; домена означает "любой поддомен".
Сохраняем и заставляем bind перечитать введенную нами информацию:
sudo service bind9 reload
Дальше нужно проверить вступили ли изменения в силу — делаем
nslookup test.loc 127.0.0.1, домен должен успешно резолвится.
Теперь нужно подключить наш DNS. Если вы не пользуетесь NetworkManager-ом, то достаточно в самое начало файла
/etc/resolv.conf прописать ваш DNS сервер 127.0.0.1.
Если же используется NetworkManager, то открываем "Изменить соединения", выбираем нужное соединение (проводное, VPN, или любое другое, которое вы используете), открываем вкладку "Параметры IPv4" и заменяем "Автоматически (DHCP)" на "Автоматически (DHCP, только адрес)", затем в поле "Серверы DNS" вписываем первым IP вашего DNS сервера и дальше через запятую ip адреса из
/etc/resolv.conf. Переподключаем сеть и наш DNS заработал в полную силу.
Этап 2. Настраиваем ApacheПредлагаю, для начала, разобраться с правами. Для удобства работы с сервером нужно изменить владельца и группу директории
/opt/lampp/htdocs, а также всего ее содержимое на текущего пользователя, которым вы залогинены. Это позволит без проблем создавать директории сайтов. Кроме того, те же действия нужно проделать с файлом
/opt/lampp/phpmyadmin/config.inc.php.
Теперь открываем в редакторе файл
/opt/lampp/etc/httpd.conf и ищем строки:
User nobody
Group nobody
Вместо nobody ставим имя пользователя и группы под которыми вы залогинены. Дальше ищем строку:
LoadModule vhost_alias_module modules/mod_vhost_alias.so
Смотрим, чтобы строка не была закомментирована. Если это так, то ее необходимо раскомментировать. После того, как это сделано можем приступать к последнему изменению в этом конфигурационным файле — в конец файла добавляем следующие строки:
<IfModule vhost_alias_module>
# UseCanonicalName: Определяет как Apache строит внутренние
# URL-ссылки и значения переменных SERVER_NAME и SERVER_PORT.
# Когда задано "Off", Apache использует имя и порт, данные
# клиентом. Если же задано "On", то Apache использует значение
# директивы ServerName из блока VirtualHost.
UseCanonicalName Off
# Создаем лог-файл доступа в котором будет не только ip-адрес,
# но и хост, к которому пытались обратится
<IfModule log_config_module>
LogFormat "%V %h %l %u %t "%r" %s %b" vcommon
CustomLog logs/access_log.log vcommon
</IfModule>
# Разрешим доступ к содержимому виртуальных хостов
# если этого не сделать, то получим access forbidden
# поскольку по умолчанию работает правило
# order deny,allow
# deny from all
<Directory "/opt/lampp/htdocs">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>
# Добавляем имя хоста в путь с размещением настроек
VirtualDocumentRoot /opt/lampp/htdocs/%0/www
VirtualScriptAlias /opt/lampp/htdocs/%0/cgi-bin
</IfModule>
После сохранения файла стартуем XAMPP. Кстати, мы же еще не создали ни одного домена. Нужно исправить это упущение. Внутри директории
/opt/lampp/htdocs создаем следующую структуру директорий:
/test.loc
/www
/cgi-bin
...и в директорию www помещаем файл index.php следующего содержания:
<?php
foreach($_SERVER as $key=>$var) echo "$key: $var<br />
";
?>
...и заходим браузером по адресу
http://test.loc/ ЗаключениеЕсть одино неудобство — мы не можем зайти на сайт по адресу
http://www.test.loc ибо не можем использовать директиву ServerAlias, однако данная проблема имеет простое решение:
ln -s /opt/lampp/htdocs/test.loc /opt/lampp/htdocs/www.test.loc
Надеюсь, что я изложил все понятно и доступно, для того, чтобы повторить.