2016-10-22 6 views
0

ノードプロセスを終了する前にすべての接続を適切に閉じるために私が作業しているアプリケーションのExpress.jsベースのサーバが必要ですシャットダウン信号(SIGTERMまたはSIGINT)が送信されたときに発生します。正常にノード+ Expressアプリケーションをシャットダウンできません(ノードのhttpサーバのクローズ機能が完了しません)

は私がexpress-graceful-shutdownミドルウェア(which is really simple)をわずかに変更されているので、次のように私のコードの関連部分は約になります。

server.js

import gracefulShutdown from './tools/graceful-shutdown'; 

const server = app.listen(config.port,() => { 
    console.log(`Server is running`); 
}); 

app.use(gracefulShutdown(server)); 

優雅な-shutdown.js:

function gracefulShutdownMiddleware(server) { 

    let shuttingDown = false; 
    const forceTimeout = 10 * 1000; // giving the app 10 seconds to shutdown gracefully 


    process.on('SIGTERM', gracefulExit); // listen for TERM signal (e.g. kill) 
    process.on ('SIGINT', gracefulExit); // listen for INT signal (e.g. Ctrl-C) 

    function gracefulExit() { 

    if (shuttingDown) return; 
    shuttingDown = true; 
    console.log('Received kill signal (SIGTERM), shutting down'); 

    setTimeout(function() { 
     console.log('Could not close connections in time, forcefully shutting down'); 
     process.exit(1); 
    }, forceTimeout); 

    server.close(function() { 
     console.log('Closed out remaining connections.'); 
     process.exit(); 
    }); 

    } 

    function middleware(req, res, next) { 
    if (!shuttingDown) return next() 
    res.set('Connection', 'close') 
    res.status(503).send('Server is in the process of restarting.') 
    } 

    return middleware 

} 

export default gracefulShutdownMiddleware; 

私は問題ですこれを観察する。ノードサーバーが起動した直後にノードサーバーをシャットダウンすると、期待通りにシャットダウンされます(関数gracefulExitはミドルウェアで正常に動作します)、server.closeが正常に実行され、server.closeへのコールバックがコンソールメッセージを出力します。しかし、ブラウザを開いて実際にローカルホスト上の自分のアプリケーションにアクセスして、サーバが何らかの作業をしてからサーバをシャットダウンしようとすると、server.close関数が終了しないように見えます最終的にはsetTimeoutは独自のコールバックを呼び出して、強制的にアプリをシャットダウンするまで。

server.close関数は、ノードのlibからthis functionです。

あなたは私がなぜノードサーバのclose機能を見つけ出す助けてもらえprocess.exitでコールバックを呼び出し完了しない可能性がありますか?

+0

[プロセスが終了したときにExpress Serverを正常にシャットダウンするにはどうすればよいですか?](https://stackoverflow.com/questions/43003870/how-do-i-shut-down-my-express-サーバーが正常に処理された場合) –

+0

上記の問題と同じ問題が発生しています。私の答えもチェックしてください(https://stackoverflow.com/a/44291800/1056679)。 –

答えて

1

.close()アクティブな接続を実際に閉じることはできません。 新しい接続の接続が停止され、アクティブな接続が(クライアントによって)閉じられるのを待ちます。

接続が開いたままになっている(キープアライブ接続を使用している)クライアントが接続されている場合、コールバックが呼び出されないことがあります。

HTTPサーバーを正常にシャットダウンするのに役立つhttp-shutdownというパッケージがあります。

+0

ありがとう!私は 'http-shutdown'のコードを読みました。そのアプローチはうまくいっているようです。私はまだ[コードのこの部分](https://github.com/thedillonb/http-shutdown/blob/master/index.js#L29)が何をしているのかと少し混同しています。 – azangru

+0

@azangruから見て、モジュールはすべての着信接続を追跡し(シャットダウンするために呼び出されたときに閉じられるようにします)、参照しているコードは基本的に終了した接続をクリーンアップします接続が既に終了しているため、シャットダウン時)。 – robertklep

関連する問題