web-dev-qa-db-ja.com

Node.jsアプリケーションを独自のプロセスとして実行するにはどうすればよいですか?

Node.jsをデプロイする最良の方法は何ですか?

私にはDreamhost VPSがあります(これは VM と呼ばれます)。Node.jsをインストールしてプロキシを設定することができました。これは、ノードを開いて開始したSSH接続を保持している限り、うまく機能します。

192
respectTheCode

2016 answer:ほとんどすべてのLinuxディストリビューションにはsystemdが付属しています。つまり、forever、monit、PM2などはありません。長く必要-OSはこれらのタスクを既に処理しています

myapp.serviceファイルを作成します(明らかに 'myapp'をアプリの名前に置き換えます):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nobody
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Unixを初めて使用する場合は注意してください:/var/www/myapp/app.jsは最初の行に#!/usr/bin/env nodeが必要です。

サービスファイルを/etc/systemd/systemフォルダーにコピーします。

systemctl daemon-reloadを使用して、systemdに新しいサービスについて知らせます。

systemctl start myappで開始します。

systemctl enable myappで起動時に実行できるようにします。

journalctl -u myappでログを見る

これはLinuxでのノードアプリのデプロイ方法、2018年版から取得されます。これにはAWS/DigitalOceanを生成するコマンドも含まれますLinux /ノードサーバー(.serviceファイルを含む)を構築するための/ Azure CloudConfig。

100
mikemaccana

Forever を使用します。 Node.jsプログラムを個別のプロセスで実行し、いずれかが停止した場合は再起動します。

使用法:

  • forever start example.jsはプロセスを開始します。
  • forever listは、永久に開始されたすべてのプロセスのリストを表示します
  • forever stop example.jsでプロセスを停止するか、forever stop 0でインデックス0のプロセスを停止します(forever listで表示)。
100
David Tang

私はここに私のデプロイ方法について書きました: node.jsアプリのデプロイ

要するに:

  • Git post-receiveフックを使用する
  • Jake ビルドツール用
  • ノードのサービスラッパーとしてのUpstart
  • Monitは、ダウンしたアプリケーションを監視および再起動します
  • nginx リクエストを同じサーバー上の異なるアプリケーションにルーティングする
41
Ben

pm2 はトリックを行います。

機能は、監視、ホットコードリロード、組み込みのロードバランサー、自動起動スクリプト、および復活/ダンププロセスです。

16
nickleefly

monitforeverupstart、またはsystemdを使用してサーバーを起動できます。

Nginxの代わりにVarnishまたはHAProxyを使用できます(Nginxはwebsocketで動作しないことが知られています)。

迅速で汚れたソリューションとして、Nohup node your_app.js &を使用してアプリがサーバーで終了するのを防ぐことができますが、forevermonitおよびその他の提案されたソリューションの方が優れています。

9
nponeccop

現在、アプリに使用されているUpstartスクリプトを作成しました。

description "YOUR APP NAME"
author "Capy - http://ecapy.com"

env LOG_FILE=/var/log/node/miapp.log
env APP_DIR=/var/node/miapp
env APP=app.js
env PID_NAME=miapp.pid
env USER=www-data
env GROUP=www-data
env POST_START_MESSAGE_TO_LOG="miapp HAS BEEN STARTED."
env NODE_BIN=/usr/local/bin/node
env PID_PATH=/var/opt/node/run
env SERVER_ENV="production"

######################################################

start on runlevel [2345]
stop on runlevel [016]

respawn
respawn limit 99 5

pre-start script
    mkdir -p $PID_PATH
    mkdir -p /var/log/node
end script

script
    export NODE_ENV=$SERVER_ENV
    exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
end script

post-start script
    echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
end script

#########の前にすべてをカスタマイズし、/ etc/init/your-service.confにファイルを作成して貼り付けます。

その後、次のことができます。

start your-service
stop your-service
restart your-service
status your-service
7
Capy

Node.jsをデプロイするための非常に包括的なガイドをサンプルファイルとともに作成しました。

チュートリアル:Node.jsアプリケーションをデプロイする方法、例付き

Http-proxy、 SSL および Socket.IO のようなものをカバーしています。

6
Rich Jones

ルートアクセスがある場合は、バックグラウンドで安全に動作するようにデーモンを設定することをお勧めします。 Debian および bunt の場合は、ブログ投稿Node.jsをサービスとして実行Ubunt

5
Seldaek

Systemdでこの問題を解決するための長い記事を次に示します。 http://savanne.be/articles/deploying-node-js-with-systemd/

留意すべきいくつかのこと:

  • 誰がプロセス監視を開始しますか? Foreverは優れたツールですが、実行を継続するには監視ツールが必要です。それは少しばかげている、なぜあなたの初期化システムを使用しないのですか?
  • プロセスを適切に監視できますか?
  • 複数のバックエンドを実行していますか?もしそうなら、あなたはそれらのどれかがリソース使用の面で他のものをダウンさせるのを防ぐために準備をしていますか?
  • サービスは常に必要ですか?そうでない場合は、ソケットのアクティブ化を検討してください(記事を参照)。

これらはすべてsystemdで簡単に実行できます。

5

Foreverはトリックを行います。

@Kevin:プロセスを正常に終了できるはずです。私はドキュメントを少し再確認します。エラーを再現できる場合は、GitHubに問題として投稿することをお勧めします。

3
Marak

Box9が言ったように、 Forever は量産コードに適しています。ただし、クライアントから SSH 接続が閉じられた場合でも、プロセスを続行することもできます。

本番環境では必ずしも良い考えではありませんが、これは長いデバッグセッションの途中、または長いプロセスのコンソール出力に従う場合、またはSSH接続を切断するのに便利であるが、サーバーでターミナルを維持する場合に非常に便利です後で再接続する(自宅でNode.jsアプリケーションを起動し、作業中に後でコンソールに再接続して、状況を確認するなど)。

サーバーが* nixボックスであると仮定すると、シェルから screen コマンドを使用して、クライアントSSHが閉じられていてもプロセスを実行し続けることができます。まだインストールされていない場合は、Webから画面をダウンロード/インストールできます(Linuxの場合はディストリビューションのパッケージを探し、OS-Xの場合は MacPorts を使用します)。

次のように機能します。

  1. 最初にSSH接続を開くとき、「screen」と入力します-これにより、スクリーンセッションが開始されます。
  2. 通常どおりに作業を開始します(つまり、Node.jsアプリケーションを開始します)
  3. 完了したら、ターミナルを閉じます。サーバープロセスは実行を続けます。
  4. コンソールに再接続するには、sshでサーバーに戻ってログインし、「screen -r」と入力して再接続します。古いコンソールコンテキストがポップアップ表示され、使用を再開できます。
  5. サーバーに接続した状態で画面を終了するには、コンソールプロンプトで「exit」と入力します。これにより、通常のシェルにドロップされます。

必要に応じて、このように複数のスクリーンセッションを同時に実行でき、任意のクライアントから任意のスクリーンセッションに接続できます。すべてのオプションについては、オンラインでドキュメントをお読みください。

2
cjcela

これを試してください: http://www.technology-ebay.de/the-teams/mobile-de/blog/deploying-node-applications-with-capistrano-github-nginx-and-upstart.html =

Capistrano、Upstart、およびNginxでNode.jsアプリを展開するための優れた詳細なガイド

2
Pono

https://paastor.com は、VPSまたはその他のサーバーに展開する比較的新しいサービスです。コードをプッシュするCLIがあります。 Paastorには無料ティアがあります。少なくともこの投稿の時点ではそうでした。

1
ruffrey

node-deploy-server を試してください。これは、プライベートサーバーにアプリケーションを展開するための複雑なツールセットです。 Node.jsで記述され、インストールにnpmを使用します。

1
AndyGrom

Foreverは、アプリの実行を維持するための適切なオプションです(そして、npmはNiceモジュールとしてインストール可能です)。

しかし、より深刻な「展開」(展開、再起動、コマンドの実行などのリモート管理など)には、ノード拡張でcapistranoを使用します。

https://github.com/loopj/capistrano-node-deploy

1
martyman

あなたの場合、 pstart デーモンを使用できます。完全な展開ソリューションについては、 capistrano をお勧めします。 2つの有用なガイドは、Node.js envのセットアップ方法およびcapistrano + upstartを介して展開する方法。

1
Anatoliy