当AWS EC2主机名更改或增加时,如何自动更新Nginx上游服务器列表?


16

我想在AWS中设置自动缩放。我不想使用Elastic Load Balancer。

Amazon的自动缩放功能可在需求高峰期间无缝创建EC2实例,以保持性能,并在需求停顿期间自动减少EC2实例,以最大程度地降低成本。

由于此EC2实例是自动创建的,因此NGINX不知道其主机名。

我知道并且已经在nginx到10个EC2实例中进行了上游设置。

当自动缩放添加/更新/删除EC2实例时,我希望能够将服务器名称自动添加/更新/删除到我的上游nginx配置中。


1
您需要从问题中删除“自动缩放”。自动缩放是一个AWS术语。我认为您的意思是要通过向作为LB的nginx添加更多上游节点来自动(水平)扩展,并且您正在询问如何在添加/删除/修改上游节点时自动修改nginx配置。如果是这样,请相应地编辑您的问题。
talonx

好吧,实际上,我知道什么是自动缩放,我想这么说。我要混合两者。我将更新问题。
Luis Lobo Borobia

1
从意图上来说,这个问题现在更加清楚。我想投票决定重新开放,但我没有看到一个选择-猜我还没有足够的代表。
talonx

谢谢@talonx,我希望其他人可以投票找到我的答案
Luis Lobo Borobia 2013年

1
我认为您可以结合使用AWS自动缩放通知(使用SNS交付)(假设它返回新创建/终止的实例的主机名)和第三方nginx API之一来更新和重新加载nginx配置。抱歉,您还不清楚-我对自动缩放API不太熟悉。
talonx

Answers:


7

这可以通过使用SSD,EC2和Autoscaling服务来使用Amazon SDK(我几乎完成了,将其放在github上)来实现。

我已按照以下步骤实现了这一目标:

  1. 启用HTTP通知并订阅了我的Web服务器。
  2. 向我的自动伸缩组添加了一个心跳为1分钟(等待1分钟才能终止)的生命周期挂钩
  3. 创建了一个索引文件来分析消息以检测消息的类型(即启动或终止)
  4. 确定事件类型后,我查询EC2以获取实例的私有IP
  5. 在启动的情况下,等待直到收到标头200,然后将ip添加到nginx配置并重新加载
  6. 如果终止,请从配置中删除IP并重新加载nginx

请在这里找到脚本https://github.com/singhupendra/aws-autoscale


你有没有机会在github上发布这个?我正在尝试做同样的事情,任何帮助将不胜感激。
亚伦


2

谢谢@talonx,我已经做过一些研究,Amazon Autoscale有一个API可查询当前自动伸缩组状态并枚举其成员。它返回实例ID(http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/api_requests.html#query-example),然后您可以使用describe工具获取服务器名称(http:// docs .aws.amazon.com / AWSEC2 / latest / CommandLineReference / ApiReference-cmd-DescribeInstances.html),最后重新创建上游包含文件。我可以感觉到“自动缩放”通知以启动执行这些任务的进程。

我仍然没有实现它,但是它是一个可行的方法。

也可以将Scaling与SNS一起使用http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/ASGettingNotifications.html


这基本上就是我所做的。我编写了一个每N分钟运行一次的ruby脚本。使用AWS开发工具包,它查询ASG的成员,并使用ERB模板,生成新的配置。如果新配置与当前配置不同,则会将其复制到位并告诉守护程序(在我的情况下为haproxy)重新加载其配置。请注意,实例终止后,实例在ASG中保留了一段时间,因此请确保instance.status ==:running。还要注意,如果实例启动后需要N分钟才能处理请求,请不要立即使用它> instance.launch_time +N。–
Mark Wagner

谢谢@MarkWagner。您是否有可能在某个地方共享该脚本?要点,github?谢谢!
Luis Lobo Borobia

这个脚本有运气吗?在github或其他地方有示例吗?
亚伦

现在不行,nginx-plus(付费版本)允许更多。
Luis Lobo Borobia

1

我还没有实现这个还没有我自己,但我正在寻找到使用的On-the-飞重构Nginx的加。我认为AMI或设置Auto Scaling Group实例的配置管理(Puppet,Salt等)都可以访问NGiNX重新配置API(也许通过内部Route53域名,因此没有固定IP) (需要使用),并将其自身添加到逆向代理的上游群集中。之后,NGiNX的内置运行状况检查将接管该[添加的]实例,并在该实例不可用时将其丢弃。这似乎是最干净的解决方案,并且添加实例没有任何延迟,而且由于NGiNX Plus具有带外运行状况检查功能,因此删除实例几乎没有任何延迟。

这种方法避免了需要设置自动发现系统(Consul,Serf等)的麻烦,对于较小的设置,无论是在设置/管理还是所需的EC2实例方面,这通常看起来都是很多开销。例如,领事至少需要三个实例才能保持稳定。Serf也许可以在ASG实例本身上运行,但是维护它仍然会产生开销,并且如果ASG缩减到一两个实例,您将失去定额。

最后,这可以与Auto Scaling组更改的自动通知(可能在用于负载平衡的NGiNX服务器上)结合使用。然后,由此类通知触发的侦听器(这可能是Upendra所指的)然后可以通过即时修改API将新实例立即添加到NGiNX中。除了NGiNX Plus的成本外,这使人们感到奇怪,为什么有人会首先使用Elastic Load Balancer及其众多问题。

编辑2015-12-07:ngx_openrestybalancer-by-lua请参阅此GitHub线程)提供了另一个可能的开源解决方案,用于从NGiNX上游组中热添加/删除服务器。我本人尚未对此进行试验,但是想在这里为任何绊倒这篇文章的人添加一个提及。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.