Nginx 和 Unicorn 位于不同的机器上

Nginx 和 Unicorn 位于不同的机器上

我有一个相当标准的 Rails 应用程序,它与 Unicorn 和 Nginx 一起运行在一台机器上。我想将应用程序本身拆分开来,将 Nginx 放在一台机器上,将 Unicorn(带有 Rails 应用程序)放在另一台机器上。这里的想法是,我想在将来添加另一个带有 Unicorn 的应用服务器,主要用于一些轻量级负载平衡。

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

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

答案1

这是正常的。您不需要 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;
}

然后你将得到一个带有类似块的虚拟服务器定义:

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;
    }
}

您可能需要其他代理语句才能让事情按您希望的方式运行,但这基本上就可以了。proxy_pass 语句将使用上游块中定义的块,并将作业分发到列出的应用服务器。查看 nginx 文档以了解其他可能合适的选项。

相关内容