前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx 的 DNS 缓存

nginx 的 DNS 缓存

作者头像
一个会写诗的程序员
发布2019-08-22 13:35:56
5.4K0
发布2019-08-22 13:35:56
举报

nginx 配置中有1个upstream配置是指向一个域名Y的,而这个域名Y解析对应IP其实是会动态变化的。

今天的生产遇到一个很奇怪的现象,一个代理到 cdn 的静态资源访问超时了。 去查看了 nginx 的配置:

代码语言:javascript
复制
        location /xxxx.js {
          proxy_set_header Host cdn.com;
          proxy_pass https://cdn.com/platform/xxx.js;
        }

单独访问 https://cdn.com/platform/xxx.js 没问题。但是生产系统的域名访问,走了代理之后,这个资源就超时了。看了 nginx 的 access.log 发现 DNS 解析到的 IP 对应的机器访问不了了。后来跟运维了解到是这个 IP 对应的机器节点下线了。

而由于生产机器上的 nginx DNS 有缓存,导致解析到的还是这个失效的 IP。

提示:nginx本身有dns缓存机制,配置文件中 resolver 配置了dns的valid时间是10天。对于nginx 的 dns 缓存来说,nginx会在首次proxy_pass到upsteam时并且upstream是域名配置的,nginx就会解析域名,并缓存直到valid时间后,再重新重新解析dns的结果。

这样来看的话,如果我们想要把域名Y后面对应的服务器S退出的话,比较合理的做法应该是让已经退休的S运行一段时间,在开一台新的服务器S2,把域名Y解析到S2上。但是至少要保证原来的S能够正常运行足够久的时间T。这样所有的客户端,才可以正常访问服务。

这样问题就清楚了。

代码语言:javascript
复制
nginx -s reload

就能解决上面的问题。

resolver的语法如下:

代码语言:javascript
复制
Syntax: resolver address ... [valid=time] [ipv6=on|off];
Default:    —
Context:    http, server, location

可以配置多个dns服务,nginx会采用轮询的方式去访问dns服务,nginx会缓存dns对域名解析的结果,缓存的时间由valid指定,ipv6用于显示开启或者关闭ipv6。

代码语言:javascript
复制
Syntax: resolver_timeout time;
Default:    
resolver_timeout 30s;
Context:    http, server, location

resolver_timeout用于指定dns解析的超时时间。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.08.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档