动态upstream域名解析

来自SEnginx
2014年5月6日 (二) 03:11Root (讨论 | 贡献)的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航, 搜索

目录

动态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参数,此功能也不会起作用,包括:

  1. proxy_pass的第一个参数是upstream的名称,并且upstream中所有的server都是IP地址;
  2. 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地址上。

个人工具
名字空间
  • 页面
  • 讨论

变换
操作
导航
其他语言
工具箱