使用 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.comserver_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;
  
  (...)
  
}

这会有用吗或者我遗漏了什么?

相关内容