Node.jsをデプロイする最良の方法は何ですか?
私はDreamhost VPS(これがVMと呼ばれています)を使用しており、Node.jsをインストールしてプロキシを設定できました。ノードを開いた状態で開始したSSH接続を維持している限り、これはうまく機能します。
Node.jsをデプロイする最良の方法は何ですか?
私はDreamhost VPS(これがVMと呼ばれています)を使用しており、Node.jsをインストールしてプロキシを設定できました。ノードを開いた状態で開始したSSH接続を維持している限り、これはうまく機能します。
回答:
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を生成するコマンドも含まれています。
Failed to issue method call: Unit name ... is not valid.
か?
/etc/systemd/system
、実行が必要になる場合がありますsystemctl daemon-reload
(systemdは通常、これが必要かどうかを通知します)。TBHこれは別の質問として質問するのが最善です。
/etc/systemd/system
、を使用しsystemctl enable /full/path/to/myapp.service
てシンボリックリンクを作成することができ/etc/systemd/system
ます。
node
は単独で呼び出され/var/www/myapp/app.js
ます。Unixでは、ファイルを実行可能にし、最初の行が#!/some/file
ファイルで始まる場合、そのバイナリで解釈されます。詳細については、Googleの「インタプリタUnix」をご覧ください。
Foreverを使用します。Node.jsプログラムを個別のプロセスで実行し、停止した場合は再起動します。
使用法:
forever start example.js
プロセスを開始します。forever list
永久に開始されたすべてのプロセスのリストを表示するにはforever stop example.js
プロセスを停止するかforever stop 0
、インデックス0のプロセスを停止します(で示されていますforever list
)。forever stop 0
エラーがあり、物事はそこから離れてしまいました。私は自分のユーザーにrootなしでこれを実行しようとしています。適切な解決策を見つけたら簡単にクリーンアップできるようにしています。それが私の問題かもしれません。もう少し調べます。
ここに私の展開方法について書きました:node.jsアプリの展開
要するに:
あなたは使用することができmonit
、forever
、upstart
またはsystemd
サーバーを起動します。
Nginxの代わりにVarnishまたはHAProxyを使用できます(NginxはWebソケットでは機能しないことがわかっています)。
迅速でダーティなソリューションとして、nohup node your_app.js &
アプリがサーバーで終了しないようにすることができますがforever
、monit
その他の提案されたソリューションの方が優れています。
私のアプリで現在使用されている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
Node.jsをデプロイするための非常に包括的なガイドをサンプルファイルとともに作成しました。
systemdを使用したこの問題の解決に関するより長い記事を次に示します。http://savanne.be/articles/deploying-node-js-with-systemd/
覚えておくべきいくつかのこと:
これらすべてはsystemdで簡単に実行できます。
rootアクセス権がある場合は、デーモンを設定して、安全に実行され、バックグラウンドで音が鳴るようにします。DebianとUbuntuでちょうどそれを行う方法については、ブログ投稿Run Node.js as a Service on Ubuntuを参照してください。
永遠にトリックを行います。
@Kevin:プロセスを正常に強制終了できるはずです。ドキュメントを少し再確認します。エラーを再現できる場合は、GitHubに問題として投稿してください。
これを試してください: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アプリをデプロイするための優れた詳細ガイド
Box9が言ったように、Foreverはプロダクションコードに適しています。ただし、SSH接続がクライアントから閉じられている場合でも、プロセスを続行することもできます。
本番環境では必ずしも良い考えではありませんが、これは、長いデバッグセッションの途中、または長いプロセスのコンソール出力を追跡する場合、またはSSH接続を切断するのに役立つが、サーバーで端末を存続させる場合に非常に便利です。後で再接続します(自宅でNode.jsアプリケーションを起動し、職場で後でコンソールに再接続して、状態を確認します)。
サーバーが* nixボックスであると仮定すると、クライアントのSSHが閉じている場合でも、シェルからscreenコマンドを使用してプロセスを実行し続けることができます。まだインストールされていない場合は、Webから画面をダウンロード/インストールできます(Linuxの場合はディストリビューションのパッケージを探します。OSXの場合はMacPortsを使用します)。
次のように機能します。
必要に応じて、このように複数の画面セッションを同時に実行することができ、任意のクライアントから任意のセッションに接続できます。すべてのオプションについては、オンラインのドキュメントをお読みください。
Foreverは、アプリを実行し続けるための優れたオプションです(そして、npmはモジュールとしてインストール可能であり、優れています)。
しかし、より深刻な「デプロイメント」-デプロイ、再起動、コマンドの実行などのリモート管理-の場合は、ノード拡張でcapistranoを使用します。
https://paastor.comは、VPSまたはその他のサーバーにデプロイする比較的新しいサービスです。コードをプッシュするCLIがあります。Paastorには無料枠があり、少なくともこれを投稿した時点でそうでした。
あなたの場合、あなたはupstartデーモンを使うかもしれません。完全な展開ソリューションについては、capistranoをお勧めします。二つの便利なガイドがあるどのようにENV Node.jsの設定にし、どのようにカピストラーノ+成り上がりを経由してデプロイします。
node-deploy-serverを試してください。これは、プライベートサーバーにアプリケーションを展開するための複雑なツールセットです。Node.jsで記述され、インストールにはnpmを使用します。