nginx conf uwsgi_pass не соблюдает TTL DNS

#nginx #dns #uwsgi #aws-cloudmap

#nginx #dns #uwsgi #aws-cloudmap

Вопрос:

Я использую nginx вместе с вышестоящим приложением uwsgi. Приложение uwsgi использует AWS Cloudmap для обнаружения служб.

Проблема, с которой я столкнулся, заключается в том, что cloudmap использует разрешение DNS для хостов uwsgi. Кажется, что uwsgi разрешает и кэширует все, что попадает в uwsgi_pass.

например, в uwsgi conf у меня есть строка uwsgi_pass uwsgi://web.sandbox:8000;

Это означает, что сервер nginx работает нормально, пока поле в DNS не будет удалено или заменено. Затем я получаю сообщение об ошибке, в котором говорится, что nginx не может подключиться, потому что он пытается перейти к старому несуществующему ящику.

No route to host) while connecting to upstream, client: 12.151.32.34, server: sandbox.mydomain.com, request: "GET /member/api/user/ HTTP/1.1", upstream: "uwsgi://172.30.1.89:8000"

Я пытался использовать resolver_timeout 0s; , но это, похоже, не влияет на uwsgi_pass.

Для TTL DNS установлено значение 10 секунд, поэтому nginx не учитывает это.

Как мне заставить uwsgi_pass либо уважать TTL, либо разрешать домен каждый раз?

Ответ №1:

Решение, которое я нашел, состоит в том, чтобы добавить следующее в начало моего nginx conf

     # these two lines force DNS resolution (so if ip changes due to LB is replacement or if we use DNS service discovery)
    resolver ${DNS_SERVER};
    set $uwsgi_django_backend "${UWSGI_SERVER_FQDN}";
 

замените две переменные на переменные, подходящие для вашей среды.

Теперь вы можете это сделать proxy_pass $uwsgi_django_backend; , и это приведет к переоценке DNS.

Распознаватель DNS обычно прост 127.0.0.1 , но иногда вам нужно будет найти его вручную (например, если вы находитесь в специальной контейнерной среде)

 export DNS_SERVER=$(cat /etc/resolv.conf |grep -i '^nameserver'|head -n1|cut -d ' ' -f2)