nginx upstream配置aws alb域名导致timeout报错

nginx upstream配置aws alb域名导致timeout报错,第1张

目录

问题描述 

问题分析

问题结论

解决方法 


问题描述 

先贴nginx的配置,下面是我的nginx ingress的upstream配置,将流量转发到aws的 alb  上,通过alb的负载均衡策略,去控制后端的两个实例。

upstream xxx-xxx {
    server internal-xxx-1180960654.cn-northwest-1.elb.amazonaws.com.cn:8080 weight=1 max_fails=0 fail_timeout=120s;
}

但是在使用的过程中,一开始的请求是正常的,运行了大概一周后,通过浏览器访问页面时出现了访问超时的情况。

问题分析

猜测是流量到了后端某个节点出现了网络问题,最有可能的就是nginx。

查看位于/var/log/nginx下的错误日志 ,查看到了大量的timeout错误。具体的错误日志路径,可以直接打开nginx.conf配置文件查看。所以可以断定,一定是转发请求的url有问题,大概率是dns解析的问题。

可以看到,我在通过域名请求的过程中,发生了ip地址的变化。

 这里要说明一个机制,就是nginx在启动的时候,会对upstream里面配置的域名进行一次dns解析,并缓存起来。在运行的过程就不再进行动态的dns解析,除非再次进行加载,否则访问对应upstream就是通过一开始解析到的ip地址去访问。

于是手动执行

$ nginx -s reload

果然查看控制台后发现不再报错了 

问题结论

1.aws的alb是d性ip,这一点和阿里云不同,可能是历史遗留问题

2.nginx只在启动和热加载的时候做一次dns解析并缓存,没有做动态dns解析

解决方法 

aws针对这个问题有专门的解决方案

Using AWS Lambda to enable static IP addresses for Application Load Balancers | Networking & Content Delivery

这个是早期方案,需要借助lambda,S3,CloudWatch 来实现 ,还是比较重的方案,所以官方在后续更新了一个比较轻量级的方案,只需要配置一个包含alb的目标组,通过新建一个nlb去连接到这个目标组,就可以实现。缺点是aws的nlb需要额外收费。

Application Load Balancer 现可通过与网络负载均衡器直接集成来启用 AWS PrivateLink 和静态 IP 地址

简单来讲,就是alb作为七层负载均衡不具备提供静态ip的功能,新支持alb类型的目标组,将流量从nlb转发到alb,有nlb来提供静态ip。

 首先,该方案需要在新版EC2下实践,点击控制台左上方的开关可以进行切换。

创建负载均衡,选择nlb,图示上可以看到alb类型的目标组可以作为nlb的后端。

在添加侦听器时需要创建新的目标组。

目标组的类型中选择alb,在对其的描述中可以发现该类型就是为alb提供静态ip地址的方案而生的。  

创建好之后,只需要将nginx配置文件中的alb地址替换成nlb地址即可。通过nlb域名解析得到的ip地址一定是固定的。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/788463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存