
我有一個由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;
(...)
}
這有用還是我錯過了什麼?