2017-08-11 139 views
1

我們有一個節點應用程序在Amazon Elastic Load Balancer(ELB)後面運行,它在有多個併發請求時以及每個請求需要時間處理時隨機地拋出502錯誤。最初,我們試圖將ELB的閒置超時時間增加到5分鐘,但我們仍然獲得了502個響應。Amazon ELB拋出的NodeJs應用程序拋出502

當我們聯繫亞馬遜團隊時,他們說這是因爲後端在5秒後關閉與ELB的連接。

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 ****'); 
}); 
+0

這可能對您很有意思:https://github.com/hapijs/hapi/issues/3738#issuecomment-364213653 –

回答

0

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); 
 
setTimeout(() => { // 10 * 60 seconds * 1000 msecs 
 
     server.listen(80, function() { 
 
     console.log('**** STARTING SERVER ****'); 
 
     }); 
 
},10*60*1000)

這會爲你工作。你的服務器立即開始。

+0

我們希望我們的服務器能夠立即啓動,以防出現高流量。 –

0

嘗試將server.keepAliveTimeout設置爲缺省值5s以外的值。請參閱:https://nodejs.org/api/http.html#http_server_keepalivetimeout

注:這是在節點V8.0.0增加

另外,如果你仍然在經典ELB,認爲是基於目前的經驗,這似乎已經移動到新的應用負載平衡器爲我們改進了很多東西。如果每個服務都有很多獨立的ELB,您還可以節省幾美元。缺點可能是所有服務都有1個故障點。但在AWS中我們相信:)

相關問題