Ошибка nginx host not found in upstream: неизвестное имя в proxy_pass
В строке proxy_pass стоит имя, которое сервер не знает. Если приложение работает на этом же сервере, напишите вместо имени адрес 127.0.0.1 и порт приложения.
Содержание 9
Что сделать прямо сейчас
- Откройте файл на строке из сообщения — шаг 1.
- Приложение на этом же сервере — поставьте вместо имени 127.0.0.1: приложение на этом же сервере.
- Проверьте и примените настройки — шаг 3.
Все команды на этой странице вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне.
Что значит это сообщение
2026/10/09 12:00:00 [emerg] 2345#2345: host not found in upstream "app:3000" in /etc/nginx/sites-enabled/example.com:14
nginx: configuration file /etc/nginx/nginx.conf test failedhost not found in upstream — «адрес не найден». Имя из строки proxy_pass nginx превращает в IP-адрес ещё при запуске. Если адрес найти не удалось, nginx не запускается. В кавычках — имя и порт из настроек, после слова in — файл и номер строки. Дата, время и номер процесса у вас будут свои. В других сборках nginx та же строка начинается со слов nginx: [emerg].
Причины:
- имя взято из инструкции для Docker. Там у приложений свои имена — например, app или backend, — но знают их только программы внутри Docker, а nginx на сервере — нет;
- в строке
proxy_pass http://backend;указано имя блока upstream, а блока с таким именем нет или в имени опечатка; - в адресе другого сервера опечатка или у домена нет DNS-записи.
Шаг 1. Откройте файл на строке из сообщения
Откройте файл из сообщения сразу на нужной строке: число после знака + — номер строки из сообщения, путь — тот, что стоит перед двоеточием.
sudo nano -l +14 /etc/nginx/sites-available/example.comЕсли в сообщении путь начинается с /etc/nginx/sites-enabled/, откройте файл с тем же именем в папке /etc/nginx/sites-available/ — там лежит оригинал, а в sites-enabled только ссылка на него. Как это проверить, написано в разделе «Какой файл открывать».
Курсор встанет на строку с proxy_pass, например:
proxy_pass http://app:3000;Шаг 2. Найдите свой случай
Приложение на этом же сервере
Если приложение — сайт на Node.js или Python — работает на этом же сервере, пишите вместо имени адрес 127.0.0.1 — так сервер обращается сам к себе. Порт оставьте тот, на котором работает приложение:
proxy_pass http://127.0.0.1:3000;Сохраните файл: Ctrl+O, Enter, затем Ctrl+X.
Имя из блока upstream
Если в строке proxy_pass стоит имя без точки — например, http://backend — nginx ищет блок upstream с таким именем. Пример такого блока:
upstream backend {
server 127.0.0.1:3000;
}Блок upstream пишут в том же файле выше блока server — не внутри него. Имя после слова upstream должно совпадать с именем в proxy_pass буква в букву.
Если ошибка указывает на строку server внутри блока upstream, в этой строке тоже неизвестное имя. Поставьте вместо него 127.0.0.1, как в разделе приложение на этом же сервере.
Адрес другого сервера
Если приложение на другом сервере и в proxy_pass его домен, проверьте, знает ли сервер этот домен:
getent hosts api.example.comЕсли команда ответила IP-адресом, имя находится. Если не ответила ничего, сервер адрес не нашёл: проверьте, нет ли опечатки, и есть ли у домена DNS-запись.
Шаг 3. Проверьте и примените настройки
Проверьте настройки ещё раз командой sudo nginx -t. Когда в ответе будут слова syntax is ok и test is successful, примените их:
sudo systemctl reload nginxЕсли команда ничего не ответила, настройки применены.
Как проверить
sudo nginx -t отвечает syntax is ok и test is successful. Откройте сайт. Если браузер показывает 502 Bad Gateway, nginx запустился, но приложение не отвечает на этом порту — об этом страница 502 Bad Gateway.
Похожие ошибки
| Сообщение | Чем отличается |
|---|---|
| 502 Bad Gateway | nginx работает, но приложение по адресу из proxy_pass не отвечает |
| 504 Gateway Timeout | Приложение отвечает слишком долго |
| open() failed | nginx не нашёл файл, а не адрес |
Тексты сообщений на этой странице сверены с исходным кодом nginx 1.24.0 — эта версия стоит в Ubuntu 24.04. В других версиях слова могут немного отличаться.
Источники
- Исходный код nginx 1.24.0: ngx_http_upstream_round_robin.c — текст host not found in upstream для имени из proxy_pass.
- Исходный код nginx 1.24.0: ngx_http_upstream.c — тот же текст для строки server в блоке upstream.
- Документация nginx: модуль ngx_http_proxy_module — директива proxy_pass.
- Документация nginx: модуль ngx_http_upstream_module — блок upstream.
- man getent — команда getent hosts.
Сверено 9–10 октября 2026 года.
Что почитать дальше
Проверено и обновлено: 10.10.2026