Проблема виртуальных хостов становится достаточно острой, когда вам нужно создать 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” и добавьте следующие строки в самом конце файла после всех комментариев:
# localhost NameVirtualHost 127.0.0.1 # Контейнер конфигурации виртуального хоста <VirtualHost localhost> # Домен по которому Вы сможете обращаться к виртуальному хосту. ServerName localhost:80 # Папка, в которой будет корень хоста. DocumentRoot "C:/web_server/apache/htdocs" # Файл, в который будут записываться ошибки. ErrorLog "c:/web_server/apache/htdocs/error.log" # Файл журнала доступа к хосту. CustomLog "c:/web_server/apache/htdocs/access.log" common </VirtualHost> # profiphp <VirtualHost profiphp> ServerName profiphp:80 DocumentRoot "C:/localhost/profiphp" ErrorLog "c:/localhost/profiphp/error.log" CustomLog "c:/localhost/profiphp/access.log" common </VirtualHost>
Директива “NameVirtualHost” говорит серверу, что указанный IP-адрес может использоваться несколькими виртуальными хостами, поэтому для обработки запросов, поступающих на этот адрес, нужно использовать протокол HTTP 1.1.
При необходимости можно добавить и другие параметры в блоки “<VirtualHost>” (например, DirectoryIndex и т.д.). Не переопределенные параметры наследуются виртуальным хостом от главного. Однако не советую злоупотреблять настройками в этих секциях – лучше сделать их в файле “.htaccess” в директории нужного хоста, так как компания, которая предоставляет настоящие виртуальные хосты в интернете, вряд ли позволит менять эти блоки.
Также следует заметить, что включить поддержку виртуальных хостов можно и другим вариантом. Для этого необходимо в файле “C:\web_server\apache\conf\httpd.conf” раскомментировать строку:
Include conf/extra/httpd-vhosts.conf
И редактировать файл “C:\web_server\apache\conf\extra\httpd-vhosts.conf“, в котором прописаны все виртуальные хосты. Данный вариант более понятный, поскольку у нас есть отдельный файл с настройками виртуальных хостов. Но если виртуальных хостом немного, тогда проще добавить настройки в конфигурационный файл Apache напрямую чем подключать отдельный файл.
Если виртуальных хостов много, то работа по их конфигурированию в одном файле “httpd.conf” может осложниться. Решением этой проблемы является создание специального конфигурационного файла для каждого виртуального узла и присоединение этих файлов с помощью директивы “include“. В конфигурационные файлы помещаются только контейнер “<VirtualHost>” и директивы внутри него.
Следующий шаг создания виртуального хоста – это изменение файла “C:\WINDOWS\system32\drivers\etc\hosts” операционной системы. Откройте данный файл и добавьте в него строки:
127.0.0.1 localhost 127.0.0.1 profiphp
Если у Вас уже есть запись “localhost“, то второй добавлять не нужно.
При возникновении проблем с изменением данного файла, прочитайте тему Редактирование и защита файла hosts в Windows.
Теперь запустите сервер Apache, откройте браузер, введите в адресной строке “http://profiphp/” и вы окажетесь в своем виртуальном хосте.
Если у вас по каким то причинам виртуальные хосты не работают, необходимо проверить файл логов, который находится по адресу: “/apache/logs/error.log“. Например, может содержаться уведомление:
AH00548: NameVirtualHost has no effect and will be removed in the next release /apache/conf/httpd.conf:553
Дело в том, что до версии Apache 2.3.11, директива NameVirtualHost должна была инструктировать сервер о конкретном IP-адресе и комбинации портов, которые могут использоваться в качестве виртуального хоста на основе имени. Версия 2.3.11 и более поздние, когда IP-адрес и комбинация портов используются на нескольких виртуальных хостах, виртуальный хост на основе имени автоматически включается для этого адреса. Поэтому в настоящее время эта директива не действует. Единственным решением данной проблемы является удаление директивы NameVirtualHost. Также необходимо заменить все значения VirtualHost:
<VirtualHost *: 80>
Измененный код:
<VirtualHost *:80> ServerName localhost:80 DocumentRoot "C:/web_server/apache/htdocs" ErrorLog "c:/web_server/apache/htdocs/error.log" CustomLog "c:/web_server/apache/htdocs/access.log" common </VirtualHost> # profiphp <VirtualHost *:80> ServerName profiphp DocumentRoot "C:/localhost/profiphp" ErrorLog "c:/localhost/profiphp/error.log" CustomLog "c:/localhost/profiphp/access.log" common </VirtualHost>