添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

NGINX动态DNS解析原理及源码分析

原文作者:皮皮鲁
原文链接: NGINX动态DNS解析原理及源码分析 - NGINX开源社区
转载来源:NGINX开源社区

一. 概述

NGINX在配置上游的服务器时,支持域名配置。根据不同的配置,NGINX提供了静态和动态解析两种方式。本文试图从代码层面分析动态dns解析是如何实现的。

a. 静态解析

http {
upstream test {
                            server   private.server1.com.cn;
                            server   private.server2.com.cn;
server {
                            listen 80;
                            location / {
                                proxy_pass test;
}

如上的配置,在NGINX启动运行时,会使用本机在/etc/hosts和/etc/resolve.conf中配置的主机和dns服务器对域名 private.server1.com.cn private.server2.com.cn 进行解析。这个解析过程是通过lib C的函数getaddrinfo进行的同步操作。

如果解析失败,NGINX就不能成功启动。解析得到的ip地址会一直伴随着NGINX运行的整个生命周期。如果在运行期间对应域名的ip地址发生变化,服务就会中断。唯一的解决办法就是重新启动NGINX。

b. 动态解析

开源版的NGINX提供了resolver这种动态的dns解决方案。核心思想是NGINX自身充当dns的客户端进行动态dns解析。

http {
server {
                            listen 80;
                            resolver 8.8.8.8 valid=10s;
                            set   $test   private.server1.com.cn;
                            location / {
                                proxy_pass http://$test;
            }

如上配置,当访问服务器的根目录时,会把请求转移到test变量定义的服务器中。而且,这个test变量定义的服务器 private.server1.com.cn 会通过resolver 定义的dns 服务器进行动态解析。

在此配置中,通过resolver得到的解析结果有效期是10秒。有效期过后,再次访问根目录时就会对域名进行重新解析。

需要注意的是,如果proxy_pass后面是一个域名而不是一个变量,那么对域名的解析也是发生在启动解析期间,无法完成动态域名解析的功能。


二. 配置参数

动态域名解析是通过resolver指令和变量来实现的。指令resolve可以在http范围内全局设定,也可以在某一个server甚至某一个location里面单独设定。

http {
server {
        listen 80;
        set   $test  private.server1.com.cn;
        location / {
                resolver 8.8.8.8 valid=10s;
                proxy_pass http://$test;