当我关闭一个http服务器时,为什么我挂断了套接字?

时间:2012-05-30 08:25:18

标签: http node.js

我对node.js服务器实现了优雅的停止。基本上是这样的:

var shutDown = function () {
    server.on('close', function () {
        console.log('Server ' + process.pid + ' closed.');

        process.exit();
    });

    console.log('Shutting down ' + process.pid + '...');
    server.close();
}

但是,当我像这样关闭服务器时,我的连续请求中出现Error: socket hang up错误。

我认为server.close()会使服务器停止侦听并接受新请求,但会继续处理所有待处理/打开请求。但是,这应该会产生Error: connect ECONNREFUSED

我做错了什么?

附加信息:服务器由主服务器和三个分叉的子服务器组成。但是,主人没有收听或绑定一个端口,只有孩子,并且他们如上所述被关闭。

1 个答案:

答案 0 :(得分:1)

the docs,听起来server.close()只会阻止新的连接进入,所以我很确定错误是已经打开的连接。

也许您的shutDown()可以检查server.connections并等到没有更多?

var shutDown = function(){
    if(server.connections) return setTimeout(shutDown, 1000);

    // Your shutDown code here
}

稍微丑陋(并且可扩展性更低),但没有等待:您可以在发生连接时跟踪连接并自行关闭

server.on('connection', function(e){
    // Keep track of e.connection in a list.
    //   You'll want to remove e.connection
    //   from the list if it closes on its own
}

var shutDown = function(){
    // Close all remaining connections in the list

    // Your shutDown code here
}