Site de balanceamento de carga com Nginx

Site de balanceamento de carga com Nginx

Eu tenho um aplicativo Rails 4 servido pelo nginx que está recebendo mais tráfego do que o servidor pode suportar, então quero executar uma segunda instância desse aplicativo em outro servidor e balancear a carga do tráfego entre os dois.

Este aplicativo Rails atende muitos sites provenientes de vários domínios diferentes, cada site tem seu próprio serverbloco Nginx com certificados SSL que direcionam proxy_passo tráfego de volta para o aplicativo Rails, por exemplo, mysite.comvai para mainapp.com/1, myothersite.comvai para mainapp.com/2e assim por diante.

minha idéia seria modificar as configurações do nginx para que o aplicativo Rails server #1atuasse como um balanceador de carga, adicionando um upstreambloco com os IPs dos dois servidores que executam o aplicativo Rails (um dos IPs seria 127.0.0.1 já que é o mesmo servidor) para que o tráfego fosse para si mesmo ou paraserver #2

Agora o que não consigo entender é o que colocar no upstreambloco porque se eu fizer algo assim:

upstream samplecluster {
  ip_hash;
  server localhost;
  server x.xx.xxx.x; #private IP of server #2
}

considerando server #2que está executando mais sites, como o Nginx saberia qual site servir ao receber o tráfego do balanceador de carga?

a solução seria usar domínios em vez de IP para server #2? Como por exemplo:

upstream samplecluster {
  ip_hash;
  server localhost;
  server www2.mainapp.com; #domain instance of the main app on server #2
}

e no serverbloco da instância mainapp em server #2uso www2.mainapp.comcomo server_name?

Ou talvez use o IP interno, mas para uma porta específica e depois use server_name _;e ouça apenas essa porta específica?

Algo assim, talvez?


#on server #1

upstream samplecluster {
  ip_hash;
  server localhost:6789;
  server x.x.x.x:6789; #internal ip of server #2
}

#main app domain acting as load balancer
server {
  listen 443;
  server_name www.mainapp.com mainapp.com;

  location / {
    try_files $uri @app;
  }

  location @app {
    proxy_pass http://samplecluster;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Host $http_host;

    proxy_headers_hash_max_size 512;
    proxy_headers_hash_bucket_size 128;

    proxy_redirect off;
  }
  
  (...)
  
}

#also on server #1, main app behind load balancer actually serving the files
server {
  listen 6789;
  server_name _;
  root /var/www/mainapp;
  
  (...)
  
}


#on server #2

server {
  listen 6789;
  server_name _;
  root /var/www/mainapp;
  
  (...)
  
}

Isso funcionaria ou estou faltando alguma coisa?

informação relacionada