Изящное отключение HTTP-сервера node.JS - PullRequest
28 голосов
/ 10 марта 2011

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

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

Как мне закрыть существующие поддерживающие соединения?

Ответы [ 3 ]

24 голосов
/ 16 декабря 2011

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

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);
<b>//Set the idle timeout on any new connection
server.addListener("connection",function(stream) {
    stream.setTimeout(4000);
});</b>

Мы можем проверить это с помощью netcat:

ben@quad-14:~/node$ <b>echo -e "GET /test HTTP/1.1\nConnection: keep-alive\n\n" | netcat -C -q -1 localhost 1088</b>
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$ <b>echo -e "GET /end HTTP/1.1\nConnection: keep-alive\n\n" | netcat -C -q -1 localhost 1088</b>
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

18 голосов
/ 14 марта 2011

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

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

4 голосов
/ 19 июля 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...