Настройка виртуальных хостов Apache
Apache — это один из самых популярных веб-серверов для размещения сайтов на хостингах и VPS, а также для создания тестовых окружений. Если на вашем сервере один сайт, то все довольно просто, все запросы, поступающие к серверу, отправляется этот единственный сайт. А что если сайтов несколько? Как Apache будет понимать кому адресован запрос?
Для решения этой задачи есть виртуальные хосты. В этой статье мы поговорим о том, как выполняется настройка виртуальных хостов Apache, а также как все это работает.
Как работают виртуальные хосты Apache?
Не будем пока о локальных системах. Если у вас есть веб-сайт, то наверное, вы занимались парковкой домена и уже знаете как все настраивается. Сначала используется DNS сервер, который выдает IP адрес вашего сервера всем клиентам, запросившим адрес этого домена. Затем клиенты отправляют запрос на ip вашего сервера, а веб-сервер уже должен его обработать.
Обычно, на хостингах один веб-сервер обслуживает десятки, а то и сотни сайтов. И как вы понимаете, все запросы поступают на один ip. Для распределения их между папками на сервере используется имя домена, которое передается вместе с запросом в HTTP заголовке «Host». Именно поэтому нужно выполнять парковку домена не только на DNS сервисе, но и на вашем сервере.
Вы настраиваете виртуальные хосты Apache, а затем веб-сервер сравнивает домен, переданный в заголовке «Host» с доступными виртуальными доменами и если находит совпадение, то возвращает содержимое настроенной папки или содержимое по умолчанию, или ошибку 404. Нужно сказать, что вы можете настроить виртуальный хост для любого домена, например, vk.com или losst.pro. Но пользователи смогут получить доступ к этому домену у вас, только если к вам будут поступать запросы от браузеров, в которых будет значиться этот домен. А теперь детальнее про настройку.
Настройка виртуальных хостов Apache?
Я уже подробно рассматривал как настроить Apache в отдельной статье. Поэтому не буду полностью расписывать здесь все конфигурационные файлы. Остановимся на файлах виртуальных хостов. Для удобства они вынесены в отдельные папки:
- /etc/apache2/sites-available
- /etc/apache2/sites-enabled
Ясно, что это разделение очень условно. Вы можете его убрать и добавлять свои виртуальные хосты прямо в основной конфигурационный файл. Все файлы из этих папок подключаются к нему с помощью директив Include. Но ведь так намного удобнее. В папке sites-available находятся все конфигурационные файлы, но они пока еще не активированы и отсюда не импортируются никуда. При активации нужного хоста на него просто создается ссылка в папку /etc/apache2/sites-enabled.
Для примера, создадим новый конфигурационный файл для виртуального хоста site1.ru. Для этого просто скопируем существующую конфигурацию для хоста по умолчанию — 000-default:
$ sudo cp /etc/apache2/sites-enabled/000-default.conf /etc/apache2/sites-enabled/site1.ru.conf
Сначала рассмотрим синтаксис того, что вы увидите в этом файле:
<VirtualHost адрес_хоста_для прослушивания : порт > ServerName домен ServerAlias псевдоним_домена ServerAdmin емейл@администратора DocumentRoot /путь/к/файлам/сайта ErrorLog /куда/сохранять/логи/ошибок/error.log CustomLog /куда/сохранять/логи/доступа/access.log combined </VirtualHost>
Это минимальная конфигурация, которую вам нужно указать, чтобы создать виртуальный хост Apache. Конечно, здесь вы можете использовать и другие директивы Apache, такие как Deny, Allow и многие другие. А теперь рассмотрим наш пример для тестового сайта site1.ru:
<VirtualHost *:80> ServerName site1.ru ServerAdmin webmaster@localhost DocumentRoot /var/www/html/site1.ru/ ErrorLog $

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

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

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

Настройка виртуальных хостов с SSL
Если вы хотите использовать современный безопасный протокол https для работы вашего виртуального хоста, то вам кроме обычного хоста на порту 80 будет необходимо создать виртуальный хост на порту 443. Здесь будет не так много отличий, вот пример, для нашего сайта site1.ru:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ServerName site1.ru ErrorLog $

Теперь о каждой новой строчке более подробно:
- <IfModule mod_ssl.c> — весь код в этой секции будет выполнен только в том случае, если активирован модуль mod_ssl. Это нужно для безопасности, чтобы если модуль не активирован, то код не вызывал ошибок;
- SSLEngine — включает поддержку SSL;
- SSLCertificateFile, SSLCertificateKeyFile — пути к файлам сертификата и приватного ключа;
- SSLOptions — для скриптов php, cgi и других мы передаем стандартные SSL опции.
Вот и все. Как видите, не так сложно. Осталось перезапустить Apache и проверить как все работает:
sudo a2enmod ssl sudo a2ensite site1.ru-ssl sudo systemctl restart apache2

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

Выводы
В этой статье мы рассмотрели как выполняется настройка виртуальных хостов Apache. Как видите, один веб-сервер может обслуживать сотни сайтов, а создание виртуальных хостов apache совсем не сложно. Надеюсь, эта статья была вам полезной. Если у вас остались вопросы, спрашивайте в комментариях!
Виртуальные хосты 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 можно открывать свои локальные сайты, например, по легко запоминающимся именам.
Особенности настройки виртуальных хостов Apache в Windows
Прежде чем приступить к настройке, совсем немного теории: при открытии сайтов по доменному имени или по имени хоста, веб-браузеру всё равно нужно знать IP адрес веб-сервера, куда делается запрос. Эту проблему решают DNS сервера. То есть перед открытием они спрашивают у сервера имён DNS, какой IP имеет сайт, например, apache-windows.ru?
Поскольку мы не можем добавить запись в DNS сервер для нашего локального сайта, мы воспользуемся другой возможностью операционной системы.
Суть в том, что аналогичные записи, как в DNS сервер, можно добавить в системный файл C:\Windows\System32\drivers\etc\hosts и Windows перед тем, как отправить запрос к DNS серверу, также сделает запрос к этому файлу.
Допустим я хочу создать виртуальный хост Apache с именем php.test, тогда я открываю файл C:\Windows\System32\drivers\etc\hosts и добавляю в него запись
Вы можете добавить в этот файл любое количество хостов с указанием любых IP адресов. Каждая запись должна быть на собственной строке. Первым должен быть помещён IP адрес, а затем соответствующее имя хоста. IP адрес и имя хоста должны быть разделены хотя бы одним пробелом. Вместо пробела можно использовать табуляцию (Tab).
В этом файле можно вставлять комментарии — комментариями считаются все строки, которые начинаются с символа # (решётка). Комментарии могут быть как размещены на отдельных строках, так и следовать после имени машины. Итак, мы выполнили подготовительный этап — прописали имя нашего виртуального хоста в файле hosts. В результате запрос, сделанный к этому виртуальному хосту, теперь будет перенаправляться веб-серверу Apache — именно этого мы и добивались.
Настройка в Apache виртуальных остов на основе имени
Теперь нам нужно сделать так, чтобы сам веб-сервер Apache мог обрабатывать пришедший запрос для определённого хоста. То есть мы наконец-то переходим к настройке Apache.
Откройте главный конфигурационный файл httpd.conf (например у меня он расположен по адресу C:\Server\bin\Apache24\conf\httpd.conf).
Найдите там строку:
И раскомментируйте её, чтобы получилось:
и убедитесь, что она раскомментирована.
Сохраните и закройте этот файл.
Теперь откройте сам файл httpd-vhosts.conf (c:\Server\bin\Apache24\conf\extra\httpd-vhosts.conf). Содержимое этого файла можно просто удалить — оно нам не понадобится.
Виртуальные хосты описываются в контейнере <VirtualHost>. Внутри этого контейнера можно указать практически любые директивы Apache. Но обязательными являются только две:
- ServerName — определяет само имя хоста
- DocumentRoot — определяет, какие файлы показывать для этого имени, то есть содержит путь до сайта этого хоста
Секций <VirtualHost> может быть любое количество — столько, сколько вам нужно виртуальных хостов на данном сервере.
Ещё одно правило: первый раздел VirtualHost используется для сбора всех запросов, которые не соответствуют ServerName или ServerAlias в любом другом блоке <VirtualHost>. То есть первая секция является как бы дефолтной — для всех остальных запросов, которые не предназначены для виртуальных хостов. Поэтому нам нужно сделать как минимум два контейнера <VirtualHost>:
- Будет собирать запросы, которые не предназначены ни для какого из хостов. Обычные запросы, например, к localhost или 127.0.0.1
- Контейнер самого хоста (у меня хост называется php.test)
Что будет если не сделать первый («дефолтный») контейнер? Все запросы, которые даже те, которые не предназначаются для php.test, всё равно будут обрабатываться как будто бы они пришли для хоста php.test.
Вместе с контейнером VirtualHost можно указать IP адрес и порт, которые прослушиваются для данного хоста. Если вы используете какой-то нестандартный порт, который ещё не открыт с помощью директивы Listen, то вам нужно добавить эту директиву с соответствующим портом в главный конфигурационный файл или прямо в файл httpd-vhosts.conf. Например, я хочу, чтобы виртуальный хост был привязан к порту 81, тогда перед VirtualHost мне нужно добавить:
Для нашего примера я буду использовать стандартный 80 порт, а в качестве IP адреса укажу звёздочку. Дефолтным хостом у меня является localhost, файлы которого расположены по пути C:/Server/data/htdocs/, тогда первый контейнер выглядит так:
Второй контейнер создан для хоста php.test, и его файлы будут располагаться в папке C:/Server/data/htdocs/virthosts/host1/, тогда полностью код контейнера будет выглядеть так:
Собираем всё вместе, полное содержимое файла httpd-vhosts.conf:
Чтобы сделанные изменения вступили в силу, перезапускаем веб-сервер:
Открываю в веб-браузере ссылку http://php.test и вижу там тот файл, который создан для этого хоста (то есть размещён в папке C:/Server/data/htdocs/virthosts/host1/):
Кроме этих самых необходимых директив, как уже было сказано, можно использовать практически любые настройки хостов, которые поддерживает главный конфигурационный файл Apache.
Например, кроме ServerName, можно добавить ещё ServerAlias:
Можно установить отдельные файлы логов для каждого виртуального хоста:
Установить с помощью директивы ServerAdmin электронную почту администратора данного виртуального хоста, включить HTTPS отдельно для данного хоста. Кстати, настройки HTTPS нужно прописывать индивидуально для каждого виртуального хоста, поскольку у каждого из них свои собственные SSL сертификаты.
На уровне виртуальных хостов можно прописать правила mod_rewrite, настроить аутентификацию, контроль доступа и любые другие настройки, которые поддерживает Apache, можно перенести в конфигурацию виртуальных хостов для их тонкой и индивидуальной настройки.
Виртуальный хостинг или виртуальный сервер — что выбрать?
На сайте каждого уважающего себя провайдера обязательно найдется сравнение традиционного веб-хостинга с виртуальными серверами. Авторы статей отмечают сходство VPS с физическими машинами и проводят параллели между ними и собственными квартирами, отводя веб-серверам коллективного пользования роль коммуналок. Поспорить с такой трактовкой трудно, хотя мы попытаемся все не так однозначно. Давайте заглянем чуть глубже поверхностных аналогий и разберем для начинающих пользователей особенности каждого варианта.
Как устроен традиционный хостинг?
Чтобы веб-сервер мог обслуживать различные сайты, были придуманы т.н. name based virtual host. Протокол HTTP предполагает возможность передачи в составе запроса URL (единого указателя ресурса) — это позволяет сервису понять, к какому именно сайту обращается браузер или иная клиентская программа. Остается только привязать доменное имя к нужному IP-адресу и прописать в конфигурации корневой каталог для виртуального хоста. После этого можно разложить файлы сайтов разных пользователей в их домашние каталоги и открыть доступ по FTP для администрирования.
Чтобы веб-приложения на стороне сервера (различные скрипты или даже системы управления контентом — CMS) запускались с правами того или иного пользователя хостинга, в Apache был создан специальный механизм suexec. Понятно, что настройки безопасности веб-сервера не позволяют пользователям лезть в чужой огород, но в целом это действительно похоже на коммунальную квартиру с раздельными комнатами и общим адресом (IP) на сотни сайтов. Сервер баз данных (обычно MySQL) для виртуальных хостов тоже общий, но доступ у пользователя хостинга есть только к его личным базам. Все программное обеспечение сервера кроме скриптов сайта обслуживается провайдером, менять его конфигурацию по своему усмотрению клиенты не могут. Процесс управления аккаунтами автоматизирован: для этих целей у каждого хостера есть специальная веб-панель, через которую можно управлять услугами.
Как устроены VPS?
Сравнение виртуальных серверов с физическими не вполне корректно, поскольку на одном «железном» хосте работает множество VPS. Образно выражаясь, это уже не коммуналка, а многоквартирный дом с общим подъездом и едиными несущими конструкциями. Для создания отдельных «квартир» (VPS) в пределах одного «дома» (физического сервера) задействованы средства установленной на хосте операционной системы и различные технологии виртуализации.
Если применяется виртуализация уровня ОС, процессы клиента просто работают в изолированном окружении (или неком контейнере) и не видят чужих ресурсов и процессов. Отдельная гостевая ОС в этом случае не запускается, а значит программное обеспечение в гостевом окружении должно быть бинарно совместимо с системой на физическом хосте — как правило клиентам предлагают специально модифицированные под такой способ эксплуатации дистрибутивы GNU/Linux. Есть и более продвинутые варианты, вплоть до эмуляции физической машины, на которой можно запустить почти любую гостевую ОС даже с собственного инсталляционного образа.
С точки зрения администратора любой VPS мало чем отличается от физического сервера. При заказе услуги хостер разворачивает выбранную конфигурацию, а дальше обслуживание системы ложится на плечи клиента. При этом можно установить нужное программное обеспечение и как угодно его настроить — полная свобода выбора веб-сервера, версии PHP, сервера баз данных и т.д. IP-адрес у VPS тоже свой, его не придется делить с сотней — другой соседей. На этом с описанием основных различий мы закончим и перейдем к преимуществам и недостаткам, от которых зависит выбор решения.
Какой вариант проще и удобнее?
Виртуальный хостинг не требует администрирования обеспечивающего работу сайта окружения. Клиенту не придется самому устанавливать, настраивать и обновлять системное и прикладное ПО, а в ряде случаев панель управления хостингом позволяет устанавливать и CMS — такой вариант выглядит привлекательным для новичков. С другой стороны задачи тонкой настройки CMS все равно придется решать самостоятельно, к тому же за относительно низким порогом входа прячется меньшая гибкость решения. Выбор софта будет ограничен: на виртуальном хостинге нельзя, например, по своему желанию поменять версию PHP или MySQL, а тем более установить какой-нибудь экзотический пакет или выбрать альтернативную панель управления — придется пользоваться предложенными поставщиком услуг средствами. Если провайдер проведет обновление сервера, в ваших веб-приложениях могут возникнуть проблемы программной совместимости.
VPS лишен этих недостатков традиционного хостинга. Клиент может сам выбрать нужную ему ОС (необязательно Linux) и установить любое программное обеспечение. Настраивать и администрировать окружение придется самостоятельно, однако процесс можно упростить — все хостеры предлагают сразу инсталлировать на виртуальный сервер панель управления, которая автоматизирует процесс администрирования. Благодаря ей большой разницы в сложности управления между традиционным хостингом и VPS не будет. К тому же никто не запрещает установить собственную панель, не входящую в список предложений провайдера. В целом накладные расходы на администрирование VPS не так велики, а большая гибкость решения с лихвой окупает некоторые дополнительные трудозатраты.
Какой вариант безопаснее и надежнее?
Может показаться, будто размещение сайтов на традиционном хостинге безопаснее. Ресурсы разных пользователей надежно изолированы друг от друга, а за актуальностью программного обеспечения сервера следит провайдер — это отличный вариант, но только на первый взгляд. Злоумышленники далеко не всегда эксплуатируют уязвимости в системном ПО, обычно сайты взламывают, используя незакрытые дыры в скриптах и небезопасные настройки систем управления контентом. В этом смысле никаких преимуществ у традиционного хостинга нет — ресурсы клиентов работают на тех же самых CMS — зато недостатков хватает.
Главная проблема виртуального хостинга заключается в общем IP-адресе для сотен сайтов разных пользователей. Если кого-то из ваших соседей взломают и начнут, например, рассылать через него спам или проводить другие вредоносные действия, общий адрес может попасть в различные черные списки. В этом случае пострадают все клиенты, чьи сайты используют тот же IP. Если сосед попадет под DDoS-атаку или создаст чрезмерную нагрузку на вычислительные ресурсы, пострадают остальные «жильцы» сервера. Управлять выделением квот для отдельных VPS провайдеру намного проще, к тому же виртуальному серверу присваивается отдельный IP и необязательно один: можно заказать любое их количество, дополнительный сервис по защите от DDoS, антивирусный сервис и т.д. В смысле безопасности и надежности VPS превосходит традиционный хостинг, нужно только своевременно обновлять установленные программы.
Какой вариант дешевле?
Еще несколько лет назад ответ на этот вопрос был однозначным — при всех ее недостатках комната в коммуналке была намного дешевле отдельной квартиры. Отрасль не стоит на месте и сейчас на рынке появилось множество бюджетных VPS: у нас можно арендовать собственный виртуальный сервер на Linux за 130 рублей в месяц. В среднем месяц работы бюджетного VPS обойдется клиенту в 150 — 250 рублей, при таких ценах мириться с проблемами традиционного хостинга нет смысла, кроме случая, когда на сервере нужно разместить простейшие сайты-визитки. К тому же тарифные планы виртуального хостинга ограничивают количество сайтов и баз данных, а на VPS клиент ограничен только емкостью накопителя и вычислительными возможностями сервера.
Работаем с виртуальными хостами
Так как большинство читателей работают с операционной системой Windows, то сначала организуем виртуальные хосты в Windows 7.
Виртуальные хосты в Windows 7
В качестве примера поместим один или несколько проектов на диск D: локального компьютера. Сначала организуем структуру каталогов. На диске D: создаем каталог «mysites», а в нём каталог для первого сайта «site1». В каталоге «site1» сделаем два подкаталога: «www» и «logs». В первом подкаталоге будет располагаться сам сайт, а во втором, журналы виртуального хоста: access.log (журнал доступа) и error.log (журнал ошибок).

Файлы журналов создавать не надо, они будут созданы автоматически. А в каталоге «www», пока нет сайта, поместим простейший файл-заглушку «index.html» следующего содержания:

Теперь немного поправим настройки для виртуальных хостов веб-сервера Apache. Открываем C:\xampp\apache\conf\extra\ httpd-vhosts.conf
Как видим, этот файл уже содержит два примера виртуальных хостов. Не будем их трогать, а ниже разместим следующие строки:
Первая директива NameVirtualHost *:80 включает поименное использование виртуальных хостов на 80-ом порту (обычный http, если нужен https, используем 443 порт).
Следующие четыре строки это общая секция для всех виртуальных хостов. Если клиент обращается к серверу по IP-адресу или по несуществующему имени он попадет на этот виртуальный хост. В нашем случае в корневую директорию веб-сервера. Остальные строки это описание нашего первого виртуального хоста. Если нужно добавить ещё один виртуальный хост, то просто копируем эту секцию, вставляем ниже и по аналогии изменяем данные. Сохраняем файл.
Значение данных в секции виртуального хоста:
- <VirtualHost *:80> Какой порт используется
- ServerAdmin webmaster@site1.ru Эл. почта администратора сайта
- DocumentRoot «D:/mysites/site1/www» Корневой каталог сайта
- ServerName site1 Имя хоста
- ServerAlias www.site1 Псевдоним хоста. Можно обращаться, используя псевдоним
- ErrorLog «D:/mysites/site1/logs/error.log» Расположение журнала ошибок
- CustomLog «D:/mysites/site1/logs/access.log» common Расположение журнала доступа. Оператор common определяет общую степень детализации журнала. Если нужна более подробная детализация, то вместо common пишем combined
- <Directory «D:/mysites/site1/www»> Подсекция, в которой определяются права и настройки для конкретного каталога.
- AllowOverride All Эта директива нужна для правильной работы системы SEF
Из панели управления XAMPP перестартовываем Apache. Изменяем файл C:\Windows\System32\drivers\etc\hosts. Дописываем в него две строки:
Вместо 127.0.0.1 можно написать 127.0.0.2, а для следующего виртуального хоста 127.0.0.3, но в этом нет особой нужды. Об этом напишу в другой раз. А сейчас сохраняем файл. Открываем браузер и адресной строке вводим http://site1 или просто site1. Если всё сделано правильно, видим информацию из файла-заглушки.

Виртуальные хосты в Debian GNU/Linux
Настройка виртуальных хостов в Linux мало чем отличается от их настройки в Windows. Разве что созданием структуры каталогов. Оно и понятно, Apache кроссплатформенное решение, настроечные файлы практически одинаковы.
При установке XAMPP, корневой директорией веб-сервера Apache является каталог /opt/lampp/htdocs. А вот когда Apache устанавливается в Linux отдельным пакетом, то по умолчанию корневой директорией является каталог /var/www. Вот в этот каталог мы и поместим виртуальные хосты.
В качестве примера, создадим каталог /var/www/site1, который будет содержать два подкаталога: logs для журналов и www для файлов сайта.

Делаем владельцем каталога site1 пользователя www-data:
В каталог /var/www/site1/www помещаем файл-заглушку index.html

Открываем файл /opt/lampp/etc/extra/httpd-vhosts.conf и удаляем всё его содержимое. Добавляем следующий код:
Последние 15 строк кода – это как раз описание виртуального хоста site1. Если в дальнейшем надо будет добавить ещё один виртуальный хост, то просто скопируйте эти строки и измените пути к директориям.
Открываем файл /opt/lamp/etc/httpd.conf и раскомментируем (т. е. удалим символ решетки) строку 488:
Правим файл /etc/hosts. Ниже строки
Вставляем строку следующие строки:
В адресной строке браузера набираем
http://site1 или просто site1

Если вы видите страницу-заглушку, значит, всё сделали правильно!
Помните, что у нас вы можете не только купить готовый сайт или заказать его разработку, но и подобрать подходящий тариф поддержки сайта, заказать продвижение сайта в поисковых системах, а так же зарегистрировать домен в одной из двухсот доменных зон и выбрать недорогой тариф хостинга! Айтишник РУ