Nginx 和 Unicorn 在不同的机器上

cmh*_*bbs 3 nginx load-balancing ruby-on-rails unicorn

我有一个非常标准的 Rails 应用程序,可以在一个盒子上运行 Unicorn 和 Nginx。我想分离应用程序本身,并在一台机器上安装 Nginx,在另一台机器上安装 Unicorn(带有 Rails 应用程序)。这里的想法是我想在以后的 Unicorn 中添加另一个应用程序服务器,主要是为了一些轻负载平衡。

我可能是从错误的角度来解决这个问题的。这是正常的/可能的吗?如果是这样,有人可以指出我的示例配置或文档吗?

如果这不是要走的路,那么实现最终目标的正确途径是什么?我已经研究过 HAProxy,但在阅读了一些 Nginx/Unicorn 文档后,我了解到无需任何其他软件即可实现这一点。

cjc*_*cjc 7

这是正常的。您不需要 HAProxy,尽管 HAProxy 可能会为您提供比 nginx 负载平衡更“公平”的应用服务器之间的负载平衡。

因此,在您的应用服务器上,将 Unicorn 设置为侦听网络接口。这应该最好是私有 IP 地址。在此示例中,假设您的应用服务器为 192.168.1.100、192.168.1.101 和 192.168.1.102。配置 unicorn 以侦听所有应用服务器上的 8000 端口。

在 nginx 方面,您将有一个“上游”块,例如:

upstream unicorn {
  server 192.168.1.100:8000;
  server 192.168.1.101:8000;
  server 192.168.1.102:8000;
}
Run Code Online (Sandbox Code Playgroud)

然后你的虚拟服务器定义将包含如下块:

location / {

    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X_FORWARDED_PROTO $scheme;
    proxy_set_header  Host $host;

    proxy_connect_timeout 3;
    proxy_read_timeout 60;
    proxy_send_timeout 60;

    proxy_redirect off;
    proxy_max_temp_file_size 0;

    if (!-f $request_filename) {
      proxy_pass http://unicorn;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能需要其他代理声明才能让事情按您想要的方式工作,但这基本上应该可以做到。proxy_pass 语句将使用上游块中定义的块,并将作业分发到列出的应用服务器。检查有关其他可能合适的选项的 nginx 文档。

  • 这个网址是空白的,你有复制的内容吗? (2认同)