Apache2 – один из самых популярных веб серверов, он обеспечивает гибкую настройку и надёжность работы сервиса, сегодня мы поговорим о создании виртуальных хостов на данном веб сервере. Зачем это нужно, в первую очередь для того, чтобы иметь несколько сайтов на одном хосте, на одном ip адресе.
Нам понадобится:
- Установленная ОС, мы будем использовать Ubuntu server 18.04
- Установленный Apache
- Желательно уже настроенные записи DNS, это если вы уже собираетесь настраивать рабочую машину, если просто побаловаться, то можно использовать локальные записи, например в файле hosts
Для начала разберемся со структурой каталогов хранения сайтов, основная директория у нас будет /var/www, именно эту папку Apache считает корневой директорией для поиска выводимого контента, предлагаю в ней создать два каталога для двух разных сайтов hello.ru и world.ru, вы конечно же можете использовать свои домены и названия каталогов
$ sudo mkdir -p /var/www/hello.ru
$ sudo mkdir -p /var/www/world.ru
Папки созданы, но права на них имеет только root, значит надо дать доступ всем нашим пользователям
$ sudo chown -R $USER:$USER /var/www/hello.ru
$ sudo chown -R $USER:$USER /var/www/world.ru
Передаваемые параметры $USER:$USER это переменная, которая принимает значение имени пользователя от которого мы работаем. Далее задаём разрешения на чтение файлов
$ sudo chmod -R 755 /var/www
Для проверки работы виртуальных хостов можно создать тестовые страницы index.html в директориях каждого сайта
$ nano /var/www/hello.ru/index.html
Создаём внутри этого файла html разметку, так чтобы было понятно какой файл мы открыли в браузере, явно указывая на его принадлежность своему виртуальному хосту
<html>
<head>
<title>Welcome to hello.ru!</title>
</head>
<body>
<h1>Получилось, виртуальных хост на сайте hello.ru работает</h1>
</body>
</html>
Теперь тоже самое сделаем и в директории сайта world.ru
$ nano /var/www/world.ru/index.html
И снова заполняем этот файл
<html>
<head>
<title>Welcome to world.ru!</title>
</head>
<body>
<h1>Получилось, виртуальных хост на сайте world.ru работает</h1>
</body>
</html>
С подготовкой закончили, можно приступать к созданию самих виртуальных хостов. Apache хранит конфигурацию виртуальных хостов в отдельных файлах, в нем задаются и физическое расположение хостов, и способы ответа веб сервера. Имеется файл виртуального хоста по умолчанию 000-default.conf, Apache использует его как точку отсчёта, если DNS запись привела запрос на наш сервер, а виртуального хоста у нас нет для такого запроса, он обрабатывается исходя из настроек в этом файле, мы же скопируем его для дальнейшей настройки наших хостов
$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/hello.ru.conf
$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/world.ru.conf
Открываем первый файл
$ sudo nano /etc/apache2/sites-available/hello.ru.conf
И видим следующую картину
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Разберемся что к чему, VirtualHost *:80 означает что apache обращается к этим настройкам при запросе на любой адрес (*), на порту 80, если мы имеем несколько адресов на сервере, то мы можем более тонко контролировать запросы на адреса, вместо * вписать конкретный адрес. ServerAdmin это служебная информация сообщающая электронную почту администратора хоста. После этой строки мы вставляем две дополнительные директивы, которые будут сообщать с какими имена работает данный хост
ServerName hello.ru
ServerAlias www.hello.ru
ServerName сообщает основное имя, а ServerAlias дополнительное имя, зачастую это имя с добавлением www. Далее меняем директиву DocumentRoot
DocumentRoot /var/www/hello.ru
Это указывает в какой папке лежат файлы нашего хоста. В итоге у нас должно получиться
<VirtualHost *:80>
ServerAdmin admin@hello.ru
ServerName hello.ru
ServerAlias www.hello.ru
DocumentRoot /var/www/hello.ru
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Теперь делаем всё то же самое для второго файла, с учётом поправок, у нас должно получиться
<VirtualHost *:80>
ServerAdmin admin@world.ru
ServerName world.ru
ServerAlias www.world.ru
DocumentRoot /var/www/world.ru
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Следующий шагом мы должны активировать наши виртуальные хосты, раньше для этого приходилось создавать символьные ссылки, теперь у Apache есть специальная утилита которая делает это за нас, вводим команды
$ sudo a2ensite hello.ru.conf
$ sudo a2ensite world.ru.conf
И у нас остался дефолтный файл виртуального хоста 000-default.conf, давайте его отключим его
$ sudo a2dissite 000-default.conf
Перезапускаем наш веб сервер
$ sudo systemctl restart apache2
И если все прошло без ошибок, значит мы все сделали правильно. Пришло время проверить что у нас получилось, если вы настраивали виртуальные хосты для реальных действующих DNS записей, то у вас все должно работать, но если у вас имена как у меня, вымышленные, или даже не наши, то можно проверить настроив файл hosts, но делать это надо на локальной машине, на той где вы будете использовать браузер для проверки, открываем файл hosts (на Mac OS и Linux он расположен /etc/hosts, на Windows это C:\Windows\System32\drivers\etc\hosts) и вводим
You_server_ip hello.ru
You_server_ip world.ru
Сохраняем закрываем и открываем браузер, вводим в адресную строку наши имена виртуальных хостов
http://hello.ru
и
http://world.ru
Видим что на открытых страницах красуются надписи
Получилось, виртуальных хост на сайте hello.ru работает
и
Получилось, виртуальных хост на сайте world.ru работает
Соответственно.
На этом все, мы только что настроили два виртуальных хоста для двух разных сайтов на одной машине с одним адресом.
Все статьи можно посмотреть на сайте или на Zen Yandex