Amazon ELB背后的NodeJs应用程序抛出502

问题描述 投票:7回答:2

我们有一个在Amazon Elastic Load Balancer(ELB)后面运行的节点应用程序,当有多个并发请求时以及每个请求需要时间处理时,它会随机抛出502个错误。最初,我们尝试将ELB的空闲超时时间增加到5分钟,但我们仍然得到了502个响应。

当我们联系亚马逊团队时,他们说这种情况正在发生,因为后端在5秒后关闭了与ELB的连接。

ELB将HTTP-502发送回您的客户,原因如下:

  • 尝试建立连接时,负载均衡器从目标接收到TCP RST。
  • 当负载均衡器对目标有未完成的请求时,目标使用TCP RST或TCP FIN关闭连接。
  • 目标响应格式错误或包含无效的HTTP标头。
  • 使用了新的目标组,但尚未通过初始健康检查。目标必须通过一次健康检查才能被视为健康。

我们试图将应用程序的keep-alive / timeouts设置为大于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 ****');
});
node.js express tcp elastic-load-balancer
2个回答
7
投票

尝试将server.keepAliveTimeout设置为默认值5s以外的值。见:https://nodejs.org/api/http.html#http_server_keepalivetimeout

注意:这是在Node v8.0.0中添加的

此外,如果您仍然使用经典ELB,请考虑根据当前经验迁移到新的应用程序负载均衡器,这似乎为我们提供了很多改进。如果每个服务都有很多单独的ELB,您还可以节省一些钱。缺点可能是您的所有服务都出现了1点故障。但在AWS我们相信:)


1
投票

将你的server.listen()改为:

const port = process.env.PORT || 3000;
const server = app.listen(port, function() {
  console.log("Server running at http://127.0.0.1:" + port + "/");
});

你可以阅读更多关于这个here的信息。

© www.soinside.com 2019 - 2024. All rights reserved.