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服务地址。
Does Nginx honor DNS TTLs for proxy upstreams?
nginx无网络启动失败——proxy_pass域名DNS解析出错