像我五岁一样解释如何使用 Nginx 进行负载平衡

像我五岁一样解释如何使用 Nginx 进行负载平衡

我发现了很多关于如何使用上游服务器将 Nginx 配置为负载均衡器的 DIY 帖子和教程:

upstream backend  {
  ip_hash;
  server 1.2.3.4;
  server 1.2.3.5;
  server 1.2.3.6;
}

server {
  location / {
    proxy_pass  http://backend;
  }
}

但就配置此架构而言,我能找到的就只有这些了。目前,我已将 rails 应用程序部署到 3 个后端 VPS 服务器上,并使用 Unicorn 作为 HTTP 服务器。我是否也需要在负载平衡服务器上安装 ruby​​ 以及 rails 应用程序和 unicorn?我是否需要在每个上游服务器上安装 Nginx?如果需要,我该如何配置它们?如果我将 Varnish 之类的东西引入架构,它会放在哪里?在负载平衡器前面还是每个后端前面?

以下是我如何组织所有内容的视觉效果:

                                       +---> backend1 <---+
                                       |                  |
[requests] <---> [Nginx load-balancer]-+---> backend2 <---+-[Database server]
                                       |                  |
                                       +---> backend3 <---+

答案1

简短回答:

Nginx实际上只有一项工作,那就是接受传入的请求并将其交给后端服务器。

假设您的前端服务器仅需运行,nginx而您的后端服务器仅需运行rails。有道理吗?

现在,如果您的后端和前端都在同一台服务器上运行,那么,当然,它也必须安装在那里,但是从您的图表来看,我不认为情况如此。

如果您引入 HTTP 缓存软件,例如Varnish,它将在Nginx和之间传输Rails,很可能也在后端服务器上运行。因此请求将遵循以下路径:

Nqinx -> Varnish -> Rails

答案2

使用 Rails 时,nginx可以充当多种角色,最常见的是作为 HTTP 负载平衡器或应用服务器前端。您的设置是可以正常工作的常见设置,但随着流量增加,可能会带来扩展挑战。

当您使用所描述的少量 VPS 服务器时,一个 nginx 实例可以作为传入流量的主要 HTTP 负载均衡器,也可以作为前端来卸载 Rails 应用服务器的低级职责(提供静态文件、URL 重写/重定向等)。

nginx 可以在不占用太多资源的情况下处理数千个并发连接,而​​ Unicorn Rails 应用服务器通常只能处理少量并发连接。随着规模的扩大,您将需要更多负载均衡器/前端 nginx 实例(以及它们之间的负载平衡方法,如 DNS 循环或其他机制)。

如果您使用 Amazon AWS 或其他更成熟的托管平台,则通常使用 Elastic Load Balancing (ELB) 等服务作为主要 Web 负载均衡器。每个应用服务器都运行 nginx/Unicorn,利用 nginx 作为前端来卸载每个 Unicorn 的处理。由于每台服务器前面都有高容量 ELB,因此扩展起来要容易得多。

相关内容