如何配置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都会缓存,并且轮询使用。