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