Один сервер может обслуживать десятки сайтов одновременно — за это отвечают виртуальные хосты 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. Создадим две:
sudo mkdir -p /var/www/site1.ru/public_html
sudo mkdir -p /var/www/site2.ru/public_htmlНазначьте владельцем себя, чтобы редактировать файлы, и задайте права:
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Положите тестовую страницу в каждую папку, чтобы потом проверить, что маршрутизация работает:
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. Создаём конфиг первого сайта
Создайте файл конфигурации для первого сайта:
sudo nano /etc/apache2/sites-available/site1.ru.confВпишите конфигурацию виртуального хоста:
<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. Конфиг второго сайта
Скопируйте конфиг и поправьте под второй домен:
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:
sudo a2ensite site1.ru.conf
sudo a2ensite site2.ru.confТеперь важный момент. Отключите дефолтный сайт Apache — иначе он будет перехватывать запросы:
sudo a2dissite 000-default.confПочему это критично: Apache обрабатывает виртуальные хосты по алфавиту, и 000-default идёт первым. Если оставить его включённым, он будет ловить все запросы, не совпавшие с вашими сайтами (например, во время распространения DNS), и показывать стандартную заглушку Apache вместо вашего сайта. Это одна из самых частых ошибок.
Шаг 5. Проверяем и перезагружаем
Перед перезагрузкой ВСЕГДА проверяйте синтаксис — опечатка в конфиге может положить сразу все сайты на сервере, а не только тот, что вы правили:
sudo apache2ctl configtestДолжно вывести Syntax OK. Теперь перезагрузите Apache, чтобы применить изменения без разрыва активных соединений:
sudo systemctl reload apache2Шаг 6. Проверяем результат
Если домены уже направлены на сервер A-записями — просто откройте site1.ru и site2.ru в браузере, должны появиться ваши тестовые страницы.
Посмотреть, какие виртуальные хосты активны и как Apache их сопоставляет:
sudo apache2ctl -SЭта команда — лучший друг при отладке: она показывает все vhost'ы и какой из них за что отвечает.
Тест без реального DNS
Если домен ещё не куплен или DNS не настроен, можно проверить конфигурацию локально. Отредактируйте файл hosts на своём компьютере (не на сервере):
На Linux/macOS — /etc/hosts, на Windows — C:\Windows\System32\drivers\etc\hosts. Добавьте строки, направив тестовые домены на IP сервера:
192.168.1.100 site1.ru
192.168.1.100 site2.ruТеперь на вашем компьютере эти домены будут открывать сайты с сервера, минуя реальный DNS. Это переопределение работает только на вашей машине.
Добавление HTTPS
После того как виртуальные хосты работают по HTTP, добавьте SSL. Certbot от Let's Encrypt умеет настраивать сертификаты для каждого виртуального хоста отдельно — он найдёт ваши домены по ServerName и пропишет HTTPS-версии конфигов автоматически. Одна команда на все сайты:
sudo certbot --apacheCertbot покажет список найденных доменов, и вы выберете, для каких выпустить сертификаты.
Итог
Виртуальные хосты — основа хостинга нескольких сайтов на одном сервере. Схема простая: папка в /var/www, конфиг в sites-available, включение через a2ensite, проверка синтаксиса, reload. Главное не забыть отключить 000-default и всегда проверять configtest перед перезагрузкой. Дальше на каждый сайт можно повесить свой SSL, свой PHP-пул и свои настройки.