动态upstream域名解析
目录 |
动态upstream域名解析
概要
此功能对原始nginx的upstream域名处理环节进行了增强,原始nginx只有在解析配置文件阶段会对proxy_pass后的域名或者upstream中server的域名进行一次DNS查询,如果域名对应的IP地址发生变化之后,则需要reload或者重新启动nginx。
SEnginx可以支持在运行阶段动态查询域名所对应的IP地址,目前此功能只支持查询到的IP地址列表中的第一个地址,并使用此地址连接后端的服务器。
此功能在1.5.10之后的SEnginx中提供。
命令
此功能为nginx的proxy_pass命令增加了若干参数: dynamic_resolve,dynamic_fail_timeout,dynamic_fallback。
如果配置了dynamic_resolve参数,则表示启用此功能进行动态域名解析。此功能需要和nginx的resolver功能配合使用,如果没有定义resolver,则此功能不起作用。
例如:
resolver 127.0.0.1:53 valid=1; resolver_timeout 1s; ... location / { proxy_pass https://senginx.org dynamic_resolve dynamic_fail_timeout=30s dynamic_fallback=stale; }
其中,dynamic_fail_timeout和dynamic_fallback参数在1.5.14以后版本中有效。
- dynamic_fail_timeout用于设定查询DNS失败后,多长时间内不进行DNS查询。
- dynamic_fallback设定当查询失败后,采取的动作,动作有如下几种:
- next,指使用下一个server,此为默认值
- stale,使用上一次成功查询的数据
- shutdown,直接关闭和客户端的连接
需要注意的是,有些情况下,即使配置了dynamic_resolve参数,此功能也不会起作用,包括:
- proxy_pass的第一个参数是upstream的名称,并且upstream中所有的server都是IP地址;
- proxy_pass的第一个参数是一个URI,且Host部分是变量,这种情况下nginx会默认解析域名。
当第一种情况时,即使用了proyx_pass upstream名称的时候,只有特定的负载均衡算法能被支持,目前SEnginx中所有自带的负载均衡算法都是支持的,包括:
- round_robin
- least_conn
- fastest
- ip_hash
不在此列表中的其他第三方负载均衡算法无法使用dynamic_resolve功能,如果需要使用其他算法,需要对算法做出对应的修改。
此外,目前本功能的局限性是只能支持使用查询DNS时得到的第一个IP地址,在DNS sever返回多个IP地址的情况下,如果每次查询返回的IP地址的顺序不变,则除第一个IP外的其它IP不会被SEnginx使用到;如果顺序会发生变化,由于SEnginx每次都使用第一个IP,当次数足够多时,所有IP都会被SEnginx使用到,但这样情况下依然会影响负载均衡算法的效果。
配置示例
proxy_pass到upstream的配置
upstream backend { server host1.domain1; server host2.domain2; } resolver 1.1.1.1:53 valid=1; resolver timeout 1s; server { ... location /static_dns { proxy_pass http://backend; } location /dynamic_dns { proxy_pass http://backend dynamic_resolve; } ... }
host1.domain1和host2.domain2会在nginx解析配置文件的阶段被解析成IP地址并记录到upstream上,当这两个域名对应的IP地址发生了变化时,访问/static_dns路径的请求会无法连接,而访问/dynamic_dns路径的请求会联系到新的IP地址上。
proxy_pass到URL的配置
resolver 1.1.1.1:53 valid=1; resolver timeout 1s; server { ... location /static_dns { proxy_pass http://host1.domain1; } location /dynamic_dns { proxy_pass http://host2.domain2 dynamic_resolve; } ... }
host1.domain1只在启动或reload的时候解析成IP地址,而host2.domain2不仅在启动时解析域名,如果其对应的IP地址发生了变化,SEnginx会将请求转发到新的IP地址上。