Site mit Nginx ausgleichen

Site mit Nginx ausgleichen

Ich habe eine Rails 4-Anwendung, die von Nginx bereitgestellt wird und mehr Datenverkehr hat, als der Server verarbeiten kann. Deshalb möchte ich eine zweite Instanz dieser Anwendung auf einem anderen Server ausführen und den Datenverkehr zwischen den beiden ausgleichen.

Diese Rails-App bedient viele Sites aus vielen unterschiedlichen Domänen. Jede Site verfügt über ihren eigenen Nginx- serverBlock mit SSL-Zertifikaten, die proxy_passden Datenverkehr zurück zur Rails-App leiten, also beispielsweise mysite.coman gehen mainapp.com/1, myothersite.coman gehen mainapp.com/2und so weiter.

meine Idee wäre, die Nginx-Konfigurationen für die Rails-App so zu ändern server #1, dass sie als Load Balancer fungiert, indem ich einen upstreamBlock mit den IPs der beiden Server hinzufüge, auf denen die Rails-App läuft (eine der IPs wäre 127.0.0.1, da es sich um denselben Server handelt), sodass der Datenverkehr entweder an sich selbst oder anserver #2

Was ich jetzt nicht verstehe, ist, was ich in den upstreamBlock einfügen soll, denn wenn ich so etwas mache:

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

Wenn wir bedenken server #2, dass mehrere Sites ausgeführt werden, woher weiß Nginx, welche Site bedient werden soll, wenn es den Datenverkehr vom Load Balancer empfängt?

Wäre die Lösung, Domänen statt IPs zu verwenden server #2? Wie zum Beispiel:

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

und auf dem serverBlock für die Mainapp-Instanz bei server #2Verwendung www2.mainapp.comals server_name?

Oder vielleicht die interne IP verwenden, aber für einen bestimmten Port, und dann server_name _;nur diesen bestimmten Port verwenden und abhören?

So etwas vielleicht?


#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;
  
  (...)
  
}

Würde das funktionieren oder übersehe ich etwas?

verwandte Informationen