NGINX
#nginx#virtual-hosts#server-blocks#multi-site#sites-available#conf.d

Nginx: несколько virtual hosts на одном сервере

Настройка нескольких сайтов (virtual hosts) на одном сервере Nginx. Примеры для Ubuntu/Debian (sites-available/sites-enabled) и CentOS/Rocky (conf.d).

Настройка нескольких сайтов на одном сервере через virtual hosts (server blocks). Работает за счёт HTTP-заголовка Host.

Ubuntu / Debian (sites-available/sites-enabled)

Структура директорий

/etc/nginx/
├── sites-available/
│   ├── site1.conf
│   └── site2.conf
└── sites-enabled/
    ├── site1.conf -> ../sites-available/site1.conf
    └── site2.conf -> ../sites-available/site2.conf

Конфигурация первого сайта

Создайте /etc/nginx/sites-available/site1.conf:

server {
    listen 80;
    server_name site1.ru www.site1.ru;

    root /var/www/site1.ru/public;
    index index.html index.php;

    access_log /var/www/site1.ru/logs/access.log;
    error_log  /var/www/site1.ru/logs/error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

Конфигурация второго сайта

Создайте /etc/nginx/sites-available/site2.conf:

server {
    listen 80;
    server_name site2.ru www.site2.ru;

    root /var/www/site2.ru/public;
    index index.html;

    access_log /var/www/site2.ru/logs/access.log;
    error_log  /var/www/site2.ru/logs/error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

Активация сайтов

# Активация первого сайта
ln -s /etc/nginx/sites-available/site1.conf /etc/nginx/sites-enabled/

# Активация второго сайта
ln -s /etc/nginx/sites-available/site2.conf /etc/nginx/sites-enabled/

# Проверка и перезагрузка
nginx -t && systemctl reload nginx

Отключение сайта

# Удаляем симлинк
rm /etc/nginx/sites-enabled/site1.conf

# Проверяем и перезагружаем
nginx -t && systemctl reload nginx

CentOS / Alma / Rocky (conf.d)

Структура директорий

/etc/nginx/conf.d/
├── site1.conf
├── site2.conf
└── api.site3.conf

Конфигурация сайтов

Создайте /etc/nginx/conf.d/site1.conf:

server {
    listen 80;
    server_name site1.ru www.site1.ru;

    root /var/www/site1.ru/public;
    index index.html;

    access_log /var/www/site1.ru/logs/access.log;
    error_log  /var/www/site1.ru/logs/error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

Создайте /etc/nginx/conf.d/site2.conf:

server {
    listen 80;
    server_name site2.ru www.site2.ru;

    root /var/www/site2.ru/public;
    index index.html;

    access_log /var/www/site2.ru/logs/access.log;
    error_log  /var/www/site2.ru/logs/error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

Активация и проверка

# Проверка конфигурации
nginx -t

# Перезагрузка
systemctl reload nginx

Отключение сайта

# Переименовываем файл
mv /etc/nginx/conf.d/site1.conf /etc/nginx/conf.d/site1.conf.disabled

# Или удаляем
rm /etc/nginx/conf.d/site1.conf

# Проверяем и перезагружаем
nginx -t && systemctl reload nginx

Пример с поддоменами

# Основной домен
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com/public;
    # ...
}

# API поддомен
server {
    listen 80;
    server_name api.example.com;
    root /var/www/api.example.com/public;
    # ...
}

# Статика на отдельном поддомене
server {
    listen 80;
    server_name static.example.com;
    root /var/www/static.example.com/public;
    # ...
}

Проверка активных virtual hosts

# Просмотр активных конфигов (Ubuntu/Debian)
ls -la /etc/nginx/sites-enabled/

# Просмотр всех конфигов (CentOS/Rocky)
ls -la /etc/nginx/conf.d/

# Проверка, какие server блоки активны
nginx -T 2>/dev/null | grep -A 5 "server_name"

Usage:

В Ubuntu/Debian используйте sites-available для хранения конфигов и sites-enabled для активации через симлинки. В CentOS/Rocky файлы в conf.d/ активны автоматически.

Notes:

⚠️ Каждый домен должен иметь уникальный server_name. Nginx выбирает нужный сайт по HTTP-заголовку Host. Всегда проверяйте конфигурацию перед reload: nginx -t.