46 Stimmen

Wie man das HTTP Keep-Alive-Timeout in einem nodejs-Server einstellt

Ich führe tatsächlich einige Lasttests gegen einen ExpressJS-Server durch und habe festgestellt, dass die Antwort, die vom Server gesendet wird, einen "Verbindung: Keep-Alive" Header enthält. Soweit ich das verstehe, bleibt die Verbindung geöffnet, bis der Server oder der Client einen "Verbindung: Close" Header sendet.

In einigen Implementierungen erscheint der "Verbindung: Keep-Alive" Header mit einer Einstellung für die Verbindungs-Timeout und die maximale Anzahl aufeinanderfolgender Anfragen, die über diese Verbindung gesendet werden.

Zum Beispiel: "Keep-Alive: timeout=15, max=100"

Gibt es eine Möglichkeit (und ist es relevant), diese Parameter auf einem Express-Server einzustellen?

Falls nicht, wissen Sie, wie ExpressJS damit umgeht?

Bearbeiten: Nach einigen Untersuchungen habe ich herausgefunden, dass das Standard-Timeout in der Node-Standard-HTTP-Bibliothek festgelegt ist:

socket.setTimeout(2 * 60 * 1000); // 2 Minuten Timeout

Um dies zu ändern:

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end("Hallo Welt");
}).on('connection', function(socket) {
  socket.setTimeout(10000);
}).listen(3000);

Trotzdem erscheint es mir ein wenig seltsam, dass der Server dem Client keinen Hinweis auf sein Timeout sendet.

Bearbeiten2: Danke an josh3736 für seinen Kommentar.

setSocketKeepAlive hat nichts mit dem HTTP Keep-Alive zu tun. Es handelt sich um eine TCP-Ebene-Option, die es Ihnen ermöglicht festzustellen, dass das andere Ende der Verbindung verschwunden ist.

37voto

dgo.a Punkte 2404

Für Express 3:

var express = require('express');
var app = express();
var server = app.listen(5001);

server.on('connection', function(socket) {
  console.log("Eine neue Verbindung wurde von einem Client hergestellt.");
  socket.setTimeout(30 * 1000); 
  // 30 Sekunden Timeout. Passen Sie dies nach Ihren Wünschen an.
});

12voto

Ninn Punkte 121

Um die keepAliveTimeout auf dem Express-Server festzulegen, führen Sie Folgendes aus:

var express = require('express');
var app = express();
var server = app.listen(5001);

server.keepAliveTimeout = 30000;

9voto

zangw Punkte 36978

Für Node.js 10.15.2 und neuer mit Express war nur server.keepAliveTimeout nicht ausreichend. Wir müssen auch server.headersTimeout länger als server.keepAliveTimeout konfigurieren.

server.keepAliveTimeout = 30000; 
// Stellen Sie sicher, dass alle inaktiven Verbindungen vom ALB beendet werden, indem Sie dies einige Sekunden höher als die ALB-Idle-Timeout-Einstellungen setzen
server.headersTimeout = 31000; 
// Stellen Sie sicher, dass das headersTimeout höher als das keepAliveTimeout ist, aufgrund dieses Nodejs-Regression-Bugs: https://github.com/nodejs/node/issues/27363

Update

Da dieses Problem Regression issue with keep alive connections geschlossen wurde, könnten wir einfach keepAliveTimeout auf der neuesten Node.js-Version einstellen.


Noch eine Sache, Wenn Ihr Node.js-Server unter AWS ELB bereitgestellt ist und gelegentlich den 502-Fehlercode erhält.

Clients -> AWS ELB -> Node Server

AWS ELB hat standardmäßig 60 Sekunden Verbindungs-Idle-Timeout und gemäß Dokumentation

Wir empfehlen außerdem, dass Sie den Idle Timeout Ihrer Anwendung größer als den Idle Timeout des Load Balancers konfigurieren

Die Konfiguration des Werts von keepAliveTimeout auf mehr als 60 Sekunden könnte eine Option sein, um dieses Problem zu beheben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X