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服务器对域名 http:// private.server1.com.cn 和 http:// 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变量定义的服务器 http:// 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;