Несколько виртуальных хостов в CentOS 7 не работают вместе.

Вопрос или проблема

Моя информация о сервере:

Версия сервера: 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 обрабатывает все запросы.

Это поведение описано в документации с очень похожей конфигурацией:

Запуск нескольких веб-сайтов на основе имени на одном IP-адресе (httpd.apache.org/docs/2.4/vhosts/examples.html)

# Убедитесь, что 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>.


Решение:

  1. ServerName должен быть без префикса http:// и без завершающего слэша, т.е.

    ServerName biz.example.com
    

    и

    ServerName pin.example.com
    
  2. ServerAlias можно удалить, так как он имеет то же значение, что и ServerName.

  3. <Directory> и </Directory> должны начинаться с заглавной буквы.

  4. Синтаксис управления доступом 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.

Проверка конфигурации

  1. Конфигурация в файлах виртуальных хостов:

    Ваши конфигурационные файлы для 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
  2. Устранение лишних директив:

    Как вы уже заметили, в вашем случае ServerAlias можно удалить, так как его значение повторяет значение ServerName. Таким образом, упростите конфигурацию, чтобы избежать путаницы.

  3. Корректное указание директорий:

    Убедитесь, что пути в директивах DocumentRoot и <Directory> не содержат кавычек:

    DocumentRoot /var/www/html/biz
    <Directory /var/www/html/biz>
  4. Обновление синтаксиса доступа:

    В 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, поскольку они могут содержать ценные подсказки о том, что идёт не так.

Оцените материал
Добавить комментарий

Капча загружается...