
nginx によって提供される Rails 4 アプリケーションがあり、サーバーが処理できる以上のトラフィックが発生しているため、そのアプリケーションの 2 番目のインスタンスを別のサーバーで実行し、2 つのサーバー間でトラフィックの負荷を分散したいと考えています。
この Rails アプリは、さまざまなドメインからの多数のサイトに対応しており、各サイトにはserver
SSL 証明書を備えた独自の Nginx ブロックがあり、proxy_pass
トラフィックは Rails アプリに戻るため、たとえば、mysite.com
に送られmainapp.com/1
、myothersite.com
に送られるmainapp.com/2
などとなります。
server #1
私のアイデアは、Railsアプリのnginx構成をロードバランサーとして動作するように変更することです。Railsupstream
アプリを実行する2つのサーバーのIP(同じサーバーなので、IPの1つは127.0.0.1になります)を含むブロックを追加して、トラフィックがそれ自体またはserver #2
今、私が理解できないのはupstream
、次のようなことをするとブロックに何を入れればいいのかということです。
upstream samplecluster {
ip_hash;
server localhost;
server x.xx.xxx.x; #private IP of server #2
}
server #2
より多くのサイトを運営している場合、Nginx はロードバランサーからトラフィックを受信するときにどのサイトを処理するかをどのように認識するのでしょうか?
解決策としては、IP の代わりにドメインを使用することでしょうかserver #2
? たとえば次のようになります:
upstream samplecluster {
ip_hash;
server localhost;
server www2.mainapp.com; #domain instance of the main app on server #2
}
そして、server
mainapp インスタンスのブロックでは、 ?としてserver #2
使用されます。www2.mainapp.com
server_name
または、内部 IP を特定のポートに使用し、server_name _;
その特定のポートのみを使用してリッスンするのでしょうか?
こんな感じでしょうか?
#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;
(...)
}
これは機能しますか、それとも何かが欠けていますか?