Виртуальные хосты в Nginx: короткое руководство
Настройте в Nginx два сайта на одном сервере: подготовьте DNS, создайте отдельные конфиги, проверьте синтаксис и примените изменения без перезапуска. Инструкция рассчитана на Linux и HTTP.

За 15–20 минут вы настроите два домена на одном сервере Nginx: каждый будет отдавать свой сайт, а конфигурация пройдёт проверку до применения. Ниже — пример для Linux, где Nginx уже установлен; команды проверки и перечитывания конфигурации подходят для систем с systemd, но расположение файлов зависит от дистрибутива.
Что подготовить
Понадобятся SSH-доступ с правами администратора, установленный Nginx и домены, у которых DNS-записи указывают на IP сервера. Пример использует example.com и shop.example.com: замените их своими именами. Проверяйте инструкцию на Nginx 1.24 и новее; базовые директивы server, listen и server_name давно входят в Nginx, но конкретные пути к файлам и управление службой зависят от системы.
Создайте каталоги сайтов и положите в каждый тестовый файл index.html. Например, содержимое для первого сайта — «Сайт example.com», для второго — «Сайт shop.example.com». В командах ниже каталоги принадлежат пользователю, под которым вы работаете; если у процесса Nginx нет прав читать файлы, настройте владельца и права отдельно.
/var/www/example.com— файлы первого сайта./var/www/shop.example.com— файлы второго сайта.
В Debian и Ubuntu обычно используют /etc/nginx/sites-available/ и символические ссылки из sites-enabled/. В RHEL-подобных системах часто подключают конфиги из /etc/nginx/conf.d/. Посмотрите, что подключает основной файл /etc/nginx/nginx.conf, и используйте существующую схему, а не создавайте параллельную.
Настройка по шагам
- Проверьте DNS. Для каждого домена нужна запись, ведущая на адрес сервера: обычно это A для IPv4 и AAAA для IPv6, если сервер доступен по IPv6. Проверка: запросите домен через DNS-утилиту, например
dig +short example.com, и убедитесь, что ответ соответствует адресу сервера. Если DNS ещё не обновился, тестировать домен извне рано. - Создайте отдельный конфиг для первого сайта. В Debian/Ubuntu это может быть файл
/etc/nginx/sites-available/example.com; в другой системе положите его в каталог, который подключает Nginx. Добавьте блок:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Проверка: в server_name перечислены именно те имена, которые должны открывать этот сайт, а путь в root совпадает с каталогом файлов.
- Добавьте второй виртуальный хост. Создайте рядом отдельный конфиг
shop.example.com, поменяйте имена доменов и каталог:
server {
listen 80;
listen [::]:80;
server_name shop.example.com;
root /var/www/shop.example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Проверка: у второго блока свой server_name и свой root. Если случайно скопировать путь первого сайта, оба домена могут показывать один и тот же контент.
- Подключите конфиги. В Debian/Ubuntu создайте ссылки из
sites-enabledна оба файла вsites-available. Если система подключает файлы изconf.d, разместите конфиги там — ссылки не нужны. Проверьте также, не остался ли включён стандартный сайт, который перехватывает запросы по умолчанию. Проверка: оба файла действительно попадают в конфигурацию, которую читает Nginx. - Проверьте конфигурацию до применения. Выполните
sudo nginx -t. Ожидаемый результат — сообщения о корректном синтаксисе и успешной проверке. Если команда указывает на строку и файл, исправьте ошибку там; не перечитывайте конфиг, пока тест не проходит. - Примените изменения без остановки сервиса. Выполните
sudo systemctl reload nginx. Затем откройте оба домена по HTTP или проверьте их запросами из терминала. Убедитесь, что первый показывает содержимое первого каталога, а второй — второго.
Виртуальный хост1 — блок конфигурации, по которому Nginx выбирает настройки сайта для входящего запроса. Обычно он сопоставляет имя из HTTP-запроса со значением server_name; если совпадения нет, запрос попадёт в сервер по умолчанию для этого порта.
Два сайта разделяют сервер, но не конфигурацию: отдельные блоки помогают не перепутать домены, корневые каталоги и дальнейшие правила обработки запросов.
Если сайт открывается не тот
Проверьте три вещи: DNS указывает на нужный сервер, домен точно указан в server_name, а конфиг подключён. Для диагностики можно обратиться к локальному Nginx, передав имя сайта в заголовке Host:
curl -i -H 'Host: example.com' http://127.0.0.1/
Если локально приходит правильный сайт, а снаружи — нет, ищите проблему в DNS, сетевом экране или балансировщике перед сервером. Если Nginx возвращает 403, проверьте права на чтение файлов и проход по каталогам; если 404 — наличие файла и значение root. Это типичные причины, а точная диагностика зависит от журналов и остальной конфигурации.
Не назначайте default_server одному из доменов наугад: это меняет обработку запросов, которые не совпали ни с одним именем. Если нужно отдельно управлять неизвестными Host, настройте для них отдельный сервер по умолчанию и проверьте его поведение.
Что делать дальше
После проверки HTTP настройте HTTPS отдельно: сертификат должен покрывать нужные имена, а правила перенаправления на HTTPS стоит включать только после успешной проверки сертификата. Затем проверьте журналы доступа и ошибок для каждого сайта и убедитесь, что перезагрузка конфигурации проходит без сообщений об ошибках.
1 Также встречается термин «серверный блок»: это название директивы server в конфигурации Nginx.
Создатель презентаций: Структура и текст каждого слайда: заголовки-утверждения, одна мысль на слайд, заметки докладчику.
Спросить за 150 ₽Источники: Nginx Documentation: How nginx processes a request, Nginx Documentation: ngx_http_core_module
Частые вопросы
Нужно ли устанавливать отдельный Nginx для каждого домена?
Можно ли настроить виртуальный хост без домена?
Почему оба домена показывают один и тот же сайт?
Что делать, если nginx -t завершился ошибкой?
Нужно ли перезапускать Nginx после изменения файла?
Почему сайт не открывается по HTTPS?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.