SystemdDoctor
служба не работает nginx сеть загрузка частое

nginx: [emerg] host not found in upstream

nginx разрешает имена узлов при разборе конфигурации, а не при первом запросе. Если имя из upstream или proxy_pass не разрешается в момент запуска, сервер не поднимается вовсе. Это особенно обидно при загрузке: сеть ещё не готова, и nginx падает.

Что это значит

Обойти это можно двумя способами. Первый: задать resolver и передавать адрес через переменную — тогда имя разрешается во время работы, а не при старте. Второй: дождаться готовности сети через зависимость unit-файла. У каждого свои последствия: переменная в proxy_pass меняет обработку пути запроса.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Имя не разрешается в момент запуска

    При загрузке сервера сеть или разрешение имён могут быть ещё не готовы. Внешне это выглядит как случайный отказ nginx после перезагрузки.

  2. Имя вообще не существует

    Опечатка, узел выведен из работы, запись в DNS удалена. nginx честно сообщает, что имени нет.

  3. Имя разрешается только внутренним сервером, который недоступен

    Внутренние зоны разрешает свой DNS. Если он недоступен или не указан в настройках разрешения имён, внутренние имена не работают.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Показывает имя, которое не удалось разрешить, и файл с ним.

sudo nginx -t

Проверка разрешения имени так, как это видит система.

getent hosts ИМЯ

Ждёт ли nginx готовности сети.

systemctl show nginx -p After -p Wants | tr " " "\n" | grep -i network

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Имя не разрешается в момент запуска
Почему происходит
При загрузке сервера сеть или разрешение имён могут быть ещё не готовы. Внешне это выглядит как случайный отказ nginx после перезагрузки.
Как проверить
Проверьте разрешение имени и порядок запуска службы.
getent hosts backend.internal
systemctl show nginx -p After | tr " " "\n" | grep -i net
Как исправить
Добавьте ожидание готовности сети в переопределении unit-файла nginx.
sudo systemctl edit nginx   # [Unit]\nWants=network-online.target\nAfter=network-online.target
2. Имя вообще не существует
Почему происходит
Опечатка, узел выведен из работы, запись в DNS удалена. nginx честно сообщает, что имени нет.
Как проверить
Посмотрите имя из сообщения и проверьте его.
sudo nginx -t 2>&1 | grep -i "host not found"
dig +short backend.internal
Как исправить
Исправьте имя или пропишите его в /etc/hosts, если узел внутренний и записи в DNS не будет.
3. Имя разрешается только внутренним сервером, который недоступен
Почему происходит
Внутренние зоны разрешает свой DNS. Если он недоступен или не указан в настройках разрешения имён, внутренние имена не работают.
Как проверить
Посмотрите настройки разрешения имён.
resolvectl status | head -20
cat /etc/resolv.conf
Как исправить
Исправьте настройки разрешения имён или используйте resolver в nginx с адресом внутреннего сервера.

Пример вывода

nginx не поднялся при загрузке: имя узла не разрешилось. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

nginx[1120]: nginx: [emerg] host not found in upstream "backend.internal" in /etc/nginx/conf.d/proxy.conf:3
systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
systemd[1]: Failed to start nginx.service - A high performance web server and a reverse proxy server.

Связанные ошибки

Где встречается чаще всего

Источники

  • Документация nginx: resolver и proxy_pass с переменными документация программы
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено перезагрузкой машины с proxy_pass на внутреннее имя без ожидания сети.
    собственная проверка, systemd 255
    сверено 15 сентября 2026