我们有一个 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/