【问题标题】:How to run Amazon EC2 with Elastic Load Balancer and Node.js (HTTP and TCP) correctly?如何使用 Elastic Load Balancer 和 Node.js(HTTP 和 TCP)正确运行 Amazon EC2?
【发布时间】:2016-12-03 12:36:51
【问题描述】:

我的目标:运行 2 个服务器,用于我的 Web 应用程序的 HTTP 服务器和用于处理我的 TCP 客户端的 TCP 服务器,并为两者使用 SSL。 我希望 ELB 处理 HTTP 的 SSL我的应用程序处理 TCP 服务器的 SSL 连接(我只对 TCP 服务器使用自签名证书),

这是我目前所拥有的

  • 我的 HTTP 服务器是一个带有 Express 的 Node.js HTTP 服务器。我想加密所有 连接并发现我可以通过以下方式获得免费的 SSL 证书 亚马逊上的证书管理器。但是,我发现我需要 Elastic 负载均衡器。所以我设置了一个,它比我更痛苦 预计。我无法让 https 为我的网络工作 申请。
  • 想法是负载均衡器终止来自客户端的所有 SSL 连接,并将未加密的数据发送到后端 EC2 机器超过 80。node.js HTTP 服务器正在侦听 80。

这是我的 HTTP 服务器文件app.js

var express = require('express');
var http = require('http');
var servestatic = require('serve-static');
var app = express();
var bodyParser = require('body-parser');

var flash = require('connect-flash');
var morgan = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var cacheResponseDirective = require('express-cache-response-directive');

app.use(morgan('dev')); // log every request to the console
app.use(bodyParser.json()); // support json encoded bodies
app.use(bodyParser.urlencoded({extended: true })); // support encoded bodies
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
app.use(flash()); // use connect-flash for flash messages stored in session
app.use(cacheResponseDirective());



app.use(express.static('public')); // enable if needed for server to serve static content

require('routes.js')(app); // Load routes and pass in our app and fully configured passport


var allowCrossDomain = function(req, res, next) {

    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');

    if ('OPTIONS' == req.method) {
    res.send(200);
    }
    else {
    next();
    }
};



var server = app.listen(80, function() {



    console.log('The server is running at http://%s,%s', HOST,PORT);

});

我通过routes.js处理我的所有路线

module.exports = function (app) {

path = require('path');

// for home or index page
app.get('/', function (req, res) {
    res.sendFile(path.join(__dirname, './models', 'index.html'));
});// end of index file

// for contact page
app.get('/contact', function (req, res) {
    res.sendFile(path.join(__dirname, './models', 'contact.html'));
});

// route for signup
app.get('/signup', function (req, res) {
    console.log("\n I'm in index");
    res.sendFile(path.join(__dirname, './models', 'signup.html'));
});

app.get('/loginBtn', function (req, res) {
    console.log("\n I'm in initial login page");
    res.sendFile(path.join(__dirname, './models', 'login.html')); // Go to the login page
});

};
  • 我进行了研究,发现这些帖子与此问题相关。 123。第一篇文章建议使用这个 sn-p 代码。将其包含在app.js 中会产生302 error如何调试此问题?我应该在哪里包含它?

    app.use(function(req, res, next) {
     if((!req.secure) && (req.get('X-Forwarded-Proto') !== 'https')) {
      res.redirect('https://' + req.get('Host') + req.url);
     }
    else
     next();
    }); 
    
  • 其中一篇文章建议使用反向代理。有必要吗?

  • 另一个复杂性是 ELB 健康检查在端口 80 上 ping 并由同一个 HTTP 服务器处理。使用此代码 sn-p,ELB 开始看到 5xx error,并且 ELB 使实例停止服务

  • 对于我的 TCP 服务器,我计划自己处理 SSL 连接(自行生成的证书)。我在某个随机端口上运行 TCP。 当 ELB 在此端口上看到 SSL 连接时,它会终止它吗?

ELB 监听器配置

(负载均衡器)http 80 -->(节点实例)http 80

(负载均衡器)https 443 -->(节点实例)http 80

(负载均衡器)TCP random_port -->(节点实例)TCP random_port

【问题讨论】:

  • 把你的 ELB 监听器 443 改成 443 看看有没有同样的问题?
  • @error2007s 你的建议让我觉得你不明白 ELB 的 SSL 终止是如何工作的。
  • @MarkB 评论部分是评论问题而不是其他人的评论,如果您知道答案,请回答问题或通过向用户评论他应该做什么来给出您的建议。我了解和不了解的与您无关:)
  • @error2007s 我确实回答了。当人们在这个网站上传播不正确的信息时,我认为这是每个人的事。
  • @MarkB 我的评论是尝试我在评论中没有说的东西,它会解决你的问题。如果我答错了,那就是错误的信息。

标签: node.js http amazon-web-services tcp amazon-ec2


【解决方案1】:

在 app.js 中包含这个会导致 302 错误。

app.use(function(req, res, next) {
 if((!req.secure) && (req.get('X-Forwarded-Proto') !== 'https')) {
  res.redirect('https://' + req.get('Host') + req.url);
 }
else
 next();
});

302 不是错误,而是重定向。您添加了将所有 HTTP 请求重定向到 HTTPS 的代码。该代码对我来说是正确的,如果对 ELB 的原始请求不是通过 HTTPS,则应该重定向。

其中一篇文章建议使用反向代理。有必要吗?

不,不是。它可能会提供性能改进,但这不是必需的,并且会在此时添加额外的移动部件,这可能会使事情变得混乱。

另一个复杂性是 ELB 健康检查在端口 80 上 ping 和 由同一个 HTTP 服务器处理。使用此代码 sn-p,ELB 开始看到 5xx 错误,ELB 使实例停止服务。

您确定 ELB 看到的是 5xx 错误而不是 302 响应吗?无论如何,您需要在该 sn-p 中的 if 语句中添加一个条件,以允许对健康检查 URL 的 HTTP 请求通过。

对于我的 TCP 服务器,我计划处理 SSL 连接 我自己(自行生成的证书)。我在某个随机端口上运行 TCP。当 ELB 在这个端口上看到 SSL 连接,它会终止它吗?

编辑:我刚刚意识到你想在 TCP 连接上使用自签名证书,所以你应该在 ELB 上指定一个 TCP 侦听器并将其转发到服务器上的 TCP,然后ELB 不会尝试终止 SSL。

【讨论】:

  • 我的错,是的,302 是重定向。但是,重定向不会通过。知道我应该在哪里包含该代码 sn-p 吗?
  • @AGM 我刚刚更新了答案的最后一部分。关于重定向,您必须为健康检查 URL 添加例外,否则 ELB 将很快使您的服务器停止服务。让它工作,然后看看重定向是否也有效。你说你收到了 302 响应,所以听起来它确实在工作,可能是在 ELB 停止服务之前的一分钟。
猜你喜欢
  • 2017-06-29
  • 2012-11-01
  • 2016-02-05
  • 2018-06-11
  • 1970-01-01
  • 2011-09-18
  • 2020-08-03
  • 2017-12-08
  • 2018-10-11
相关资源
最近更新 更多