ノードサーバーの実行を維持するために、ノードの永遠のモジュールを使用しています。ただし、システムの再起動があると永久に終了します。システムの再起動時にノード サーバーを (永久に) 自動的に起動する方法はありますか?
16 に答える
crontab を使用することをお勧めします。使い方は簡単です。
方法
編集を開始するには、「testuser」をノード プロセスの目的のランタイム ユーザーに置き換えて、次のコマンドを実行します。自分以外の別のユーザーを選択した場合は、sudo を使用してこれを実行する必要があります。
$ crontab -u testuser -e
これまでにこれを行ったことがない場合は、どのエディターで編集するかを尋ねられます。私はvimが好きですが、使いやすさからnanoをお勧めします。
エディターに入ったら、次の行を追加します。
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
ファイルを保存します。cron がインストールされたというフィードバックが得られるはずです。
cron のインストールをさらに確認するには、次のコマンドを実行して (「testuser」をターゲット ユーザー名に置き換えます)、現在インストールされている cron を一覧表示します。
$ crontab -u testuser -l
私の意見では、cron でバイナリを実行するときは常にフル パスを使用する必要があることに注意してください。また、forever スクリプトへのパスが正しくない場合は、実行which forever
してフル パスを取得します。
forever
の呼び出しを考えるとnode
、次へのフル パスを指定することもできますnode
。
@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js
参考文献
このケースは Debian に有効です。
に以下を追加/etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
ユーザー名を置き換えます。{{app path}}
アプリのパスを置き換えます。例えば、/var/www/test/app.js
この回答とこのブログ投稿に触発された代替の crontab メソッド。
1. bash スクリプト ファイルを作成します (bob を目的のユーザーに変更します)。
vi /home/bob/node_server_init.sh
2. これをコピーして、作成したファイル内に貼り付けます。
#!/bin/sh
export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null
構成に従って、上記のパスを必ず編集してください。
3. bash スクリプトが実行できることを確認します。
chmod 700 /home/bob/node_server_init.sh
4. bash スクリプトをテストします。
sh /home/bob/node_server_init.sh
5. 「bob」をノードのランタイム ユーザーに置き換えます。
crontab -u bob -e
6. コピーして貼り付けます (bob を目的のユーザーに変更します)。
@reboot /bin/sh /home/bob/node_server_init.sh
crontab を保存します。
あなたは最後までやり遂げました、あなたの賞品は再起動です(テスト用):)
添付の質問から回答をコピーしました。
PM2を使用できます。これは、組み込みのロード バランサーを備えた Node.js アプリケーション用の運用プロセス マネージャーです。
PM2をインストール
$ npm install pm2 -g
アプリケーションを開始する
$ pm2 start app.js
エクスプレスを使用している場合は、次のようにアプリを起動できます
pm2 start ./bin/www --name="app"
実行中のすべてのプロセスを一覧表示します。
$ pm2 list
すべてのプロセスがリストされます。次に、次のコマンドでアプリの ID または名前を使用して、サービスを停止/再起動できます。
$ pm2 stop all
$ pm2 stop 0
$ pm2 restart all
ログを表示するには
$ pm2 logs ['all'|app_name|app_id]
そのためには、/etc/init.d フォルダーにシェル スクリプトを作成する必要があります。やったことのない人にとってはちょっと複雑ですが、init.d スクリプトに関する情報はウェブ上にたくさんあります。
以下は、CoffeeScript サイトを永久に実行するために作成したスクリプトのサンプルです。
#!/bin/bash
#
# initd-example Node init.d
#
# chkconfig: 345
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#
# Source function library.
. /lib/lsb/init-functions
pidFile=/var/run/forever-initd-hectorcorrea.pid
logFile=/var/run/forever-initd-hectorcorrea.log
sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile
start() {
echo "Starting $scriptId"
# This is found in the library referenced at the top of the script
start_daemon
# Start our CoffeeScript app through forever
# Notice that we change the PATH because on reboot
# the PATH does not include the path to node.
# Launching forever or coffee with a full path
# does not work unless we set the PATH.
cd $sourceDir
PATH=/usr/local/bin:$PATH
NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile
RETVAL=$?
}
restart() {
echo -n "Restarting $scriptId"
/usr/local/bin/forever restart $scriptId
RETVAL=$?
}
stop() {
echo -n "Shutting down $scriptId"
/usr/local/bin/forever stop $scriptId
RETVAL=$?
}
status() {
echo -n "Status $scriptId"
/usr/local/bin/forever list
RETVAL=$?
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
restart
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $RETVAL
init.d スクリプトは root として実行されるため、フォルダーと PATH が明示的に設定されているか、root ユーザーが使用できることを確認する必要がありました。
PM2を使う
サーバー本番サーバーを実行するための最良のオプションはどれですか
この方法でアプリケーションを実行する利点は何ですか?
アプリケーションがクラッシュした場合、PM2 は自動的にアプリケーションを再起動します。
PM2 は未処理の例外のログを保持します。この場合、/home/safeuser/.pm2/logs/app-err.log のファイルに記録されます。
1 つのコマンドで、PM2 は、サーバーの再起動時に管理するすべてのアプリケーションを確実に再起動できます。基本的に、ノード アプリケーションはサービスとして開始されます。
ノード アプリケーションをサービスとして実行するために Forever が作成されたわけではありません。正しいアプローチは、/etc/inittab エントリ (古い Linux システム) または upstart (新しい Linux システム) を作成することです。
これを新興企業として設定する方法に関するドキュメントは次のとおりです: https://github.com/cvee/node-upstart
crontab
CentOS x86 6.5 では動作しません。@reboot が機能していないようです。
最後に、私はこの解決策を得ました:
編集: /etc/rc.local
sudo vi /etc/rc.local
この行をファイルの末尾に追加します。変えUSER_NAME
てPATH_TO_PROJECT
自分のものに。NODE_ENV=production
アプリが本番モードで実行されることを意味します。複数の node.js アプリを実行する必要がある場合は、さらに行を追加できます。
su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"
別の行で設定しないNODE_ENV
でください。アプリは引き続き開発モードで実行されますNODE_ENV
。
# WRONG!
su - USER_NAME -c "export NODE_ENV=production"
vi を保存して終了します ( を押しますESC : w q return
)。サーバーの再起動を試すことができます。サーバーの再起動後、ssh 経由でリモートでアカウントにログインしなくても、node.js アプリが自動的に実行されます。
NODE_ENV
シェルで環境を設定する方がよいでしょう。NODE_ENV
アカウントのログイン時に自動的に設定されますUSER_NAME
。
echo export NODE_ENV=production >> ~/.bash_profile
/PATH_TO_PROJECT/app.js
そのため、再度設定することなく、ssh 経由で永久停止/開始などのコマンドを実行できますNODE_ENV
。
私はまさにこれを行うスクリプトを書きました:
https://github.com/chovy/node-startup
私は永遠に試したことはありませんが、実行するコマンドをカスタマイズできるので、簡単なはずです。
/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
rc.local の問題は、コマンドが root としてアクセスされることです。これは、ユーザーとしてログインして sudo を使用する場合とは異なります。
etc/profile.dに必要な起動コマンドを含む.shスクリプトを追加することで、この問題を解決しました。profile.d 内の .sh ファイルはすべて自動的にロードされ、コマンドは通常の sudo を使用したかのように処理されます。
これの唯一の欠点は、指定されたユーザーが開始するためにログインする必要があることです。これは、私の状況では常に当てはまりました。
上記の答えをたくさん試しました。それらのどれも私のために働きませんでした。/home
私のアプリは、ルートとしてではなく、ユーザーとしてインストールされます。これはおそらく、上記の開始スクリプトが実行されたときに/home
まだマウントされていないため、アプリが開始されていないことを意味します。
次に、Digital Ocean による次の手順を見つけました。
説明したように PM2 を使用するのは非常に簡単で、完璧に機能します。私の仮想サーバーは 2 回物理的にクラッシュしましたが、ダウンタイムはわずか 1 分でした。