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


195

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

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


6
うーん、Foreverを「Deploying node.js」として呼び出すのは奇妙に思えます。単なるプロセス監視/監視ツールではないですか?通常、Webデプロイメントは(少なくとも記事で遭遇するもの)Webアプリケーションを利用可能にするいくつかの相互に関連するアクティビティを意味します(このプロセスツールはその一部です)。とにかく、私はみんなの答えから学んだので、これはここStackOverflowの素晴らしい記事です。
ミコン、2011

これは、Dreamhostでのnode.jsの最も単純なデプロイメントです。目標は、ノードを構築の開始点として確実に実行することです。
respectTheCode

ドメインを実行しているポートノードへのドメインの転送をどのように処理しましたか?
grm

2
@grm私は、HTTPプロキシを使用github.com/nodejitsu/node-http-proxy
respectTheCode

現在Elastic Beanstalkを使用しており、非常にうまく機能しています。
RespectTheCode

回答:


107

2016年の回答:ほとんどすべてのLinuxディストリビューションにはsystemdが付属しています。つまり、永遠に、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フォルダーにサービスファイルをコピーします。

systemdに新しいサービスについてを伝えsystemctl daemon-reloadます。

で始めsystemctl start myappます。

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

でログを見る journalctl -u myapp

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


1
対処方法に関するアイデアはありますFailed to issue method call: Unit name ... is not valid.か?
Julien Genestoux 2015

1
@JulienGenestouxの「ユニット」名はサービスと同じです。そこに矛盾があるようです。ファイルをコピーした後/etc/systemd/system、実行が必要になる場合がありますsystemctl daemon-reload(systemdは通常、これが必要かどうかを通知します)。TBHこれは別の質問として質問するのが最善です。
mikemaccana 2015

3
サービスファイルをにコピーする代わりに/etc/systemd/system、を使用しsystemctl enable /full/path/to/myapp.serviceてシンボリックリンクを作成することができ/etc/systemd/systemます。
Arne、

1
pm2と比較してどうですか?pm2を置き換えることはできますか、それともpm2はより多くの必要な機能を提供しますか?
セルゲイバシャロフ2016年

1
@VinodSrivastav nodeは単独で呼び出され/var/www/myapp/app.jsます。Unixでは、ファイルを実行可能にし、最初の行が#!/some/fileファイルで始まる場合、そのバイナリで解釈されます。詳細については、Googleの「インタプリタUnix」をご覧ください。
mikemaccana 2018年

101

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

使用法:

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

これは近いです。それはうまくいきますが、何も止めさせません。ログアウトして再度ログインし、ノードプロセスを強制終了することができました。永遠にそれを再起動しませんでした。だから私はそれがどのように機能するかについて何かがDHと互換性がないと考えています。
RespectTheCode

@ Kevin、Forever自体がノード上で実行されるため、ノードプロセスを強制終了できません!プロセスの停止方法など、使用方法の説明を回答に追加しました。私はこれを私のVPSで使用しており、それは魅力のように機能しました。
David Tang

forever stop 0エラーがあり、物事はそこから離れてしまいました。私は自分のユーザーにrootなしでこれを実行しようとしています。適切な解決策を見つけたら簡単にクリーンアップできるようにしています。それが私の問題かもしれません。もう少し調べます。
RespectTheCode

問題を引き起こしていたnpmに何か問題がありました。npmとnodeが正しくインストールされていれば、永遠に機能します。私がやったことは、再起動時に実行するようにcronjobセットにforever startコマンドを追加することでした。私は今、procsを永久に開始および停止できる小さなノードアプリに取り組んでいます。
尊敬TheCode

ノードのネイティブクラスターAPIを使用するForeverに代わるものがあります:github.com/superjoe30/naught
andrewrk

41

ここに私の展開方法について書きました:node.jsアプリの展開

要するに:

  • git post-receiveフックを使用する
  • ビルドツールのジェイク
  • ノードのサービスラッパーとしてのアップスタート
  • 監視して、ダウンしたアプリケーションを再起動する
  • 同じサーバー上の異なるアプリケーションにリクエストをルーティングするnginx

2
サーバーに常に1つのノードサイトがある場合、Nginxを安全に破棄できますか?
Dor 2013

3
リンクが壊れているようです
verybadalloc 2013年

@Dor私はこれが遅い返信であることを知っていますが、そうではありません。SSLターミネーションやキャッシングなどのほかに、ホストの前にあるnginxリバースプロキシを使用すると、ノードをポート80で直接実行するよりもインフラストラクチャの柔軟性が向上します。これは、ノードをルートとして実行する必要がないことも意味します。 nginxセットアップを支持するかなり重い議論。
Chris Browne

16

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

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


Herokuなどのサービスと互換性がありますか?
FRD、2014年

@FRD私はherokuで動作するとは思いません。この記事を
nickleefly 2014年

9

あなたは使用することができmonitforeverupstartまたはsystemdサーバーを起動します。

Nginxの代わりにVarnishまたはHAProxyを使用できます(NginxはWebソケットでは機能しないことがわかっています)。

迅速でダーティなソリューションとして、nohup node your_app.js &アプリがサーバーで終了しないようにすることができますがforevermonitその他の提案されたソリューションの方が優れています。


2
ユーザー "Sergey Yarotskiy"が、NginxがWebSocketsをサポートするようになった(バージョン1.3以降)と投稿を編集しようとしました。代わりにコメントとして投稿する必要があると考え、編集を拒否しました。(そうしないと、同じ投稿に2つの矛盾する文が含まれ、混乱を招きます。)
Backlin

7

私のアプリで現在使用されている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

ありがとう、必要なものだけ。
Nilson Morais

6

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

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

http-proxy、SSLSocket.IOなどをカバーしています。


これは素晴らしいですね。私はherokuを開発と最初のリリースに使用していますが、最終的にはherokuを拡張してEC2に直接デプロイする必要があります。時間があるときにこれで遊んでみます。
RespectTheCode

5

systemdを使用したこの問題の解決に関するより長い記事を次に示します。http//savanne.be/articles/deploying-node-js-with-systemd/

覚えておくべきいくつかのこと:

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

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



3

永遠にトリックを行います。

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


ケビンは誰ですか?OP?
Peter Mortensen


2

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

本番環境では必ずしも良い考えではありませんが、これは、長いデバッグセッションの途中、または長いプロセスのコンソール出力を追跡する場合、またはSSH接続を切断するのに役立つが、サーバーで端末を存続させる場合に非常に便利です。後で再接続します(自宅でNode.jsアプリケーションを起動し、職場で後でコンソールに再接続して、状態を確認します)。

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

次のように機能します。

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

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


持っている良い情報。本番環境では機能しませんが、リモートサーバーでデバッグするときに非常に役立つ可能性があることに同意します。
RespectTheCode

nohupノードmyapp.js&2> /var/log/myapp.log 1> / dev / nullを使用しないのはなぜですか
markus_p

私はこのavが便利であるとわかりましたyoutube.com/watch?v=P4mT5Tbx_KE説明しnohupforever
Vinod Srivastav

1

Foreverは、アプリを実行し続けるための優れたオプションです(そして、npmはモジュールとしてインストール可能であり、優れています)。

しかし、より深刻な「デプロイメント」-デプロイ、再起動、コマンドの実行などのリモート管理-の場合は、ノード拡張でcapistranoを使用します。

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


1

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



1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.