
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 server
bloco Nginx com certificados SSL que direcionam proxy_pass
o tráfego de volta para o aplicativo Rails, por exemplo, mysite.com
vai para mainapp.com/1
, myothersite.com
vai para mainapp.com/2
e assim por diante.
minha idéia seria modificar as configurações do nginx para que o aplicativo Rails server #1
atuasse como um balanceador de carga, adicionando um upstream
bloco 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 upstream
bloco porque se eu fizer algo assim:
upstream samplecluster {
ip_hash;
server localhost;
server x.xx.xxx.x; #private IP of server #2
}
considerando server #2
que 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 server
bloco da instância mainapp em server #2
uso www2.mainapp.com
como 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?