我正在使用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或每次都解析域?
答案 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)