使用keepalive反向代理并根据nginx中的TTL重新解析DNS

Ari*_*tes 7 nginx haproxy proxypass nginx-reverse-proxy nginx-config

nginx 开源中的上游块允许您启用与反向代理服务器的保持活动连接(文档:http : //nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive)。

Syntax: keepalive connections;
Default: —
Context: upstream
Run Code Online (Sandbox Code Playgroud)

激活缓存以连接到上游服务器。

连接参数设置保留在每个工作进程的缓存中的上游服务器的空闲保持连接的最大数量。

但是,在 nginx 开源中使用上游块有一些警告,特别是:DNS 会被缓存,直到重新启动或重新加载,而不管 TTL。这意味着,如果您使用带有 keepalive 的上游块来反向代理到 AWS 负载均衡器,当负载均衡器 IP 更改时,您将遇到停机时间,除非人员/服务重新加载或重新启动 nginx。“在变量中设置域名”(见下文),允许以 TTL 间隔或任何其他所需的间隔重新解析 DNS,但似乎不允许您启用保持连接。

是否可以在nginx开源中通过域名反向代理到另一台服务器的同时启用keepalive连接,根据TTL重新解析DNS(无需服务器重新加载/重启)?(Nginx Plus 支持在上游块中重新解析 DNS)。如果单独使用 nginx 开源无法做到这一点,最好将 DNS 解析移动到 HAProxy 等另一层并指向 nginx 上游块中的该层?

nginx keepalive 和 dns 解析器几乎是相同的问题,但有以下区别:在这里,如果无法在 nginx 本身中完成,使用插件或不同的层是可以的。该问题的一个答案提到使用https://github.com/wdaike/ngx_upstream_jdomain,但这个插件似乎多年来没有改变,所以我怀疑将 DNS 解析移到另一层会更容易维护。

在以下对相关问题的评论中出现了类似的问题:Why does nginx proxy_pass close my connection?

https://www.nginx.com/blog/dns-service-discovery-nginx-plus/ 中,提到了 nginx 的三种 DNS 服务发现方法,看起来它们都不允许重新解析 DNS nginx 重启/重新加载并使用上游参数,例如keepalive

在 proxy_pass 指令中使用域名

server {
    location / {
        proxy_pass http://backends.example.com:8080;
    }
}
Run Code Online (Sandbox Code Playgroud)

...

这种方法是进行服务发现的最不灵活的方法,并且具有以下附加缺点:

  • 如果域名无法解析,NGINX 将无法启动或重新加载其配置。
  • NGINX 会缓存 DNS 记录,直到下一次重新启动或重新加载配置,忽略记录的 TTL 值。[强调我的]
  • 我们不能指定另一个负载平衡算法,也不能配置被动健康检查或由参数定义的其他特性到服务器指令,我们将在下一节中描述。

在上游服务器组中使用域名

upstream backends {
    least_conn;

    server backends.example.com:8080 max_fails=3;
}

server {
    location / {
        proxy_pass http://backends;
    }
}
Run Code Online (Sandbox Code Playgroud)

...

虽然这种方法使我们能够选择负载均衡算法并配置健康检查,但它仍然与之前的方法在启动、重新加载和 TTL 方面存在相同的缺点。[强调我的]

在变量中设置域名

resolver 10.0.0.2 valid=10s;

server {
    location / {
        set $backend_servers backends.example.com;
        proxy_pass http://$backend_servers:8080;
    }
}
Run Code Online (Sandbox Code Playgroud)

...

这种方法消除了第一种方法的两个缺点,即当域名无法解析时,NGINX 启动或重新加载操作不会失败,并且我们可以控制 NGINX 重新解析名称的频率。但是,因为它不使用上游组,所以您不能为服务器指令指定负载平衡算法或其他参数(就像我们在第二种方法中所做的那样)。[强调我的]