如何配置Nginx解析域名?
应用场景
   DNS解析配置
| 
         域名类型  | 
       
         主机记录  | 
       
         类型  | 
       
         TTL(秒)  | 
       
         值  | 
      
|---|---|---|---|---|
| 
         内网域名  | 
       
         upstream.test0222test.top  | 
       
         A  | 
       
         30  | 
       
         192.168.0.177  | 
      
| 
         nginx.test0222test.top  | 
       
         A  | 
       
         300  | 
       
         192.168.0.208  | 
      |
| 
         公网域名  | 
       
         upstream.test0222test.top  | 
       
         A  | 
       
         30  | 
       
         192.168.0.188  | 
      
操作步骤
- proxy_pass配置IP访问 
     
cn-east-3-nginx-server Nginx配置:
location /test_proxy_pass { proxy_pass http://192.168.0.177:80/status; }测试nginx.test0222test.top可以正常访问upstream。

 - proxy_pass配置域名访问,通过系统的/etc/resolv.conf里的server解析。 
     
cn-east-3-nginx-server Nginx配置:
location /test_proxy_pass { proxy_pass http://upstream.test0222test.top:80/status; }
删除内网域名,域名解析到公网的IP。等待超过30s,仍然正常访问upstream。

reload nginx,测试无法访问upstream。

 - 修改cn-east-3-nginx-server Nginx配置,增加关键字resolver 100.125.1.250,不再使用操作系统的/etc/resolv.conf里提供的配置,恢复内网域名的配置。 
     
resolver 100.125.1.250; location /test_proxy_pass { proxy_pass http://upstream.test0222test.top:80/status; }测试正常访问upstream。

删除内网域名,等30s,仍然正常访问upstream。

reload nginx,测试无法访问upstream。

 - 修改cn-east-3-nginx-server Nginx配置,使用set指令,将域名设置为变量,在proxy_pass用变量引用,恢复内网域名配置。 
     
resolver 100.125.1.250; location /test_proxy_pass { set $upstream_server upstream.test0222test.top; proxy_pass http://$upstream_server:80/status; }测试nginx.test0222test.top可以正常访问upstream。

删除内网域名,等30s,再次测试,upstream已无法访问。

 - 修改cn-east-3-nginx-server Nginx配置,将通过100.125.1.250解析到的值的生效时间(valid)修改为600s,恢复内网域名的配置并重载nginx。 
     
resolver 100.125.1.250 valid=600; location /test_proxy_pass { set $upstream_server upstream.test0222test.top; proxy_pass http://$upstream_server:80/status; }测试nginx.test0222test.top可以正常访问upstream。

删除内网域名配置。

等待超过30s,再次测试。

等待超过600s,再次测试,curl失败。

 - 恢复内网域名配置,将TTL修改为600s;修改nginx配置,将valid参数修改为30s。 
     
resolver 100.125.1.250 valid=30; location /test_proxy_pass { set $upstream_server upstream.test0222test.top; proxy_pass http://$upstream_server:80/status; }测试nginx.test0222test.top可以正常访问upstream。

删除内网域名,30s后再次测试是否可以访问upstream。

恢复内网域名后,30s后,测试正常

 - 多值测试,内网域名同时配置192.168.0.177和192.168.0.188两个值。 
     
测试时可以观察到,curl的时候,有50%概率卡顿后很快恢复,说明使用了192.168.0.188(可以通过日志中观察)。


 
方案总结
- 如果不使用set指令,将域名指定为变量,并在uri里使用,nginx只会在启动/reload时解析一次,永久使用。
 - 重载nginx,会触发域名的重新解析。
 - Resolver的valid指令,支持版本是nginx的1.17.5版本以上。
 - 使用resolver指令,可以定义nginx自己使用的DNS服务器。
 - 在resolver指令后增加valid=xxx指令,可以强制修改域名的TTL值。
 - 使用ipv4=on/off/ipv6=on/off指令,可以关闭A/AAAA的请求。
 - 当域名配置多值时,nginx都会缓存,并且轮询使用。