198

ノードサーバーの実行を維持するために、ノードの永遠のモジュールを使用しています。ただし、システムの再起動があると永久に終了します。システムの再起動時にノード サーバーを (永久に) 自動的に起動する方法はありますか?

4

16 に答える 16

348

crontab を使用することをお勧めします。使い方は簡単です。

方法

  1. 編集を開始するには、「testuser」をノード プロセスの目的のランタイム ユーザーに置き換えて、次のコマンドを実行します。自分以外の別のユーザーを選択した場合は、sudo を使用してこれを実行する必要があります。

    $ crontab -u testuser -e
    
  2. これまでにこれを行ったことがない場合は、どのエディターで編集するかを尋ねられます。私はvimが好きですが、使いやすさからnanoをお勧めします。

  3. エディターに入ったら、次の行を追加します。

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
    
  4. ファイルを保存します。cron がインストールされたというフィードバックが得られるはずです。

  5. 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

参考文献

于 2012-11-14T22:50:15.513 に答える
28

このケースは Debian に有効です。

に以下を追加/etc/rc.local

/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}

  • {{user}}ユーザー名を置き換えます。
  • {{app path}}アプリのパスを置き換えます。例えば、/var/www/test/app.js
于 2012-11-14T18:48:59.177 に答える
13

この回答とこのブログ投稿に触発された代替の 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 を保存します。

あなたは最後までやり遂げました、あなたの賞品は再起動です(テスト用):)

于 2014-02-18T08:27:57.603 に答える
9

添付の質問から回答をコピーしました。

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]
于 2016-11-03T11:23:03.867 に答える
7

そのためには、/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 ユーザーが使用できることを確認する必要がありました。

于 2012-11-14T19:22:22.080 に答える
6

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

于 2016-06-08T11:21:22.057 に答える
5

ノード アプリケーションをサービスとして実行するために Forever が作成されたわけではありません。正しいアプローチは、/etc/inittab エントリ (古い Linux システム) または upstart (新しい Linux システム) を作成することです。

これを新興企業として設定する方法に関するドキュメントは次のとおりです: https://github.com/cvee/node-upstart

于 2012-11-15T00:00:33.133 に答える
5

crontabCentOS x86 6.5 では動作しません。@reboot が機能していないようです。

最後に、私はこの解決策を得ました:

編集: /etc/rc.local

sudo vi /etc/rc.local

この行をファイルの末尾に追加します。変えUSER_NAMEPATH_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

于 2014-03-04T12:10:27.637 に答える
3

私はまさにこれを行うスクリプトを書きました:

https://github.com/chovy/node-startup

私は永遠に試したことはありませんが、実行するコマンドをカスタマイズできるので、簡単なはずです。

/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
于 2012-11-14T22:14:38.173 に答える
2

rc.local の問題は、コマンドが root としてアクセスされることです。これは、ユーザーとしてログインして sudo を使用する場合とは異なります。

etc/profile.dに必要な起動コマンドを含む.shスクリプトを追加することで、この問題を解決しました。profile.d 内の .sh ファイルはすべて自動的にロードされ、コマンドは通常の sudo を使用したかのように処理されます。

これの唯一の欠点は、指定されたユーザーが開始するためにログインする必要があることです。これは、私の状況では常に当てはまりました。

于 2017-03-08T18:22:51.323 に答える
1

上記の答えをたくさん試しました。それらのどれも私のために働きませんでした。/home私のアプリは、ルートとしてではなく、ユーザーとしてインストールされます。これはおそらく、上記の開始スクリプトが実行されたときに/homeまだマウントされていないため、アプリが開始されていないことを意味します。

次に、Digital Ocean による次の手順を見つけました。

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

説明したように PM2 を使用するのは非常に簡単で、完璧に機能します。私の仮想サーバーは 2 回物理的にクラッシュしましたが、ダウンタイムはわずか 1 分でした。

于 2015-06-22T15:07:13.800 に答える