nginx动态解析的实现

1 nginx 的upstream的解析,默认在nginx 启动后,缓存将永久,除非 -s reload。nginx

如:
upstrem web_backend {
server web1:80;
}git

在启动的时候web1的地址为1.1.1.1 (dns控制),后来架构调整 web1的地址变为2.2.2.2。而后这个时候nginx并不会自动感应到dns的变化,而是一直缓存着。 除非使用一下手段github

  1. -s reload (可是是手动的或者脚本,在必定场合如 docker容器里面,是有局限性的,而且不至智能 )
  2. 使用第三方模块ngx_upstream_jdomain 模块 或者 nginx-upstream-dynamic-servers。可是这两个模块还有略有却别的。 如下文章将对这两个第三方模块作详细的介绍。

参考:
https://github.com/GUI/nginx-upstream-dynamic-servers/blob/master/README.mdweb

https://github.com/wdaike/ngx_upstream_jdomaindocker

介绍:
nginx-upstream-dynamic-servers 模块后端

使用方法: (resolver指令和 upstream要配套使用,不然报错,动态缓存时间vaild可设置,依赖知道那个的域名地址)缓存

http {
...
      resolver 10.59.72.3 valid=30s;
....
}
upstream rpm {
    zone upstream_dynamic 64k;
    server ops-rpmbuild001.a.pa.com:8001 resolve;
}

特色架构

  1. 即便 指定的server不可被解析,nginx 也能被启动,不影响-t 检查只是有告警提示。
  2. 只依赖resolver指定的dns。

nginx动态解析的实现

介绍2: jdomain模块dom

特色:ide

  1. 若是指定的server不可解析,nginx -t 检查将不经过,nginx是不能被启动的。
  2. 代表上不依赖http中 resolver指定的dns(即便没有启动也没问题),可是nginx的解析工做须要依赖,没有指定的话,会jdomian的动态工做特性将不生效,有可能会读取本地的/etc/hosts文件,可是后面也一直不会动态更新。

upstream rpm {
#server 1ops-rpmbuild001.a.pa.com:8001 resolve;
jdomain ops-rpmbuild001.a.pa.com port=8001 interval=5;
}

nginx动态解析的实现

(在使用jdomain的经验当中,若是解析中来的后端有多个,而请求恰好落地的那个后端响应不通,则nginx会自动轮询到下一个地址,则此处$reqeust_time,$upstream_addr 地址会有两个用逗号隔开,固然请求时间会比较长了)

综合上述,其实使用 nginx-upstream-dynamic-servers 模块 是更好的。

相关文章
相关标签/搜索