Системное администрирование

Первый виртуальный хост Apache на Ubuntu

Первый виртуальный хост Apache на Ubuntu

Когда Apache уже работает и нужно разместить на одном сервере несколько сайтов, виртуальные хосты — самый удобный и правильный способ. На Ubuntu это делается через отдельный конфиг в /etc/apache2/sites-available/ и активацию через специальную утилиту, после чего Apache начинает обслужвать сайт по имени домена или хосту.

Что такое виртуальный хост и зачем он нужен

Виртуальный хост — это отдельный набор настроек Apache для конкретного сайта: свой DocumentRoot (папка, из которой отдаются файлы), свои логи, свой ServerName и при необходимости ServerAlias. Проще говоря, один сервер может обслуживать несколько сайтов, и Apache будет понимать, какой из них отдавать, по имени запрошенного домена.

Это полезно, когда:

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

Для начинающего системного администратора настройка первого виртуального хоста — это не просто учебное упражнение. Это та самая база, без которой не получится хостить клиентские проекты, разворачивать тестовые стенды и понимать, как работают веб-серверы в продакшене. На практике почти любой сайт живёт внутри виртуального хоста.

Как устроены сайты в Apache на Ubuntu

На Ubuntu конфигурация Apache обычно разделена на две директории:

/etc/apache2/sites-available/ — здесь хранятся все конфиги виртуальных хостов, активные и неактивные; /etc/apache2/sites-enabled/ — здесь лежат символические ссылки только на те сайты, которые сейчас включены.

Важно запомнить простое правило: файл редактируют в sites-available, а не в sites-enabled. Когда сайт нужно включить, используется специальная команда активации, которая создаёт ссылку в sites-enabled. Это удобно: можно одной командой включить или отключить сайт, не удаляя файл конфигурации.

Такой подход принят в Debian/Ubuntu и избавляет от ручного управления символьными ссылками. Начинающие часто путают эти директории, но на самом деле схема простая: редактируем в sites-available, включаем — получаем ссылку в sites-enabled.

Подготовка: что проверить перед настройкой

Перед созданием первого виртуального хоста убедитесь, что:

Apache установлен и запущен (systemctl status apache2); у сайта уже есть папка с файлами или вы готовы её создать; домен или поддомен указывает на сервер, если сайт должен открываться по реальному имени; порт 80 открыт, если используется обычный HTTP.

Если это тестовая настройка, домен можно подставить временно через файл /etc/hosts на локальной машине. Добавьте строку вроде 192.168.1.100 example.com, где IP — адрес вашего сервера. Для учебного стенда это норм, но на боевом сервере так не делают — DNS должен быть настоен правильно.

Кроме того, проверьте права на папку с сайтом. Apache должен иметь возможность читать файлы. Обыично владелец — либо www-data (пользователь, от которого запускается Apache), либо отделаный пользватель с группой www-data. Для первого опытта можно временно отдать папку полностью www-data, но в реальных проектах это не всегда лучшая практика — об этом дальеше.

Пошаговая настройка первого виртуального хоста

Ниже — рабочая схема, которую удобно использовать на Ubuntu.

Шаг 1. Создайте папку сайта

Обычно для сайта делают отдельный каталог, например:

sudo mkdir -p /var/www/example.com/html

Права на папку можно сразу привести в порядок, чтобы Apache мог читать файлы сайта:

sudo chown -R www-data:www-data /var/www/example.com

В боевой среде часто настраивают владельца чуть иначе: создают отдельного пользователя для каждого сайта, а группу www-data доавляют с правами на чтение. Но для старта и понимания механики такой вариат вполне раотает.

Шаг 2. Создайте тестовую страницу

Чтобы бысторо проверить, что хост раотает, положите простой index.html:

sudo noun /var/www/example.com/html/index.html

Содержимое:

<h1>It works! example.com</h1></pre>

Проверьте, что файл на самом деле лежит там и доступен на чтение пользователю www-data. Без этого шага даже правильно настроенный виртуальный хост выдаст ошибку 403.

 

Шаг 3. Создайте файл виртуального хоста

 

На Ubuntu удобно брать за основу стандартный конфиг 000-default.conf, который обычно уже используется как базовый сайт. Создадим свой файл:

 
sudo noun /etc/apache2/sites-available/example.com.conf
 

Пример содержимого:

 
<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/html
    ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>
 

Что означает каждая директива

 
Директива Зачем нужна
VirtualHost *:80 Говорит Apache обрабатывать запросы на порту 80 для этого сайта
ServerName Основное имя сайта, по которому Apache выберет этот хост
ServerAlias Дополнительные имена, например www-версия
DocumentRoot Папка, из которой отдаются файлы сайта
ErrorLog Файл ошибок конкретного сайта
CustomLog Лог запросов конкретного сайта
 

Обратите внимание: путь к логам использует переменную ${APACHE_LOG_DIR} — она определена в основном конфиге и обычно указывает на /var/log/apache2/. Так проще поддерживать однообразие. ServerAdmin не обязателен, но если на сайте появятся ошибки, Apache может показать этот адрес посетителю.

 

Включение сайта

 

После создания конфига сайт нужно актировать. На Ubuntu для этого используется команда a2ensite (сокращение от apt-get enable site). Она создаёт символьную ссылку в sites-enabled, указывающую на файл в sites-available.

 
sudo a2ensite example.com.conf
 

Если нужно убрать стандартную заглушку, её обычно отключают отдельно, чтобы она не перехватывала запросы по умолчанию. На практике это часто делается так:

 
sudo a2dissite 000-default.conf
 

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

 

Проверка конфигурации и перезапуск

 

Перед перезагрузкой Apache обязательно проверьте синтаксис:

 
sudo apache2ctl configtest
 

Если всё в порядке, примените изменения:

 
sudo systemctl reload apache2
 

На Ubuntu также часто используют:

 
sudo service apache2 reload
 

Оба варианта встречаются в документации, но для современных систем удобнее systemctl. Разница небольшая: service — более старая обёртка, но тоже работает. Главное — reload перечитывает конфиги без полного перезапуска сервера, что сохраняет активные сессии.

 

Как проверить, что виртуальный хост работает

 

Проверку лучше делать в таком порядке:

 
  1. Откройте сайт в браузере по домену. Проверьте, что отображается нужная страница. Убедитесь, что в логах появляются записи (например,

tail -f /var/log/apache2/example.com-access.log

  1. ). Если сайт не открывается, проверьте резолвинг домена и конфигурацию Apache.
 

Для диагностики полезно смотреть:

 
sudo apache2ctl -S
 

Эта команда показывает, какие виртуальные хосты Apache видит и какой из них назначен основным. В выводе вы увидите строчки вида default server example.com (...) — это ваш хост.

 

Типовые ошибки новичков

 

1. Редактируют файл в sites-enabled

 

Это лишняя ошибка. Правильный путь — создавать и править конфиг в sites-available, а включать его отдельно. Если вы отредактировали включённый конфиг, он всё равно лежит в sites-available, а ссылка в sites-enabled обновится сама (она же указывает на тот же файл). Но если создать файл прямо в sites-enabled, то при отключении сайта он удалится — вы потеряете конфигурацию.

 

2. Не указывают ServerName

 

Если ServerName не задан, Apache может выбрать не тот сайт, особенно если на сервере несколько виртуальных хостов. Он использует первый подходящий виртуальный хост из списка, и ваш новый сайт может не отозваться. Всегда прописывайте основное имя явно.

 

3. Забывают отключить 000-default.conf

 

Тогда стандартная заглушка продолжает отвечать на запросы, и кажется, что новый сайт «не работает». Бывает, что браузер кэширует старый ответ — очистите кэш или откройте в режиме инкогнито.

 

4. Неверный DocumentRoot

 

Если путь указан с ошибкой, Apache не сможет отдать файлы сайта. Проверьте, что папка существует и в ней есть index.html (или index.php). Также проверьте права: у пользователя www-data (или того, от кого запускается Apache) должен быть доступ на чтение и выполнение к директории и файлам.

 

5. Не обновили DNS

 

Если домен ещё не указывает на сервер, виртуальный хост настроен правильно, но открыть сайт по имени всё равно не получится. На время теста можно обойтись файлом hosts на клиентской машине.

 

Практический шаблон для реального проекта

 

Ниже — аккуратный шаблон, который можно брать за основу для большинства обычных сайтов на Ubuntu.

 
<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/html
    ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined

    <Directory /var/www/example.com/html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
 

Блок <Directory> нужен, если вы планируете использовать .htaccess, например для CMS или правил перенаправления. Если сайт простой и .htaccess не нужен, этот блок можно не добавлять. AllowOverride All разрешает переопределять настройки Apache через файлы .htaccess, но и даёт больше гибкости. На боевом сервере нередко ограничивают AllowOverride None для производительности и безопасности, вынося все правила в основной конфиг.

 

Когда одного виртуального хоста недостаточно

 

Один виртуальный хост — это база, но в реальной работе часто приодится добалять:


HTTPS и отдельный хост на :443, с указанием сертификатов;
редирект с www на без www или наоборот (часто через отдельный виртуальный хост с редиректом);
отдельные логи для каждого сайта (уже включено в шаблон);
ограничения по IP (для административных разделов);
поддержку PHP-FPM (отдельный пул для каждого сайта);
защиту админок и закрытых разделов.

Если вы разворачваете не учебный стенд, а рабочий проект, сразу планируйте структуру под это. Потом переделывать сложнее, чем сделать правильно с первого раза. Например, продумайте имена лог-файлов, чтобы через полгода не гадать, к какому сайту относится ошибка.

 

Короткий чек-лист перед запуском


Создана отдельная папка сайта.
Есть тестовый файл index.html или рабочее приложение.
Файл виртуального хоста лежит в sites-available.
Заданы ServerName и, при необходимости, ServerAlias.
Указан правильный DocumentRoot.
Конфиг включён через a2ensite.
000-default.conf отключён, если он мешает.
Конфигурация проверена через apache2ctl configtest.
Apache перезагружен без ошибок.


Что делать, если сайт не открывается

 

Если виртуальный хост не работает, проверьте по порядку:

 

apache2ctl configtest

  1. — нет ли синтаксической ошибки.

apache2ctl -S

  1. — видит ли Apache ваш хост, какое имя считается основным. DNS или файл hosts — указывает ли имя на нужный сервер.

DocumentRoot

  1. — существует ли папка и есть ли там index-файл. Логи Apache — нет ли ошибок доступа или прав (обычно в

/var/log/apache2/

  1. ). Порт 80 — слушает ли его сервер (

netstat -tulpn | grep :80

  1. или

ss -tlnp | grep :80

  1. ).
 

Такой порядок экономит время: сначала исключаются ошибки конфигурации, потом проблемы сети и DNS. В девяти случаях из десяти причиной оказывается неверный путь к DocumentRoot или забытый ServerName.

 

Вывод

 

Первый виртуальный хост Apache на Ubuntu настраивается просто, если держать в голове три вещи: конфиг создаётся в sites-available, включается через a2ensite, а сам сайт должен иметь правильный ServerName и DocumentRoot. После этого Apache сможет обслуживать несколько сайтов на одном сервере, а вы получите понятную и масштабируемую схему для дальнейшей работы.

 

Эта схема — фундамент. Потом вы будете добавлять SSL, PHP, настраивать обратный прокси, баллансировку, но первый виртуальный хост — это как первый самостоятельно написанный скрипт: с него начинается понимание, как работает веб-сервер.

 

FAQ

 

Нужно ли редактировать sites-enabled вручную?

 

Нет. Файлы создают и правят в sites-available, а в sites-enabled попадают только ссылки. Вручную добавлять или удалять симлинки не стоит, используйте a2ensite и a2dissite.

 

Можно ли запускать несколько сайтов на одном IP?

 

Да. Именно для этого и используются виртуальные хосты: Apache выбирает сайт по имени хоста, а не только по IP. Это называется name-based virtual hosting.

 

Обязательно ли указывать ServerAlias?

 

Нет, но это удобно, если сайт должен открываться и по www, и без www. Без алиаса Apache будет обслуживать только точно совпадающий запрос, указанный в ServerName.

 

Что делать со стандартным сайтом Ubuntu?

 

Если он мешает, его обычно отключают через a2dissite 000-default.conf. После этого запросы к серверу по неизвестному имени попадут в первый загруженный виртуальный хост из списка apache2ctl -S.

 

Как быстро проверить, какой хост сейчас отвечает по умолчанию?

 

Используйте apache2ctl -S — команда показывает активные виртуальные хосты и порядок их применения. В выводе будет строка «default server …», которая укажет, какой хост является первым.

 

Нужен ли AllowOverride All?

 

Только если планируете использовать .htaccess. Если он не нужен, лучше не открывать лишние возможности без необходимости. На продакшене часто применяют AllowOverride None, чтобы все настройки были централизованы и не было «магических» файлов в директориях.