Syntax: | resolver address ... [valid=time] [ipv6=on|off]; |
---|---|
Default: | — |
Context: | http , server , location |
http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver
我们都知道nginx 有个resolver 能提供NS解析的功能,那么什么时候用系统自带配置,什么时候用resolver呢? 这里直接给结论:
proxy_pass 给一个域名, 用系统自带的resolv.conf
server {
listen 80 ;
server_name www.4os.org;
resolver 114.114.114.114 ipv6=off;
location / {
proxy_pass http://www.qq.com;
}
}
upstream server 里边跟域名, 用系统自带的resolv.conf
upstream backends {
server www.qq.com;
}
server {
listen 80 ;
server_name www.sohu.com;
resolver 114.114.114.114 ipv6=off;
location / {
proxy_pass http:// backends;
}
}
proxy_pass 后边跟的是变量,比如你设置的$host, 用resolver
server {
listen 80 ;
server_name www.4os.org;
resolver 114.114.114.114 ipv6=off;
location / {
set $ups “www.qq.com”;
proxy_pass http://$ups;
}
}
另外 nginx plus版本, upstream server 的域名如果带了resolver 参数,那么用resolver
resolver 10.0.0.2 valid=10s;
upstream backends {
zone backends 64k;
server backends.example.com:8080 resolve;
}
server {
location / {
proxy_pass http://backends;
}
}
至于AAAA的IPV6结果,如果是用系统自带的解析器,那么nginx 会ipv4和ipv6一起解析, 如果你的nginx服务器没有V6地址,这会产生额外的一个upstream error,并next_upstream给V4地址
所以,如果要禁用V6解析, 你需要使用变量设置你的proxy_pass 回源,并明确定义resolver 的ipv6=off参数
以上结论基于nginx官方文档,并使用tcpdump监测dns解析获得
参考文档: https://www.nginx.com/blog/dns-service-discovery-nginx-plus/#domain-name-proxy_pass