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

6 篇文章 0 订阅
3 篇文章 0 订阅

目录

问题描述 

问题分析

问题结论

解决方法 


问题描述 

先贴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是弹性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地址一定是固定的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值