У нас есть приложение узла, работающее за Amazon Elastic Load Balancer (ELB), которое случайным образом выдает ошибку 502 при наличии нескольких одновременных запросов и когда для обработки каждого запроса требуется время. Изначально мы пытались увеличить время простоя ELB до 5 минут, но все равно получали 502 ответа.
Когда мы связались с командой Amazon, они сказали, что это происходит из-за того, что серверная часть закрывает соединение с ELB через 5 секунд.
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 ****');
});