You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Shutdown a Nodejs HTTP server gracefully by terminating the listening socket, then destroying all keep-alive idle sockets all while allowing in-flight requests to finish.
Shutdown a Nodejs HTTP server gracefully by doing the following:
Close the listening socket to prevent new connections
Close all idle keep-alive sockets to prevent new requests during shutdown
Wait for all in-flight requests to finish before closing their sockets.
Profit!
Other solutions might just use server.close which only terminates the listening socket and waits for other sockets to close - which is incomplete since keep-alive sockets can still make requests. Or, they may use ref()/unref() to simply cause Nodejs to terminate if the sockets are idle - which doesn't help if you have other things to shutdown after the server shutsdown.
http-shutdown is a complete solution. It uses idle indicators combined with an active socket list to safely, and gracefully, close all sockets. It does not use ref()/unref() but, instead, actively closes connections as they finish meaning that socket 'close' events still work correctly since the sockets are actually closing - you're not just unrefing and forgetting about them.
Installation
$ npm install http-shutdown
Usage
There are currently two ways to use this library. The first is explicit wrapping of the Server object:
// Create the http servervarserver=require('http').createServer(function(req,res){res.end('Good job!');});// Wrap the server object with additional functionality.// This should be done immediately after server construction, or before you start listening.// Additional functionailiy needs to be added for http server events to properly shutdown.server=require('http-shutdown')(server);// Listen on a port and start taking requests.server.listen(3000);// Sometime later... shutdown the server.server.shutdown(function(err){if(err){returnconsole.log('shutdown failed',err.message);}console.log('Everything is cleanly shutdown.');});
The second is implicitly adding prototype functionality to the Server object:
// .extend adds a .withShutdown prototype method to the Server objectrequire('http-shutdown').extend();varserver=require('http').createServer(function(req,res){res.end('God job!');}).withShutdown();// <-- Easy to chain. Returns the Server object// Sometime later, shutdown the server.server.shutdown(function(err){if(err){returnconsole.log('shutdown failed',err.message);}console.log('Everything is cleanly shutdown.');});
Test
$ npm test
About
Shutdown a Nodejs HTTP server gracefully by terminating the listening socket, then destroying all keep-alive idle sockets all while allowing in-flight requests to finish.