转载自: Nginx upstream DNS 解析缓存问题
问题说明
先看现有的配置方式,再说问题:
upstream mydomain {
server www.mydomain.com:8080;
}
如上配置所示,server 中为第三方提供的接口服务地址,提供了互联网域名地址(但是该域名对应的DNS解析IP地址会定期更新)。
当我们把一个域名解析可能会变的域名用作 upstream 中时,就会出现当域名解析IP变更后,ngingx 无法正常反向代理的问题。
根本原因就是 “nginx 只会在服务启动的时对 upstream 中的域名进行一次 lookup 解析并缓存下来,以后没有自动重新解析机制”
,即便是你使用 nginx -s reload 也不会触发重新解析,这个解析只发生在服务启动时
。
官网有人在2011年提问过这个问题,详见链接:https://forum.nginx.org/read.php?2,215830,215832#msg-215832
解决方法
- 方式使用 upstream 方式
- 通过配置 resolver 和 变量的方式来设定 proxy_pass
具体配置示例,如下:
server {
listen 80;
server_name mydomain.com *.mydomain.com;
# 配置DNS解析服务器和DNS缓存超时时间
resolver 223.5.5.5 valid=300s;
resolver_timeout 3s;
set $proxy\_pass\_scheme "http";
set $var\_proxy\_pass "";
location / {
if ($host ~* (test1.mydomain.com|mydomain.com)$) {
set $var\_proxy\_pass "test1.mydomain.com:8080";
}
if ($host ~* (test2.mydomain.com)$) {
set $var\_proxy\_pass "test2.mydomain.com:9999";
set $proxy\_pass\_scheme "https";
}
proxy_pass $proxy\_pass\_scheme://$var\_proxy\_pass;
}
}
(END)