My Goal :运行2台服务器,我的Web应用程序的HTTP服务器和TCP服务器来处理我的TCP客户端并为两者使用SSL . I want ELB to handle SSL for HTTP 和 my 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
});
};
- 我做了我的研究,发现这些帖子与这个问题有关 . 1,2,3 . 第一篇文章提出了这段代码 . 将此包含在
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 回答
302不是错误,它是重定向 . 您添加了代码以将所有HTTP请求重定向到HTTPS . 代码对我来说是正确的,如果对ELB的原始请求不是通过HTTPS,则应该重定向 .
不,不是 . 它可以提供性能改进,但它不是必需的,并且此时会添加额外的移动部件,这可能会使事情变得混乱 .
你确定ELB看到5xx错误而不是302回复吗?无论如何,您需要向该代码段中的if语句添加条件,以允许对运行状况检查URL的HTTP请求通过 .
Edit: 我刚刚意识到您希望在TCP连接上使用自签名证书,因此您应该在ELB上指定一个TCP侦听器并将其转发到服务器上的TCP,并且ELB不会尝试终止SSL .