Re: host not found in upstream: не появилась возможность игнорировать?
Valery Kholodkov
valery+nginx на grid.net.ru
Чт Мар 16 14:25:39 UTC 2017
Для решения этой проблемы достаточно всем контейнерам одного сервиса в
оверлей-сети прописать один и тот же алиас. Тогда докер в своем
внутреннем DNS-е пропишет запись с множеством адресов и nginx сможет
резолвить набор адресов контейнеров соответствующих сервису.
Пример на docker-compose:
version: '2'
services:
myapp:
[ ... пропущено ... ]
networks:
ovr0:
aliases:
- myapp
networks:
ovr0:
external:
name: ovr0
Конфиг nginx:
server {
server_name myurl.com;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
location / {
proxy_pass http://myapp;
}
}
Замечания:
1. nginx должен быть докеризирован. Я пока не нашел способов роутинга
трафика с хоста в оверлей-сеть;
2. Контейнеры должны использовать внутренный DNS докера;
3. Оверлей-сеть не всегда стабильна, особенно в глобальном масштабе.
Полагаю максимальная стабильность может быть гарантирована, только если
все хосты находятся в локальной сети.
On 16-03-17 14:56, obolobova wrote:
> Здравствуйте.
>
> У нас крутится 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 mailing list
> nginx-ru на nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
>
Подробная информация о списке рассылки nginx-ru