如何使用 Classic Load Balancer 配置 Elastic Beanstalk NodeJS 应用程序以使用 HTTPS?

How do I configure an Elastic Beanstalk NodeJS application with a Classic Load Balancer to use HTTPS?

我有一个 Elastic Beanstalk 应用程序,它是 运行 一个 Classic Load Balancer。负载均衡器正在使用 ACM SSL 证书。 NodeJS 应用程序是 运行 端口 8080 上的 HTTP 服务器,当访问时,它会重定向到端口 3000 上 运行 的 HTTPS 服务器。但是,这似乎不起作用。两台服务器都不会加载任何东西。目前,我的负载均衡器正在监听端口 80 并发送到实例端口 80,监听端口 443 并使用 ACM SSL 证书发送到实例端口 443。我应该如何配置我的 EB 应用程序、负载均衡器和 nodeJS 应用程序才能使其正常工作?


编辑:作为 Elastic Beanstalk 应用程序的默认设置,还有一个 nginx 实例 运行。我不提那个是我的错。

根据@kgiannakakis 的建议,我的 nodeJS 应用现在如下所示:

var express = require('express');
var path = require('path');
var routes = require("./routes");

const port = process.env.PORT || 8080;

var app = express();

app.set('views', __dirname + '/views');
app.set('view engine', 'pug');
app.set('port',port)
app.use(express.static(path.join(__dirname, 'public')));
app.enable('trust proxy')
app.use((req, res, next) => {
    req.secure ? next() : res.redirect('https://' + req.headers.host + req.url)
})

function init() {
    app.get('/', routes.index);

    app.get("/ping", function(req, res){
        res.send("Ok");
        res.end();
    });

    app.listen(app.get('port'), () => {
        console.log("App running on port %s.",app.get('port'));
    });
}

init();

HTTP 请求工作正常,但是 HTTPS 不工作。

由于您拥有 ACM 证书,我假设您要在负载均衡器级别终止 SSL。这意味着负载均衡器和 Elastic Beanstalk 实例之间的通信将是未加密的。对于您的 Node.js 服务器,您只需要监听代理端口 (8080)。详情为here。您应该注意:

  • 您的应用程序侦听的端口不会影响 nginx 服务器侦听的端口以接收来自负载均衡器的请求。
  • Amazon 的默认端口是 8080 Linux 2.

在您的 Classic Load Balancer 中,您应该添加两个侦听器。一个用于端口 80 重定向到 80,一个使用证书重定向到 443,也重定向到 80。您实例中的 Nginx 服务器侦听端口 80 并将请求转发到您的节点服务器。

另请注意,可以在实例中终止 SSL。这需要您自己的证书(不是通过 ACM)并正确配置 nginx。阅读详情 here.