5

私の知る限り、Node.jsサーバーは基本的にJavaScriptファイルであり、実行可能ファイルによって実行されnodeます。リクエストの処理を停止せずにこのファイルを更新することは可能ですか?

このためにはノード実行可能ファイルを停止する必要があると思うので、リバースプロキシを使用する必要があると思います。例えば:

  1. 元のサーバーバージョンはlocalhost:50001でリッスンします
  2. プロキシサーバーはwebinterface:80でリクエストをリッスンし、それらをlocalhost:50001に転送します
  3. 新しいサーバーバージョンはlocalhost:50002で開始する必要があります
  4. プロキシサーバーの転送ターゲットをlocalhost:50002に変更する必要があります
  5. 元のサーバーバージョンを停止する必要があります

これは有効なアプローチですか?このようなバージョン更新を複数のサーバーマシン(同じLANからアクセス可能)で自動的に実行するにはどうすればよいですか?

4

2 に答える 2

10

別の「純粋なノード」ソリューションは、組み込みのクラスターモジュールを使用することです。

コードは(多くの)1つのクラスタークライアントとして実行されます。クラスタサーバープロセスはポートにバインドし、クライアント間で自動負荷分散を行います。コードを変更したら、クラスターサーバーにシグナルを送信できます。これにより、既存の接続を切断することなく、クライアントが正常に再起動されます。

クラスタサーバー管理を実行できるプロジェクトは次のとおりです。

利点:

  • スタック内のコンポーネントが少なくなります。(展開/管理が簡単です。)
  • CPU上のコアごとにノードプロセスを自動的に開始できるため、プログラムは基盤となるハードウェアを完全に活用できます。
  • nginxの構成構文を学ぶ必要はありません
于 2012-11-13T12:43:45.593 に答える
7

基本的に、あなたができる(すべき)ことは次のとおりです。

  • NginxなどのWebサーバーをリバースプロキシとして実行する
  • その背後にある少なくとも2つの(!)Node.jsインスタンスを使用します
  • セッションをRedisなどのデータベースに配置します

システムを更新する必要がある場合は、2つのNode.jsインスタンスのいずれかをシャットダウンして更新し、再起動します。次に、他の人と同じことをします。

基本的に、これでうまくいくはずです。

欠点は、異なるバージョンのアプリケーションを短時間同時に実行している可能性があり、データベース(たとえば)がこれに追いつくことができる必要があることです。

于 2012-11-13T10:11:06.173 に答える