Apache Virtual Hosts — настройка нескольких сайтов на одном сервере

Быстрые ссылки
Конфигурация каталогов сайтов
Конфигурация Apache
Включение виртуальных хостов
Алиасы сайтов
Дополнительные опции конфигурации
Хосты по IP-адресу
Механизм сопоставления виртуальных хостов
Отладка и тестирование
Безопасность и SSL
Заключение
Введение
Определение: Virtual Host — это запись конфигурации Apache, которая говорит, как обслуживать конкретное доменное имя или IP-адрес. Простыми словами, Virtual Hosts позволяют одному экземпляру Apache работать как несколько независимых веб-серверов.
Apache Virtual Hosts полезны, когда нужно: распределить сайты по каталогам, изолировать логи, задать разные правила для разных доменов или обслуживать как публичный, так и внутренний сайт с одного сервера.
Важно: это руководство предполагает, что Apache уже установлен и запущен.
Конфигурация каталогов сайтов
Каждый сайт должен иметь собственную директорию в файловой системе. Apache называет её DocumentRoot — это корень документов, которые сервер отдаёт клиентам.
Обычно сайты хранятся в /var/www, но вы можете расположить их в другом месте по необходимости.
Пример создания каталогов для двух сайтов:
sudo mkdir -p /var/www/a.example.comsudo mkdir -p /var/www/b.example.comПо умолчанию /var/www принадлежит root, поэтому используем sudo. Затем поменяйте владельца на своего пользователя и установите права:
sudo chown -R $USER:$USER /var/www/a.example.comsudo chown -R $USER:$USER /var/www/b.example.comsudo chmod -R 755 /var/wwwСкопируйте файлы сайта в соответствующие директории. Для примера можно создать простые index.html:
Файл: /var/www/a.example.com/index.html
a.example.com
Файл: /var/www/b.example.com/index.html
b.example.com
Совет: для разработки используйте символьные ссылки из проекта в DocumentRoot, чтобы не дублировать код.
Конфигурация Apache
Создайте отдельный файл конфигурации Virtual Host для каждого сайта. На Debian-подобных системах обычно используют каталог /etc/apache2/sites-available. На других дистрибутивах — /etc/httpd/sites-available.
Минимальные параметры для Virtual Host:
ServerName— основное доменное имя.DocumentRoot— путь к каталогу сайта.
Пример для двух сайтов:
Файл: /etc/apache2/sites-available/a.example.com.conf
ServerName a.example.com
DocumentRoot /var/www/a.example.com
Файл: /etc/apache2/sites-available/b.example.com.conf
ServerName b.example.com
DocumentRoot /var/www/b.example.com
Пояснение: *:80 означает, что Apache будет прослушивать все интерфейсы на порту 80 и затем выбирать Virtual Host по Host заголовку.
Включение виртуальных хостов
Добавление файла в sites-available делает конфигурацию доступной, но не активной. Чтобы сайт начал обслуживаться, нужно создать ссылку в sites-enabled.
На Debian используют помощник a2ensite:
a2ensite a.example.coma2ensite b.example.comНа других системах создайте символьную ссылку вручную:
sudo ln -s /etc/httpd/sites-available/a.example.com.conf /etc/httpd/sites-enabled/a.example.com.confПосле включения конфигурации перезапустите Apache:
sudo apache2ctl restartЕсли нет DNS для доменов, временно добавьте их в локальный /etc/hosts для тестирования:
127.0.0.1 a.example.com127.0.0.1 b.example.comПосле этого откройте браузер и проверьте, что каждый домен показывает свою страницу.
Алиасы сайтов
Если нужно обслуживать сайт на нескольких доменах, используйте ServerAlias. Apache будет сопоставлять входящий Host с ServerName или ServerAlias.
Пример:
ServerName a.example.com
ServerAlias example.com
ServerAlias www.example.com
DocumentRoot /var/www/a.example.com
Используйте ServerAlias для дополнительных имён. Повторный ServerName работает иначе и не заменяет ServerAlias.
Дополнительные опции конфигурации
Virtual Host позволяет переопределять глобальные настройки для конкретного сайта. Примеры опций:
ServerName a.example.com
DocumentRoot /var/www/a.example.com
DirectoryIndex my-index.html
AllowOverride All
Options -Indexes
Require all granted
ErrorLog ${APACHE_LOG_DIR}/a.example.com_error.log
CustomLog ${APACHE_LOG_DIR}/a.example.com_access.log combined
Объяснение ключевых опций:
DirectoryIndex— задаёт файл по умолчанию.AllowOverride— разрешает использование.htaccessв каталоге.Options -Indexes— отключает листинг каталогов.ErrorLog/CustomLog— отдельные файлы логов для сайта.
Совет: храните логи для каждого сайта отдельно — так проще анализировать трафик и проблемы.
Хосты по IP-адресу
Кроме имён, Apache поддерживает привязку виртуальных хостов к конкретным IP-адресам. Это полезно, если сервер имеет несколько интерфейсов или IP.
Пример:
ServerName a.example.com
DocumentRoot /var/www/a
ServerName b.example.com
DocumentRoot /var/www/b
ServerName a.example.com
DocumentRoot /var/www/a2
В этом примере a.example.com отдаёт разный контент в зависимости от IP-интерфейса, через который пришёл запрос.
Практическое применение: один сервер обслуживает публичный сайт на WAN IP и внутренний корпоративный портал на LAN IP.
Механизм сопоставления виртуальных хостов
Алгоритм упрощённо:
- Apache сопоставляет входящий заголовок
HostсServerNameиServerAliasв определениях VirtualHost. - Если найдено несколько совпадающих определений, выбирается первый в порядке, в котором конфигурация была загружена.
- На файловой системе порядок загрузки обычно определяется сортировкой имён файлов. Поэтому, если вам нужно приоритетное совпадение, добавьте префикс в имя файла, например
000-default.conf.
Важно: уникальные домены устраняют конфликты. Конфликты возникают, когда несколько конфигураций подходят под один Host.
Отладка и тестирование
Шаги для проверки корректности настроек:
- Проверить синтаксис конфигурации Apache:
sudo apache2ctl configtest- Перезапустить или перегрузить сервис:
sudo systemctl reload apache2sudo apache2ctl restart- Проверить логи ошибок и доступа:
sudo tail -n 200 /var/log/apache2/error.log- Проверить разрешение DNS через
digилиnslookup:
dig +short a.example.com- Локально протестировать через
curlс заголовкомHost:
curl -H "Host: a.example.com" http://127.0.0.1/Советы по отладке:
- Если сайт возвращает содержимое другого VirtualHost, проверьте порядок файлов в
sites-enabled. - Если Apache вообще не стартует, проверьте
apache2ctl configtestиerror.log.
Проверочные сценарии и критерии приёмки
Критерии приёмки:
- Каждый сайт отвечает на свой домен и возвращает корректный
DocumentRoot. - Для каждого сайта генерируется собственный файл доступа и ошибок (при необходимости).
- Все права доступа на файлы и каталоги настроены так, чтобы Apache мог читать файлы, а разработчики могли их изменять.
- Перезапуск сервера не вызывает синтаксических ошибок конфигурации.
Тестовые сценарии:
- Открыть
a.example.comиb.example.comв браузере — каждая страница должна показывать свой заголовок. - Выполнить
curlс заголовкомHostдля каждого домена. - Имитировать неверный
Hostи убедиться, что запрос попадёт в дефолтный VirtualHost. - Проверить, что
ServerAliasобслуживает дополнительные домены.
Ролевые чек-листы
Администратор сервера:
- Убедиться, что Apache установлен и запущен.
- Создать каталоги сайтов и установить владельца и права.
- Создать конфигурацию в
sites-availableи включить сайт. - Настроить логирование и безопасность.
- Перезагрузить сервис и проверить логи.
Разработчик:
- Разместить статические и скомпилированные файлы в
DocumentRoot. - Проверить работу
.htaccess, если используетсяAllowOverride. - Тестировать ссылки и относительные пути.
Оператор DevOps:
- Настроить автоматическое развёртывание в
DocumentRoot(CI/CD). - Настроить резервное копирование конфигураций и сайтов.
- Контролировать доступы и права.
Безопасность и SSL
Рекомендации по безопасности:
- Всегда использовать HTTPS для публичных сайтов. Получите сертификат от доверенного центра (например, Let’s Encrypt).
- Ограничьте доступ к административным разделам по IP или через аутентификацию.
- Отключите листинг директорий (
Options -Indexes). - Не давайте Apache прав на запись в каталоги, где это не требуется.
Пример перенаправления HTTP на HTTPS (включается в конфиг VirtualHost на :80):
ServerName example.com
Redirect permanent / https://example.com/
Пример слушания HTTPS (потребуется SSL-сертификат):
ServerName example.com
DocumentRoot /var/www/example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Обратите внимание: пути к сертификатам зависят от выбранного метода и инструмента для получения сертификатов.
Альтернативные подходы
Если у вас микросервисная архитектура или контейнеры, можно использовать:
- Обратный прокси (nginx, Traefik) перед Apache для маршрутизации по доменам и балансировки нагрузки.
- Запуск нескольких контейнеров Apache/WSGI и маршрутизация по хосту на уровне прокси.
- Использование отдельных виртуальных машин при необходимости строгой изоляции.
Когда не стоит использовать Virtual Hosts:
- Если сайты требуют полной изоляции окружения и ресурсов — лучше контейнеры или отдельные ВМ.
- Если у вас очень высокая нагрузка и необходима тонкая балансировка — лучше использовать выделенный обратный прокси/балансировщик.
Типичные ошибки и их исправление
Проблема: Apache отдаёт содержимое не того сайта
- Причина: порядок загрузки файлов в
sites-enabled. - Решение: проверить имена файлов и при необходимости добавить числовой префикс.
Проблема: 403 Forbidden
- Причина: неверные права на файлы или директорию.
- Решение: убедиться, что Apache-юзер (обычно
www-data) имеет права на чтение, а каталоги имеют execute-бит для обхода.
Проблема: конфигурация не загружается
- Причина: синтаксическая ошибка.
- Решение:
sudo apache2ctl configtestи просмотрerror.log.
Советы по миграции и совместимости
- При переносе конфигураций между дистрибутивами учитывайте различия в путях (
/etc/apache2vs/etc/httpd) и именах сервисов. - Проверяйте версии модулей Apache; некоторые директивы зависят от включённых модулей (
mod_ssl,mod_rewrite,mod_proxyи т.д.). - Для автоматизации используйте конфигурационные менеджеры (Ansible, Puppet, Chef).
Ментальные модели и эвристики
- Подумайте о Virtual Host как о контейнере настроек для одного домена.
- Оставляйте логирование и правила безопасности на уровне сайта — это упрощает отладку.
- Если что-то работает на локальной машине, но не на сервере — проверьте DNS и
Hostзаголовок.
Примерный пошаговый SOP для развёртывания нового сайта
- Создать каталог:
sudo mkdir -p /var/www/new.example.com. - Назначить владельца:
sudo chown -R $USER:$USER /var/www/new.example.com. - Подготовить
index.htmlи проверить локально. - Создать файл
/etc/apache2/sites-available/new.example.com.confсServerNameиDocumentRoot. - Включить сайт:
a2ensite new.example.com. - Протестировать конфигурацию:
sudo apache2ctl configtest. - Перезагрузить Apache:
sudo systemctl reload apache2. - Проверить доступ через браузер или
curl.
Заключение
Apache Virtual Hosts дают гибкий и знакомый способ запускать множество сайтов на одном сервере. Правильная организация каталогов, уникальные имена конфигураций, отдельные логи, внимательное отношение к правам доступа и SSL обеспечат надёжную работу. Для сложных сценариев используйте обратный прокси, контейнеры или отдельные хосты.
Краткая проверка перед сдачей в эксплуатацию:
- Убедитесь, что DNS указывает на сервер.
- Проверили
apache2ctl configtest— ошибок нет. - Сайты доступны по HTTPS (если требуется).
- Логи выглядят корректно и нет неожиданных ошибок.
Сводка:
- Virtual Hosts изолируют конфигурации по доменам.
- Используйте
sites-availableиsites-enabledдля управления. - Логи и права должны быть настроены отдельно для каждого сайта.
Важное: всегда делайте резервные копии конфигураций перед массовыми изменениями и используйте тестовую среду для проверки сложных изменений.
Похожие материалы
vsftpd и FTPS: установка и защита
Google Assistant для Home Assistant — шаг за шагом
Как аннотировать презентации в Google Slides
Как перенести номер в Google Voice
Как подключить гарнитуру к устройству с одним аудиоразъёмом