2017-08-11 43 views
1

我们有一个节点应用程序在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 ****'); 
}); 
+0

这可能对您很有意思:https://github.com/hapijs/hapi/issues/3738#issuecomment-364213653 –

回答

0

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); 
 
setTimeout(() => { // 10 * 60 seconds * 1000 msecs 
 
     server.listen(80, function() { 
 
     console.log('**** STARTING SERVER ****'); 
 
     }); 
 
},10*60*1000)

这会为你工作。你的服务器立即开始。

+0

我们希望我们的服务器能够立即启动,以防出现高流量。 –

0

尝试将server.keepAliveTimeout设置为缺省值5s以外的值。请参阅:https://nodejs.org/api/http.html#http_server_keepalivetimeout

注:这是在节点V8.0.0增加

另外,如果你仍然在经典ELB,认为是基于目前的经验,这似乎已经移动到新的应用负载平衡器为我们改进了很多东西。如果每个服务都有很多独立的ELB,您还可以节省几美元。缺点可能是所有服务都有1个故障点。但在AWS中我们相信:)

相关问题