我有一个由 nginx 提供服务的 rails 4 应用程序,其流量超出了服务器的处理能力,因此我想在另一台服务器上运行该应用程序的第二个实例,并对两者之间的流量进行负载平衡。
这个 rails 应用程序为来自不同域的许多站点提供服务,每个站点都有自己的 Nginxserver
块和 SSL 证书,proxy_pass
流量可以返回到 rails 应用程序,例如,mysite.com
转到mainapp.com/1
,myothersite.com
转到mainapp.com/2
等等。
我的想法是修改 rails 应用程序的 nginx 配置,使其server #1
充当负载平衡器,方法是添加一个upstream
包含运行 rails 应用程序的两个服务器的 IP 的块(其中一个 IP 将是 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
}
并在mainappserver
实例的块上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;
(...)
}
这会有用吗或者我遗漏了什么?