http - stop - stdin nodejs
Cierre correcto de un servidor HTTP node.JS (3)
Puede controlar el tiempo de espera inactivo para una conexión, por lo que puede establecer cuánto tiempo permanecerá abierta una conexión de mantenimiento. Por ejemplo:
server=require(''http'').createServer(function(req,res) {
//Respond
if(req.url.match(/^//end.*/)) {
server.close();
res.writeHead(200,{''Content-Type'':''text/plain''});
res.end(''Closedown'');
} else {
res.writeHead(200,{''Content-Type'':''text/plain''});
res.end(''Hello World!'');
}
}).listen(1088);
//Set the idle timeout on any new connection
server.addListener("connection",function(stream) {
stream.setTimeout(4000);
});
Podemos probar esto con netcat:
ben@quad-14:~/node$ echo -e "GET /test HTTP/1.1/nConnection: keep-alive/n/n" | netcat -C -q -1 localhost 1088
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: keep-alive
Transfer-Encoding: chunked
c
Hello World!
0
after 4 seconds, the connection closes
Y ahora podemos mostrar que el cierre del servidor funciona: después de que se eliminan todas las conexiones inactivas, el servidor sale:
ben@quad-14:~/node$ echo -e "GET /end HTTP/1.1/nConnection: keep-alive/n/n" | netcat -C -q -1 localhost 1088
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: keep-alive
Transfer-Encoding: chunked
9
Closedown
0
after 4 seconds, the connection closes and the server exits
Aquí hay un servidor web simple en el que estoy trabajando
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 :)
Funciona muy bien, excepto para mantener vivo. Cuando llega la primera solicitud, se llama a server.close
. Pero el proceso no termina. En realidad, la conexión TCP todavía está abierta, lo que permite que llegue otra solicitud que es lo que estoy tratando de evitar.
¿Cómo puedo cerrar las conexiones de keep-alive existentes?
Puede llamar a request.connection.destroy()
en la devolución de llamada de respuesta. Eso cerrará la conexión de solicitud.
También finalizará el proceso, ya que no queda nada por hacer, el resultado final es el mismo que se llama a process.exit()
allí mismo.
Si está cerrando el servidor como parte de un cierre correcto del proceso, solo necesita esto:
var server = require(''http'').createServer(myFancyServerLogic);
server.on(''connection'', function (socket) {socket.unref();});
server.listen(80);
function myFancyServerLogic(req, res) {
req.connection.ref();
res.end(''Hello World!'', function () {
req.connection.unref();
});
}
Básicamente, los sockets que usa su servidor solo mantendrán el proceso activo mientras están atendiendo una solicitud. Mientras están sentados allí sin hacer nada (debido a una conexión Keep-Alive), una llamada a server.close()
cerrará el proceso, siempre y cuando no haya nada más que lo mantenga vivo. Si necesita hacer otras cosas después de que se cierre el servidor, como parte de su cierre process.on(''beforeExit'', callback)
puede conectarse a process.on(''beforeExit'', callback)
para finalizar sus procedimientos de cierre process.on(''beforeExit'', callback)
.