我们有一个节点应用程序在Amazon Elastic Load Balancer(ELB)后面运行,它在有多个并发请求时以及每个请求需要时间处理时随机地抛出502错误。最初,我们试图将ELB的闲置超时时间增加到5分钟,但我们仍然获得了502个响应。Amazon ELB抛出的NodeJs应用程序抛出502
当我们联系亚马逊团队时,他们说这是因为后端在5秒后关闭与ELB的连接。
ELB将发送HTTP-502回到你的客户,原因如下:
- 负载平衡器尝试建立连接时,从目标收到一个TCP RST。
- 目标关闭与TCP RST或TCP FIN的连接,同时负载平衡器向目标发出未完成的请求。
- 目标响应格式错误或包含无效的HTTP标头。
- 使用了一个新的目标群体,但没有目标已通过初始健康检查。目标必须通过一项健康检查才能被视为健康。
我们试图设置我们的应用程序的保活/超时大于ELB空闲超时(5分钟),所以ELB可以负责打开和关闭连接。但是,我们仍然面临502错误。
JS:
var http = require('http');
var express = require('express');
var url = require('url');
var timeout = require('connect-timeout')
const app = express();
app.get('/health', (req, res, next) => {
res.send("healthy");
});
app.get('/api/test', (req, res, next) => {
var query = url.parse(req.url, true).query;
var wait = query.wait ? parseInt(query.wait) : 1;
setTimeout(function() {
res.send("Hello!");
}, wait);
});
var server = http.createServer(app);
server.setTimeout(10*60*1000); // 10 * 60 seconds * 1000 msecs
server.listen(80, function() {
console.log('**** STARTING SERVER ****');
});
这可能对您很有意思:https://github.com/hapijs/hapi/issues/3738#issuecomment-364213653 –