![像我五岁一样解释如何使用 Nginx 进行负载平衡](https://linux22.com/image/623452/%E5%83%8F%E6%88%91%E4%BA%94%E5%B2%81%E4%B8%80%E6%A0%B7%E8%A7%A3%E9%87%8A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Nginx%20%E8%BF%9B%E8%A1%8C%E8%B4%9F%E8%BD%BD%E5%B9%B3%E8%A1%A1.png)
我发现了很多关于如何使用上游服务器将 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,因此扩展起来要容易得多。