nginx的动态DNS解析

背景

项目有一个需求,是将一个传统虚拟机的服务升级部署到cpaas平台。前端和后台服务部署在3个az中,各2个pod,通过lb进行负载,3个az的lb则通过域名进行跨集群负载。
因为网络隔离问题,客户端并不能访问得到前端的域名地址。所以,在公共网络域部署接口机进行代理,将客户端请求代理到前端服务器。

出问题了

项目上线之前一直在进行非功能测试,通过jemeter录制页面脚本,模拟实际生产场景进行发压。
然而,刚开始起压力就出现了问题,所有的请求都去往了一个az,排查吧!

寻找方案

首先来看域名的负载有没有问题,经过域名探测,是可以正常的进行负载和解析的,后端应用家康检查接口也都正常,ok。
接下来看一下接口机到后端应用的网络,ping一下ip是通的,telnet端口也是通的,ok。
最后就是代理的配置了,nginx的配置文件是按照F5负载后端应用的方式来写的,但是如果后端应用按照域名进行配置,并不能保证与域名解析服务器实时同步,问题基本就出在这里了。

解决问题

找资料吧,看一下nginx怎么实现动态域名解析的,发现了resolver这个神奇的东西

server {
    server_name local
    
    location / {
        resolver 4.4.4.4 valid=10s;
        set $proxy_url "test.com";
        proxy_pass http://$proxy_url;
    }
}

注意,只有在将域名进行set声明,然后再引用到proxy_pass中才会生效,否则还是不能实现动态的域名解析。如果直接写域名是不生效的,如下:

server {
    server_name local
    
    location / {
        resolver 4.4.4.4 valid=10s;
        proxy_pass http://test.com;
    }
}

valid参数是指域名解析后的缓存时间,如果配置为10s,那么ngixn会在本次请求10s后接收到请求的时候去重新做一次域名解析。
简单聊一下nginx的域名解析机制。如果不配置域名解析resolver,nginx会在启动的时候做一次域名解析,然后缓存在内存中,这样,每次请求过来,都会将请求代理到第一次启动时解析的节点上,这样出现了本文描述的问题,压测不均衡。

你可能感兴趣的:(nginx的动态DNS解析)