56

私たちは現在、CMS から提供されるコンテンツにリアルタイムの更新を提供する node.js/socket.io アプリケーションによってサポートされる顧客向けの Web サイト (Apache の下の TYPO3) を開発しています。

これは私たちの最初の node.js プロジェクトであるため、「完璧なセットアップ」に関して従うべきベスト プラクティスはありません。

適切なセットアップを実現するために、いくつかの質問が残っています。

  1. お客様が簡単に導入できます。これは非常に重要です。当社の Web サイトは、豊富な Web サイトを提供し、顧客によって管理されていないサーバー上で実行されている「ライブ」の TYPO3 インストールに統合されるためです。遅いプロセス。

  2. 簡単に更新できるはずです。前述のように、再起動を要求してサーバーの変更を行うのは遅いプロセスであるため、理想的には、ノードのインストールを再起動/更新する必要がありますgit.

展開

一般的なコンセンサスforeverは、ノード アプリケーションを展開して実行し続ける場合に使用するようです。をテストしましたが、 (グローバル)foreverでインストールすると正常に動作するようです。npm install forever -gただし、ライブ環境にグローバルにインストールするには外部の支援が必要になるため、アプリケーションのnode_modulesディレクトリから実行することをお勧めしますが、そうするためのしっかりしたラッパーを作成できませんでした.

さらに、forever正常に動作しますが、手動で開始する必要があります。サーバーの起動時に起動して実行し続けることを保証するための最良のアプローチは何ですか?

  • 簡単なinit.dスクリプト?
  • ウォッチドッグ ラッパーを作成しますか?
  • foreverステータス をチェックする TYPO3 スケジューラ タスク?

迅速な開発 / 更新時に再起動

現在、プロジェクトはまだ開発段階にあり、node.js アプリケーションに変更を加えるたびに、手動で再起動nodeまたはforever. これは機能しますが、理想とはほど遠いものです。ファイルの変更をチェックし、検出された変更時に再起動するいくつかの小さなnpmモジュールがあります。node

誰でもこれらの経験がありますか?

更新: クラスターを使用しないのはなぜですか?

Cluster モジュールは、リロードメカニズムを通じて同様の機能を提供しますが、Node 0.5+ では機能しません。それを置き換えたコア Cluster モジュール (Node 0.6+)には、これらの機能がすべて含まれているわけではなく、クラスタリングのみが提供されます。これはsocket.io ではうまく機能しません。少なくとも、Redis を使用しないわけにはいきません (これは、別の前提条件サービスを顧客に強制することができないため、私たちにとっては問題です)。

--

明らかに、プロジェクトを顧客に引き渡す前に、更新リスターターを組み合わせた最も安定したソリューションを見つけようとしてforeverいます。誰かが技術の実証済みの組み合わせを作成したことを本当に望んでいます。

4

3 に答える 3

63

収集したすべての知識 (アイデアを提供してくれたJulian Knightに感謝します) と先週テストした方法を組み合わせて、以下に説明する展開ソリューションに落ち着くことにしました (同様の質問で他の人を助けるために共有したいと思いました) ):

Forever が node.js スクリプト内から生成されている限り、スクリプト エラー時の自動再起動とスクリプト変更時の自動リロード は、スクリプト ウォッチも含まれているため、 foreverによって処理されます。

そのために、実際に実行したいスクリプトをserver.js起動する を追加しました。app.js

サーバー.js

var forever = require('forever'),
    child = new(forever.Monitor)('app.js', {
        'silent': false,
        'pidFile': 'pids/app.pid',
        'watch': true,
        'watchDirectory': '.',      // Top-level directory to watch from.
        'watchIgnoreDotFiles': true, // whether to ignore dot files
        'watchIgnorePatterns': [], // array of glob patterns to ignore, merged with contents of watchDirectory + '/.foreverignore' file
        'logFile': 'logs/forever.log', // Path to log output from forever process (when daemonized)
        'outFile': 'logs/forever.out', // Path to log output from child stdout
        'errFile': 'logs/forever.err'
    });
child.start();
forever.startServer(child);

これにより、アプリケーション ディレクトリ内のすべてのファイルの変更が監視されforever、いずれかが変更されるとすぐに実行中のスクリプトが再起動されます。ログと pidfile はアプリケーションのサブディレクトリにあるため、これらはファイル ウォッチから無視する必要があります。無視しないと、スクリプトが再起動をループします。

.foreverignore

pids/**
logs/**

これをすべてシステムの起動時に開始し、サービスを簡単に制御できるようにするために、Ubuntu の Upstartを使用start node-appします。2 つの例 (これこれ) を 1 つにまとめて、非常にうまく機能するようにしました。stop node-app

/etc/init/node-app.conf

# This is an upstart (http://upstart.ubuntu.com/) script
# to run the node.js server on system boot and make it
# manageable with commands such as
# 'start node-app' and 'stop node-app'
#
# This script is to be placed in /etc/init to work with upstart.
#
# Internally the 'initctl' command is used to manage:
# initctl help
# initctl status node-app
# initctl reload node-app
# initctl start node-app

description "node.js forever server for node-app"
author      "Remco Overdijk <remco@maxserv.nl>"
version "1.0"

expect fork

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:

start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

env HOME=/home/user/node-app-dir

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME=$HOME
    chdir $HOME
    exec /usr/local/bin/node server.js > logs/node.log &
end script

#post-start script
#   # Optionally put a script here that will notifiy you node has (re)started
#   # /root/bin/hoptoad.sh "node.js has started!"
#end script

ケビンが彼の記事で賢く言及しているように、ノードをルートとして実行するのは賢明ではないため、exec sudo -u www-data /usr/local/bin/node来週新しいサーバーに移動するときにそれを変更します.

そのため、forevergets によって自動的に開始され、node server.jsによって起動されupstart、クラッシュとファイルの変更を監視し、必要な限りセットアップ全体を実行し続けます。

これが誰にも役立つことを願っています。

于 2012-06-22T13:33:40.193 に答える
7

私の最後の答えは未来のためです!役立つその他のリンクを次に示します。

まだ完全な答えはないようですが、本番 Node インスタンスを実行している人はたくさんいます。うまくいけば、これはあなたを正しい方向に向けるでしょう。

于 2012-06-19T21:49:17.083 に答える
5

本番環境で使用する場合は、 Clusterのようなものを見たほうがよいかもしれません。クラスター機能は必要ないかもしれませんが、ゼロ ダウンタイム再起動、ログ記録、ワーカーなどの他の運用機能も含まれています。

あなたが言うように、Forever はテスト用には問題ありませんが、本番環境での使用に必要なものは実際にはありません。

ぼんやりと覚えているようですが、v0.7 になると Node 自体に Cluster などが採用される可能性があります。

于 2012-06-18T20:26:54.403 に答える