Изящное завершение HTTP-сервера node.JS

Вот простой веб-сервер, над которым я работаю

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-соединение все еще открыто, что позволяет выполнить другой запрос, из которого я пытаюсь избежать.

Как я могу закрыть существующие соединения keep-alive?

Ответ 1

Вы можете вызвать request.connection.destroy() в обратном вызове ответа. Это закроет соединение с запросом.

Он также завершит ваш процесс, так как ничего не остается сделать, конечный результат будет таким же, как и вызов process.exit().

Ответ 2

Вы можете контролировать тайм-аут простоя для подключения, поэтому вы можете установить, как долго будет оставаться открытым соединение. Например:

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:

[email protected]:~/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

И теперь мы можем показать, что закрытие сервера работает: после того, как все простоя отключены, сервер завершает работу:

[email protected]:~/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

Ответ 3

Если вы закрываете сервер как часть изящного завершения процесса, вам просто нужно:

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), чтобы закончить свои изящные процедуры выключения.