2017-08-11 9 views
1

Amazon Elastic Load Balancer(ELB)の背後で動作するノードアプリケーションがあります。複数の同時リクエストがあり、各リクエストに処理に時間がかかるとランダムに502エラーが発生します。当初、ELBのアイドルタイムアウトを5分に増やそうとしましたが、依然として502回の応答がありました。Amazon ELBの背後にあるNodeJsアプリケーション502

amazonチームに連絡したとき、彼らはバックエンドが5秒後にELBとの接続を終了しているため、これが起こっていると言いました。

ELBは、次のような理由から、あなたのクライアントに戻すHTTP-502が送信されます:接続を確立しようとしたとき

  • ロードバランサは、ターゲットからのTCP RSTを受けました。
  • ターゲットは、ロードバランサがターゲットへの未処理の要求を持っているときに、TCP RSTまたはTCP FINとの接続を閉じました。
  • ターゲットレスポンスの形式が正しくないか、無効なHTTPヘッダーが含まれています。
  • 新しいターゲットグループが使用されましたが、ターゲットは初期ヘルスチェックにまだ合格していません。ターゲットは健全であるとみなされるために1つのヘルスチェックを通過する必要があります。

アプリケーションのキープアライブ/タイムアウトを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をデフォルトの5秒以外に設定してみてください。参照:https://nodejs.org/api/http.html#http_server_keepalivetimeout

注:これはあなたがクラシックELBに残っている場合、現在の経験に基づいて、これは持っているように見えるように、新しいアプリケーションのロードバランサへの移行を検討し、

またノードV8.0.0で追加されました私たちのために多くのものを改善しました。また、サービスごとに別々のELBがある場合は、数ドル節約できます。欠点は、すべてのサービスに1点の障害があることです。しかし、AWSでは信頼しています:)

関連する問題