Nginx配置resolver指定DNS解析

nginx 通过 proxy_pass 和 upstream server 通信的时候需要手动指定 resolver。某些时候 DNS 解析失败就会出现domain.com could not be resolved.这样的错误。

resolver可以指定多个DNS,使用valid来设置缓存时间,如下:

resolver 119.29.29.29 114.114.114.114 valid=3600s;

如果不填写端口则默认使用53,还可以向下面这样指定DNS端口:

resolver 127.0.0.1:5353 valid=30s;

仅仅添加resolver指令并不能解决问题,依然提示could not be resolved.这样的错误,原因是:proxy_pass后紧跟域名,那么在nginx启动的时候,会使用/etc/resolv.conf下配置的DNS服务器进行域名解析。

可以使用下面的方法强制更新解析:

resolver 127.0.0.1;
set $backend "foo.example.com";
proxy_pass http://$backend;

采用变量的方式后,nginx启动时不会再去解析变量所对应的域名,但是会在进行代理访问的时候,进行域名解析,此时不会使用/etc/resolv.conf配置的DNS服务器,必须使用reslover指令指定DNS服务地址。

此文参考了
Nginx DNS resolver配置实例

Does Nginx honor DNS TTLs for proxy upstreams?
nginx无网络启动失败——proxy_pass域名DNS解析出错

标签: nginx 配置 DNS解析 nginx resolver

发表评论: