Развертывание Virtual Hosts в Apache: Name-Based против IP-Based
- Все домены открывают один и тот же сайт (первый сконфигурированный VirtualHost по алфавиту).
- Команда
apachectl -Sвыводит предупреждения о перекрывающихся портах (VirtualHost overlap on port 80). - Необходимость привязки изолированных SSL-сертификатов к разным сетевым интерфейсам сервера.
1. Концепция: Name-Based vs IP-Based
- Name-Based: Десятки сайтов делят один IP-адрес и порт. Apache определяет нужный сайт по заголовку запроса
Host:(стандарт для 99% сайтов). - IP-Based: Каждый сайт слушает собственный уникальный физический или виртуальный IP-адрес.
2. Настройка Name-Based Virtual Hosts
Создайте файл /etc/apache2/sites-available/site1.conf:
<VirtualHost *:80>
ServerAdmin admin@site1.ru
ServerName site1.ru
ServerAlias www.site1.ru
DocumentRoot /var/www/site1/public_html
DirectoryIndex index.php index.html
<Directory /var/www/site1/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/site1_error.log
CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
</VirtualHost>3. Настройка IP-Based Virtual Host
При наличии нескольких IP на сетевом интерфейсе (192.168.1.10 и 192.168.1.11):
<VirtualHost 192.168.1.10:80>
ServerName portal.corp.local
DocumentRoot /var/www/portal
</VirtualHost>
<VirtualHost 192.168.1.11:80>
ServerName public.corp.local
DocumentRoot /var/www/public
</VirtualHost>4. Активация и траблшутинг через apachectl -S
# Включение сайтов (Debian/Ubuntu)
a2ensite site1.conf site2.conf
# Проверка карты загруженных виртуальных хостов
apachectl -S
# Применение
systemctl reload apache2 Частые вопросы (FAQ)
Почему открывается не тот сайт при обращении по IP?
Если входящий Host-заголовок не совпадает ни с одним ServerName или ServerAlias, Apache отдает первый загруженный виртуальный хост (по алфавиту файлов конфигурации, обычно 000-default.conf).
Нужна ли директива NameVirtualHost в Apache 2.4?
Нет, в Apache 2.4 директива NameVirtualHost устарела и была удалена. Любой блок <VirtualHost IP:Port> автоматически работает как Name-Based.