正常关闭node.JS HTTP服务器

时间:2011-03-10 17:55:56

标签: http node.js exit

这是我正在处理的简单网络服务器

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 :)

除了保持活着外,效果很好。当第一个请求进入时,server.close被调用。但这个过程并没有结束。实际上TCP连接仍处于打开状态,允许另一个请求通过,这是我试图避免的。

如何关闭现有的保持连接?

3 个答案:

答案 0 :(得分:24)

您可以控制连接的空闲超时,以便设置保持连接保持打开的时间。例如:

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);
});

我们可以用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

现在我们可以证明关闭服务器的工作原理是:在删除所有空闲连接后,服务器退出:

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

答案 1 :(得分:18)

您可以在响应回调中调用request.connection.destroy()。这将关闭请求连接。

它也将结束你的过程,因为没有什么可做的,最终结果就像在那里调用process.exit()一样。

答案 2 :(得分:4)

如果您正在关闭服务器作为正常关闭流程的一部分,您只需要:

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();
    });
}

基本上,服务器使用的套接字只会使进程在实际提供请求时保持活动状态。虽然他们只是懒散地坐在那里(因为保持活跃的连接),但是对server.close()的调用将关闭该过程,只要没有其他任何东西保持该过程活着。如果您需要在服务器关闭后执行其他操作,作为正常关闭的一部分,您可以挂钩process.on('beforeExit', callback)以完成正常的关闭过程。