Резолвер 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 перестаёт подставлять путь автоматически.