Rootop 服务器运维与web架构

nginx中resolver参数配置解释

之前有个测试环境配置 proxy_pass 时直接指定域名是可以用的,比如

location / {
    proxy_pass http://dev.abc.com:10068;
}

遇到一个问题是:
反向代理的地址是通过花生壳动态dns实现的。
dev.abc.com通过cname解析到花生壳之类的动态dns给分配的域名上,如果路由器因为断电或者掉线之类的原因重新拨号后ip发生变化,此处nginx就无法反向代理了,必须重启一次nginx才行。

今天遇到一个问题就是通过 set 设置变量,然后 proxy_pass 调用变量实现反向代理(目的是减少配置复杂度),比如:

set $skyneturl "http://dev.abc.com:10077"; # 注意set好像不支持变量名中带下划线或其它特殊字符

location /applyrecord/aladinnApplyrecord { 
    proxy_pass $skyneturl;
}

重启nginx后发现报502错误,也就是连不上后端服务器。
看nginx日志发现错误提示:

2019/04/11 10:34:04 [error] 17241#0: *4334742 no resolver defined to resolve dev.abc.com ...

说没有定义 resolver 来解析域名,查了一下发现需要配置resolver参数。

官网文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver

Syntax:	resolver address ... [valid=time] [ipv6=on|off];
Default:	—
Context:	http, server, location

Configures name servers used to resolve names of upstream servers into addresses, for example:

意思是需要配置dns地址用来解析upstream中的域名(用域名替代ip地址)

添加resolver配置参数:

resolver 202.102.134.68 114.114.114.114 ipv6=off;
set $skyneturl "http://dev.abc.com:10077";
location /applyrecord/aladinnApplyrecord { 
    proxy_pass $skyneturl;
}

重启nginx后访问成功。

无意间查资料发现 proxy_pass 后面跟域名的话并不是每次请求都会解析出这个域名的ip(这也验证了必须重启nginx才能解决),所以就会导致路由ip变化时造成服务无法访问。
解决这个问题的话,就可以用 set 设置一个变量,通过 resolver 实现每次访问都重新解析出ip地址。

原创文章,转载请注明。本文链接地址: http://www.rootop.org/pages/4307.html

作者:Venus

专注于 服务器运维与web架构 E-mail:venus#rootop.org

评论已关闭。