Справочник

server_name в nginx: имена сайта и сервер по умолчанию

server_name — строка в блоке server со списком имён, на которые отвечает сайт. nginx сравнивает имя из запроса с этими списками и выбирает блок. Если имя не подошло ни к одному, запрос получает сервер по умолчанию для этого порта.

≈ 6 мин чтения
Содержание 7

Что сделать прямо сейчас

  1. Команды вводятся на сервере: подключитесь к нему по SSH ([как подключиться](/instrukcii/kak-podklyuchitsya-k-vps-po-ssh/)) и набирайте их в том же окне.
  2. Откройте файл сайта: sudo nano /etc/nginx/sites-available/example.com. Вместо example.com — имя файла вашего сайта: список покажет ls /etc/nginx/sites-enabled/. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter.
  3. Нажмите Ctrl+W, введите server_name и нажмите Enter — курсор встанет на строку с этой директивой.
  4. Впишите через пробел все имена сайта, в конце — точка с запятой: server_name example.com www.example.com;
  5. Сохраните файл — Ctrl+O, Enter, затем Ctrl+X — и проверьте настройки: sudo nginx -t. В ответе должны быть слова syntax is ok и test is successful. Тогда примените их: sudo systemctl reload nginx. Если команда ничего не ответила, настройки применены.
  6. Откройте сайт в браузере по каждому имени. Если вместо сайта видна стартовая страница nginx или другой ваш сайт, имя не совпало — см. Как nginx выбирает сайт.

Чтобы имя открывало сайт, домен должен быть направлен на IP-адрес сервера записью DNS — шаг 1 инструкции по размещению сайта.

Как записывать имена

ЗаписьКакие имена подходят
example.comтолько example.com
example.com www.example.comоба имени — без www и с www
*.example.comлюбой поддомен: www.example.com, shop.example.com и даже a.shop.example.com; само example.com — нет
.example.comexample.com и все его поддомены
www.example.*www.example.com, www.example.ru и другие окончания
~^shop\d+\.example\.com$регулярное выражение: shop1.example.com, shop25.example.com
_ни одно настоящее имя — так пишут в сервере по умолчанию

Звёздочка ставится только в начале или в конце имени и только у точки: имена вроде w*.example.com некорректны, для них нужно регулярное выражение. Регулярное выражение начинается со знака ~, точки в нём пишут как \.. Первое имя в списке nginx считает основным.

Если строки server_name в блоке нет, у блока пустое имя: он подходит к запросам без имени, например от программ, которые не передают заголовок Host.

Как nginx выбирает сайт

Браузер передаёт имя сайта в запросе — в заголовке Host. Сначала nginx отбирает блоки server, которые слушают порт запроса, затем сравнивает имя с их server_name в таком порядке:

  1. точное имя, например example.com;
  2. самая длинная маска со звёздочкой в начале, например *.example.com;
  3. самая длинная маска со звёздочкой в конце, например www.example.*;
  4. первое подходящее регулярное выражение — по порядку в настройках.

Поиск останавливается на первом совпадении. Поэтому точное www.example.com в одном блоке победит маску *.example.com в другом, где бы эти блоки ни стояли.

Сервер по умолчанию

Если имя не подошло ни к одному блоку — сайт открыли по IP-адресу сервера или на сервер направлен чужой домен, — запрос получает сервер по умолчанию. Это блок, у которого в строке listen стоит default_server. Если такого блока нет, сервером по умолчанию становится первый блок server с этим портом в настройках.

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    ...
}

Так начинается стартовый сайт nginx в Ubuntu — файл /etc/nginx/sites-available/default. Пока ссылка на него есть в sites-enabled, на запросы по IP и по чужим именам отвечает стартовая страница nginx. В инструкции по размещению сайта эту ссылку убирают — тогда на такие запросы ответит первый по порядку из ваших сайтов.

default_server — свойство порта, а не имени, поэтому его пишут в строке listen. На одном порту сервер по умолчанию может быть только один: второй nginx не примет — ошибка a duplicate default server. Для порта 443 сервер по умолчанию свой: в Ubuntu его строки в файле default закомментированы, и для HTTPS им становится первый блок с listen 443 ssl.

Чтобы запросы по IP и на чужие имена не попадали в ваши сайты, заведите отдельный сервер по умолчанию с ответом 444 — как отсечь запросы по IP и на чужие имена и то же для HTTPS.

Какой блок сейчас сервер по умолчанию, покажет поиск по всем включённым сайтам:

grep -Rn 'default_server' /etc/nginx/sites-enabled/

Если в ответе пусто, сервер по умолчанию — первый блок server с этим портом. Порядок файлов покажет sudo nginx -T | grep -n '# configuration file'.

Ошибки и как их исправить

Что видитеЧто делать
conflicting server name "…" on 0.0.0.0:80, ignoredодно имя стоит в двух блоках server
a duplicate default serverdefault_server у двух блоков на одном порту
could not build server_names_hashдлинное имя сайта
вместо сайта стартовая страница nginxимя не совпало: проверьте строку server_name и что ссылка на файл сайта есть в sites-enabled
по https:// открывается другой ваш сайтдля этого имени нет блока с listen 443 ssl — запрос попал в сервер по умолчанию для порта 443

Источники

Сверено 14 октября 2026 года.

Что почитать дальше