我有一个相当标准的 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 文档以了解其他可能合适的选项。