Андрей Смирнов
Время чтения: ~14 мин.
Просмотров: 17

Настройка виртуальных хостов на Apache для начинающих

Термин Virtual Host (виртуальный хост) относится к практике запуска более чем одного сайта (такие как company1.example.com и company2.example.com) на одной машине. Виртуальные хосты могут быть «IP-based», что означает, что у вас есть различные IP адреса для каждого сайта, или «name-based», что означает, что у вас есть несколько имён, работающие на каждом IP адресе. Для конечного пользователя тот факт, что эти сайты работают на одном и том же физическом сервере, не является очевидным, то есть он может об этом и не знать.

В этой статье я рассмотрю создание виртуальных хостов на основе имени, так как это более распространено, особенно на локальном сервере. О других вариантах, о создании виртуальных хостов на основе IP, в том числе на локальном сервере, а также об автоматическом создании виртуальных хостов, смотрите в статье «Настройка Apache в Windows».

Можно создать виртуальный хост Apache — один или сразу много. Суть хостов Apache в том, что в браузере вместо ввода IP к сайту можно обратиться по имени хоста — точно также как мы открываем все сайты в Интернете: мы вводим доменное имя, а не IP адрес сайта. Аналогично можно настроить и на локальном веб-сервере: в браузере вместо 127.0.0.1 или вместо localhost можно открывать свои локальные сайты, например, по легко запоминающимся именам.

Прежде чем приступить к настройке, совсем немного теории: при открытии сайтов по доменному имени или по имени хоста, веб-браузеру всё равно нужно знать IP адрес веб-сервера, куда делается запрос. Эту проблему решают DNS сервера. То есть перед открытием они спрашивают у сервера имён DNS, какой IP имеет сайт, например, apache-windows.ru?

Поскольку мы не можем добавить запись в DNS сервер для нашего локального сайта, мы воспользуемся другой возможностью операционной системы.

Суть в том, что аналогичные записи, как в DNS сервер, можно добавить в системный файл C:WindowsSystem32driversetchosts и Windows перед тем, как отправить запрос к DNS серверу, также сделает запрос к этому файлу.

Допустим я хочу создать виртуальный хост Apache с именем php.test, тогда я открываю файл C:WindowsSystem32driversetchosts и добавляю в него запись

  127.0.0.1               php.test

hosts.png

Вы можете добавить в этот файл любое количество хостов с указанием любых IP адресов. Каждая запись должна быть на собственной строке. Первым должен быть помещён IP адрес, а затем соответствующее имя хоста. IP адрес и имя хоста должны быть разделены хотя бы одним пробелом. Вместо пробела можно использовать табуляцию (Tab).

В этом файле можно вставлять комментарии — комментариями считаются все строки, которые начинаются с символа # (решётка). Комментарии могут быть как размещены на отдельных строках, так и следовать после имени машины. Итак, мы выполнили подготовительный этап — прописали имя нашего виртуального хоста в файле hosts. В результате запрос, сделанный к этому виртуальному хосту, теперь будет перенаправляться веб-серверу Apache — именно этого мы и добивались.

Теперь нам нужно сделать так, чтобы сам веб-сервер Apache мог обрабатывать пришедший запрос для определённого хоста. То есть мы наконец-то переходим к настройке Apache.

Откройте главный конфигурационный файл httpd.conf (например у меня он расположен по адресу C:ServerbinApache24confhttpd.conf).

Найдите там строку:

  #Include conf/extra/httpd-vhosts.conf

И раскомментируйте её, чтобы получилось:

  Include conf/extra/httpd-vhosts.conf

Найдите строку

  LoadModule log_config_module modules/mod_log_config.so

и убедитесь, что она раскомментирована.

Сохраните и закройте этот файл.

Теперь откройте сам файл httpd-vhosts.conf (c:ServerbinApache24confextrahttpd-vhosts.conf). Содержимое этого файла можно просто удалить — оно нам не понадобится.

  • ServerName — определяет само имя хоста
  • DocumentRoot — определяет, какие файлы показывать для этого имени, то есть содержит путь до сайта этого хоста

Ещё одно правило: первый раздел VirtualHost используется для сбора всех запросов, которые не соответствуют ServerName или ServerAlias в любом другом блоке . То есть первая секция является как бы дефолтной — для всех остальных запросов, которые не предназначены для виртуальных хостов. Поэтому нам нужно сделать как минимум два контейнера :

  1. Будет собирать запросы, которые не предназначены ни для какого из хостов. Обычные запросы, например, к localhost или 127.0.0.1
  2. Контейнер самого хоста (у меня хост называется php.test)

Что будет если не сделать первый («дефолтный») контейнер? Все запросы, которые даже те, которые не предназначаются для php.test, всё равно будут обрабатываться как будто бы они пришли для хоста php.test.

Вместе с контейнером VirtualHost можно указать IP адрес и порт, которые прослушиваются для данного хоста. Если вы используете какой-то нестандартный порт, который ещё не открыт с помощью директивы Listen, то вам нужно добавить эту директиву с соответствующим портом в главный конфигурационный файл или прямо в файл httpd-vhosts.conf. Например, я хочу, чтобы виртуальный хост был привязан к порту 81, тогда перед VirtualHost мне нужно добавить:

  Listen 81

Для нашего примера я буду использовать стандартный 80 порт, а в качестве IP адреса укажу звёздочку. Дефолтным хостом у меня является localhost, файлы которого расположены по пути C:/Server/data/htdocs/, тогда первый контейнер выглядит так:

<virtualhost>      ServerName localhost      DocumentRoot "C:/Server/data/htdocs/"  </virtualhost>

Второй контейнер создан для хоста php.test, и его файлы будут располагаться в папке C:/Server/data/htdocs/virthosts/host1/, тогда полностью код контейнера будет выглядеть так:

<virtualhost>      ServerName php.test      DocumentRoot "C:/Server/data/htdocs/virthosts/host1/"  </virtualhost>

Собираем всё вместе, полное содержимое файла httpd-vhosts.conf:

<virtualhost>      ServerName localhost      DocumentRoot "C:/Server/data/htdocs/"  </virtualhost><virtualhost>      ServerName php.test      DocumentRoot "C:/Server/data/htdocs/virthosts/host1/"  </virtualhost>

Чтобы сделанные изменения вступили в силу, перезапускаем веб-сервер:

  c:ServerbinApache24binhttpd.exe -k restart

Открываю в веб-браузере ссылку http://php.test и вижу там тот файл, который создан для этого хоста (то есть размещён в папке C:/Server/data/htdocs/virthosts/host1/):

apache-virtual-host.png

Кроме этих самых необходимых директив, как уже было сказано, можно использовать практически любые настройки хостов, которые поддерживает главный конфигурационный файл Apache.

Например, кроме ServerName, можно добавить ещё ServerAlias:

  ServerName dummy-host.example.com  ServerAlias www.dummy-host.example.com

Можно установить отдельные файлы логов для каждого виртуального хоста:

  ErrorLog "logs/dummy-host.example.com-error.log"  CustomLog "logs/dummy-host.example.com-access.log" common

Установить с помощью директивы ServerAdmin электронную почту администратора данного виртуального хоста, включить HTTPS отдельно для данного хоста. Кстати, настройки HTTPS нужно прописывать индивидуально для каждого виртуального хоста, поскольку у каждого из них свои собственные SSL сертификаты.

На уровне виртуальных хостов можно прописать правила mod_rewrite, настроить аутентификацию, контроль доступа и любые другие настройки, которые поддерживает Apache, можно перенести в конфигурацию виртуальных хостов для их тонкой и индивидуальной настройки.

Связанные статьи:

  • Несколько сайтов на Apache (100%)
  • Виртуальный хост Apache по умолчанию. _default_ и catch-all в Apache (100%)
  • Apache для Windows (54.2%)
  • Как запустить Apache на Windows (54.2%)
  • Документация по Apache на русском языке (54.2%)
  • Как установить MariaDB 7.4 в Windows (RANDOM — 50%)

Каждый владелец VPS сталкивается с вопросом, как разместить несколько сайтов на одном сервере с одним IP-адресом. Если вы используете в качестве веб-сервера Apache,виртуальные хосты (virtual hosts) — верное решение для разделения ресурсов и отдельной конфигурации для каждого сайта.

Предварительная настройка

Все действия осуществляются на сервере через подключение по SSH. Перед тем как приступить к настройке виртуальных хостов, необходимо произвести настройку сервера.

Создание пользователя

По умолчанию после создания сервера для доступа к нему создаётся root пользователь. В целях безопасности не рекомендуем работать под суперюзером.

Чтобы создать пользователя, введите команду:

adduser userName

Где UserName — имя нового пользователя.

Система попросит ввести пароль для нового пользователя и дополнительную информацию:

Теперь установите права доступа, чтобы новый пользователь мог использовать команду sudo. Для этого выполните команду:

usermod -aG sudo UserName

Где UserName — имя созданного ранее пользователя.

Готово. Новый пользователь создан. Завершите SSH-сеанс под root и подключитесь к серверу под новым пользователем.

Установка Ubuntu Apache

Чтобы выполнить действия ниже, у вас должен быть установлен Apache. Для полноценной работы сайта рекомендуем установить LAMP (Linux Apache MySQL PHP). Это минимальный набор ПО, который чаще всего используется для размещения и запуска сайта. Как установить LAMP, вы можете узнать в инструкции.

Подготовка доменов

Ваши домены должны быть привязаны к облачному серверу. Сделать это вы можете по инструкции.

Обратите внимание

В данной инструкции будут приведены примеры с доменами faq-reg.ru и support-faq.ru. В тех местах, где они будут встречаться, измените домены на свои.

Подготовка каталогов

Подготовим структуру каталогов. Рабочая директория Apache — /var/www. В данной директории мы будем создавать отдельные каталоги для каждого домена (виртуального хоста).

Чтобы создать каталоги, выполните команды:

sudo mkdir -p /var/www/faq-reg.ru/
sudo mkdir -p /var/www/support-faq.ru/

В этих каталогах будут храниться файлы вашего сайта. Далее необходимо установить права доступа к ним:

sudo chmod -R 755 /var/www
sudo chown -R $USER:$USER /var/www/faq-reg.ru/
sudo chown -R $USER:$USER /var/www/support-faq.ru/

Готово. Структура каталогов и права доступа настроены. Далее подготовим демостраницы.

Создание демостраниц

Перед тем как настроить конфигурационный файл, для удобной проверки финального результата мы создадим демостраницу для каждого виртуальная хоста. В каждую папку мы поместим файл index.html, в котором будет строка с именем домена.

Для faq-reg.ru:

echo "

faq-reg.ru

" > /var/www/faq-reg.ru/index.html</pre>

Для support-faq.ru:

echo "

support-faq.ru

" > /var/www/support-faq.ru/index.html</pre>

Не забудьте заменить доменные имена на ваши.

Готово. Теперь после настройки виртуальных хостов мы сможем проверить корректность их работы.

Создание конфигурационных файлов и настройка

Файл конфигурации Ubuntu Apache virtual hosts отвечает за обработку запросов к разным доменам. У Apache существует дефолтный файл 000-default.conf, который можно использовать в качестве шаблона. Для каждого виртуального хоста необходимо будет скопировать его, задать произвольное имя (рекомендуем использовать имя домена) и произвести определённые настройки. Обязательное условие — соблюдение расширения файла: .conf

Создание конфига для faq-reg.ru

  1. 1.

    Скопируйте шаблон конфига для первого домена с помощью команды:

    sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/faq-reg.ru.conf
  2. 2.

    Откройте созданный файл командой:

    sudo nano /etc/apache2/sites-available/faq-reg.ru.conf
  3. 3.

    В файле присутствует секция VirtualHost для обработки запросов на 80 порт (порт для HTTP-запросов). Измените следующие строки:

    ServerAdmin webmaster@localhost DocumentRoot /var/www/html

    Вместо webmaster@localhost укажите электронный адрес администратора, вместо /var/www/html укажите каталог домена, который мы создали на этапе подготовки, в нашем случае это /var/www/faq-reg.ru/

    Затем добавьте ещё две строки:

    ServerName   faq-reg.ru ServerAlias  www.faq-reg.ru

    Сохраните изменения в файле и закройте его.

    Результат:

  4. 4.

    Настройка виртуального хоста для первого домена завершена. Скопируйте этот файл для второго домена с помощью команды:

    sudo cp /etc/apache2/sites-available/faq-reg.ru.conf /etc/apache2/sites-available/support-faq.ru.conf

    Не забудьте изменить faq-reg.ru.conf и support-faq.ru.conf на имена ваших доменов.

  5. 5.

    Откройте файл для редактирования:

    sudo nano /etc/apache2/sites-available/support-faq.ru.conf
  6. 6.

    Измените DocumentRoot, ServerName и ServerAlias в соответствии с данными для второго домена и сохраните изменения:

  7. 7.

    Деактивируйте конфиг по умолчанию командой:

    sudo a2dissite 000-default.conf

    И активируйте созданные конфиги:

    sudo a2ensite faq-reg.ru.conf
    sudo a2ensite support-faq.ru.conf
  8. 8.

    Перезапустите Apache командой:

    sudo service apache2 restart

Готово. Создание и настройка виртуальных хостов завершена. Далее можем проверить результат.

Проверка работы виртуальных хостов

Если вы заранее привязали ваши домены к серверу и делегирование уже произошло, при переходе по домену должна открыться страница, которую мы создали на этапе «Создание демостраниц».

Если с момента изменения DNS прошло менее 24 часов и домен ещё не делегирован, увидеть результат вы можете, настроив локальные хосты в файле hosts. Подробнее в инструкции.

При переходе по домену faq-reg.ru:

При переходе по домену support-faq.ru:

Готово. Файл index.html можно удалить. Далее вы можете загрузить файлы сайта в созданные директории.

5 —>

Не нашли ответа на свой вопрос?

Заявка в службу поддержки

Apache — это один из самых популярных веб-серверов для размещения сайтов на хостингах и VPS, а также для создания тестовых окружений. Если на вашем сервере один сайт, то все довольно просто, все запросы, поступающие к серверу, отправляется этот единственный сайт. А что если сайтов несколько? Как Apache будет понимать кому адресован запрос?

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

Не будем пока о локальных системах. Если у вас есть веб-сайт, то наверное, вы занимались парковкой домена и уже знаете как все настраивается. Сначала используется DNS сервер, который выдает IP адрес вашего сервера всем клиентам, запросившим адрес этого домена. Затем клиенты отправляют запрос на ip вашего сервера, а веб-сервер уже должен его обработать.

Обычно, на хостингах один веб-сервер обслуживает десятки, а то и сотни сайтов. И как вы понимаете, все запросы поступают на один ip. Для распределения их между папками на сервере используется имя домена, которое передается вместе с запросом в HTTP заголовке «Host». Именно поэтому нужно выполнять парковку домена не только на DNS сервисе, но и на вашем сервере.

Вы настраиваете виртуальные хосты Apache, а затем веб-сервер сравнивает домен, переданный в заголовке «Host» с доступными виртуальными доменами и если находит совпадение, то возвращает содержимое настроенной папки или содержимое по умолчанию, или ошибку 404. Нужно сказать, что вы можете настроить виртуальный хост для любого домена, например, vk.com или losst.ru. Но пользователи смогут получить доступ к этому домену у вас, только если к вам будут поступать запросы от браузеров, в которых будет значиться этот домен. А теперь детальнее про настройку.

Я уже подробно рассматривал как настроить Apache в отдельной статье. Поэтому не буду полностью расписывать здесь все конфигурационные файлы. Остановимся на файлах виртуальных хостов. Для удобства они вынесены в отдельные папки:

  • /etc/apache2/sites-available
  • /etc/apache2/sites-enabled

Ясно, что это разделение очень условно. Вы можете его убрать и добавлять свои виртуальные хосты прямо в основной конфигурационный файл. Все файлы из этих папок подключаются к нему с помощью директив Include. Но ведь так намного удобнее. В папке sites-available находятся все конфигурационные файлы, но они пока еще не активированы и отсюда не импортируются никуда. При активации нужного хоста на него просто создается ссылка в папку /etc/apache2/sites-enabled.

Для примера, создадим новый конфигурационный файл для виртуального хоста site1.ru. Для этого просто скопируем существующую конфигурацию для хоста по умолчанию — 000-default:

Сначала рассмотрим синтаксис того, что вы увидите в этом файле:

<virtualhost>адрес_хоста_для прослушивания:порт></virtualhost>ServerName доменServerAlias псевдоним_доменаServerAdmin емейл@администратораDocumentRoot /путь/к/файлам/сайтаErrorLog /куда/сохранять/логи/ошибок/error.logCustomLog /куда/сохранять/логи/доступа/access.log combined

Это минимальная конфигурация, которую вам нужно указать, чтобы создать виртуальный хост Apache. Конечно, здесь вы можете использовать и другие директивы Apache, такие как Deny, Allow и многие другие. А теперь рассмотрим наш пример для тестового сайта site1.ru:

<virtualhost> ServerName site1.ru ServerAdmin webmaster@localhost DocumentRoot /var/www/html/site1.ru/ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </virtualhost>

Snimok-ekrana-ot-2017-10-04-21-20-12-1024x576.png

Здесь мы используем звездочку вместо ip адреса, это значит, что веб-сервер будет слушать соединения на всех адресах, как на внешнем, так и на localhost. Порт 80, это порт по умолчанию. Затем указываем домен, электронный адрес администратора, и путь к папке, в которой будут находиться данные сайта. Две строчки Log говорят куда сохранять логи, но добавлять их необязательно. Дальше, нам нужно активировать этот хост. Мы можем вручную создать ссылку или использовать уже заготовленную команду:

Snimok-ekrana-ot-2017-10-04-21-22-08-1024x576.png

Затем перезапустите Apache:

И нам осталось все это протестировать. Если ваш сервер имен еще не направляет запросы к домену на ваш ip, а вы хотите уже проверить как все работает, можно пойти обходным путем. Для этого достаточно внести изменения в файл /etc/hosts на машине, с которой вы собрались открывать сайт. Этот файл, такой себе локальный DNS. Если компьютер находит ip для домена в нем, то запрос в интернет уже не отправляется. Если вы собираетесь тестировать с той же машины, на которую установлен Apache2, добавьте:

127.0.0.1 site1.ru

Snimok-ekrana-ot-2017-10-04-22-19-02-1024x576.png

Если же это будет другой компьютер, то вместо 127.0.0.1 нужно использовать адрес вашего сервера, на котором установлен Apache. Затем можете открыть сайт в браузере:

site1.ru

Snimok-ekrana-ot-2017-10-04-22-19-45-1024x576.png

Если вы хотите использовать современный безопасный протокол https для работы вашего виртуального хоста, то вам кроме обычного хоста на порту 80 будет необходимо создать виртуальный хост на порту 443. Здесь будет не так много отличий, вот пример, для нашего сайта site1.ru:

<ifmodule><virtualhost> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ServerName site1.ru ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key <filesmatch> SSLOptions +StdEnvVars </filesmatch></virtualhost></ifmodule>

Snimok-ekrana-ot-2017-10-04-22-08-00-1024x576.png

Теперь о каждой новой строчке более подробно:

  • SSLEngine — включает поддержку SSL;
  • SSLCertificateFile, SSLCertificateKeyFile — пути к файлам сертификата и приватного ключа;
  • SSLOptions — для скриптов php, cgi и других мы передаем стандартные SSL опции.

Вот и все. Как видите, не так сложно. Осталось перезапустить Apache и проверить как все работает:

Snimok-ekrana-ot-2017-10-04-22-20-30-1024x576.png

Затем откройте https адрес в браузере:

https://site1.ru

Snimok-ekrana-ot-2017-10-04-22-49-58-1024x576.png

В этой статье мы рассмотрели как выполняется настройка виртуальных хостов Apache. Как видите, один веб-сервер может обслуживать сотни сайтов, а создание виртуальных хостов apache совсем не сложно. Надеюсь, эта статья была вам полезной. Если у вас остались вопросы, спрашивайте в комментариях!

Используемые источники:

  • https://apache-windows.ru/виртуальные-хосты-apache/
  • https://www.reg.ru/support/vps-servery/oblachnie-serveri-vps/ustanovka-programmnogo-obespechenija/kak-nastroit-virtualnye-hosty-v-apache-na-ubuntu-16041804
  • https://losst.ru/nastrojka-virtualnyh-hostov-apache

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации