nginx动态域名解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx动态域名解析相关的知识,希望对你有一定的参考价值。

参考技术A

原文链接:
https://priesttomb.github.io/%E6%8A%80%E6%9C%AF/2020/05/17/nginx-cached-dns-server-resolvered-answer/

接 上篇文章 中提到的 Nginx 解析域名地址的问题,用一句话描述就是“proxy_pass 中如果配置的是域名地址,Nginx 只有在 start / restart / reload 时,才会连接一次域名服务器解析域名,缓存解析的结果,后续则 不会根据解析结果的 TTL 进行自动更新 ”,如果遇到了域名地址配置有多个 IP ,且还在动态变化,那就会出现 Nginx 把请求转发到一个过期的 IP 地址的情况,连接超时的报错日志类似这样:

这个说法在 官方的一篇 2016 年的博客 中有提到:

除此之外,除了一些分析源码的网络文章,暂时还没有找到其他的官方文档中说到这个细节

在 upstream 中可以对上游的服务器进行更详细的设置,解决 DNS 缓存的问题可以在 upstream 中指定需要的负载均衡算法,比如 least_conn ,并指定 max_fails ,以实现调用失败 N 次之后判定该服务异常,暂停转发该服务

注:

这个配置的示例是官方博客中的,看到这个配置时觉得有点奇怪,自己进行了模拟测试,测试的方案是在 hosts 文件中配置一个模拟的域名与三个 IP 地址,其中两个 IP 是正确的,另一个是内网不存在的 IP,测试的结果就是 Nginx 始终会将请求转发到那个错误的 IP 去,日志中一直能看到超时的报错,配置的 max_fails 仿佛没有任何作用(有补充配置了 fail_timeout ,也尝试配置了 proxy_next_upstream 、 proxy_next_upstream_timeout 和 proxy_next_upstream_tries )

不清楚用 hosts 配置的方式是不是必然会出现这样的情况,因为目前没条件测试真正想要的场景,所以不敢说博客中的这种配置是错的【如果以后碰巧有条件能测试验证,再回头来更新

最初学习 Nginx 的时候测试过 max_fails 这个配置,当时在 upstream 里配置的都是一些 IP 地址的上游服务。再次按 IP 地址进行测试,在 upstream 中配置两个正确的 IP 地址 和一个错误的 IP 地址,发现这样的配置就是能生效的,失败一定次数之后(实际失败的次数比设置的 max_fails 多,不清楚什么原因),Nginx 在 fail_timeout 时间内就不再转发请求到那个错误的 IP

resolver 的配置详情可看 官方文档 ,示例的配置是指定 DNS 服务器 10.0.0.2,指定 DNS 解析的有效时间为 10 秒,按博客 《Nginx动态解析upstream域名》 中博主的测试,不是说 Nginx 每过 10 秒会自己重新调一次 DNS 解析,而是有请求转发时才检验一次有效期是否过期

不配置 valid 选项时,V1.1.9 之后的 Nginx 默认会使用 DNS 解析结果中的 TTL

在 proxy_pass 中使用变量,带来的作用就是在 TTL 过期时能再次调用 DNS 解析,从而解决一直使用缓存结果的问题

这大概是目前官方原版唯一解决 DNS 缓存的解决方案了,带来的弊端也如 《Nginx动态解析upstream域名》 的博主所说,不能使用 upstream 模块特有的相关配置

Nginx Plus 版有更好的配置解决这些问题,另外使用 Lua 插件或许也能更完美的解决这个问题,暂时就没什么研究了

动态域名解析

域名服务器(domain name server)的简称为DNS,它存储了域名与IP地址对应的列表。DNS服务器,是需要设置固定IP地址的。

静态域名

 编辑
本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
动态域名的功能就是实现固定域名到动态IP地址之间的解析。用户每次上网得到新的IP地址之后,安装在用户计算机里的动态域名软件就会把这个IP地址发送到动态域名解析服务器,更新域名解析数据库。Internet上的其他人要访问这个域名的时候,动态域名解析服务器会返回正确的IP地址给他。
中文名
静态域名
外文名
Static Domain Name

基本介绍

编辑

概述

Internet上的域名解析一般是静态的,即一个域名所对应的IP地址是静态的,长期不变的。也就是说,如果要在Internet上搭建一个网站,需要有一个固定的IP地址。这叫静态域名。

区别

因为绝大部分Internet用户上网的时候分配到的IP地址都是动态的,用传统的静态域名解析方法,用户想把自己上网的计算机做成一个有固定域名的网站,是不可能的。而有了动态域名,这个美梦就可以成真。用户可以申请一个域名,利用动态域名解析服务,把域名与自己上网的计算机绑定在一起,这样就可以在家里或公司里搭建自己的网站,非常方便。

动态域名解析

编辑
一般的 DNS 服务器只能进行静态的“翻译”工作,即 IP 与域名的绑定是固定的,预先就定义好了的。那么,如果IP地址变化了怎么办呢?当我们采用拨号方式接入Internet时就会遇到这种情况,每次拨入时ISP都会分配不同的IP地址,如果你利用宽带来建立站点被他人访问时,就涉及到动态IP地址的解析问题。
动态域名解析系统就是这样的动态 DNS 系统。其工作原理是:客户端向我们的服务器报告您当前的 IP 地址,当我们的服务器收到要求解析您域名信息的请求时,就把目前您的 IP 回答给查询的机器,这样对方就可以直接通过域名来访问您的机器。
主机通过客户端向 DNS 服务器报告目前使用的 IP 地址。同时在第二步的回答中,DNS 服务器回答主机报告的 IP 地址,如果主机没有上线,DNS要停用该域名的服务,以免因为同一个IP地址重复利用引起混乱。

以上是关于nginx动态域名解析的主要内容,如果未能解决你的问题,请参考以下文章

Nginx反向代理到花生壳动态域名失效问题解决

nginx启动忽略dns解析

每步动态域名解析

龙叔运维问题排查记录nginx-resolver解决动态域名解析

动态域名解析

阿里云动态域名解析