Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код: Skills Начать
Рубрики
Linux Администрация

Как настроить виртуальные хосты в 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.com
  • http://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.com
sudo certbot --nginx -d example2.com -d www.example2.com

Следуйте интерактивным подсказкам. Certbot будет:

  1. Проверить право собственности на домен через HTTP-вызов
  2. Получить подписанный сертификат от Let’s Encrypt
  3. Автоматически обновить блок сервера Nginx для прослушивания порта 443
  4. Настроить перенаправление 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.com

404 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 в производстве.