0

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.

私は何を間違っていますか?

追加情報: サーバーは、マスターと 3 つのフォークされた子/ワーカーで構成されます。ただし、マスターはポートをリッスンまたはバインドしていません。子のみがリッスンしており、上記のようにシャットダウンされています。

4

1 に答える 1

0

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
}
于 2012-05-31T06:14:46.450 に答える