Резолвер 127.0.0.11 и имена контейнеров в upstream
14 августа 2026
Если в конфиге написано просто так:
location / {
proxy_pass http://myapp:8080;
}
то nginx резолвит имя myapp один раз, на старте. Пока
контейнер поднят — всё хорошо. Но стоит ему лежать в момент проверки
конфига, и вы получаете host not found in upstream. Это не
предупреждение, а фатальная ошибка разбора: падает не отдельный сайт, а
весь nginx целиком, вместе со всеми остальными доменами на нём.
То есть один выключенный сервис роняет вообще всё. Обидно.
Обходится переносом резолва в рантайм — через штатный DNS докера и имя в переменной:
resolver 127.0.0.11 valid=10s ipv6=off;
set $upstream "myapp:8080";
location / {
proxy_pass http://$upstream$request_uri;
}
Как только имя оказывается в переменной, nginx перестаёт трогать его при
разборе конфига и идёт в DNS уже на живом запросе. Лежащий контейнер теперь
даёт 502 на своём домене — и только там.
Не забыть $request_uri: при proxy_pass с
переменной nginx перестаёт подставлять путь автоматически.