- Виртуальные хосты Apache
- Что такое виртуальный хост Apache
- Особенности настройки виртуальных хостов Apache в Windows
- Настройка в Apache виртуальных остов на основе имени
- Настройка виртуальных хостов Apache в Windows
- Виртуальные хосты на основе IP-адреса
- Виртуальные хосты на основе имени хоста
- Создание виртуальных хостов на Apache
- Создание виртуальных хостов 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). Содержимое этого файла можно просто удалить — оно нам не понадобится.
Виртуальные хосты описываются в контейнере . Внутри этого контейнера можно указать практически любые директивы Apache. Но обязательными являются только две:
- ServerName — определяет само имя хоста
- DocumentRoot — определяет, какие файлы показывать для этого имени, то есть содержит путь до сайта этого хоста
Секций может быть любое количество — столько, сколько вам нужно виртуальных хостов на данном сервере.
Ещё одно правило: первый раздел VirtualHost используется для сбора всех запросов, которые не соответствуют ServerName или ServerAlias в любом другом блоке . То есть первая секция является как бы дефолтной — для всех остальных запросов, которые не предназначены для виртуальных хостов. Поэтому нам нужно сделать как минимум два контейнера :
- Будет собирать запросы, которые не предназначены ни для какого из хостов. Обычные запросы, например, к 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, можно перенести в конфигурацию виртуальных хостов для их тонкой и индивидуальной настройки.
Настройка виртуальных хостов Apache в Windows
Виртуальные хосты могут быть привязаны к имени хоста (например, host.local ) или к IP-адресу (например, 127.0.0.3 ). Рассмотрим оба способа, и начнём с создания директорий виртуальных хостов. После установки Apache у меня уже есть директория DocumentRoot :
Внутри директории d:/work создаем еще три: localhost1 , localhost2 , localhost3 . Внутри каждой директории localhost* создаем еще одну директорию www . В каждую папку www добавляем файл index.html с любым содержанием, который позволил бы идентифицировать хост. Например
- в файл D:\work\localhost1\www\index.html добавляем текст «localhost1»
- в файл D:\work\localhost2\www\index.html добавляем текст «localhost2»
- в файл D:\work\localhost3\www\index.html добавляем текст «localhost3»
В файле C:\wamp\apache\conf\httpd.conf надо найти и раскоментировать строку:
В файле C:\wamp\apache\conf\extra\httpd-vhosts.conf надо закомментировать (или удалить) те строки, которые приведены по умолчанию.
Виртуальные хосты на основе IP-адреса
Для виртуальных хостов, которые привязаны к IP, требуются несколько IP-адресов. Таковые у нас имеются: это 127.0.0.1 , 127.0.0.2 , 127.0.0.3 , 127.0.0.4 , 127.0.0.5 и так далее. И к каждому из них можно привязать виртуальный хост.
Для этого добавляем в файл C:\Windows\System32\drivers\etc\hosts строки
А в файл C:\wamp\apache\conf\extra\httpd-vhosts.conf добавляем следующее
Теперь можно обращаться к виртуальным хостам так:
- http://127.0.0.1 , http://localhost/ , http://host.ru/ , http://www.host.ru/
- http://127.0.0.2 , http://localhost1/ , http://host1.ru/ , http://www.host1.ru/
- http://127.0.0.3 , http://localhost2/ , http://host2.ru/ , http://www.host2.ru/
- http://127.0.0.4 , http://localhost3/ , http://host3.ru/ , http://www.host3.ru/
Виртуальные хосты на основе имени хоста
Для этого добавляем в файл C:\Windows\System32\drivers\etc\hosts строки
А в файл C:\wamp\apache\conf\extra\httpd-vhosts.conf добавляем следующее
Теперь можно обращаться к виртуальным хостам так:
Создание виртуальных хостов на Apache
Данное руководство предназначено для использования в локальной среде тестирования на Windows. Инструкции подходят для Apache 2.4 и более поздних версий.
- Создайте вложенную папку внутри C:\vhosts для каждого виртуального хоста, который вы хотите добавить на сервер Apache.
- Откройте C:\WINDOWS\system32\drivers\etc\hosts в блокноте или в любом другом текстовом редакторе. Найдите следующую строку в нижней части документа:
- На отдельной пустой строке введите 127.0.0.1, затем поставьте пробел и введите имя виртуального хоста, который необходимо зарегистрировать. Например, чтобы создать виртуальный хост с именем mysite, введите следующую команду:
- Добавьте нужное количество дополнительных виртуальных хостов, каждый из которых должен быть введён на отдельной строке с указанием того же IP-адреса (127.0.0.1). Сохраните файл хостов, и закройте его.
- Откройте конфигурационный файл Apache, httpd.conf , в текстовом редакторе. Он находится в файлах Apache в папке conf . Если вы используете XAMPP, этот файл находится по адресу C:\xampp\apache\conf\httpd.conf . Прокрутите вниз до конца раздела Supplemental configuration и найдите следующий раздел (приблизительно около 500 строки):
- Сотрите # около начала второй строки, раздел теперь должен выглядеть так:
- Сохраните файл httpd.conf и закройте его.
- Откройте extra\httpd-vhosts.conf в блокноте или в любом другом текстовом редакторе. Если вы используете XAMPP, то адрес будет таким C:\xampp\apache\conf\extra\httpd-vhosts.conf . Главный раздел выглядит так:
В XAMPP все строки будут закомментированы. Вам нужно удалить # в начале строки, содержащей следующую директиву:
Создание виртуальных хостов Apache
Проблема виртуальных хостов становится достаточно острой, когда вам нужно создать 2 или более хостов. Для их администрирования обычным «localhost» не обойтись. С помощью виртуальных хостов и сервера Apache эту проблему вполне можно решить.
Создание виртуальных хостов Apache, это совсем несложная и быстрая работа.
Итак, вы установили и настроили Apache, как написано в статье «Настройка Apache и PHP» и получили, таким образом, директорию «C:\web_server\apache\htdocs\» для хранения документов. Однако в интернете вы поддерживаете (или, скорее всего, будете поддерживать) несколько серверов, а Apache создал только один. Конечно, можно структуру этих нескольких серверов хранить на одном сервере, однако проще и удобнее было бы создать несколько виртуальных хостов.
Мы создадим виртуальные хосты с использованием одного общего IP-адреса. Советую имена виртуальных хостов называть так же, как и на нынешнем Web-сервере, но только без суффикса «.net» или «.com» — это может многое упростить при программировании скриптов. Например, создадим виртуальный хост «profiphp«.
Для установки виртуальных хостов необходимо сделать некоторые изменения в файле конфигурации Apache «C:\web_server\apache\conf\httpd.conf«, а также в некоторых файлах Windows.
Создаем папку «localhost» в корневом каталоге диска (C:\localhost\). Далее создаем в ней каталог виртуального хоста — «profiphp» (C:\localhost\profiphp\). Именно в этой папке и будут содержаться файлы виртуального хоста.
Далее необходимо включить поддержку виртуальных хостов. Откройте файл «C:\web_server\apache\conf\httpd.conf» и добавьте следующие строки в самом конце файла после всех комментариев:
Директива «NameVirtualHost» говорит серверу, что указанный IP-адрес может использоваться несколькими виртуальными хостами, поэтому для обработки запросов, поступающих на этот адрес, нужно использовать протокол HTTP 1.1.
При необходимости можно добавить и другие параметры в блоки » » (например, DirectoryIndex и т.д.). Не переопределенные параметры наследуются виртуальным хостом от главного. Однако не советую злоупотреблять настройками в этих секциях — лучше сделать их в файле «.htaccess» в директории нужного хоста, так как компания, которая предоставляет настоящие виртуальные хосты в интернете, вряд ли позволит менять эти блоки.
Также следует заметить, что включить поддержку виртуальных хостов можно и другим вариантом. Для этого необходимо в файле «C:\web_server\apache\conf\httpd.conf» раскомментировать строку:
И редактировать файл «C:\web_server\apache\conf\extra\httpd-vhosts.conf«, в котором прописаны все виртуальные хосты. Данный вариант более понятный, поскольку у нас есть отдельный файл с настройками виртуальных хостов. Но если виртуальных хостов немного, тогда проще добавить настройки в конфигурационный файл Apache напрямую чем подключать отдельный файл.
Если виртуальных хостов много, то работа по их конфигурированию в одном файле «httpd.conf» может осложниться. Решением этой проблемы является создание специального конфигурационного файла для каждого виртуального узла и присоединение этих файлов с помощью директивы «include«. В конфигурационные файлы помещаются только контейнер » » и директивы внутри него.
Следующий шаг создания виртуального хоста — это изменение файла «C:\WINDOWS\system32\drivers\etc\hosts» операционной системы. Откройте данный файл и добавьте в него строки:
Если у Вас уже есть запись «localhost«, то второй добавлять не нужно.
При возникновении проблем с изменением данного файла, прочитайте тему Редактирование и защита файла hosts в Windows.