在配置nginx反向代理时,经常会发现代理的域名无法解析, 在nginx的error日志中可以看到错误码,如下:
2020/03/31 11:43:26 [error] 14393#0: *1695 no resolver defined to resolve www.baidu.com, client: 129.204.84.x,
无法解析域名 www.baidu.com,导致代理请求失败。如何解决?
通常使用proxy_pass 和 upstream server做反向代理时,需要手动指定 resolver。nginx提供了resolver配置命令来让用户自已配置域名解析服务器,命令具体语法如下:
resolver address ... [valid=time] [ipv6=on|off] [status_zone=zone];
如果解析的是公网的域名,如www.baidu.com这些,可以配置一些免费DNS服务,免费DNS服务列表如下:
Google DNS | 8.8.8.8, 8.8.4.4 |
Public DNS+ | 119.29.29.29 |
阿里 DNS | 223.6.6.6,223.5.5.5 |
百度 DNS | 180.76.76.76 |
114 DNS | 114.114.114.114,114.114.115.115 |
我们只需要nginx.conf中配置如下命令,就可以让nginx成功解析域名:
resolver 8.8.8.8 114.114.114.114;
如果是公司私网,则需要配置公司的域名服务器地址。
需要注意的是,当配置多个DNS IP时,nginx会依次尝试用这些IP解析域名,直到成功就停止。如果前面域名解析失败,会导致DNS请求时间过长,所以在配置resolver时要把最优秀的域名IP放在前面,并且要调小解析超时时间。
nginx resolver命令具体解释详见官网resolver。