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

Posted

技术标签:

【中文标题】如何使用 Classic Load Balancer 配置 Elastic Beanstalk NodeJS 应用程序以使用 HTTPS?【英文标题】:How do I configure an Elastic Beanstalk NodeJS application with a Classic Load Balancer to use HTTPS? 【发布时间】:2022-01-10 17:11:04 【问题描述】:

我有一个使用 Classic Load Balancer 运行的 Elastic Beanstalk 应用程序。负载均衡器正在使用 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 不能。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

这适用于 HTTP 请求,但 HTTPS 请求仍然没有结果。 您收到什么错误信息?此外,您不应签入代码以获取安全请求。所有请求都将不加密。 我在日志中看到的唯一错误来自 nginx,并且是 connect() failed (111: Connection refused) while connecting to upstream 确保实例端口为 80 并且实例协议 HTTP 用于 HTTP 和 HTTPS。 太棒了,这行得通。似乎由于某种原因,这些更改在重新部署时已被重置。发生这种情况是否有原因?

以上是关于如何使用 Classic Load Balancer 配置 Elastic Beanstalk NodeJS 应用程序以使用 HTTPS?的主要内容,如果未能解决你的问题,请参考以下文章

OpenStack Neutron 之 Load Balance

mq从零开始实现 mq-07-负载均衡 load balance

Vertica7 Native Connection Load Balance

hue的load balance

golang JSON webservice - nginx load balance

亲密接触Redis-第三天(Redis的Load Balance)