Как настроить виртуальные хосты в Nginx на Ubuntu
Настройка виртуальных хостов в Nginx — один из самых мощных методов размещения нескольких веб-сайтов на одном сервере, каждый с собственным доменным именем, корневой директорией и независимой конфигурацией. Nginx реализует это через блоки сервера — гибкие, легковесные единицы конфигурации, которые определяют, как веб-сервер отвечает на запросы для каждого домена.
Независимо от того, управляете ли вы личным портфолио, запускаете веб-сайты клиентов или масштабируете многотенантное приложение, это руководство предоставляет полное, готовое к использованию в production пошаговое руководство по настройке виртуальных хостов Nginx на Ubuntu. Мы рассмотрим структуру директорий, конфигурацию блоков сервера, включение сайтов, настройку SSL/HTTPS и устранение неполадок — всё, что вам нужно, чтобы перейти от нуля к полностью функциональному многосайтовому серверу Nginx.
> Ищете надёжный сервер Ubuntu для практики? Планы VPS Hosting AlexHost предоставляют полный root-доступ, SSD-хранилище и мгновенное развёртывание — идеально для этого случая.
Предварительные требования
Перед началом убедитесь, что выполнены следующие условия:
Nginx установлен на вашем сервере
Если Nginx еще не установлен, выполните следующие команды на вашем сервере Ubuntu:
sudo apt update
sudo apt install nginxПроверьте установку и убедитесь, что служба работает:
sudo systemctl status nginxВы должны увидеть active (running) в выводе. Если нет, запустите его вручную:
sudo systemctl start nginx
sudo systemctl enable nginxДоменные имена, указывающие на ваш сервер
Каждый виртуальный хост требует доменного имени, которое разрешается на публичный IP-адрес вашего сервера. Вам нужно создать A записи в настройках DNS, указывающие на IP сервера.
> Нужен домен? Зарегистрируйте свой через AlexHost Domain Registration и управляйте DNS записями прямо из панели управления.
Для локального тестирования вы можете обойти DNS полностью, отредактировав файл /etc/hosts (описано в Шаге 7).
Требуемые разрешения
Вам нужны привилегии sudo на сервере Ubuntu для создания директорий, редактирования файлов конфигурации и управления службой Nginx.
Шаг 1: Настройка директорий для каждого веб-сайта
Каждый веб-сайт, размещенный на вашем сервере, должен иметь собственную изолированную директорию для хранения веб-файлов. Такое разделение поддерживает организованность ваших проектов и предотвращает конфликты конфигурации.
В этом руководстве мы настроим два примера доменов: example1.com и example2.com. Замените их на ваши фактические имена доменов везде в тексте.
Создание корневых директорий веб-сайтов
sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/htmlФлаг -p создает все промежуточные директории по мере необходимости.
Назначение правильного владельца
Предоставьте владение этими директориями пользователю www-data, системному пользователю, от имени которого работает Nginx:
sudo chown -R www-data:www-data /var/www/example1.com/html
sudo chown -R www-data:www-data /var/www/example2.com/htmlЭто гарантирует, что Nginx имеет необходимые разрешения на чтение для обслуживания файлов из этих директорий.
Установка разрешений директорий
sudo chmod -R 755 /var/wwwРазрешение 755 означает, что владелец имеет полный доступ на чтение/запись/выполнение, в то время как группы и другие пользователи имеют доступ на чтение и выполнение — это уместно для публично обслуживаемого веб-контента.
Шаг 2: Создание примера HTML контента
Чтобы проверить, что каждый виртуальный хост работает правильно, создайте простой index.html файл для каждого сайта.
Для example1.com
echo "<h1>Welcome to Example1.com!</h1>" | sudo tee /var/www/example1.com/html/index.htmlДля example2.com
echo "<h1>Welcome to Example2.com!</h1>" | sudo tee /var/www/example2.com/html/index.htmlЭти страницы-заполнители подтвердят, что Nginx маршрутизирует запросы в правильный корневой каталог документов для каждого домена.
Шаг 3: Создание файлов конфигурации виртуального хоста
Nginx хранит файлы конфигурации сайтов в /etc/nginx/sites-available/. Каждый файл определяет блок сервера — эквивалент виртуального хоста Apache в Nginx. Включенные сайты затем связываются символической ссылкой в /etc/nginx/sites-enabled/.
Конфигурация для example1.com
Создайте новый файл конфигурации:
sudo nano /etc/nginx/sites-available/example1.comДобавьте следующий блок сервера:
server {
listen 80;
listen [::]:80;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
index index.html index.htm;
access_log /var/log/nginx/example1.com.access.log;
error_log /var/log/nginx/example1.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}Сохраните и закройте файл (Ctrl+X, затем Y, затем Enter).
Конфигурация для example2.com
Создайте второй файл конфигурации:
sudo nano /etc/nginx/sites-available/example2.comДобавьте следующий блок сервера:
server {
listen 80;
listen [::]:80;
server_name example2.com www.example2.com;
root /var/www/example2.com/html;
index index.html index.htm;
access_log /var/log/nginx/example2.com.access.log;
error_log /var/log/nginx/example2.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}Объяснение ключевых директив
| Директива | Назначение |
|---|---|
listen 80 | Прослушивает входящие HTTP-соединения на порту 80 |
listen [::]:80 | Включает поддержку IPv6 на порту 80 |
server_name | Определяет, какие доменные имена обрабатывает этот блок |
root | Устанавливает корневой каталог документов — где хранятся файлы веб-сайта |
index | Указывает файл по умолчанию для обслуживания при запросе каталога |
try_files | Пытается обслужить запрошенный файл; возвращает 404, если не найден |
access_log / error_log | Отдельные файлы журналов для каждого сайта для более удобной отладки |
Шаг 4: Включение виртуальных хостов
Nginx активирует сайты, создавая символические ссылки из sites-available на sites-enabled. Этот дизайн позволяет подготовить конфигурации без их немедленной активации.
sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/Удаление сайта по умолчанию (опционально, но рекомендуется)
Если вы хотите предотвратить вмешательство страницы-заполнителя Nginx по умолчанию, отключите её:
sudo rm /etc/nginx/sites-enabled/defaultВы всегда можете повторно включить её позже, пересоздав символическую ссылку.
Шаг 5: Проверка конфигурации Nginx
Перед перезагрузкой Nginx всегда проверяйте файлы конфигурации на синтаксические ошибки. Неправильно настроенный файл может привести к отключению всех сайтов на сервере.
sudo nginx -tУспешная проверка возвращает:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulЕсли вы видите ошибки, Nginx укажет файл и номер строки, где произошла проблема. Проверьте соответствующий файл конфигурации и исправьте все опечатки или отсутствующие точки с запятой перед продолжением.
Шаг 6: Перезагрузите Nginx для применения изменений
После успешной проверки конфигурации перезагрузите или перезапустите Nginx для применения ваших изменений:
sudo systemctl restart nginxИли используйте reload для корректной перезагрузки, которая не прерывает активные соединения:
sudo systemctl reload nginxШаг 7: Доступ к вашим веб-сайтам
Если DNS уже настроен
Если ваши доменные имена уже указывают на IP-адрес вашего сервера через DNS A записи, просто откройте браузер и перейдите на:
http://example1.comhttp://example2.com
Вы должны увидеть соответствующие сообщения "Welcome", которые вы создали на шаге 2.
Для локального тестирования (без DNS)
Если вы тестируете локально или DNS еще не распространился, вы можете имитировать разрешение доменов, отредактировав файл /etc/hosts на вашем локальном компьютере (в Linux/macOS) или C:WindowsSystem32driversetchosts (в Windows).
Откройте файл с повышенными привилегиями:
sudo nano /etc/hostsДобавьте следующие строки, заменив YOUR_SERVER_IP на фактический IP-адрес вашего сервера:
YOUR_SERVER_IP example1.com www.example1.com
YOUR_SERVER_IP example2.com www.example2.comСохраните файл и протестируйте в браузере. Помните, что нужно удалить эти записи после того, как ваши реальные DNS записи будут активны.
Шаг 8: Включите HTTPS с Let’s Encrypt (Рекомендуется)
Запуск веб-сайтов по простому HTTP больше неприемлем для производственных сред. HTTPS шифрует трафик между вашим сервером и посетителями, улучшает рейтинги SEO и требуется для современных функций браузера. Let’s Encrypt предоставляет бесплатные автоматически обновляемые сертификаты SSL/TLS.
> Предпочитаете премиум-решение SSL? AlexHost предлагает надежные SSL Certificates для компаний, которым нужна расширенная проверка или поддержка подстановочных знаков.
Установите Certbot
sudo apt install certbot python3-certbot-nginxПолучите и установите SSL-сертификаты
Запустите Certbot для каждого домена. Плагин --nginx автоматически изменяет вашу конфигурацию Nginx для включения HTTPS:
sudo certbot --nginx -d example1.com -d www.example1.comsudo certbot --nginx -d example2.com -d www.example2.comСледуйте интерактивным подсказкам. Certbot будет:
- Проверить право собственности на домен через HTTP-вызов
- Получить подписанный сертификат от Let’s Encrypt
- Автоматически обновить блок сервера Nginx для прослушивания порта 443
- Настроить перенаправление HTTP на HTTPS
Проверьте автоматическое обновление
Сертификаты Let’s Encrypt истекают каждые 90 дней. Certbot устанавливает таймер systemd для автоматического обновления. Протестируйте его с помощью:
sudo certbot renew --dry-runЕсли пробный запуск завершится без ошибок, ваши сертификаты будут автоматически обновляться без какого-либо ручного вмешательства.
Как будет выглядеть ваш обновленный блок сервера
После запуска Certbot ваша конфигурация будет автоматически обновлена примерно так:
server {
listen 443 ssl;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
index index.html;
ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 80;
server_name example1.com www.example1.com;
return 301 https://$host$request_uri;
}Устранение распространенных проблем
Даже при тщательной конфигурации могут возникнуть проблемы. Вот наиболее распространенные проблемы и способы их решения:
502 Bad Gateway
Это обычно означает, что Nginx не может взаимодействовать с внутренней службой (например, PHP-FPM или приложением Node.js). Убедитесь, что служба upstream запущена и что сокет/порт в вашей конфигурации указаны правильно.
403 Forbidden
Обычно это проблема с разрешениями. Проверьте, что www-data владеет корневой папкой веб-сайта и что разрешения файлов установлены правильно:
sudo chown -R www-data:www-data /var/www/example1.com
sudo chmod -R 755 /var/www/example1.com404 Not Found
Убедитесь, что директива root в блоке server указывает на правильный каталог и что index.html существует по этому пути.
Загружается неправильный сайт
Если при посещении example1.com загружается содержимое example2.com, проверьте, что:
- Каждая директива
server_nameуникальна и правильна - Символические ссылки в
sites-enabledдействительны:ls -la /etc/nginx/sites-enabled/ - Сайт по умолчанию отключен, если он конфликтует
Nginx не запускается после изменения конфигурации
Всегда запускайте sudo nginx -t перед перезагрузкой. Внимательно изучите вывод ошибок — он указывает на точный файл и строку, вызывающие проблему.
Проверка логов
Логи для каждого сайта (настроенные на этапе 3) — ваш лучший ресурс для отладки:
sudo tail -f /var/log/nginx/example1.com.error.log
sudo tail -f /var/log/nginx/example1.com.access.logДополнительные соображения
Хостинг PHP приложений
Если ваши сайты работают на PHP (например, WordPress, Laravel), вам потребуется установить PHP-FPM и добавить fastcgi_pass директиву в блок вашего сервера:
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}Использование панели управления
Управление виртуальными хостами Nginx вручную через командную строку — это мощный, но трудоёмкий способ при масштабировании. Если вы предпочитаете графический интерфейс, рассмотрите VPS с cPanel от AlexHost или изучите полный диапазон панелей управления VPS, чтобы найти подходящий вариант для вашего рабочего процесса.
Масштабирование сверх одного VPS
По мере роста трафика одного VPS может быть недостаточно. Для высоконагруженных ресурсоёмких рабочих нагрузок рассмотрите возможность перехода на выделенные серверы для гарантированных ресурсов, полной изоляции оборудования и максимальной производительности.
Заключение
Вы успешно настроили виртуальные хосты Nginx на Ubuntu, что позволяет вашему серверу одновременно размещать несколько независимых веб-сайтов. Вот краткое описание того, что было достигнуто:
- Созданы изолированные каталоги веб-корня для каждого домена с правильным владельцем и разрешениями
- Написаны чистые, готовые к производству конфигурации блоков сервера с отдельными журналами доступа и ошибок
- Включены виртуальные хосты с использованием паттерна на основе символических ссылок Nginx
sites-available/sites-enabled - Проверена и перезагружена конфигурация Nginx безопасно
- Защищен каждый сайт с помощью HTTPS с использованием бесплатных сертификатов Let's Encrypt через Certbot
Эта установка эффективна, масштабируема и следует лучшим практикам Nginx. Независимо от того, размещаете ли вы два сайта или двадцать, применяется одна и та же схема — просто повторите процесс для каждого дополнительного домена.
Для достижения наилучших результатов объедините эту конфигурацию с быстрой и надежной средой хостинга. Планы VPS Hosting AlexHost оптимизированы для рабочих нагрузок Linux, поставляются с полным доступом root и поддерживаются круглосуточной технической поддержкой — обеспечивая идеальную основу для запуска Nginx в производстве.
на всех хостинговых услугах