← База знаний

Виртуальные хосты Apache: несколько сайтов на одном сервере

Один сервер может обслуживать десятки сайтов одновременно — за это отвечают виртуальные хосты Apache. Вместо отдельной машины под каждый домен вы размещаете site1.ru, site2.ru и blog.site1.ru на одном сервере, и каждый отдаёт своё содержимое. Разберём настройку с нуля.

Как это работает

Когда браузер запрашивает сайт, он передаёт Apache имя домена в заголовке. Apache смотрит, какой виртуальный хост отвечает за это имя, и отдаёт содержимое из нужной папки. Так один Apache различает site1.ru и site2.ru, хотя они на одном IP. Это называется name-based виртуальный хостинг. Количество сайтов не ограничено — упираетесь только в ресурсы сервера.

Логика конфигурации Apache

В Ubuntu конфиги сайтов лежат в двух папках, и это важно понять:

/etc/apache2/sites-available/ — здесь лежат конфиги всех сайтов, включённых и выключенных. Это склад.

/etc/apache2/sites-enabled/ — здесь симлинки на те конфиги, что реально работают. Команда a2ensite создаёт такой симлинк, a2dissite — убирает. Так можно выключить сайт, не удаляя его конфиг.

Шаг 1. Создаём папки для сайтов

Каждому сайту — своя директория в /var/www. Создадим две:

bash
sudo mkdir -p /var/www/site1.ru/public_html
sudo mkdir -p /var/www/site2.ru/public_html

Назначьте владельцем себя, чтобы редактировать файлы, и задайте права:

bash
sudo chown -R $USER:$USER /var/www/site1.ru/public_html
sudo chown -R $USER:$USER /var/www/site2.ru/public_html
sudo chmod -R 755 /var/www

Положите тестовую страницу в каждую папку, чтобы потом проверить, что маршрутизация работает:

bash
echo '<h1>site1.ru работает</h1>' > /var/www/site1.ru/public_html/index.html
echo '<h1>site2.ru работает</h1>' > /var/www/site2.ru/public_html/index.html

Шаг 2. Создаём конфиг первого сайта

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

bash
sudo nano /etc/apache2/sites-available/site1.ru.conf

Впишите конфигурацию виртуального хоста:

apache
<VirtualHost *:80>
    ServerName site1.ru
    ServerAlias www.site1.ru
    DocumentRoot /var/www/site1.ru/public_html

    <Directory /var/www/site1.ru/public_html>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/site1.ru-error.log
    CustomLog ${APACHE_LOG_DIR}/site1.ru-access.log combined
</VirtualHost>

Разберём ключевые строки. ServerName — основной домен. ServerAlias — дополнительные имена (например, www-версия), которые отдают тот же сайт. DocumentRoot — папка, откуда Apache берёт файлы. AllowOverride All — разрешает файлы .htaccess (нужно для WordPress и «красивых» ссылок). Отдельные логи на каждый сайт удобны для отладки.

Шаг 3. Конфиг второго сайта

Скопируйте конфиг и поправьте под второй домен:

bash
sudo cp /etc/apache2/sites-available/site1.ru.conf /etc/apache2/sites-available/site2.ru.conf
sudo nano /etc/apache2/sites-available/site2.ru.conf

Замените везде site1.ru на site2.ru — ServerName, ServerAlias, DocumentRoot и имена логов.

Шаг 4. Включаем сайты

Активируйте оба виртуальных хоста командой a2ensite:

bash
sudo a2ensite site1.ru.conf
sudo a2ensite site2.ru.conf

Теперь важный момент. Отключите дефолтный сайт Apache — иначе он будет перехватывать запросы:

bash
sudo a2dissite 000-default.conf

Почему это критично: Apache обрабатывает виртуальные хосты по алфавиту, и 000-default идёт первым. Если оставить его включённым, он будет ловить все запросы, не совпавшие с вашими сайтами (например, во время распространения DNS), и показывать стандартную заглушку Apache вместо вашего сайта. Это одна из самых частых ошибок.

Шаг 5. Проверяем и перезагружаем

Перед перезагрузкой ВСЕГДА проверяйте синтаксис — опечатка в конфиге может положить сразу все сайты на сервере, а не только тот, что вы правили:

bash
sudo apache2ctl configtest

Должно вывести Syntax OK. Теперь перезагрузите Apache, чтобы применить изменения без разрыва активных соединений:

bash
sudo systemctl reload apache2

Шаг 6. Проверяем результат

Если домены уже направлены на сервер A-записями — просто откройте site1.ru и site2.ru в браузере, должны появиться ваши тестовые страницы.

Посмотреть, какие виртуальные хосты активны и как Apache их сопоставляет:

bash
sudo apache2ctl -S

Эта команда — лучший друг при отладке: она показывает все vhost'ы и какой из них за что отвечает.

Тест без реального DNS

Если домен ещё не куплен или DNS не настроен, можно проверить конфигурацию локально. Отредактируйте файл hosts на своём компьютере (не на сервере):

На Linux/macOS — /etc/hosts, на Windows — C:\Windows\System32\drivers\etc\hosts. Добавьте строки, направив тестовые домены на IP сервера:

bash
192.168.1.100 site1.ru
192.168.1.100 site2.ru

Теперь на вашем компьютере эти домены будут открывать сайты с сервера, минуя реальный DNS. Это переопределение работает только на вашей машине.

Добавление HTTPS

После того как виртуальные хосты работают по HTTP, добавьте SSL. Certbot от Let's Encrypt умеет настраивать сертификаты для каждого виртуального хоста отдельно — он найдёт ваши домены по ServerName и пропишет HTTPS-версии конфигов автоматически. Одна команда на все сайты:

bash
sudo certbot --apache

Certbot покажет список найденных доменов, и вы выберете, для каких выпустить сертификаты.

Итог

Виртуальные хосты — основа хостинга нескольких сайтов на одном сервере. Схема простая: папка в /var/www, конфиг в sites-available, включение через a2ensite, проверка синтаксиса, reload. Главное не забыть отключить 000-default и всегда проверять configtest перед перезагрузкой. Дальше на каждый сайт можно повесить свой SSL, свой PHP-пул и свои настройки.

Корпус Eruscus Blade 19" 1U Стоечный корпус на 4 платы Raspberry Pi с активным охлаждением.
Смотреть корпус →