0

http サーバーの設定マネージャーを構築しています。プロセス全体を強制終了せずに設定を変更できるようにしたい。変更できるようにしたい設定の 1 つは、ポート番号を変更することであり、さまざまな解決策を考え出しました。

  • プロセスを強制終了して再起動する
  • server.close() を呼び出してから、最初のアプローチを実行します
  • server.close() を呼び出し、同じプロセスで新しいサーバーを初期化します

問題は、各アプローチの影響がどうなるかわからないことです。最初の方法が機能することはわかっていますが、次のことを実現したいと思っています。

  • 新しいリクエストを受け入れずに、既存のリクエストに応答する
  • 新しいサーバーのメモリにデータを保持する
  • アップタイムの損失を可能な限り少なくする

私が欲しいものすべてを手に入れる方法はありますか?server.close() の API は希望を与えてくれます。 server.close(): Stops the server from accepting new connections.

私のサーバーは、私が作成したクライアントと、ブラウザーを介して接続する非常に限られた数のクライアントのみがアクセスできるため、ポートの変更を通知できます。ポートを変更することは一般的に悪い考えであることは理解していますが、それが便利な場合や必要になる可能性があるエッジケースを考慮したいと考えています。

PSそれが何かを変えるなら、私は接続を使用しています。

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

4

3 に答える 3

3

コードを徹底的にテストして、それが本当にバグであるかどうかを確認することにしたとき、ノードの github ページで問題を報告しようとしていました (ユーザー エラーである場合にバグ レポートを提出するのは嫌いです)。どうやらブラウザは、サーバーとの接続がまだあるためにデッドポートにアクセスできる奇妙な種類の HTTP リクエストキープアライブを行うため、問題はブラウザでのみ現れることに気付きました。

私が学んだことはこれです:

  • サーバー上のプロセスが強制終了されない限り、ブラウザのキャッシュはポートを有効に保ちます
  • デフォルトでキャッシュを保持しないユーティリティ (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);

回答ありがとうございます。

于 2011-03-29T18:14:47.250 に答える
3

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);
于 2011-03-29T15:58:42.067 に答える
0

クラスターの使用はどうですか?

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

面白そう!

于 2011-03-29T16:06:24.313 に答える