web-dev-qa-db-ja.com

ノードの正常なシャットダウン.JS HTTPサーバー

これが私が取り組んでいる簡単なウェブサーバーです

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接続はまだ開いているので、別の要求を通過させることができますが、これは回避しようとしていることです。

既存のキープアライブ接続を閉じるにはどうすればよいですか?

29
Bryan Field

応答コールバックでrequest.connection.destroy()を呼び出すことができます。これでリクエスト接続が閉じます。

また、何もする必要がないため、プロセスは終了します。最終結果は、ここでprocess.exit()を呼び出すのと同じです。

18
Ricardo Tomasi

接続のアイドルタイムアウトを制御できるため、キープアライブ接続を開いたままにしておく時間を設定できます。例えば:

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

24
Ben Last

プロセスの正常なシャットダウンの一環としてサーバーを閉じる場合は、次のようにするだけです。

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

基本的に、サーバーが使用するソケットは、実際にリクエストを処理している間のみプロセスを維持します。 (Keep-Alive接続が原因で)単にアイドル状態でそこに座っている間は、server.close()を呼び出すと、プロセスを存続させるものがない限り、プロセスが閉じます。サーバーのクローズ後に他のことを行う必要がある場合は、正常なシャットダウンの一環として、process.on('beforeExit', callback)にフックして正常なシャットダウン手順を完了することができます。

4
Joshua Wise