如何使用 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.
我有一个 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.