配置负载均衡器以路由到实例的不同页面?

时间:2018-10-25 03:43:20

标签: node.js amazon-web-services httprequest amazon-elb

  • 我在实例x的前面有一个AWS负载均衡器。
  • 实例x在以下位置运行 端口3000。实例x有两个页面,即x / abc和x / zyx。
  • 当前,x的负载均衡器有两个侦听器,即80 -> 30008080 -> 3000。然后在/
  • 上ping
  

要求:我有两个服务器要与实例x通信。服务器1希望将http请求发送到x / abc和服务器2   想要将http请求发送到x / zyx。

如何配置LB路由到特定页面,例如x / abc和x / zyx? 还是以其他方式编写我的请求?

代码1:服务器1要向x / abc发出http请求

// url is the DNS of load balancer... this should go to x/abc(?)
request({
    url: "LoadBalancer-11122232.us-west-2.elb.amazonaws.com:80",
    method: "POST",
    json: true,  
    body: tweetJSON
}

代码2:服务器2希望向x / zyx发出http请求

// url is the DNS of load balancer... this should go to x/abc 
// DO I EVEN NEED TWO DIFFERENT PORT LISTENERS(?)
    request({
        url: "LoadBalancer-11122232.us-west-2.elb.amazonaws.com:8080",
        method: "POST",
        json: true,  
        body: tweetJSON
    }

2 个答案:

答案 0 :(得分:2)

您没有将负载均衡器配置为将请求路由到不同的端点,这更像是反向代理的工作,例如Nginx

Load Balancer提供了一个要呼叫的端点,并将来自客户端的请求转发到许多相同的服务器之一。目的是在许多服务器之间共享高负载。

在您所处的环境中,您仍然可以使用负载均衡器,但就路由而言,我建议您完整寻址URL:

代码1:服务器1要向x / abc发出http请求

// url is the DNS of load balancer plus the route (/abc)
request({
    url: "https://LoadBalancer-11122232.us-west-2.elb.amazonaws.com/abc",
    method: "POST",
    json: true,  
    body: tweetJSON
}

代码2:服务器2希望向x / zyx发出http请求

// url is the DNS of load balancer plus the route (/zyx)
request({
    url: "https://LoadBalancer-11122232.us-west-2.elb.amazonaws.com/zyx",
    method: "POST",
    json: true,  
    body: tweetJSON
}

如果您需要阻止客户端访问后端URL,则需要某种形式的身份验证来标识服务器2。

答案 1 :(得分:0)

通常,您使用负载平衡器来平衡两个节点服务器之间的流量。

因此,您有两个非常简单的选项。一种是代替经典的Amazon负载均衡器(ELB),而可以切换到ALB(应用程序负载均衡器)。

要进行设置,请遵循these Amazon instructions

特别注意最后一部分

  

在“侦听器”选项卡上,使用箭头查看规则。   侦听器,然后选择添加规则。指定规则,如下所示:

     

对于目标组名称,选择您要使用的第二个目标组   已创建。

     

对于路径模式,请指定要用于基于路径的确切模式   路由(例如/ img / *)。

有关更多信息,请see Listener Rules.

一个更便宜的选择是使用Nginx来滚动您自己的负载均衡器。您可以使用配置了Nginx的AMI启动EC2实例。

然后,您将编辑Nginx配置,如下所示:

# The Node.js application serving ABC

upstream node_abc {
  server ip.address.node.instance1:3000;
}

# The Node.js application serving XYZ 
upstream node_xyz {
  server ip.address.node.instance2:3000;
}

# Accept connections from clients
server {
  listen 80;
  charset utf-8;
  location /abc {
      proxy_pass http://node_abc;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
  }
  location /xyz {
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

尽管更好,而且我认为您真正想要的是使用nginx作为适当的负载平衡反向代理。为此,您将运行同一node.js应用程序的两个副本,其中每个副本都可以响应路由/ abc或/ xyz,并为页面提供服务器。然后使用如下配置:

#Proper Load Balanced Nginx setup

upstream node_server {
  server ip.address.node.instance1:3000;
  server ip.address.node.instance2:3000;
}

# Accept connections from clients

server {
  listen 80;
  charset utf-8;
  location / {
      proxy_pass http://node_server;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
  }

如果您执行此最后的配置,则不必担心页面上的任何复杂的URL重写。

您可以在单独的服务器上获得两个单独的节点实例的好处。因此,如果您的一个节点实例发生故障,那么您的负载均衡器将使用另一个节点实例。 (将/ _health路由添加到响应200 OK的nodejs应用)

您可以轻松地进行A / B测试,并且蓝绿色部署在其中您仅使用新代码更新一个实例,然后再更新另一个实例。

可以将Nginx配置为不同的负载平衡策略,默认为轮询。如果需要在用户开始会话后将他们发送到同一节点实例,则还可以添加粘性会话。