Nginx upstream DNS 解析缓存问题

Posted catoop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

以上是关于Nginx upstream DNS 解析缓存问题的主要内容,如果未能解决你的问题,请参考以下文章

nginx动态解析的实现

负载均衡详解 - 玩转Kong网关

nginx以upstream分组的方式实现tcp反向代理

Nginx FastCGI 缓存 $upstream_cache_status;不显示

Nginx---负载均衡和缓存

Nginx 提示host not found in upstream 错误解决方法