节点负载均衡器和基于路径的路由

时间:2018-03-02 18:11:05

标签: javascript node.js amazon-web-services amazon-ec2

我有一个我在AWS上托管的Web应用程序。当我没有ALB时,这项服务很好。

我面临的问题是我使用基于路径的路由,但不想因为负载均衡器而修改我的应用程序代码。

在内部,应用程序位于此处的某个位置,并与同一位置的其他服务共享。

类似

http://1.2.3.4/index.html

我的服务如下

const server = http.createServer((req, res) => {
const pathname = url.parse(req.url).pathname;
const jsHeader = { 'Content-Type': 'application/javascript' };
const cssHeader = { 'Content-Type': 'text/css' };
const textHeader = { 'Content-Type': 'text/plain' };

const jsBundleLink = `<${ FRAGMENT_EXTERNAL_LINK }/client/bundle.js>; 
rel="fragment-script"`;
const cssBundleLink = `<${ FRAGMENT_EXTERNAL_LINK }/client/bundle.css>; 
rel="fragment-script"`;

switch (pathname) {
  case '/client/bundle.js':
     res.writeHead(200, jsHeader);
     return fs.createReadStream(
      `${ WORKING_DIRECTORY }/client/bundle.js`).pipe(res);
  case '/client/bundle.css':
      res.writeHead(200, cssHeader);
      return fs.createReadStream(
        `${ WORKING_DIRECTORY }/client/bundle.css`).pipe(res);
  case '/healthcheck':
      res.writeHead(200, textHeader);
      return res.end('');
  default:
      res.writeHead(200, {
         'Content-Type': 'text/html',
         'Link': `${ jsBundleLink },${ cssBundleLink }`,
       });
      return res.end('');
      }
  });`

当我设置负载均衡器时,请求以

的形式出现

http://balancer.aws.com/microspas/mymicrospa/index.html

这会改变

的路径名

/client/bundle.js到microspas / mymicrospa / client / bundle.js

这对我来说是个问题,因为我的应用程序现在必须知道aws elb的子路径设置。

任何方式都没有改变路径或者很容易让我的应用程序知道它存在于子路径中,所以如果我点击直接URL或负载均衡网址仍然有效?

有些事情需要注意:

  1. 我需要坚持使用HTTP.CreateServer,因为负载均衡集群中还有其他项目,所以我需要在负载均衡器中进行子路径。
  2. 一个显示如何在节点中工作的示例将是一个很大的帮助,如果我可以在alb级别修复这个甚至更好。

    编辑:我不小心在原帖中写了ELB,但它是一个ALB。但问题仍然存在。我想不要从ALB发送基址。

    即。路径:www.contoso.com/albpath/client.js应该作为/client.js发送到我的应用程序而不是albpath / client.js

1 个答案:

答案 0 :(得分:0)

这不是直接解决此问题的方法,但是我遇到了同样的问题,因此决定使用基于主机的路由而不是基于路径的路由来解决此问题。

因此,如果您的主机名是example.com,则无需配置应用程序负载平衡器来路由example.com/abc的请求,而是可以配置它来路由您的abc.example.com的请求。