Настройка name-based виртуального хостинга Apache на Ubuntu 22.04
В этой инструкции показано, как настроить два name-based виртуальных хоста Apache на Ubuntu 22.04. Мы создадим папки сайтов, настроим файлы виртуальных хостов, обновим /etc/hosts для локального тестирования, включим сайты через a2ensite, проверим конфигурацию и перезагрузим сервис Apache.

Что разберём
- Понятие name-based виртуального хостинга и отличие от IP-based. Короткое определение: name-based — несколько доменных имён обрабатываются на одном IP-адресе, Apache выбирает сайт по заголовку Host.
- Практическая пошаговая настройка на Ubuntu 22.04 с Apache.
- Тестирование и критерии приёмки.
- Альтернативы, возможные проблемы и рекомендации по безопасности.
Требования и примечания
- Сервер/локальная машина с Ubuntu 22.04.
- Доступ root или sudo.
- Установленный Apache (инструкции ниже показывают установку).
- Для реального продакшена используйте настоящие домены и DNS; здесь мы используем /etc/hosts для локального тестирования.
Важно: этот метод предполагает name-based виртуальные хосты (несколько имён на одном IP). Если вы хотите отдельные IP для каждого сайта, используйте IP-based виртуальные хосты.
Быстрый план действий
- Обновить систему и установить Apache.
- Создать структуру каталогов для host1 и host2.
- Установить права и создать index.html для каждого сайта.
- Изменить /etc/hosts для локального резолва доменов.
- Создать файлы виртуальных хостов в /etc/apache2/sites-available.
- Включить сайты (a2ensite), отключить дефолтный сайт, проверить конфиг и перезагрузить Apache.
- Проверить доступ через curl или браузер.
Шаги — подробная инструкция
1. Обновление системы
Обновите индекс пакетов и установите обновления:
sudo apt updatesudo apt upgrade -y2. Установка Apache
Установите Apache2:
sudo apt install apache2 -y
Перезапустите и проверьте статус сервиса:
sudo systemctl restart apache2sudo systemctl status apache2
Пример ожидаемого вывода: сервис должен быть active (running).
3. Создание каталогов для сайтов
Создайте директории для двух виртуальных хостов и их корней:
sudo mkdir -p /var/www/host1/public_htmlsudo mkdir -p /var/www/host2/public_htmlПути /var/www/host1/public_html и /var/www/host2/public_html будут использоваться как DocumentRoot.
4. Права и владение
Сделайте текущего пользователя владельцем каталогов (чтобы удобно редактировать файлы) и установите стандартные права для веб-каталога:
sudo chown -R $USER:$USER /var/www/host1/public_htmlsudo chown -R $USER:$USER /var/www/host2/public_htmlsudo chmod -R 755 /var/wwwПримечание: 755 даёт чтение для Apache и запись владельцу. В продакшене настройте владельцев и группы согласно политике безопасности.
5. Создание простых страниц index.html
Создайте минимальные страницы для проверки:
sudo bash -c 'echo "Welcome to Virtual Host 1." > /var/www/host1/public_html/index.html'sudo bash -c 'echo "Welcome to Virtual Host 2." > /var/www/host2/public_html/index.html'Важно: используем корректные кавычки и запуск через bash -c под sudo, чтобы запись прошла успешно.
6. Локальное сопоставление доменов (для теста)
Чтобы не регистрировать домены, добавим хосты в /etc/hosts:
sudo sh -c "echo 127.0.0.1 www.host1.com >> /etc/hosts"sudo sh -c "echo 127.0.0.1 www.host2.com >> /etc/hosts"
7. Создание файлов виртуальных хостов
Скопируйте дефолтный файл конфигурации как шаблон и создайте два файла:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/host1.confsudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/host2.confОтредактируйте host1.conf и host2.conf (используйте ваш любимый редактор). Пример содержимого для host1.conf:
ServerAdmin webmaster@localhost
ServerName host1
ServerAlias www.host1.com
DocumentRoot /var/www/host1/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
В host2.conf замените указатели на host2 и /var/www/host2/public_html соответственно.
8. Включение сайтов и отключение дефолтного
Включите ваши сайты и отключите 000-default.conf:
sudo a2ensite host1.confsudo a2ensite host2.confsudo a2dissite 000-default.conf9. Проверка конфигурации и перезагрузка Apache
Проверьте синтаксис конфигурации:
sudo apache2ctl configtestЕсли вывод сообщает Syntax OK — применяйте изменения перезагрузкой или перезапуском:
sudo systemctl reload apache2
10. Тестирование
Проверьте ответы каждого виртуального хоста:
$ curl www.host1.comДолжен вернуться текст из index.html виртуального хоста 1.
$ curl www.host2.comАналогично — ответ от хоста 2.

Критерии приёмки
- curl www.host1.com возвращает «Welcome to Virtual Host 1.»
- curl www.host2.com возвращает «Welcome to Virtual Host 2.»
- Файлы /etc/apache2/sites-available/host1.conf и host2.conf существуют и настроены с разными DocumentRoot
- sudo apache2ctl configtest выдаёт Syntax OK
- Apache active (running) и перезагрузка прошла без ошибок
Возможные ошибки и как их исправить
- Страницы возвращают содержимое одного и того же сайта: проверьте ServerName/ServerAlias в конфигах и что они включены через a2ensite.
- permission denied при записи в /var/www: убедитесь, что вы использовали sudo и правильно выставили chown/chmod.
- После изменения /etc/hosts остались старые записи — проверьте порядок и отсутствие опечаток.
- Если используете брандмауэр (ufw), откройте порт 80: sudo ufw allow 80/tcp.
Альтернативные подходы
- IP-based виртуальные хосты: если у вас несколько публичных IP, каждый сайт можно привязать к отдельному IP (часто используется для SSL без SNI в старых клиентах).
- Использование обратного прокси (Nginx) перед Apache: Nginx часто используют как front‑end, отдающий статику и проксирующий запросы в backend.
- Автоматизация: Terraform, Ansible или скрипты для воспроизводимой настройки в инфраструктуре.
Ментальная модель и чеклист для ролей
Ментальная модель: Apache выбирает виртуальный хост по заголовку Host; если совпадений нет — отдаёт первый (обычно дефолтный).
Чеклист для разработчика/инженера:
- Создана структура /var/www/host*/public_html
- Созданы index.html и проверено содержимое
- Права и владельцы корректны
- /etc/hosts содержит записи для локального теста
- Файлы в sites-available настроены и включены
- Выполнен apache2ctl configtest
- Apache перезагружен и сервис активен
Небольшая методология деплоя (SOP)
- Подготовить каталоги и контент в тестовом окружении.
- Создать файлы виртуальных хостов и проверить синтаксис.
- Добавить записи в /etc/hosts только для теста; в production использовать DNS.
- Включить сайт, отключить дефолтный, запустить configtest.
- Перезагрузить Apache и выполнить smoke‑test через curl.
- Зафиксировать изменения в системе управления версиями конфигураций.
Факто‑бокс
- Порт по умолчанию для HTTP: 80
- Конфигурационные директории Apache в Debian/Ubuntu: /etc/apache2/sites-available и /etc/apache2/sites-enabled
- Команды управления: systemctl, a2ensite, a2dissite, apache2ctl
Когда name-based не подойдёт
- Нужно отдельное публичное IP для каждого сайта (например, старые клиенты без SNI и разные SSL‑сертификаты без SNI/либо особая сетевая архитектура).
- Если у вас строгие требования по изоляции сетевого трафика между сайтами на уровне IP.
Простая схема принятия решения
flowchart TD
A[Нужны несколько сайтов на одном сервере?] --> B{Есть ли разные публичные IP для каждого сайта?}
B -- Да --> C[Использовать IP-based виртуальные хосты]
B -- Нет --> D[Использовать name-based virtual hosts 'SNI для HTTPS']
D --> E{Нужно ли автоматизировать?}
E -- Да --> F[Использовать Terraform/Ansible]
E -- Нет --> G[Ручная настройка Apache]Резюме
Мы прошли полный цикл: установка Apache, создание каталогов сайтов, настройка виртуальных хостов, локальное тестирование и проверка работы. Для продакшена рекомендуем применять HTTPS (SNI) и автоматизировать развёртывание.
FAQ
Как включить HTTPS для каждого виртуального хоста?
Для каждого виртуального хоста создайте отдельные директивы
Можно ли использовать один конфиг для нескольких доменов?
Да — в ServerAlias можно перечислить дополнительные имена; но чаще для разных сайтов используют отдельные конфиги, чтобы проще управлять логами и корнями сайтов.
Как откатить изменения, если что-то пошло не так?
Отключите созданные сайты: sudo a2dissite host1.conf host2.conf, восстановите 000-default.conf через a2ensite 000-default.conf и выполните sudo systemctl reload apache2.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента