
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- server
Block mit SSL-Zertifikaten, die proxy_pass
den Datenverkehr zurück zur Rails-App leiten, also beispielsweise mysite.com
an gehen mainapp.com/1
, myothersite.com
an gehen mainapp.com/2
und 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 upstream
Block 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 upstream
Block 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 server
Block für die Mainapp-Instanz bei server #2
Verwendung www2.mainapp.com
als 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?