Как настроить виртуальные хосты в Nginx: пошаговая инструкция
Настроим два сайта на одном сервере: создадим каталоги и конфиги Nginx, подключим домены и проверим результат. Инструкция рассчитана на Ubuntu или Debian с Nginx 1.24 и новее; базовая настройка займёт около 20 минут.

За 20 минут вы настроите два домена на одном сервере так, чтобы Nginx отдавал каждому свой сайт. Покажем конфигурацию для Ubuntu и Debian с Nginx 1.24 и новее: от проверки DNS до теста в браузере. Для HTTPS понадобятся отдельный сертификат и настройка TLS — здесь ограничимся HTTP, чтобы сначала проверить маршрутизацию.
Что понадобится до начала
Подготовьте сервер с установленным Nginx, доступом по SSH и правами на команды через sudo. Пример рассчитан на Ubuntu или Debian, где обычно есть каталоги /etc/nginx/sites-available и /etc/nginx/sites-enabled. На другой системе расположение конфигов может отличаться: проверьте основной файл /etc/nginx/nginx.conf и директиву include.
Для примера используем домены example.com и shop.example.com. Замените их на свои. Для каждого домена DNS-запись A должна указывать на публичный IPv4-адрес сервера; если используете IPv6, проверьте и запись AAAA. Без этого браузер может обращаться не к тому серверу, даже если конфигурация Nginx правильная.
- Проверьте, что Nginx установлен и запущен:
sudo systemctl status nginx. - Подготовьте доступ к DNS-панели домена и откройте для входящих подключений порт 80 в сетевом экране сервера.
- Убедитесь, что на сервере нет другого процесса, который уже занимает порт 80.
Если служба активна и команда показывает active (running), можно переходить к конфигурации.
Настраиваем два виртуальных хоста
Виртуальный хост — это конфигурация сайта, которую Nginx выбирает по имени домена из HTTP-запроса. Само имя не создаёт сайт: DNS должен привести браузер к серверу, а в конфигурации должен быть подходящий блок server.
Два домена на одном IP — не два отдельных сервера. Nginx выбирает нужный сайт по имени в запросе, поэтому DNS и директива
server_nameдолжны совпасть.
1. Создайте каталоги и тестовые страницы
Команды ниже создают отдельную папку для каждого сайта и кладут в неё простую страницу. Укажите свои домены вместо примеров, если меняете имена в дальнейших шагах.
sudo mkdir -p /var/www/example.com/html /var/www/shop.example.com/html
printf '<h1>Главный сайт</h1>\n' | sudo tee /var/www/example.com/html/index.html
printf '<h1>Магазин</h1>\n' | sudo tee /var/www/shop.example.com/html/index.html
sudo chmod -R 755 /var/www/example.com /var/www/shop.example.com
Права 755 дают владельцу каталога запись, а остальным — чтение и проход по каталогам. Для файлов сайта, который обновляет отдельный пользователь или система публикации, права нужно настроить под этот процесс; не выдавайте всем запись только ради устранения ошибки.
Проверка: выполните ls -l /var/www/example.com/html. В списке должен быть index.html.
2. Создайте конфигурацию первого домена
На Ubuntu и Debian удобно хранить включённые сайты в sites-available, а активировать их ссылкой из sites-enabled. Создайте файл:
sudo nano /etc/nginx/sites-available/example.com
Вставьте целиком конфигурацию для Nginx 1.24 и новее:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Сохраните файл и закройте редактор. Директива server_name перечисляет домены, которые обслуживает этот блок. Если вариант с www не нужен или DNS для него не настроен, удалите его из списка.
Проверка: команда sudo cat /etc/nginx/sites-available/example.com должна показать сохранённый блок без обрезанных строк.
3. Создайте конфигурацию второго домена
Создайте отдельный файл — не добавляйте второй домен в первый блок, если ему нужны собственные файлы сайта.
sudo nano /etc/nginx/sites-available/shop.example.com
server {
listen 80;
listen [::]:80;
server_name shop.example.com;
root /var/www/shop.example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Проверка: в файле должны совпадать три вещи: имя домена в server_name, путь после root и каталог, созданный на первом шаге.
4. Включите сайты и проверьте конфиг
Создайте символические ссылки, затем попросите Nginx проверить конфигурацию. Тест выполняйте до перезагрузки службы.
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo ln -s /etc/nginx/sites-available/shop.example.com /etc/nginx/sites-enabled/shop.example.com
sudo nginx -t
Ожидаемый результат проверки — сообщения syntax is ok и test is successful. Если команда сообщает, что файл уже существует, ссылка могла быть создана раньше: проверьте её командой ls -l /etc/nginx/sites-enabled/, а не удаляйте наугад.
5. Примените изменения
Только после успешного nginx -t перечитайте конфигурацию без полного перезапуска процесса:
sudo systemctl reload nginx
Проверка: команда sudo systemctl status nginx должна показывать, что служба работает. Затем откройте оба домена в браузере: на первом должна появиться надпись «Главный сайт», на втором — «Магазин».
Проверяем маршрутизацию, если DNS ещё не обновился
Если домен пока указывает на старый сервер, можно проверить ответ нужного виртуального хоста локально на сервере. Команда подставляет имя домена в HTTP-запрос, но отправляет его на локальный порт 80:
curl -H 'Host: example.com' http://127.0.0.1/
curl -H 'Host: shop.example.com' http://127.0.0.1/
В первом ответе ищите «Главный сайт», во втором — «Магазин». Если локальная проверка проходит, а браузер показывает старый сайт или не открывает домен, проверьте DNS, адрес сервера и сетевой экран. Изменения DNS могут применяться не мгновенно; точное время зависит от настроек DNS-записи и кешей.
Если не получилось
nginx: [emerg] ...и указание на строку конфига. Часто причина — пропущенная точка с запятой или закрывающая скобка. Запуститеsudo nginx -tи исправьте именно файл и строку, которые указаны в сообщении.ln: failed to create symbolic link ... File exists. Ссылка или файл с таким именем уже есть. Проверьтеls -l /etc/nginx/sites-enabled/; убедитесь, что существующая ссылка ведёт к нужному конфигу.- Оба домена показывают один сайт. Проверьте, что активны оба конфига и в каждом правильный
server_name. Уточните DNS командойdig +short example.com, если утилитаdigустановлена. - Браузер показывает 403 Forbidden. Nginx не может прочитать файл или пройти по одному из каталогов пути. Проверьте права на все каталоги командой
namei -l /var/www/example.com/html/index.html, еслиnameiдоступна, и настройте чтение для пользователя Nginx. - Браузер показывает 502 Bad Gateway. Приведённые блоки отдают статические файлы и сами по себе не должны обращаться к приложению. Проверьте, не включены ли в другом активном конфиге проксирование на неработающий сервер приложения или конфликтующий блок для того же домена.
Что настроить дальше
После проверки HTTP настройте HTTPS для каждого домена и проверьте, что сертификат покрывает все имена из server_name. Если сайт работает на CMS или приложении, отдельно добавьте правила обработки запросов и проверьте, что они не меняют выбор виртуального хоста. В проде смотрите журналы ошибок и доступа Nginx: обычно они находятся в /var/log/nginx/, но фактические пути задаются конфигурацией.
Термин: символическая ссылка — файл-указатель на другой файл или каталог. В этой схеме она позволяет включить конфигурацию сайта, не копируя её из sites-available в sites-enabled.
Проверка рекламы на риски: Что в макете вызовет вопросы ФАС: превосходные степени, сравнения, обещания результата, маркировка.
Спросить за 40 ₽Источники: Документация Nginx: выбор виртуального сервера по имени, Руководство Nginx для начинающих
Частые вопросы
Можно ли разместить несколько доменов на одном IP-адресе?
Нужно ли создавать отдельный конфиг для каждого сайта?
Почему домен открывает старую страницу после настройки?
Что делать, если в Ubuntu или Debian нет каталогов sites-available и sites-enabled?
Можно ли настроить HTTPS по этой инструкции?
Почему после правки сайта Nginx перестал запускаться?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.