How can I close existing keep-alive connections?
Since Node 8.0.0, you can set the server keepAliveTimeout
attribute to 1
millisecond (it is set to 5000
milliseconds by default):
server.keepAliveTimeout
Added in: v8.0.0
<number>
Timeout in milliseconds. Default: 5000
(5 seconds).
The number of milliseconds of inactivity a server needs to wait for additional incoming data, after it has finished writing the last response, before a socket will be destroyed. If the server receives new data before the keep-alive timeout has fired, it will reset the regular inactivity timeout, i.e., server.timeout
.
A value of 0
will disable the keep-alive timeout behavior on incoming connections. A value of 0
makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout.
The socket timeout logic is set up on connection, so changing this value only affects new connections to the server, not any existing connections.
Alternatively, since Node 18.2.0, you can call the server closeIdleConnections()
method:
server.closeIdleConnections()
Added in: v18.2.0
Closes all connections connected to this server which are not sending a request or waiting for a response.
For instance, this is useful for running a test suite of an HTTP server fast instead of waiting 5 seconds for the default keep-alive timeout:
import assert from 'node:assert/strict';
import http from 'node:http';
import test from 'node:test';
test.describe(() => {
const server = http.createServer((request, response) => {
response.statusCode = 200;
response.setHeader('Content-Type', 'text/plain');
response.setHeader('Content-Length', '12');
response.end('hello, world');
});
server.listen(8000, 'localhost');
test.after(() => {
server.closeIdleConnections();
server.close();
});
test.test(async () => {
const response = await fetch('http://localhost:8000/');
assert.equal(response.status, 200);
assert.equal(response.headers.get('Content-Type'), 'text/plain');
assert.equal(response.headers.get('Content-Length'), '12');
assert.equal(await response.text(), 'hello, world');
});
});
Alternatively, since Node 19.0.0, you can rely on the server close()
method to implicitly call the server closeIdleConnections()
method so the previous suggestions do not apply anymore:
server.close([callback])
History
Version |
Changes |
v19.0.0 |
The method closes idle connections before returning. |
v0.1.90 |
Added in: v0.1.90 |
Stops the server from accepting new connections and closes all connections connected to this server which are not sending a request or waiting for a response. See net.Server.close()
.