Гид по технологиям

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

7 min read Серверы Обновлено 22 Dec 2025
Apache Virtual Hosts — настройка сайтов
Apache Virtual Hosts — настройка сайтов

Логотип Apache HTTP Server

Быстрые ссылки

  • Конфигурация каталогов сайтов

  • Конфигурация 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.com
sudo mkdir -p /var/www/b.example.com

По умолчанию /var/www принадлежит root, поэтому используем sudo. Затем поменяйте владельца на своего пользователя и установите права:

sudo chown -R $USER:$USER /var/www/a.example.com
sudo chown -R $USER:$USER /var/www/b.example.com
sudo 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.com
a2ensite 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.com
127.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.

Механизм сопоставления виртуальных хостов

Алгоритм упрощённо:

  1. Apache сопоставляет входящий заголовок Host с ServerName и ServerAlias в определениях VirtualHost.
  2. Если найдено несколько совпадающих определений, выбирается первый в порядке, в котором конфигурация была загружена.
  3. На файловой системе порядок загрузки обычно определяется сортировкой имён файлов. Поэтому, если вам нужно приоритетное совпадение, добавьте префикс в имя файла, например 000-default.conf.

Важно: уникальные домены устраняют конфликты. Конфликты возникают, когда несколько конфигураций подходят под один Host.

Отладка и тестирование

Шаги для проверки корректности настроек:

  1. Проверить синтаксис конфигурации Apache:
sudo apache2ctl configtest
  1. Перезапустить или перегрузить сервис:
sudo systemctl reload apache2
sudo apache2ctl restart
  1. Проверить логи ошибок и доступа:
sudo tail -n 200 /var/log/apache2/error.log
  1. Проверить разрешение DNS через dig или nslookup:
dig +short a.example.com
  1. Локально протестировать через 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/apache2 vs /etc/httpd) и именах сервисов.
  • Проверяйте версии модулей Apache; некоторые директивы зависят от включённых модулей (mod_ssl, mod_rewrite, mod_proxy и т.д.).
  • Для автоматизации используйте конфигурационные менеджеры (Ansible, Puppet, Chef).

Ментальные модели и эвристики

  • Подумайте о Virtual Host как о контейнере настроек для одного домена.
  • Оставляйте логирование и правила безопасности на уровне сайта — это упрощает отладку.
  • Если что-то работает на локальной машине, но не на сервере — проверьте DNS и Host заголовок.

Примерный пошаговый SOP для развёртывания нового сайта

  1. Создать каталог: sudo mkdir -p /var/www/new.example.com.
  2. Назначить владельца: sudo chown -R $USER:$USER /var/www/new.example.com.
  3. Подготовить index.html и проверить локально.
  4. Создать файл /etc/apache2/sites-available/new.example.com.conf с ServerName и DocumentRoot.
  5. Включить сайт: a2ensite new.example.com.
  6. Протестировать конфигурацию: sudo apache2ctl configtest.
  7. Перезагрузить Apache: sudo systemctl reload apache2.
  8. Проверить доступ через браузер или curl.

Заключение

Apache Virtual Hosts дают гибкий и знакомый способ запускать множество сайтов на одном сервере. Правильная организация каталогов, уникальные имена конфигураций, отдельные логи, внимательное отношение к правам доступа и SSL обеспечат надёжную работу. Для сложных сценариев используйте обратный прокси, контейнеры или отдельные хосты.

Краткая проверка перед сдачей в эксплуатацию:

  • Убедитесь, что DNS указывает на сервер.
  • Проверили apache2ctl configtest — ошибок нет.
  • Сайты доступны по HTTPS (если требуется).
  • Логи выглядят корректно и нет неожиданных ошибок.

Сводка:

  • Virtual Hosts изолируют конфигурации по доменам.
  • Используйте sites-available и sites-enabled для управления.
  • Логи и права должны быть настроены отдельно для каждого сайта.

Важное: всегда делайте резервные копии конфигураций перед массовыми изменениями и используйте тестовую среду для проверки сложных изменений.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

vsftpd и FTPS: установка и защита
Linux

vsftpd и FTPS: установка и защита

Google Assistant для Home Assistant — шаг за шагом
Умный дом

Google Assistant для Home Assistant — шаг за шагом

Как аннотировать презентации в Google Slides
Презентации

Как аннотировать презентации в Google Slides

Как перенести номер в Google Voice
Мобильная связь

Как перенести номер в Google Voice

Как подключить гарнитуру к устройству с одним аудиоразъёмом
Аудио

Как подключить гарнитуру к устройству с одним аудиоразъёмом

PowerPoint не может найти Word — исправление ошибки
Microsoft Office

PowerPoint не может найти Word — исправление ошибки