ノードのforeverモジュールを使用して、ノードサーバーを実行し続けています。ただし、システムを再起動すると、永久に終了します。システムの再起動時にノードサーバーを(永久に)自動的に起動する方法はありますか?
ノードのforeverモジュールを使用して、ノードサーバーを実行し続けています。ただし、システムを再起動すると、永久に終了します。システムの再起動時にノードサーバーを(永久に)自動的に起動する方法はありますか?
回答:
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
@reboot
cronが開始するcronデーモンで実行されることを説明します。付け加えると、設定されているcron @reboot
がシステムブート時に実行されないことを示唆する状況に遭遇したことはありません。シャットダウンする方法はこれには関係ありません。
/home
、これは動作しませんので、あなたのコードはに住んでいる場合は、まだマウントされていません/home
。
@reboot varname=value ...
これを行うには、forever-serviceを使用できます。
npm install -g forever-service
forever-service install test
これにより、現在のディレクトリにapp.jsがサービスとして永久にプロビジョニングされます。サービスは、システムが再起動されるたびに自動的に再起動します。また、停止すると、正常な停止が試行されます。このスクリプトは、logrotateスクリプトもプロビジョニングします。
GithubのURL:https : //github.com/zapty/forever-service
注:私はforever-serviceの作成者です。
forever-service install test
でtest
は、サービスの名前になりますが、実行する実際のプログラム/ノードの.jsファイルの名前ではありません。デフォルトでは、プログラムの名前はであると想定されてapp.js
いますが--script
、次のようにフラグで上書きできますforever-service install test --script main.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
/etc/rc.local
はないと思います/etc/init.d/rc.local
app.js
相対ファイルが正しく読み込まれるようにすることもできます process.chdir('/your/path/to/your/app');
-Node.js ref docs here
/etc/rc.local
私のためのトリックをした:( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
NPMを使用してPM2をグローバルにインストールする
npm install pm2 -g
スクリプトをpm2で開始します
pm2 start app.js
アクティブな起動スクリプトを生成する
pm2 startup
注:pm2起動は、システムの再起動時にPM2を起動するためのものです。PM2はいったん開始すると、システムがダウンする前に管理していたすべてのプロセスを再起動します。
自動起動を無効にしたい場合は、単にpm2 unstartupを使用してください
起動スクリプトを別のユーザーで実行する場合は、-u <username>
オプションと--hp <user_home>:
この答えとこれに触発された代替の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
Expressを使用している場合は、次のようにアプリを起動できます
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]
$pm2 startup
その後、pm2が手動でコマンドを実行し、それをコピーして実行するように求めるメッセージが表示されます。その後、$pm2 save
app.jsはシステムの再起動後も存続します
そのために、/ etc / init.dフォルダーにシェルスクリプトを作成する必要があります。これまで行ったことがない場合は少し複雑ですが、init.dスクリプトに関するWeb上の情報はたくさんあります。
以下は、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は、サーバーが再起動したときに、管理するすべてのアプリケーションが確実に再起動するようにします。基本的に、ノードアプリケーションはサービスとして起動します。
参照:https : //www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
ノードアプリケーションをサービスとして実行するように設計されていません。正しい方法は、/ etc / inittabエントリ(古いLinuxシステム)またはアップスタート(新しい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を介してforever stop / startなどのコマンドを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
上記の答えをたくさん試しました。それらのどれも私のために働いていません。私のアプリは/home
rootではなく、ユーザーとしてインストールされています。これはおそらく、上記の起動スクリプトが実行されると、/home
されたときにまだマウントされていないため、アプリが起動されていないます。
それから私はデジタルオーシャンによるこれらの指示を見つけました:
説明されているようにPM2を使用すると、非常にシンプルで完全に機能しました。仮想サーバーで2つの物理的なクラッシュが発生したため、ダウンタイムはわずか1分程度でした。
完全な例のcrontab(/ etc / crontabにあります)..
#!/bin/bash
# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l
# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
# * * * * * echo "executes once every minute" > /root/deleteme
@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;