【发布时间】: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
});
};
-
我进行了研究,发现这些帖子与此问题相关。 1、2、3。第一篇文章建议使用这个 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