apache2 настройка virtualhost

Для настройки виртуальных хостов на web сервере apache2 под ubuntu 7.10, 8.04, 8.10, 9.04, 9.10, Debian 5 необходимо в самое начало или конец (вне инструкций ) файла /etc/apache2/sites-available/default добавить директиву:

NameVirtualHost 192.168.0.1

Там необходимо указать IP адрес либо DNS имя компютера на котором размещён вебсервер, можно указать localhost или 127.0.0.1

Затем, учитывая организацию конфигов apache2 в Debian, необходимо создать файл виртуального хоста в директории: /etc/apache2/sites-available/
например ваш сайт называется supebreys.ru, значит логичнее создать чтото вроде /etc/apache2/sites-available/supebreys_ru.conf. В любом случае это название должно вам говорить для чего этот файл и будет лучше если вы будете придерживаться какого то одного правила создания таких файлов. Затем в этот файл добавляем такой текст:

<VirtualHost *:80>
        DocumentRoot "/home/httpd/breys.ru/www"
        ServerName    breys.xxx 
        <Directory />
                allow from all
                Options +Indexes
       </Directory>
        ScriptAlias /cgi-bin/ "/home/httpd/breys.ru/cgi-bin/"
        CustomLog  /home/httpd/breys.ru/access.log common
        ErrorLog /home/httpd/breys.ru/error.log
</VirtualHost>

Здесь мы создали виртуальный хост которых будет обрабатывать запросы на 80 порту с любого доступного адреса

Также тут указана корневая директория сайта, директория с cgi скриптами и пути к файлам журналов работы вебсервера

Для корневой директори указаны дополнительные(необязательные) опции: разрешение доступа с любого адреса и включение модуля обработки индексного файла, в принципе эти опции не обязательны и нужны только если прихоится переопределять глобальные политики доступа и загрузки модулей вебсервером

После создания этого файла веб сервер ещё не видит его. Если внимательно посмотреть на файлы в директориях /etc/apache2/sites-enabled/ и /etc/apache2/sites-available/ то должно стать ясно, то что в директории /etc/apache2/sites-available лежат файлы описывающие виртуальные хосты, а в папке/etc/apache2/sites-enabled/ лежат симлинки на файлы в sites-available.  Исходя из названий становится ясно, что:
sites-available - все доступные виртуальных хосты
sites-enabled - включаемые вебсервером
то есть, чтобы добавить виртульный хост в apache2, необходимо либо создать файл нового виртуального хоста в sites-available либо дописать(не желательно) его в уже имеющийся там файл, а чтобы включить виртуальный хост, необходимо чтобы директории sites-enabled была ссылка на файл описывающий виртуальных хост

Это сделанно для того, чтобы разделить виртуальные домены на уровне хостинга. Например, хостер чтобы временно удалить какой то домен удаляет ссылку из папки sites-enabled и перезапускает вебсервер и так же быстро включает домен снова, без правки единого конфига, как это было реализованно ранее.

Итак, включаем наш, только что созданный, новых виртуальный хост:

ln -s /etc/apache2/sites-available/breys_ru.conf /etc/apache2/sites-enabled/breys_ru.conf

Этой командой мы создаём симлинк(символическую ссылку на один файл в другой директории) на рабочий файл виртуального хоста, который будет обработан при следующем перезапуске вебсервера

Возможно вам потребуется расширить поведение вашего виртуального хоста - может потребоваться чтобы он был доступен по нескольким адреса

Например, у меня имеются зеркала моих сайтов и я работаю с ними дома используя имена сайтов + моя домашняя зона .xxx, тоесть для сайта breys.ru у меня есть домашнее зеркало breys.xxx, но вполне вероятна ситуация когда нужно показать зеракло ещё кому то, тогда я могу использовать DNS зону зарегистрированную за мной на DYNDNS.COM, тоесть это зеркало имеет дополнительный адрес в виде:breys.ffsdmad.homelinux.org, ещё более частая ситуация когда нужно иметь имя www.breys.ru и соответственноwww.breys.ffsdmad.homelinux.org
Чтобы включить этого необходимо в файл виртального хоста, внутри инструкций .. добавить список необходимых алиасов:

<VirtualHost *:80>
 ....другие инструкции
  ServerName breys.xxx
  ....
  ServerAlias www.breys.xxx
  ServerAlias breys.ffsdmad.homelinux.org
  ServerAlias www.breys.ffsdmad.homelinux.org
  ....
</VirtualHost>

Вполне возможно придётся заниматься отладкой модуля mod_rewrite, для этого необходимо в файл виртуального хоста добавить строки:

<VirtualHost *:80>
 ....другие инструкции
 RewriteLog /home/httpd/breys.ru/rewrite.log
 RewriteLogLevel 9 
</VirtualHost>

Начните с небольшого примера и постепенно расширяйте возможности своего виртуального хостинга различными возможностями вебсервера apache2 (а их у него предостаточно) и постепенно вы поймёте насколько проста и логична такая структура в условиях такого сложного сервиса как вебхостинг

Также следует заметить, что если вы поставили на локальную машину сервер apache2 и виртуальные хосты прописаны в /etc/hosts (соответствия имени ip адресу), то начинаются тормоза при обращении к вебсерверу. Дело в том, что браузер сначала пытается распознать ip адрсе у dns сервера, который у вас прописан в /etc/resov.conf, а не проверять файл /etc/hosts. Это можно исправить заменив в файле /etc/host.conf последовательность перебора сервисов разрешения имён, но лучше всего настроить bind и забыть про тормоза и проблемы с обратным разрешением имени по IP

Вот тут можно прочитать как настроить bind для домашней сети, а здесь можно взять скрипт автоматического создания виртуальных хостов в условиях домашнего хостинга

Эта заметка висит здесь уже второй год и на неё не прекращается поток запроса, а это наталкивает меня на мысль, что люди не могут разобраться с этой системой, а значит нужно объяснять ещё более доходчиво, в этоге эта заметка переписывалась уж три раза

Если у вас остались или возникли какие то вопросы или неясности, не стесьняйтесь, спрашивайте, система коментариев мгновенно оповещает меня через Jabber, таким образом я реагирую практически моментально

 
Комментариев 4
Михаил Нилов
Михаил Нилов

2016-06-12

Добрый вечер.
Изучая ваш мануал наткнулся на определенные трудности.
Задача - разместить два и более сайтов на одном сервере (соответственно на одной внешнем ip).
В наличие машина с server ubuntu 16.04 (версия не принципиальна, могу откатить на более раннюю),
два домена купленные на https://domains.webmoney.ru/. Предположим example1.ru, example2.ru
Расположение сайтов на сервере /var/www/example1/index.html /var/www/example2/index.html

Насколько я понимаю, на https://domains.webmoney.ru/ именно dns сервера распределяют запрос на index.html в (example1 или example2).
Правильно ли я понял принцип работы двух или больше сайтов на одном сервере?
И было бы очень благодарен, если бы вы создали подробным мануал именно к такой задаче.
т.к. по крайней мере поверхностный поиск информации, быстрое и качественное решение моей проблемы не дает...

Заранее спасибо.

Илья Басманов
Илья Басманов

2016-06-22

Михаил привет!
DNS сервер определяет IP-адрес сервера на котором размещён сайт, преобразуя доменное (текстовое) имя и формат IP-адреса и ни как не связан со страницами на сайте.
То-есть, пользователей в браузере набирает адрес example1.ru или example2.ru
его операционная система через DNS клиент (системная функция ОС) запрашивает у своего DNS сервере (про который она знает после настройки сети) IP-адрес example1.ru или example2.ru
Сервер провайдера либо уже знает этот IP-адрес (они их кешируют) либо делает запрос к своему корневому серверу.
В итоге запроса, браузер клиента получает IP-адрес интересуемого сайта, затем он заворчивает доменное имя сайта в специальный HTTP пакет, этот пакет можно увидеть в отладчике Firefox.
Затем отправляет пакет по IP-адресу на 80 порт. Предполагается, что на этом IP-адресе работает вебсервер, который принимает и обрабатывает входящие пакеты.
Допустим сервер получил этот пакет, затем он начинает его разворачивать и находит там поле Host в которое брузер записал адрес сайта.
И если сервер настроен на работу с виртуальными хостами, то он начинает искать среди виртуальных хостов и их алиасов, тот который указан в заголовке Host.
Если находит то передаёт запрос этому виртуальному хосту, а если не находит то передаёт на обработку хосту по умолчанию, обычно это хост описан в файле 000-default
Такое имя файла используется, потому что оно будет первым в отсортированном списке хостов.
Затем, когда уже обработчик запроса к виртуальному хосту получает свой запрос, он начинает обрабатывать остальные поля, в частности он ищет поле Path и вызывает обработчик связанный с ним.
Если не находит такого обработчика, то пытается найти обработчик по умолчани, например это можно быть обработка индексной страницы, иначе вызывает обработчик 404

Михаил Нилов
Михаил Нилов

2016-06-22

Спасибо за ответ. Тогда не совсем понимаю, зачем в принципе существует возможность добавлять dns сервера у продавцов домена (https://domains.webmoney.ru/)?.
Еще советую обратить внимание на то, что я сижу через браузер opera 38.0.2220.31, и у меня раз в несколько минут полностью исчезает текст набираемого мною сообщения. Так, что, что - то не так с полем ввода сообщений. Прошу проверить.

Михаил Нилов
Михаил Нилов

2016-06-22

Спасибо, все заработало.
Хочу дополнить вашу инструкцию.

Для Apache/2.4.18 (Ubuntu)
По умолчанию закрыть доступ к директории /home
Выдает ошибку 403:
Forbidden

You don't have permission to access / on this server.
Apache/2.4.18 (Ubuntu) Server at example.ru Port 80

Надо в файле /etc/apache2/apache2.conf 164 строка :


Options Indexes FollowSymLinks
AllowOverride None
Require all granted


Дописать свою директорию


Options Indexes FollowSymLinks
AllowOverride None
Require all granted


И все будет работать.

Еще раз спасибо за мануал.

Нужна авторизация с помощью
Об авторе
Илья Илья

меня можно найти тут