XxBlog

knowledge is power

我叫潘潘,来自成都,是一名 Java,Python 开发者,爱好广泛,热爱各种新技术,致力成为一名全栈开发工程师。


Nginx 反向代理DNS缓存问题

发现问题

作为一名程序员,Jetbrains 家的IDE自然是必须要使用的一个好工具,但是自从2017.3版本之后网上几乎所有的激活服务器域名都被封杀了,后来看到一篇博客文章给出了一个解决方案,可以通过自己的网站反向代理一个被封杀了的激活服务器,可以完美解决,所以我就通过自己服务器上的 Nginx 做了一个反向代理,但是使用一段时间之后发现偶尔会有失败的情况,经过努力排查发现只要重启一下服务器上的 Nginx 就可以解决这个问题,以前没有时间去检查就没有处理过,今天快过年了工作比较闲而且又出现了这种情况我就决定来排查一下,通过访问的提示我发现是提示我代理的网站的 DNS 地址修改了,但是我在本地直接访问和在服务器上面通过 wget 命令访问都是正常的,没有提示 DNS 解析失败,可是为什么通过 Nginx 代理就会失败呢?不经陷入了沉思。。。

寻找解决方案

由此我怀疑是不是 Nginx 对我 proxy_pass 的域名缓存了 DNS 解析结果,在百度上经过一番搜索无果之后我转向了谷歌,果然发现了问题,原来 Nginx 中如果 proxy_pass 配置了反向代理一个域名,那么为了能加速 Nginx 只会在启动的时候解析一次这个域名,后面都是通过 IP 地址去访问,这样就节省了每次解析域名所花费的时间,也是之前为什么我每次重启服务就正常了的一个合理的解释,但是缓存这个东西很明显就是一把双刃剑,用得好当然不错,用得不好就会有各种各样的问题。

server {  
  listen 80;
  server_name xx.xxblog.cn;

  location / {
    proxy_pass http://xx.example.com;
  }
}

例如上面这个配置。

解决方案

通过一番查找终于找到了一个解决方案,那就是通过一个变量来替换需要反向代理的地址,这样就可以让 DNS 配置 TTL 正常工作,意思就是只需要一个变量来代替 proxy_pass http://xx.example.com; 这一行中的 http://xx.example.com 就能解决。 贴一个修改之后的配置,应该一看就能明白。

server {  
  listen 80;
  server_name xx.xxblog.cn;

  // resolver 是服务器的DNS解析服务器地址,后面的valid是TTL时间,鉴于一般DNS解析TTL都是10 min所以我们就设置600 s
  resolver 114.114.114.114 valid=600s;

  set $proxy_pass_url http://xx.example.com;

  location / {
    proxy_pass $proxy_pass_url;
  }
}

大功告成,记录一下,反正我在百度是没有搜到这个问题,以后还是多用 Google.

最近的文章

Docker Swarm 配置

Docker Swarm 配置 初始化Docker swarm Master节点,可以得到集群的Token。 docker swarm init --advertise-addr 192.168.242.129 运行之后如果没有出错可以得到下面的结果: Swarm initialized: current node (f8xch6u685str1fjv7zvu7lxz) is now a manager. To add a worker to this sw...…

dockerswarm继续阅读
更早的文章

基于Docker搭建Jekyll并实现自动部署

国内的服务器到期之后,博客就停了,最近打算重新启用起来,所以决定花了一天时间来重新搭建了一下。先上地址:https://xxblog.cn博客准备博客是基于 Jekyll 搭建的,然后主题使用了 @onevcat 大神修改的 vno-jekyll ,一直很喜欢这种风格的博客,好了,开始正题。Docker既然jekyll是一个独立的服务,那么选择基于docker来运行它是自然了的。DockerfileFROM ruby:latestRUN gem install jekyll bundler...…

devops继续阅读