Nginx e Unicorn em máquinas separadas

3

Eu tenho um aplicativo padrão Rails rodando com Unicorn e Nginx em uma única caixa. Eu gostaria de dividir o aplicativo em si e ter o Nginx em uma máquina e o Unicorn (com o aplicativo Rails) em outra máquina. A ideia aqui é que eu gostaria de adicionar outro servidor de aplicativos com o Unicorn no futuro, principalmente para algum balanceamento de carga leve.

Eu posso estar lidando com isso do ângulo errado. Isso é normal / possível? Em caso afirmativo, alguém pode me indicar exemplos de configuração ou documentação?

Se não é o caminho a percorrer, qual é o caminho correto para atingir o objetivo final? Eu olhei para o HAProxy, mas depois de ler algumas documentações do Nginx / Unicorn, eu entendo que isso pode ser feito sem qualquer software adicional.

    
por cmhobbs 21.03.2012 / 02:35

1 resposta

7

Isso é normal. Você não precisa do HAProxy, embora o HAProxy possa fornecer um balanceamento de carga "mais justo" entre os servidores de aplicativos do que o balanceamento de carga do nginx.

Assim, nos seus servidores de aplicativos, defina Unicorn para ouvir uma interface de rede. Isso deve ser preferencialmente um endereço IP privado. Para este exemplo, digamos que seus servidores de aplicativos sejam 192.168.1.100, 192.168.1.101 e 192.168.1.102. Configure o unicórnio para ouvir a porta 8000 em todos os servidores de aplicativos.

No lado nginx, você terá um bloco "upstream" como:

upstream unicorn {
  server 192.168.1.100:8000;
  server 192.168.1.101:8000;
  server 192.168.1.102:8000;
}

Então você terá sua definição de servidor virtual com um bloco como:

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

Você pode precisar de outras declarações de proxy para fazer as coisas funcionarem como quiser, mas isso deve ser feito essencialmente. A instrução proxy_pass usará o bloco definido no bloco upstream e distribuirá tarefas aos servidores de aplicativos listados. Verifique a documentação do nginx em outras opções que possam ser apropriadas.

    
por 21.03.2012 / 02:52