
# 如何配置Nginx解析域名？
#### 应用场景
图1场景示意   
![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001851758568.png "点击放大")
#### DNS解析配置
表1DNS解析配置 
| 域名类型 | 主机记录                      | 类型 | 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 |
   
#### 操作步骤
1. 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。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001851767052.png "点击放大")
   
2. proxy_pass配置域名访问，通过系统的/etc/resolv.conf里的server解析。 cn-east-3-nginx-server Nginx配置：
   ```
   location /test_proxy_pass {
       proxy_pass http://upstream.test0222test.top:80/status;
   }
   ```
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001851608340.png "点击放大")
   删除内网域名，域名解析到公网的IP。等待超过30s，仍然正常访问upstream。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001897927733.png "点击放大")
   reload nginx，测试无法访问upstream。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001851767084.png "点击放大")
   
3. 修改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。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001897927741.png "点击放大")
   删除内网域名，等30s，仍然正常访问upstream。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001851767108.png "点击放大")
   reload nginx，测试无法访问upstream。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001897927757.png "点击放大")
   
4. 修改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。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001851767132.png "点击放大")
   删除内网域名，等30s，再次测试，upstream已无法访问。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001897927805.png "点击放大")
   
5. 修改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。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001898047349.png "点击放大")
   删除内网域名配置。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001897927829.png "点击放大")
   等待超过30s，再次测试。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001851767180.png "点击放大")
   等待超过600s，再次测试，curl失败。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001851767188.png "点击放大")
   
6. 恢复内网域名配置，将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。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001898047365.png "点击放大")
   删除内网域名，30s后再次测试是否可以访问upstream。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001897927853.png "点击放大")
   恢复内网域名后，30s后，测试正常
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001851608484.png "点击放大")
   
7. 多值测试，内网域名同时配置192.168.0.177和192.168.0.188两个值。 测试时可以观察到，curl的时候，有50%概率卡顿后很快恢复，说明使用了192.168.0.188（可以通过日志中观察）。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001898047405.png "点击放大")
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000001898047409.png "点击放大")
   
 
#### 方案总结
- 如果不使用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都会缓存，并且轮询使用。
 
