Here is a simple webserver I am working on
var server = require("http").createServer(function(req,resp) {
resp.writeHead(200,{"Content-Type":"text/plain"})
resp.write("hi")
resp.end()
server.close()
})
server.listen(80, 'localhost')
// The shortest webserver you ever did see! Thanks to Node.JS :)
Works great except for keep-alive. When the first request comes in, server.close
gets called. But the process does not end. Actually the TCP connection is still open which allows another request to come through which is what I am trying to avoid.
How can I close existing keep-alive connections?
You can control the idle timeout for a connection, so you can set how long a keep-alive connection will remain open. For example:
We can test this with netcat:
after 4 seconds, the connection closes
And now we can show that closing the server works: after all idle connections are dropped, the server exits:
after 4 seconds, the connection closes and the server exits
You can call
request.connection.destroy()
in the response callback. That will close the request connection.It will also end your process since there is nothing left to do, the end result is the same as calling
process.exit()
right there.If you're closing the server as part of a graceful shutdown of the process, you just need this:
Basically, the sockets that your server uses will only keep the process alive while they're actually serving a request. While they're just sitting there idly (because of a Keep-Alive connection), a call to
server.close()
will close the process, as long as there's nothing else keeping the process alive. If you need to do other things after the server closes, as part of your graceful shutdown, you can hook intoprocess.on('beforeExit', callback)
to finish your graceful shutdown procedures.