nginx conf uwsgi_pass不遵守DNS TTL

时间:2019-04-16 00:19:34

标签: nginx dns uwsgi aws-cloudmap

我正在使用nginx和上游uwsgi应用程序。 uwsgi应用程序正在使用AWS Cloudmap充当服务发现。

我遇到的问题是cloudmap对uwsgi主机使用DNS解析。似乎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或每次都解析域?

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是将以下内容添加到我的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)