nginx: [emerg] host not found in upstream
nginx разрешает имена узлов при разборе конфигурации, а не при первом запросе. Если имя из upstream или proxy_pass не разрешается в момент запуска, сервер не поднимается вовсе. Это особенно обидно при загрузке: сеть ещё не готова, и nginx падает.
Что это значит
Обойти это можно двумя способами. Первый: задать resolver и передавать адрес через переменную — тогда имя разрешается во время работы, а не при старте. Второй: дождаться готовности сети через зависимость unit-файла. У каждого свои последствия: переменная в proxy_pass меняет обработку пути запроса.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Имя не разрешается в момент запуска
При загрузке сервера сеть или разрешение имён могут быть ещё не готовы. Внешне это выглядит как случайный отказ nginx после перезагрузки.
-
Имя вообще не существует
Опечатка, узел выведен из работы, запись в DNS удалена. nginx честно сообщает, что имени нет.
-
Имя разрешается только внутренним сервером, который недоступен
Внутренние зоны разрешает свой DNS. Если он недоступен или не указан в настройках разрешения имён, внутренние имена не работают.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Показывает имя, которое не удалось разрешить, и файл с ним.
sudo nginx -tПроверка разрешения имени так, как это видит система.
getent hosts ИМЯЖдёт ли nginx готовности сети.
systemctl show nginx -p After -p Wants | tr " " "\n" | grep -i networkРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- При загрузке сервера сеть или разрешение имён могут быть ещё не готовы. Внешне это выглядит как случайный отказ 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
- Почему происходит
- Опечатка, узел выведен из работы, запись в DNS удалена. nginx честно сообщает, что имени нет.
- Как проверить
-
Посмотрите имя из сообщения и проверьте его.
sudo nginx -t 2>&1 | grep -i "host not found" dig +short backend.internal
- Как исправить
- Исправьте имя или пропишите его в /etc/hosts, если узел внутренний и записи в DNS не будет.
- Почему происходит
- Внутренние зоны разрешает свой 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.
Связанные ошибки
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Цель не достигнута: служба ждёт target, который не наступает Служба не запускается, потому что не достигнута цель из After= или Requires=. Разбор целей multi-user, network-online, graphical.
- nginx: [emerg] open() failed при чтении конфигурации nginx не может открыть файл конфигурации, включённый через include, или файл сертификата. Разбор путей и прав.
- Temporary failure in name resolution в журнале службы Служба не может разрешить имя: не готова сеть, нет сервера имён, мешает изоляция. Разбор при загрузке и в работе.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
Где встречается чаще всего
Источники
- Документация nginx: resolver и proxy_pass с переменными
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено перезагрузкой машины с proxy_pass на внутреннее имя без ожидания сети.