Elastic Beanstalk负载均衡器上的多个HTTP路由,用于具有多个服务器的节点应用程序

时间:2017-02-17 13:24:27

标签: node.js rest amazon-web-services websocket

难以说出我的问题,所以我找不到太多信息,所以我会解释:

我有一个node.js应用程序,它在端口8081上托管一个restify / express api。 这个api在端口8083上托管了一个websocket服务器。

所有这一切都通过指定端口在localhost上运行得非常好,但在托管环境中,它需要在端口80 http上运行。 (为简单起见省略443。)

我正在使用AWS Elastic Beanstalk(nginx服务器)。当我部署我的应用程序时,它会创建一个EC2和ELB(负载均衡器)实例。 ELB然后有一个公共dns,我用它来访问端口80上的api。没有配置特殊的监听器(只有80和443)。所以我不确定它如何到达端口8081上的api.EC2实例也只允许80和443。

使用端口80上的ELB公共DNS,api可以正常工作。

现在我已经在那里添加了websocket服务器。

我的问题是 - 我需要在端口80上的另一个公共DNS转到同一个Beanstalk应用程序的端口8083上的套接字服务器。我该如何处理?

我很感激任何想法和想法。

1 个答案:

答案 0 :(得分:2)

看起来......

  1. Elastic Beanstalk创建了一个不支持websockets的Classic负载均衡器。
  2. AWS上的默认nginx设置不允许Upgrade标头。
  3. 但是,我按照以下方式开展工作:

    • 默认EB设置(使用经典ELB)可以像往常一样提供API。
    • 然后我从EC2仪表板创建了一个ALB(应用程序负载均衡器)。
    • 我在端口8083(我的websocket监听器)上添加了一个路由到我的EC2实例(EB创建的)的目标。我的API在端口8081上运行。然后将目标添加到Listeners选项卡上的新ALB上。

    这将允许访问端口80上的新ALB的流量路由到托管我的应用程序的服务器的端口8083。

    • 在项目的.ebextensions文件中,我添加了以下更新nginx设置以允许websockets所需的Upgrade标题:

    添加到.ebextensions

    container_commands:
      enable_websockets:
        command: |
          sed -i '/\s*proxy_set_header\s*Connection/c \
                  proxy_set_header Upgrade $http_upgrade;\
                  proxy_set_header Connection "upgrade";\
                  ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf
    

    所以基本上我有两个负载平衡器。路由80到8081的默认路由,以及路由80到8083的另一个(ALB)。

    这绝不是完美的。自动缩放/负载平衡可能不起作用。但是现在是来自同一个应用程序的API和websocket服务器。