我们有一个在Amazon Elastic Load Balancer (ELB)后面运行的节点应用程序,当有多个并发请求以及每个请求需要时间处理时,它会随机抛出502个错误。最初,我们试图将ELB的空闲超时时间增加到5分钟,但仍然收到了502个响应。
当我们联系亚马逊团队时,他们说这是因为后端在5秒后关闭了与ELB的连接。
出于以下原因,ELB会将HTTP-502发送回您的客户端:
我们尝试将应用程序的keep-alive/ timeout设置为大于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 ****');
});
发布于 2017-12-27 11:44:05
尝试将server.keepAliveTimeout
设置为默认5s以外的值。请参阅:https://nodejs.org/api/http.html#http_server_keepalivetimeout根据AWS文档,您可能希望该值大于负载均衡器的空闲超时。
注意:这是在Node v8.0.0中添加的
此外,如果你还在使用Classic ELB,考虑转移到新的应用程序负载均衡器,因为根据目前的经验,这似乎对我们有很大的改善。如果你每项服务都有很多独立的ELB,你也可以节省一些钱。缺点可能是你的所有服务都有一个故障点。但在AWS中,我们信任:)
发布于 2019-09-03 03:24:36
发布于 2019-04-22 04:31:39
将您的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的更多信息。
https://stackoverflow.com/questions/45626787
复制相似问题