服务器迁移,DNS缓存导致的问题

先说问题, 如下图所示:

       web_server 的 nginx 做反向代理,将请求发送到 域名1。之前 域名1 是解析到 10.0.0.6 的后端服务器 server1,后来需更换到后端服务器 server2,域名1 解析换到了 server2 对应的 IP10.0.0.8。然后问题出现了,接口都报错!为什么?找了好半天,原来是因为 DNS 缓存导致的!!换了域名对应的IP,但是web_server上缓存的域名对应的IP还是之前的,所以接口都报错。Nginx 文档 Using DNS for Service Discovery with NGINX and NGINX Plus 中,解释了发生这个问题的原因。

再说DNS缓存:

       通过nginx第一次向proxy_pass后端对应的域名做代理数据转发时,这里nginx会通过操作系统配置的DNS服务器解析域名,此时才会缓存域名对应的IP,且会缓存很长时间,甚至一个月。

解决办法:

       第一种:手动重启web_server 的 nginx,让nginx重新解析域名。如果要把 域名1 最开始解析的后端服务器 server1 淘汰的话,至少要让 server1 继续保持运行一段时间,同时开另一台新的服务器 server2,把 域名1 解析到 server2 上。这样所有的 web_server 才可正常访问后端服务。但是这样每次域名解析换了IP,都要手动重启nginx,如果是自己更换的还好。如果是第三方的,你可能根本不知道已经换了解析。那么用第二种方法。

     第二种: 设置Nginx的DNS缓存时间。

     参考于知乎  https://www.zhihu.com/question/61786355, 网友 黑板擦 的回答。

      nginx的resolver 解决方案:

      1、默认nginx会通过操作系统设置的DNS服务器(/etc/resolv.conf)去解析域名

      2、其实nginx还可以通过自身设置DNS服务器,而不用去找操作系统的DNS

      示例配置如下:

server {
       listen      8080;
       server_name localhost;
       resolver 114.114.114.114 223.5.5.5 valid=3600s;
       resolver_timeout 3s;
       set $qq "www.qq.com";
       location / {
          proxy_pass http://$qq;
       }
   }

     参数说明:

     # resolver 可以在http全局设定,也可在server里面设定

     # resolver 后面指定DNS服务器,可以指定多个,空格隔开

     # valid设置DNS缓存失效时间,自己根据情况判断,建议600以上

     # resolver_timeout 指定解析域名时,DNS服务器的超时时间,建议3秒左右

注意:当resolver 后面跟多个DNS服务器时,一定要保证这些DNS服务器都是有效的,因为这种是负载均衡模式的,当DNS记录失效了(超过valid时间),首先由第一个DNS服务器(114.114.114.114)去解析,下一次继续失效时由第二个DNS服务器(223.5.5.5)去解析,亲自测试的,如有任何一个DNS服务器是坏的,那么这一次的解析会一直持续到resolver_timeout ,然后解析失败,且日志报错解析不了域名,通过页面抛出502错误。

重点:如上例,在代理到后端域名http://www.qq.com时,千万不要直接写在proxy_pass中,因为server中使用了resolver,所以必须先把域名定义到一个变量里面,然后在 proxy_pass http://$变量名,否则nginx语法检测一直会报错,提示解析不了域名。

其他参考: https://www.codercto.com/a/24823.html

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值