# Server block в Nginx: виртуальный хостинг нескольких сайтов

> Как настроить server block в Nginx: структура sites-available, sites-enabled, listen, server_name и несколько сайтов на одном IP.

Server block — это аналог virtual host из Apache: блок конфигурации, который описывает один сайт. На одном сервере с одним IP-адресом может работать десятки server block, и Nginx выбирает нужный по заголовку Host из запроса. После установки Nginx, описанной в статье про [установку Nginx на Ubuntu и Debian](https://www.zevshost.net/ru/kb/nginx-ustanovka-ubuntu-debian/), следующий шаг — создать первый server block для своего домена.

## Что такое server block и зачем он нужен

Без server block Nginx отдаёт всем запросам один и тот же дефолтный конфиг из /etc/nginx/sites-enabled/default. Как только на сервере появляется второй сайт, нужен отдельный блок server с собственным корнем документов, логами и правилами обработки.

Каждый server block описывает: на каком порту слушать (listen), для каких доменов он предназначен (server\_name), где лежат файлы сайта (root) и как обрабатывать разные типы запросов (директивы location, подробно разобранные в статье про [приоритет location в Nginx](https://www.zevshost.net/ru/kb/nginx-location-prioritet/)).

## Структура sites-available и sites-enabled

На Ubuntu и Debian конфигурации сайтов принято хранить в двух каталогах:

- /etc/nginx/sites-available/ — здесь лежат файлы конфигурации всех сайтов, включённых и выключенных.
- /etc/nginx/sites-enabled/ — здесь лежат символические ссылки на активные конфигурации из sites-available.

Такое разделение позволяет быстро отключить сайт, просто удалив symlink, не трогая сам файл конфигурации. Создание нового сайта выглядит так:

```
sudo nano /etc/nginx/sites-available/example.com
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```

## Минимальный server block для одного сайта

Базовая конфигурация для статического сайта на домене example.com выглядит так:

```
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com/public;
    index index.html index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;
}
```

Директива listen задаёт порт и, при необходимости, IP-адрес: listen 192.0.2.10:80 привяжет сервер только к одному адресу. Директива server\_name перечисляет домены через пробел — Nginx сравнивает их с заголовком Host входящего запроса.

## Несколько сайтов на одном сервере

Чтобы разместить второй сайт, создайте отдельный файл в sites-available с другим server\_name и своим root. Nginx выбирает подходящий server block по точному совпадению server\_name, а если совпадения нет — использует блок с флагом default\_server.

| Директива | Назначение |
| --- | --- |
| listen 80 default\_server | Обрабатывает запросы без совпадения по server\_name |
| server\_name example.com | Точное совпадение домена |
| server\_name \*.example.com | Совпадение по маске поддоменов |
| server\_name example.com www.example.com | Несколько доменов на один сайт |

## Частые ошибки при настройке server block

Забытый default\_server на одном из блоков listen 80 — самая частая причина, почему Nginx открывает не тот сайт по IP-адресу без домена. Только один server block в пределах порта может иметь флаг default\_server, иначе nginx -t выдаст ошибку duplicate default server.

Вторая частая ошибка — забыть создать symlink в sites-enabled после правки sites-available: конфигурация лежит на диске, но Nginx её не использует, пока не выполнен nginx -t и reload. Для HTTPS-сайтов дополнительно понадобится SSL-сертификат — этот процесс описан в статье про [настройку SSL/TLS в Nginx](https://www.zevshost.net/ru/kb/nginx-ssl-tls-nastroika/).

## Проверка и применение конфигурации

После любого изменения файлов в sites-available обязательны две команды:

1. sudo nginx -t — проверяет синтаксис всех подключённых конфигураций разом.
2. sudo systemctl reload nginx — применяет изменения без разрыва активных соединений.

Если nginx -t вернул ошибку, systemctl reload ничего не изменит — Nginx продолжит работать со старой конфигурацией до исправления ошибки. Это защищает production-сайт от падения из-за опечатки в конфиге.

Server block — базовый строительный блок конфигурации Nginx: один файл на один сайт, чёткое разделение sites-available и sites-enabled, обязательная проверка nginx -t перед reload. На этом фундаменте строятся более сложные сценарии — location-правила, reverse proxy и SSL.

---

Источник: https://www.zevshost.net/ru/kb/nginx-server-block-virtualnye-hosty/
