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

Настройка name-based виртуального хостинга Apache на Ubuntu 22.04

• 5 min read • Инфраструктура • Обновлено 25 Nov 2025
Apache name-based виртуальные хосты на Ubuntu 22.04
Apache name-based виртуальные хосты на 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 виртуальные хосты.

Быстрый план действий

  1. Обновить систему и установить Apache.
  2. Создать структуру каталогов для host1 и host2.
  3. Установить права и создать index.html для каждого сайта.
  4. Изменить /etc/hosts для локального резолва доменов.
  5. Создать файлы виртуальных хостов в /etc/apache2/sites-available.
  6. Включить сайты (a2ensite), отключить дефолтный сайт, проверить конфиг и перезагрузить Apache.
  7. Проверить доступ через curl или браузер.

Шаги — подробная инструкция

1. Обновление системы

Обновите индекс пакетов и установите обновления:

sudo apt update
sudo apt upgrade -y

2. Установка Apache

Установите Apache2:

sudo apt install apache2 -y

Окно установки Apache в терминале

Перезапустите и проверьте статус сервиса:

sudo systemctl restart apache2
sudo systemctl status apache2

Проверка статуса сервиса Apache в systemd

Пример ожидаемого вывода: сервис должен быть active (running).

3. Создание каталогов для сайтов

Создайте директории для двух виртуальных хостов и их корней:

sudo mkdir -p /var/www/host1/public_html
sudo 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_html
sudo chown -R $USER:$USER /var/www/host2/public_html
sudo 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"

Редактирование файла hosts для локального тестирования

7. Создание файлов виртуальных хостов

Скопируйте дефолтный файл конфигурации как шаблон и создайте два файла:

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/host1.conf
sudo 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.conf
sudo a2ensite host2.conf
sudo a2dissite 000-default.conf

9. Проверка конфигурации и перезагрузка Apache

Проверьте синтаксис конфигурации:

sudo apache2ctl configtest

Если вывод сообщает Syntax OK — применяйте изменения перезагрузкой или перезапуском:

sudo systemctl reload apache2

Включение сайтов, отключение дефолтного и перезагрузка Apache

10. Тестирование

Проверьте ответы каждого виртуального хоста:

$ curl www.host1.com

Должен вернуться текст из index.html виртуального хоста 1.

$ curl www.host2.com

Аналогично — ответ от хоста 2.

Результат тестирования curl для двух виртуальных хостов

Критерии приёмки

  • 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)

  1. Подготовить каталоги и контент в тестовом окружении.
  2. Создать файлы виртуальных хостов и проверить синтаксис.
  3. Добавить записи в /etc/hosts только для теста; в production использовать DNS.
  4. Включить сайт, отключить дефолтный, запустить configtest.
  5. Перезагрузить Apache и выполнить smoke‑test через curl.
  6. Зафиксировать изменения в системе управления версиями конфигураций.

Факто‑бокс

  • Порт по умолчанию для 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 для каждого виртуального хоста?

Для каждого виртуального хоста создайте отдельные директивы , установите SSL-сертификаты (например, через Let’s Encrypt) и включите модуль ssl: sudo a2enmod ssl.

Можно ли использовать один конфиг для нескольких доменов?

Да — в ServerAlias можно перечислить дополнительные имена; но чаще для разных сайтов используют отдельные конфиги, чтобы проще управлять логами и корнями сайтов.

Как откатить изменения, если что-то пошло не так?

Отключите созданные сайты: sudo a2dissite host1.conf host2.conf, восстановите 000-default.conf через a2ensite 000-default.conf и выполните sudo systemctl reload apache2.

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

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

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро