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 ****');
});
これはあなたにとって興味深いかもしれません:https://github.com/hapijs/hapi/issues/3738#issuecomment-364213653 –