host not found in upstream: не появилась возможность игнорировать?
obolobova
nginx-forum на forum.nginx.org
Чт Мар 16 13:56:33 UTC 2017
Здравствуйте.
У нас крутится nginx в докере, и проксирует запросы на большое количество
сервисов, тоже в контейнерах.
Все это хозяйство объединено в Docker overlay network, и адресация идет не
по реальным хостнеймам, а по именам/алиасам докер-контейнеров (DNS-резолвинг
обеспечивает сетевая инфраструктура докера).
Конфиг примерно такой:
upstream my_upstream1 {
server DOCKER_CONTAINER1:8080 max_fails=0;
server DOCKER_CONTAINER2:8080;
keepalive 32;
}
# еще куча апстримов
upstream my_upstream2...
upstream my_upstream3...
server {
server_name myurl.com;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
location / {
proxy_pass http://my_upstream1;
#также пробовали вариант с переменной
set $my_var my_upstream1;
proxy_pass http://$my_var;
}
}
Проблема, наверное, уже понятна: если хоть один контейнер исчезает (упал,
удалили, машина провалилась под землю, whatever), то соответствующее имя не
резолвится и NGINX крэшится при старте.
Подчеркну, что проблема не в резолвере - он работает совершенно верно,
исчезнувший контейнер и не должен резолвиться - всё, его нет, и докер
убирает соответствующую запись из своего DNS.
Описанный выше вариант - штатная ситуация, в системе будут сотни апстримов и
тысячи контейнеров, какие-то из них будут падать обязательно.
Можно ли что-то сделать - на уровне штатного конфига - чтобы NGINX всё же
стартовал?
В гугле пишут, что либо ничего не сделать, либо использовать переменную в
proxy_pass - но нам не помогло. Если хоть одно имя хоть в одном upstream не
резолвится, NGINX не стартует.
Может быть, появился какой-то новый workaround?
Если нет, то, насколько я понимаю, остается вариант цеплять к NGINXу
дополнительный DNS, который все эти апстримы будет резолвить хоть бы на
127.0.0.1?
Большое спасибо.
Posted at Nginx Forum: https://forum.nginx.org/read.php?21,272978,272978#msg-272978
Подробная информация о списке рассылки nginx-ru