首页 文章

如何正确运行Elastic Load Balancer和Node.js(HTTP和TCP)的Amazon EC2?

提问于
浏览
3

My Goal :运行2台服务器,我的Web应用程序的HTTP服务器和TCP服务器来处理我的TCP客户端并为两者使用SSL . I want ELB to handle SSL for HTTPmy application to handle the SSL connection for TCP server (我只为TCP服务器使用自签名证书),

Here's what I have so far

  • 我的HTTP服务器是带有Express的Node.js HTTP服务器 . 我想加密所有连接,发现我可以通过亚马逊上的证书管理器获得免费的SSL证书 . 但是,我发现我需要Elastic Load Balancer . 所以我设置了一个,它比我预期的更痛苦 . 我无法让https为我的网络应用程序工作 .

  • 想法是负载均衡器终止来自客户端的所有SSL连接,并将未加密的数据发送到80后的后端EC2机器.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 . 第一篇文章提出了这段代码 . 将此包含在 app.js 中会产生 302 error . How can I de-bug this issue? where should I include it?
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服务器处理 . 使用此代码片段,ELB开始看到 5xx error ,ELB接受实例 out of service .

  • 对于我的TCP服务器,我计划自己处理SSL连接(自生成的证书) . 我在一些随机端口上运行TCP . When ELB sees SSL conenction on this port, will it terminate it?

ELB listener config

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

1 回答

  • 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);
    }
    其他
    下一个();
    });

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

    其中一个帖子建议使用反向代理 . 这有必要吗?

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

    另一个复杂性是ELB运行状况检查在端口80上ping并由同一HTTP服务器处理 . 使用此代码段,ELB开始看到5xx错误,ELB使实例停止服务 .

    你确定ELB看到5xx错误而不是302回复吗?无论如何,您需要向该代码段中的if语句添加条件,以允许对运行状况检查URL的HTTP请求通过 .

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

    Edit: 我刚刚意识到您希望在TCP连接上使用自签名证书,因此您应该在ELB上指定一个TCP侦听器并将其转发到服务器上的TCP,并且ELB不会尝试终止SSL .

相关问题