Вопрос или проблема
Моя информация о сервере:
Версия сервера: Apache/2.4.6 (CentOS)
Сервер собран: 19 ноября 2015 21:43:13
Я пытаюсь настроить виртуальный хост для 2 разных сайтов: biz.example.com и pin.example.com, которые размещены на одном сервере. Есть 2 разные папки, расположенные в ‘var/www/html/’, названные ‘biz’ и ‘pin’ с соответствующими файлами проекта для вышеупомянутых 2 веб-сайтов. Я пытаюсь настроить это следующим образом.
В файле /etc/hosts следующая конфигурация:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
xxx.xxx.xxx.xxx biz.example.com
xxx.xxx.xxx.xxx pin.example.com
xxx.xxx.xxx.xxx заменяется на IP-адрес сервера.
В файле /etc/httpd/conf/httpd.conf:
IncludeOptional sites-enabled/*.conf
Теперь в каталоге /etc/httpd/sites-available находятся файлы biz.conf и pin.conf. У меня также есть папка sites-enabled в /etc/httpd, в которой находятся 2 файла, указывающие на biz.conf и pin.conf каталога sites-available с помощью следующей команды:
ln -s /etc/httpd/sites-available/biz.conf /etc/httpd/sites-enabled/biz.conf
ln -s /etc/httpd/sites-available/pin.conf /etc/httpd/sites-enabled/pin.conf
Файл biz.conf имеет следующее:
<VirtualHost *:80>
ServerName http://biz.example.com/
ServerAlias http://biz.example.com/
DocumentRoot "/var/www/html/biz"
<directory "/var/www/html/biz">
Options Indexes FollowSymLinks
AllowOverride all
Order Deny,Allow
Allow from 127.0.0.1
</directory>
</VirtualHost>
А конфигурация в файле pin.conf указана следующим образом:
<VirtualHost *:80>
ServerName http://pin.example.com/
ServerAlias http://pin.example.com/
DocumentRoot "/var/www/html/pin"
<directory "/var/www/html/pin">
Options Indexes FollowSymLinks
AllowOverride all
Order Deny,Allow
Allow from 127.0.0.1
</directory>
</VirtualHost>
На этой настройке, если я пытаюсь получить доступ к http://biz.example.com/, загружается правильный веб-сайт (сайт biz). Но если я пытаюсь получить доступ к http://pin.example.com/, то также загружается сайт biz вместо сайта pin. Множественная конфигурация не работает одновременно.
Я также пытался объединить виртуальные конфигурации biz.conf и pin.conf в один файл, biz.conf, но это тоже не сработало.
Ответ:
1) Необходимо удалить завершающий слэш из ServerName и ServerAlias.
2) Здесь мы можем удалить ServerAlias, так как ServerName и ServerAlias имеют одно и то же значение.
Удалите кавычки из вашего пути:
DocumentRoot /var/www/html/pin
<directory /var/www/html/pin>
На этой настройке, если я пытаюсь получить доступ к http://biz.example.com/, загружается правильный веб-сайт (сайт biz). Но если я пытаюсь получить доступ к http://pin.example.com/, то также загружается сайт biz вместо сайта pin.
Это происходит потому, что как ServerName
, так и ServerAlias
не совпадают (неверный синтаксис), и в этом случае первый определенный VirtualHost
обрабатывает все запросы.
Это поведение описано в документации с очень похожей конфигурацией:
# Убедитесь, что Apache слушает на порту 80 Listen 80 <VirtualHost *:80> DocumentRoot "/www/example1" ServerName www.example.com # Другие директивы здесь </VirtualHost> <VirtualHost *:80> DocumentRoot "/www/example2" ServerName www.example.org # Другие директивы здесь </VirtualHost>
Знаки звездочки соответствуют всем адресам, поэтому основной сервер не обслуживает запросы. Поскольку виртуальный хост с
ServerName www.example.com
первым в конфигурационном файле, он имеет наивысший приоритет и может рассматриваться как по умолчанию или основной сервер. Это означает, что если поступает запрос, который не совпадает с одним из указанныхServerName
, он будет обслужен этим первым<VirtualHost>
.
Решение:
-
ServerName
должен быть без префиксаhttp://
и без завершающего слэша, т.е.ServerName biz.example.com
и
ServerName pin.example.com
-
ServerAlias
можно удалить, так как он имеет то же значение, что иServerName
. -
<Directory>
и</Directory>
должны начинаться с заглавной буквы. -
Синтаксис управления доступом Apache 2.2 следует изменить на новый синтаксис
Require
Apache 2.4.Order Deny,Allow Allow from 127.0.0.1
следует заменить на
Require local
Смотрите
Ответ или решение
Вопрос о настройке нескольких виртуальных хостов на сервере CentOS 7 с использованием Apache 2.4 является распространенной проблемой, и, к счастью, её можно решить, обратив внимание на несколько ключевых аспектов конфигурации. Ниже я постараюсь подробно освятить этапы диагностики и исправления данной ситуации.
Проблема: Неправильная работа виртуальных хостов
Вы столкнулись с ситуацией, когда, несмотря на корректную настройку для двух виртуальных хостов (biz.example.com и pin.example.com), оба домена загружают один и тот же сайт (biz.example.com). Причины таких проблем могут быть разнообразными, но чаще всего это связано с неправильной конфигурацией ServerName
, ServerAlias
, а также с особенностями обработки директив в Apache.
Проверка конфигурации
-
Конфигурация в файлах виртуальных хостов:
Ваши конфигурационные файлы для
biz.conf
иpin.conf
содержат следующие строчки:ServerName http://biz.example.com/ ServerName http://pin.example.com/
Стоит отметить, что
ServerName
должен содержать только доменное имя безhttp://
и без завершающего слэша. Исправьте ваши конфигурации следующим образом:Для
biz.conf
:ServerName biz.example.com
Для
pin.conf
:ServerName pin.example.com
-
Устранение лишних директив:
Как вы уже заметили, в вашем случае
ServerAlias
можно удалить, так как его значение повторяет значениеServerName
. Таким образом, упростите конфигурацию, чтобы избежать путаницы. -
Корректное указание директорий:
Убедитесь, что пути в директивах
DocumentRoot
и<Directory>
не содержат кавычек:DocumentRoot /var/www/html/biz <Directory /var/www/html/biz>
-
Обновление синтаксиса доступа:
В Apache 2.4 изменился подход к управлению доступом. Вместо старого синтаксиса
Order Deny,Allow
иAllow from
, следует использовать директивуRequire
. Например:Require local
Пример конфигурации для
biz.conf
будет выглядеть следующим образом:<VirtualHost *:80> ServerName biz.example.com DocumentRoot /var/www/html/biz <Directory /var/www/html/biz> Options Indexes FollowSymLinks AllowOverride all Require local </Directory> </VirtualHost>
Аналогично для
pin.conf
:<VirtualHost *:80> ServerName pin.example.com DocumentRoot /var/www/html/pin <Directory /var/www/html/pin> Options Indexes FollowSymLinks AllowOverride all Require local </Directory> </VirtualHost>
Дополнительные проверки
-
Пасте ссылки на конфигурацию: Убедитесь, что в файле
/etc/httpd/conf/httpd.conf
присутствует строкаIncludeOptional sites-enabled/*.conf
, что позволит Apache загружать ваши виртуальные хосты из каталогаsites-enabled
. -
Проверка ошибок: После внесения изменений проверьте конфигурацию на наличие ошибок с помощью команды:
apachectl configtest
-
Перезапуск Apache: Для применения изменений вам нужно перезапустить веб-сервер:
systemctl restart httpd
-
Проверка DNS: Убедитесь, что DNS-запись для ваших доменов (biz.example.com и pin.example.com) правильно указывает на ваш сервер и соответствует
xxx.xxx.xxx.xxx
.
Заключение
Следуя приведённым выше рекомендациям, вы сможете успешно настроить несколько виртуальных хостов на CentOS 7 с Apache 2.4. Убедитесь, что вы внимательно относитесь к каждому элементу конфигурации и используете актуальный синтаксис, чтобы избежать подобных ошибок в будущем. Если после всех изменений проблема всё ещё сохраняется, сделайте дополнительную проверку логов Apache, поскольку они могут содержать ценные подсказки о том, что идёт не так.