nginx conf uwsgi_pass не учитывает DNS TTL

Я использую nginx вместе с вышестоящим приложением uwsgi. Приложение uwsgi использует AWS 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.

DNS TTL установлен на 10 секунд, поэтому nginx не соблюдает это.

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


person wonton    schedule 16.04.2019    source источник


Ответы (1)


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

    # 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)
person wonton    schedule 28.06.2019