Смена порта без потери данных - PullRequest
0 голосов
/ 29 марта 2011

Я создаю менеджер настроек для моего http-сервера.Я хочу иметь возможность изменять настройки без необходимости убивать весь процесс.Одна из настроек, которую я хотел бы изменить, - это изменить номер порта, и я нашел множество решений:

  • Завершить процесс и перезапустить его
  • Вызовите server.close (), а затем выполните первый подход
  • Вызовите server.close () и инициализируйте новый сервер в том же процессе

Проблема в том, что яне уверен, каковы последствия каждого подхода.Я знаю, что первый будет работать, но мне бы очень хотелось выполнить следующие действия:

  • Отвечать на существующие запросы, не принимая новые
  • Сохранять данные в памяти на новом сервере
  • Потерять как можно меньше времени безотказной работы

Есть ли способ получить все, что я хочу?API для server.close () вселяет надежду: server.close(): Stops the server from accepting new connections.

Мой сервер будет доступен только для клиентов, которых я создаю, и для очень ограниченного числа клиентов, подключающихся через браузер, поэтому я смогууведомить их об изменении порта.Я понимаю, что смена портов, как правило, плохая идея, но я хочу учесть крайний случай, когда это удобно или возможно необходимо.

PS Я использую connect, если это что-то меняет.

PPS Относительно не связан, но что изменится, если я буду использовать серверные сокеты UNIX или изменить имя хоста?Это может быть более подходящий вариант использования.

PPPS Этот код иллюстрирует проблему использования server.close ().Ни один из предыдущих серверов не был убит, но другие создаются с доступом к тем же ресурсам ...

var http = require("http");

var server = false,
    curPort = 8888;

function OnRequest(req,res){
    res.end("You are on port " + curPort);
    CreateServer(curPort + 1);
}
function CreateServer(port){
    if(server){
        server.close();
        server = false;
    }
    curPort = port;
    server = http.createServer(OnRequest);
    server.listen(curPort);
}
CreateServer(curPort);

Ресурсы:

http://nodejs.org/docs/v0.4.4/api/http.html#server.close

Ответы [ 3 ]

3 голосов
/ 29 марта 2011

Я собирался подать проблему на странице github узла, когда я решил тщательно протестировать свой код, чтобы увидеть, действительно ли это ошибка (я ненавижу подавать отчеты об ошибках, когда это ошибка пользователя).Я понял, что проблема проявляется только в браузере, потому что, по-видимому, браузеры выполняют странные виды HTTP-запросов, сохраняя при этом доступ к мертвым портам, потому что соединение с сервером по-прежнему существует.

What I 'Вы узнали следующее:

  • Кэши браузера поддерживают работу портов, если только процесс на сервере не завершен
  • Утилиты, которые не поддерживают кеши по умолчанию (curl, wget и т. д.), работают какожидаемый
  • HTTP-запросы в узле также не сохраняют тот же тип кэша, что и в браузерах

Например, я использовал этот код, чтобы доказать, что у клиентов http-узла нетдоступ к старым портам:

код на стороне клиента:

var http = require('http'),
    client,
    request;

function createClient (port) {
  client = http.createClient(port, 'localhost');

  request = client.request('GET', '/create');
  request.end();

  request.on('response', function (response) {
      response.on('end', function () {
          console.log("Request ended on port " + port);
          setTimeout(function () {
              createClient(port);
          }, 5000);
      });
  });
}

createClient(8888);

и код на стороне сервера:

var http = require("http");

var server,
    curPort = 8888;

function CreateServer(port){
    if(server){
        server.close();
        server = undefined;
    }

    curPort = port;

    server = http.createServer(function (req, res) {
        res.end("You are on port " + curPort);
        if (req.url === "/create") {
            CreateServer(curPort);
        }
    });
    server.listen(curPort);
    console.log("Server listening on port " + curPort);
}
CreateServer(curPort);

Спасибо всем за ответы.

3 голосов
/ 29 марта 2011

Я тестировал функцию close (). Кажется, ничего не делает абсолютно. Сервер по-прежнему принимает соединения на своем порту. перезапуск процесса был для меня единственным способом.

Я использовал следующий код:

var http = require("http");

var server = false;
function OnRequest(req,res){    
    res.end("server now listens on port "+8889);
    CreateServer(8889);
}
function CreateServer(port){
    if(server){
        server.close();
        server = false;
    }
    server = http.createServer(OnRequest);
    server.listen(port);
}
CreateServer(8888);
0 голосов
/ 29 марта 2011

А как насчет использования кластера?

http://learnboost.github.com/cluster/docs/reload.html

Выглядит интересно!

...