我研究过亚马逊网络服务上的很多后端设置,尤其是 Instagram 的后端设置。在他们的Instgram 工程博客他们提到他们在三个 NGINX 服务器前面有一个弹性负载均衡器,而这三个 NGINX 服务器又位于运行 django/Gunicorn 的应用服务器前面,这是为什么呢(是为了缓冲吗?缓存?)
如果是这样,如何将这些 NGINX 服务器连接到 django/gunicorn 应用服务器?
答案1
看了 Instagram 的帖子,我不认为他们使用 Nginx 进行缓冲或缓存(尽管我可能错了)。我使用类似的方法,但使用的是 HAProxy 而不是 Nginx。
我们采用这种方法的原因如下:
- Nginx 和 HAProxy 在第 7 层运行,而 ELB 在第 4 层。如果您需要第 7 层服务,ELB 无法提供
- 当健康检查失败时,优雅地终止连接。ELB 可以继续将流量传递给 HAProxy/Nginx,同时流量会从停止服务的实例中流出。请参阅https://forums.aws.amazon.com/message.jspa?messageID=231571
- 如有必要,您可以实时扩展负载平衡层
- 有关 HAProxy/Nginx 层后面每个实例的流量和性能的更好指标
- ELB 可以检测 HAProxy 实例何时发生故障并停止向其发送流量
答案2
我能想到的几点:
- 它分配请求并监控服务器的运行状况,因此如果您的一个 nginx 服务器崩溃,网站仍能继续正常运行。
- 亚马逊在其端采取了一些拒绝服务缓解措施。如果您自己处理负载平衡,您将为所有访问它们的流量付费。如果亚马逊阻止了一些针对您的 ELB 的攻击,您就无需为这部分付费。
- 允许您将 nginx 服务器的安全组锁定到 ELB,这使得它们比向公共互联网开放更安全。