NGINX 不尊重上游服务器的 DNS TTL

NGINX 不尊重上游服务器的 DNS TTL

我有一个 NGINX TCP 负载均衡器,其配置如下:

user myusername;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;
load_module /usr/lib/nginx/modules/ngx_stream_module.so;

events {
    worker_connections 1024;
}

stream {

    upstream api_backend_http {
        server myserver1.mydomain.com:80;
        server myserver2.mydomain.com:80;
    }

    upstream api_backend_https {
        server myserver1.mydomain.com:443;
        server myserver2.mydomain.com:443;
    }

    server {
        listen            80;
        proxy_pass        api_backend_http;
        proxy_buffer_size 16k;
        proxy_connect_timeout 1s;
    }

    server {
        listen            443;
        proxy_pass        api_backend_https;
        proxy_buffer_size 16k;
        proxy_connect_timeout 1s;
    }

    
}

myserver1.mydomain.com 的 DNS TTL 设置为 30 秒。更改此设置 45 分钟后,NGINX 仍在向旧 IP 地址发送流量。

这不应该发生 - 理想情况下它应该尊重上游服务器 DNS 名称的 TTL。但它似乎没有这样做。有人知道实际的 TTL 是什么,以及如何更改它吗?

附注:这感觉像是 NGINX 中的一个错误。

答案1

您需要明确配置 nginx,使其主动且定期刷新主机名到 IP 地址的映射。
否则,该映射仅在重新启动/重新加载时进行。(顺便说一句,这也是许多其他服务器和服务中都会出现的缺点,并非 nginx 独有的。)

您需要添加一个resolver指令等等。

答案2

在花了时间之后,似乎如果你想要这个并且还想要有多个上游,你基本上必须购买 NGINX Plus。

因此,请考虑使用 Envoy。它免费,拥有出色的许可证,并且内置了 DNS 刷新和上游健康检查。

相关内容