Как настроить виртуальные хосты Nginx на Ubuntu
Введение

Виртуальные хосты позволяют запускать несколько сайтов с разными доменными именами или портами на одном физическом сервере или виртуальной машине. Такой подход экономит ресурсы и упрощает сопровождение — именно так устроены тарифы общего хостинга.
Nginx — легковесный и высокопроизводительный веб- и обратный прокси-сервер. Инструкция рассчитана на Ubuntu и подойдёт как для локальной разработки, так и для небольших продакшен-сценариев.
Что такое виртуальный хост?
Виртуальный веб‑хост — это метод размещения нескольких веб‑сайтов на одном сервере, где каждый сайт может иметь своё доменное имя и конфигурацию. Существует два основных подхода:
- По имени (name-based): несколько server-блоков слушают один порт (обычно 80/443) и выбирают сайт по заголовку Host. Это самый распространённый способ в продакшене.
- По порту (port-based): каждый сайт слушает уникальный порт (например, 80 и 81). Удобно для тестирования и на машинах без настроенного DNS.
Шаг 1 — Установка Nginx
Если Nginx ещё не установлен, выполните эти команды в Ubuntu.
Обновите индекс пакетов:
sudo apt updateУстановите Nginx:
sudo apt install nginxТестирование Nginx
Запустите сервис:
sudo systemctl start nginxПроверьте статус:
sudo systemctl status nginxОткройте в браузере http://localhost:80. Должна отобразиться стандартная стартовая страница Nginx.
Шаг 2 — Создание каталога сайта и начальной страницы
По умолчанию корневой каталог веб‑сайта: /var/www/html. Для каждого сайта рекомендуется создать собственный каталог, чтобы изоляция и управление были проще.
Перейдите в каталог /var/www и создайте папку для сайта (в примере — VirtualHost):
cd /var/www
sudo mkdir -p VirtualHostСоздайте файл index.html:
cd /var/www/VirtualHost
sudo touch index.html
sudo tee index.html > /dev/null <<'HTML'
Nginx: Web & Reverse proxy server
Welcome to Nginx
I've just configured a virtual host using Nginx web server on Linux
HTMLПроверьте права доступа: пользователь, под которым работает веб‑сервер (обычно www-data), должен иметь доступ к файлам.
sudo chown -R www-data:www-data /var/www/VirtualHost
sudo chmod -R 750 /var/www/VirtualHostШаг 3 — Конфигурация виртуального хоста
Файлы конфигурации Nginx находятся в /etc/nginx. На Ubuntu обычно используются каталоги /etc/nginx/sites-available и /etc/nginx/sites-enabled.
Перейдите в каталог с активными конфигурациями и создайте новый файл:
cd /etc/nginx/sites-enabled
sudo touch virtual_host
sudo chmod 644 virtual_host
sudo nano virtual_hostВставьте в файл такой блок конфигурации (пример с портом 81):
server {
listen 81;
listen [::]:81;
server_name my.virtualhost.com;
root /var/www/VirtualHost;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}Сохраните и закройте файл.
Пояснения ключевых директив:
- listen — указывает порт, на котором будет доступен сайт (в примере 81). Для production обычно 80/443.
- server_name — доменное имя, по которому Nginx выбирает блок server. Для теста можно оставить любое имя и добавить запись в /etc/hosts.
- root — корневой каталог сайта.
- index — файл по умолчанию.
- try_files — безопасная проверка наличия статических файлов, возвращает 404, если файл не найден.
Важно: на реальном сервере предпочтительнее размещать конфиги в /etc/nginx/sites-available и делать символьную ссылку в sites-enabled: sudo ln -s /etc/nginx/sites-available/virtual_host /etc/nginx/sites-enabled/virtual_host
Шаг 4 — Применение и проверка
Перезапустите Nginx, чтобы применить изменения:
sudo systemctl restart nginxПроверьте статус сервера и наличие ошибок в конфигурации:
sudo nginx -t
sudo systemctl status nginxОткройте в браузере http://localhost:81. Если всё настроено правильно, вы увидите страницу из /var/www/VirtualHost/index.html.
Теперь на сервере работают два сайта: один на порту 80, другой на порту 81.
Дополнительно: как использовать имя хоста вместо порта
Для тестирования name-based хостинга на локальной машине можно добавить запись в /etc/hosts:
sudo -- bash -c 'echo "127.0.0.1 my.virtualhost.com" >> /etc/hosts'Измените listen на 80 и server_name на my.virtualhost.com, затем перезапустите Nginx. В браузере откройте http://my.virtualhost.com.
Когда этот способ не подходит
- Если вы хотите, чтобы сайты были доступны по разным доменам в интернете — потребуется корректный DNS и публичный IP. Локальная запись /etc/hosts не работает для внешних пользователей.
- Если у вас ограничены порты (например, файрвол блокирует нетипичные порты), использование портов выше 1024 может быть неудобным.
- Для высоконагруженных или изолированных приложений часто лучше использовать отдельные виртуальные машины или контейнеры.
Альтернативные подходы
- Использовать name-based виртуальные хосты (несколько server-блоков на порту 80/443).
- Воспользоваться Docker-контейнерами и Traefik/NGINX как обратным прокси с динамической маршрутизацией.
- Запускать каждый сайт в отдельном виртуальном хосте (VM) при строгой изоляции и требованиях безопасности.
Быстрый чеклист по безопасности
- Отключайте автосписок директорий: в server-блоке добавьте autoindex off; (по умолчанию выключено в большинстве конфигураций).
- Доступ к файлам: владелец www-data, права 750/640 для директорий/файлов.
- Ограничьте возможные методы запроса: добавьте директивы для защиты от ненужных методов.
- Логирование: сохраняйте access и error логи по отдельным файлам для каждого сайта.
- TLS: для публичных доменов настройте HTTPS с помощью Let’s Encrypt и certbot.
- Ограничьте размер загрузок и таймауты client_max_body_size, client_body_timeout.
Диагностика распространённых проблем
- Nginx не запускается: выполните sudo nginx -t для проверки синтаксиса. Посмотрите /var/log/nginx/error.log.
- Пустая страница или 403: проверьте права на файлы и директиву root.
- 404 на существующие файлы: проверьте try_files и правильность root.
- Конфликт портов: убедитесь, что другой процесс (например, Apache) не занимает порт.
Мини‑методология: как развернуть сайт за 10 минут
- Установить Nginx: sudo apt install nginx
- Создать каталог /var/www/имя_сайта и положить index.html
- Создать конфигурацию server в /etc/nginx/sites-available
- Сделать ln -s в sites-enabled
- Проверить конфиг: sudo nginx -t
- Перезапустить: sudo systemctl restart nginx
- Проверить в браузере
Тесты и критерии приёмки
- Nginx успешно проходит проверку конфигурации: sudo nginx -t — без ошибок.
- Сервер слушает целевой порт: sudo ss -tln | grep 81
- Веб‑страница загружается корректно по URL (HTTP 200).
- Логи не показывают ошибок 5xx при простом GET.
Шпаргалка команд (cheat sheet)
- Установка: sudo apt install nginx
- Проверка конфигурации: sudo nginx -t
- Перезапуск: sudo systemctl restart nginx
- Старт/стоп: sudo systemctl start|stop|status nginx
- Права: sudo chown -R www-data:www-data /var/www/YourSite
- Добавить хост в hosts: sudo – bash -c ‘echo “127.0.0.1 example.com” >> /etc/hosts’
Модель принятия решения: порт или имя?
flowchart TD
A[Нужен внешний доступ по домену?] -->|Да| B[Использовать name-based 'порт 80/443']
A -->|Нет, только локально| C[Можно использовать порт-based 'например, 81']
B --> D[Настроить DNS и TLS]
C --> E[Добавить запись в /etc/hosts для теста]Короткий глоссарий
- virtual host — способ размещения нескольких сайтов на одном сервере.
- server_name — директива Nginx для имени хоста.
- root — корневая директория сайта.
- try_files — директива для проверки наличия файлов и безопасной отдачи.
Советы по миграции с Apache на Nginx
- Перенесите правила перезаписи (mod_rewrite) в эквивалентные директивы Nginx (try_files, rewrite).
- Проверьте конфигурацию слушания портов и файлы виртуальных хостов.
- Тестируйте на staging перед продакшеном.
Итог
Вы научились: устанавливать Nginx, создавать корневую папку сайта, настраивать виртуальный хост (на примере порта 81), перезапускать сервер и диагностировать ошибки. Это базовый набор навыков для размещения нескольких сайтов на одном сервере.
Важно: для публичных сайтов обязательно настраивайте HTTPS и следите за безопасностью файловой системы.
Краткое резюме ниже.
Краткое резюме
- Создайте отдельный каталог сайта в /var/www.
- Создайте конфигурацию server и подключите её в sites-enabled.
- Используйте nginx -t перед перезапуском.
- Для публичного доступа настройте DNS и HTTPS.
Похожие материалы
Отслеживание скорости подростка с Automatic Pro
Lens — графический клиент для Kubernetes
Очистить историю загрузок в Firefox
Стрим с Apple Silicon: настройка M1/M2 Mac
Как использовать PGP в ProtonMail