Encontrei muitos posts e tutoriais DIY sobre como configurar o Nginx como um balanceador de carga usando o servidor upstream:
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;
}
}
Mas isso é tudo que posso encontrar no que diz respeito à configuração desta arquitetura. Atualmente tenho um aplicativo Rails implantado em 3 servidores VPS backend e estou usando o Unicorn para meu servidor HTTP. Preciso do meu Ruby instalado junto com meu aplicativo Rails e unicorn no meu servidor de balanceamento de carga também? Preciso que o Nginx esteja instalado em cada um dos servidores upstream? Se sim, como eu configuro eles? Se eu introduzir algo como Varnish na arquitetura, para onde isso vai? Na frente do balanceador de carga ou de cada um dos back-ends?
Aqui está um visual de como tenho tudo organizado:
+---> backend1 <---+
| |
[requests] <---> [Nginx load-balancer]-+---> backend2 <---+-[Database server]
| |
+---> backend3 <---+
Responder1
Resposta curta:
Nginx
na verdade, só tem um trabalho, e esse trabalho é aceitar uma solicitação recebida e entregá-la a um servidor back-end.
Dado isso, seus servidores front-end só precisam ser executados nginx
e seus servidores back-end só precisam ser executados rails
. Faz sentido?
Agora, se o seu back-end e o seu front-end estiverem rodando no mesmo servidor, então, sim, claro, ele teria que ser instalado lá também, mas pelo seu diagrama não acredito que seja o caso.
Se você introduzir um software de cache HTTP, como o Varnish
, ele ficaria entre Nginx
e Rails
, provavelmente também em execução no servidor back-end. Portanto, as solicitações seguiriam este caminho:
Nqinx -> Varnish -> Rails
Responder2
Ao trabalhar com Rails, nginx
pode ser usado para servir diversas funções, na maioria das vezes como balanceador de carga HTTP ou como front-end de servidor de aplicativos. Sua configuração é comum e funcionará, mas pode impor desafios de dimensionamento à medida que você atinge níveis mais altos de tráfego.
Quando você está trabalhando com vários servidores VPS conforme descrito, uma instância nginx pode servir como balanceador de carga HTTP primário para tráfego de entrada e um front-end para descarregar responsabilidades de baixo nível dos servidores de aplicativos Rails (servindo arquivos estáticos, reescritas/redirecionamentos de URL, etc.).
O nginx pode lidar com milhares de conexões simultâneas sem muitos recursos, enquanto os servidores de aplicativos Unicorn Rails geralmente só podem atender a um punhado de conexões simultâneas. À medida que você escala mais, precisará de mais instâncias nginx de balanceador de carga/front-end (e de um método de balanceamento de carga entre elas, como round-robin de DNS ou outros mecanismos).
Se você usa Amazon AWS ou outras plataformas de hospedagem mais maduras, geralmente é usado um serviço como Elastic Load Balancing (ELB) como balanceador de carga da web principal. Cada servidor de aplicativo executa nginx/Unicorn, utilizando nginx como front-end para descarregar o processamento de cada Unicorn. Isso é muito mais fácil de escalar, devido ao ELB de alto volume na frente de cada servidor.