使用 Nginx 負載平衡站點

使用 Nginx 負載平衡站點

我有一個由nginx 提供服務的Rails 4 應用程序,它獲得的流量超出了伺服器可以處理的流量,因此我想在另一台伺服器上運行該應用程式的第二個實例,並對兩者之間的流量進行負載平衡。

這個 Rails 應用程式為來自許多不同網域的許多網站提供服務,每個網站都有自己的 Nginxserver區塊,帶有 SSL 證書,proxy_pass流量返回 Rails 應用程序,例如mysite.com轉到mainapp.com/1myothersite.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;
  
  (...)
  
}

這有用還是我錯過了什麼?

相關內容