【问题标题】:NodeJS behind AWS ELB redirecting http to https failed health checkAWS ELB后面的NodeJS将http重定向到https失败的健康检查
【发布时间】:2017-02-28 06:06:54
【问题描述】:

我将 ELB 配置为同时打开 80 和 443,其中 443 配置了 SSL。两个 ELB 端口都指向实例的 80 端口。 ELB 的 heatlh 检查使用 ping 目标 HTTP:80/index.html。它曾经可以工作,直到我最近决定开始将 http 重定向到 https。

现在server.js上有以下代码(//内的代码是我新添加的代码):

//
app.use(function(req, res, next) {
    if (config.env === 'prod' && req.get('X-Forwarded-Proto') !== 'https') {
        console.log("redirecting")
        console.log('https://' + req.get('Host') + req.url)
        res.set('X-Forwarded-Proto', 'https');
        res.redirect('https://' + req.get('Host') + req.url);
    }
    else
        next();
});
//

app.use(express.static(path.join(__dirname, 'home')));
app.set('trust proxy'); // enable this to trust the proxy

app.listen(app.get('port'), function() {
  console.log('Express server listening on port ' + app.get('port'));
});

app.get("/*", function(req, res, next) {
    res.sendFile(path.join(__dirname, 'home/index.html'));
});

我认为上述请求会将所有请求重定向到 elb 服务器,但使用 https 协议。

但是服务器开始打印:

redirecting
https://10.x.x.xx/index.html

然后 ELB 失败,因为 https://10.x.x.xx/inde.html 不可用。

但是 index.html 的位置就在 {domain}/ 之下。

我认为我重定向的方式可能是错误的 - 但我不知道如何解决它。

【问题讨论】:

    标签: node.js amazon-web-services redirect amazon-elb elastic-load-balancer


    【解决方案1】:

    我的解决方案是在重定向之前检查健康 API 路由。

    1. 在 AWS 负载均衡器上设置运行状况检查到 /api/health
    2. 添加条件

    if (config.env === 'prod' && req.get('X-Forwarded-Proto') !== 'https' && req.url !== '/api/health') { // redirect }

    【讨论】:

      【解决方案2】:

      负载均衡器运行状况检查请求没有x-forwarded-proto 标头,因为它们不是从客户端转发的,而是直接来自负载均衡器。在进行重定向之前,您可能需要先检查标头是否存在。

      另外,我对您的 SSL 设置有点困惑。您是否在负载均衡器上进行 SSL 终止,但也在 EC2 服务器上提供 SSL 证书?您说“两个 ELB 端口都指向实例的 80 端口”,这意味着您没有在 EC2 服务器上提供 SSL 证书,因此您的健康检查 URL 应该是 http 而不是 https

      你在重定向之前的这一行根本没有完成任何事情:

      res.set('X-Forwarded-Proto', 'https');
      

      【讨论】:

      • 我以为这会设置所有带有此类标头的请求?因为只有没有这个头的请求才会进入这一行?
      • 关于 SSL - 目前,http://{domain} 和 https://{domain} 都可以使用;只是 http:{domain} 没有保护。 SSL 在 ELB 上完成,最终将所有请求指向 EC2 的端口 80。
      • x-forwarded-proto 标头的全部意义在于让负载均衡器设置它。为什么要在服务器上覆盖它?并且在发出重定向之前在请求上设置它不会完成任何事情,因为请求会被丢弃。
      • 关于您的 SSL,我不完全按照您所说的进行操作。基本上,您的问题是您正在向健康检查 URL 发送重定向,这不起作用。您必须允许通过 http 加载健康检查 URL 而无需重定向。
      • 我明白你的意思 - 重定向的请求不会也包含该标头吗?我认为 req 仍然携带所有信息。
      猜你喜欢
      • 2020-12-18
      • 2018-05-29
      • 2018-09-26
      • 2019-10-25
      • 2021-03-29
      • 2018-01-12
      • 2019-12-22
      • 2014-10-02
      • 2018-04-15
      相关资源
      最近更新 更多