node.js - Amazon ELB 背后的 NodeJs 应用程序抛出 502

标签 node.js express tcp elastic-load-balancer

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

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

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

  • 负载平衡器在尝试建立连接时收到来自目标的 TCP RST。
  • 当负载平衡器对目标有未完成的请求时,目标通过 TCP RST 或 TCP FIN 关闭了连接。
  • 目标响应格式错误或包含无效的 HTTP header 。
  • 使用了新的目标组,但还没有目标通过初始运行状况检查。目标必须通过一项健康检查才能被视为健康。

我们尝试将应用程序的保持事件/超时设置为大于 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 ****');
});

最佳答案

尝试将 server.keepAliveTimeout 设置为默认 5s 以外的值。见:https://nodejs.org/api/http.html#http_server_keepalivetimeout .根据 AWS 文档,您希望这大于负载均衡器的空闲超时。

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

此外,如果您仍在使用 Classic ELB,请考虑迁移到新的 Application Load Balancer,因为根据当前的经验,这似乎为我们带来了很多改进。如果每个服务都有很多单独的 ELB,您还可以节省几美元。不利的一面可能是您的所有服务都存在 1 个故障点。但我们信任 AWS :)

关于node.js - Amazon ELB 背后的 NodeJs 应用程序抛出 502,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45626787/

相关文章:

javascript - 在其中一个脚本中使用 package.json 的版本属性

javascript - 如何在 Node.js 解析中使用 useMasterKey?

c - 套接字正忙导致 poll() 延迟

c# - 使用 TCP 文件传输客户端发送时出现问题

javascript - 如何修复 bookshelfjs 事务中的嵌套结构

javascript - 环回模型在保存之前删除属性或属性

amazon-web-services - 将 GetObject (v2) 迁移到 GetObjectCommand (v3) - aws-sdk

android - TCP 套接字连接作为服务

javascript - 在 Node.js 中返回多个参数

node.js - NodeJS 非阻塞 I/O 本质