nginx 如何在与上游 DNS 名称关联的 IP 之间分配流量?

san*_*nts 5 domain-name-system nginx load-balancing amazon-web-services amazon-elb

使用此配置:

upstream some_upstream {
  server some-elb.us-east-1.elb.amazonaws.com:80;
}
Run Code Online (Sandbox Code Playgroud)

如果 some-elb.us-east-1.elb.amazonaws.com 映射到 2 个 IP 地址,nginx 将如何在它们之间分配请求?循环?(比如 1.1.19 版,以防行为在某个时候发生变化。)

另外,我在这里读到nginx 在启动时缓存 DNS 结果。如果您使用变量,它会刷新它们,但前提是您已配置 DNS 解析器。因此,如果我还没有配置 DNS 解析器,那么如果 some-elb.us-east-1.elb.amazonaws.com 的 IP 之一发生变化会发生什么?nginx 会继续将流量发送到它在启动时找到的同一组 IP 吗?

Xav*_*cas 8

请注意,nginx1.1.193+ 年前推出的开发版本。作为一名优秀的系统管理员,您的业务中不应出现此类情况。现在让我们专注于您的实际问题。


正如文档所解释的:

解析为多个 IP 地址的域名一次定义多个服务器。

默认情况下,使用加权循环平衡方法在服务器之间分配请求。


对于解析器部分:是的server,如果您在配置中使用静态域名,则nginx 将在启动时为条目发出域名查找,然后缓存任何结果,直到您重新启动它。

您的链接指向一篇关于反向代理的帖子,特别是proxy_pass指令中域名的处理。这是一种不同的情况,您需要在指令值中使用变量来强制 nginx 更新其 DNS 缓存:在resolver这种特殊情况下使用指令是不够的。

现在,回到server指令。使用resolver指令并添加resolve参数将允许监视 DNS 记录更改并自动重新加载新服务器列表

resolve
   monitors changes of the IP addresses that correspond to a domain name of 
   the server, and automatically modifies the upstream configuration without 
   the need of restarting nginx (1.5.12).

   In order for this parameter to work, the resolver directive must be
   specified in the http block. 
Run Code Online (Sandbox Code Playgroud)