1. 程式人生 > >nginx動態解析的實現

nginx動態解析的實現

永久 .... 分享 局限性 ges 不生效 mar ... 動態更新

1 nginx 的upstream的解析,默認在nginx 啟動後,緩存將永久,除非 -s reload。

如:
upstrem web_backend {
server web1:80;
}

在啟動的時候web1的地址為1.1.1.1 (dns控制),後來架構調整 web1的地址變為2.2.2.2。然後這個時候nginx並不會自動感應到dns的變化,而是一直緩存著。 除非使用一下手段

  1. -s reload (但是是手動的或者腳本,在一定場合如 docker容器裏面,是有局限性的,並且不至智能 )
  2. 使用第三方模塊ngx_upstream_jdomain 模塊 或者 nginx-upstream-dynamic-servers。但是這兩個模塊還有略有卻別的。 以下文章將對這兩個第三方模塊做詳細的介紹。

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

https://github.com/wdaike/ngx_upstream_jdomain

介紹:
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。

技術分享圖片

介紹2: jdomain模塊

特點:

  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-upstream-dynamic-servers 模塊 是更好的。

nginx動態解析的實現