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.