PM2プロセス管理クイックスタート
PM2は、アプリケーションの管理とオンライン維持を支援するデーモンプロセス管理ツールです。PM2の使い始めは簡単で、NPM経由でインストールできるシンプルで直感的なCLIとして提供されています。
インストール
最新のPM2バージョンは、NPMまたはYarnでインストールできます。
$ npm install pm2@latest -g
# or
$ yarn global add pm2
Node.jsとNPMをインストールするには、NVMを使用できます。
アプリの起動
アプリケーションを起動、デーモン化、監視する最も簡単な方法は、このコマンドラインを使用することです。
$ pm2 start app.js
または、他のアプリケーションも簡単に起動できます。
$ pm2 start bashscript.sh
$ pm2 start python-app.py --watch
$ pm2 start binary-file -- --port 1520
CLIに渡すことができるオプションの一部
# Specify an app name
--name <app_name>
# Watch and Restart app when files change
--watch
# Set memory threshold for app reload
--max-memory-restart <200MB>
# Specify log file
--log <log_path>
# Pass extra arguments to the script
-- arg1 arg2 arg3
# Delay between automatic restarts
--restart-delay <delay in ms>
# Prefix logs with time
--time
# Do not auto restart app
--no-autorestart
# Specify cron for forced restart
--cron <cron_pattern>
# Attach to application log
--no-daemon
ご覧のとおり、PM2でアプリケーションを管理するための多くのオプションが用意されています。ユースケースに応じて、それらを発見することになります。
プロセスの管理
アプリケーションの状態の管理は簡単です。以下はコマンドです。
$ pm2 restart app_name
$ pm2 reload app_name
$ pm2 stop app_name
$ pm2 delete app_name
app_name
の代わりに、以下を渡すことができます。
- すべてのプロセスに対して動作するには
all
- 特定のプロセスIDに対して動作するには
id
ステータス、ログ、メトリクスの確認
このアプリケーションを起動したので、ステータス、ログ、メトリクスを確認したり、pm2.ioでオンラインダッシュボードを取得したりできます。
管理対象アプリケーションの一覧
PM2で管理されているすべてのアプリケーションのステータスを一覧表示します。
$ pm2 [list|ls|status]
ログの表示
リアルタイムでログを表示するには
$ pm2 logs
古いログを詳しく調べるには
$ pm2 logs --lines 200
ターミナルベースのダッシュボード
これは、ターミナルに直接収まるリアルタイムダッシュボードです。
$ pm2 monit
pm2.io:監視と診断のためのWebインターフェース
Webベースのダッシュボード、診断システムを備えたクロスサーバー
$ pm2 plus
クラスタモード
Node.jsアプリケーションの場合、PM2には、生成された各プロセス間でHTTP[s]/Websocket/TCP/UDP接続を共有する自動ロードバランサーが含まれています。
クラスタモードでアプリケーションを起動するには
$ pm2 start app.js -i max
クラスタモードの詳細については、こちらを参照してください。
エコシステムファイル
複数のアプリケーションを管理するために、エコシステムファイルと呼ばれる設定ファイルを作成することもできます。エコシステムファイルを生成するには
$ pm2 ecosystem
これにより、ecosystem.config.jsファイルが生成されます。
module.exports = {
apps : [{
name: "app",
script: "./app.js",
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
}
}, {
name: 'worker',
script: 'worker.js'
}]
}
そして、簡単に開始できます。
$ pm2 start process.yml
アプリケーション宣言の詳細については、こちらを参照してください。
スタートアップスクリプトの設定
サーバーの起動/再起動時に管理しているプロセスでPM2を再起動することは重要です。これを解決するには、このコマンドを実行してアクティブな起動スクリプトを生成するだけです。
$ pm2 startup
そして、自動再起動のためにプロセスリストをフリーズするには
$ pm2 save
スタートアップスクリプトジェネレーターの詳細については、こちらを参照してください。
変更時のアプリケーションの再起動
--watch
オプションを使用すると非常に簡単です。
$ cd /path/to/my/app
$ pm2 start env.js --watch --ignore-watch="node_modules"
これにより、現在のディレクトリとすべてのサブフォルダーからのファイル変更が監視され、アプリが再起動されます。また、node_modulesフォルダー内の変更は無視されます(--ignore-watch="node_modules"
)。
次に、pm2 logs
を使用して、再起動されたアプリのログを確認できます。
PM2の更新
簡単にしました。リリース間に互換性を破る変更はなく、手順は簡単です。
npm install pm2@latest -g
次に、メモリ内のPM2を更新します。
pm2 update
チートシート
これは知っておくべきいくつかのコマンドです。開発マシンでサンプルアプリケーションまたは現在のWebアプリケーションで試してみてください。
# Fork mode
pm2 start app.js --name my-api # Name process
# Cluster mode
pm2 start app.js -i 0 # Will start maximum processes with LB depending on available CPUs
pm2 start app.js -i max # Same as above, but deprecated.
pm2 scale app +3 # Scales `app` up by 3 workers
pm2 scale app 2 # Scales `app` up or down to 2 workers total
# Listing
pm2 list # Display all processes status
pm2 jlist # Print process list in raw JSON
pm2 prettylist # Print process list in beautified JSON
pm2 describe 0 # Display all information about a specific process
pm2 monit # Monitor all processes
# Logs
pm2 logs [--raw] # Display all processes logs in streaming
pm2 flush # Empty all log files
pm2 reloadLogs # Reload all logs
# Actions
pm2 stop all # Stop all processes
pm2 restart all # Restart all processes
pm2 reload all # Will 0s downtime reload (for NETWORKED apps)
pm2 stop 0 # Stop specific process id
pm2 restart 0 # Restart specific process id
pm2 delete 0 # Will remove process from pm2 list
pm2 delete all # Will remove all processes from pm2 list
# Misc
pm2 reset <process> # Reset meta data (restarted time...)
pm2 updatePM2 # Update in memory pm2
pm2 ping # Ensure pm2 daemon has been launched
pm2 sendSignal SIGUSR2 my-app # Send system signal to script
pm2 start app.js --no-daemon
pm2 start app.js --no-vizion
pm2 start app.js --no-autorestart
次は?
すべてのアプリケーションの動作オプションをJSON設定ファイルで宣言する方法を学びます。
信頼性を高めるために、クリーンな停止と再起動を行う方法を学びます。
本番アプリケーションを簡単にデプロイおよび更新する方法を学びます。
PM2.ioで本番アプリケーションを監視します。
PM2の更新方法
最新のpm2バージョンをインストールします。
npm install pm2@latest -g
次に、メモリ内のPM2を更新します。
pm2 update
設定ファイル
PM2で複数のアプリケーションを管理する場合は、JS設定ファイルを使用してそれらを整理します。
設定の生成
サンプル設定ファイルを生成するには、このコマンドを入力できます。
$ pm2 init simple
これにより、サンプルecosystem.config.js
が生成されます。
module.exports = {
apps : [{
name : "app1",
script : "./app.js"
}]
}
独自の設定ファイルを作成する場合は、PM2が設定ファイルとして認識できるように、.config.js
で終わるようにしてください。
設定ファイルに対する操作
アプリケーションに対する操作よりもシームレスに、設定ファイルに含まれるすべてのアプリケーションを起動/停止/再起動/削除できます。
# Start all applications
pm2 start ecosystem.config.js
# Stop all
pm2 stop ecosystem.config.js
# Restart all
pm2 restart ecosystem.config.js
# Reload all
pm2 reload ecosystem.config.js
# Delete all
pm2 delete ecosystem.config.js
特定のプロセスに対する操作
名前とオプション--only <app_name>
を使用すると、特定のアプリケーションに対する操作も可能です。
pm2 start ecosystem.config.js --only api-app
注:--only
オプションは、起動/再起動/停止/削除にも機能します。
コンマで区切って各アプリ名を指定することで、複数のアプリに対して操作を実行するように指定することもできます。
pm2 start ecosystem.config.js --only "api-app,worker-app"
環境の切り替え
env_*
オプションを介して、さまざまな環境変数セットを指定できます。
例
module.exports = {
apps : [{
name : "app1",
script : "./app.js",
env_production: {
NODE_ENV: "production"
},
env_development: {
NODE_ENV: "development"
}
}]
}
次に、異なる環境の変数を切り替えるには、--env [環境名]
オプションを指定します。
pm2 start process.json --env production
pm2 restart process.json --env development
使用可能な属性
アプリケーションの動作と構成は、次の属性を使用して微調整できます。
一般
フィールド | タイプ | 例 | 説明 |
---|---|---|---|
name | (string) | “my-api” | アプリケーション名(デフォルトは拡張子なしのスクリプトファイル名) |
script | (string) | ”./api/app.js” | pm2開始を基準としたスクリプトパス |
cwd | (string) | “/var/www/” | アプリが起動されるディレクトリ |
args | (string) | “-a 13 -b 12” | CLIを介してスクリプトに渡されるすべての引数を含む文字列 |
interpreter | (string) | “/usr/bin/python” | インタープリターの絶対パス(デフォルトはnode) |
interpreter_args | (string) | ”–harmony” | インタープリターに渡すオプション |
node_args | (string) | interpreter_argsのエイリアス |
高度な機能
フィールド | タイプ | 例 | 説明 |
---|---|---|---|
instances | number | -1 | 起動するアプリインスタンスの数 |
exec_mode | string | “cluster” | アプリを起動するモード。 “cluster”または “fork”にすることができ、デフォルトはfork |
watch | booleanまたは[] | true | 監視と再起動機能を有効にします。フォルダーまたはサブフォルダーでファイルが変更された場合、アプリがリロードされます。 |
ignore_watch | list | [”[\/\\]\./”, “node_modules”] | 監視機能で一部のファイル名またはフォルダー名を無視する正規表現のリスト |
max_memory_restart | string | “150M” | 指定されたメモリ量を超えると、アプリが再起動されます。人間が読める形式:「10M」、「100K」、「2G」などのようにすることができます。 |
env | object | {“NODE_ENV”: “development”, “ID”: “42”} | アプリに表示される環境変数 |
env_ |
object | {“NODE_ENV”: “production”, “ID”: “89”} | inject |
source_map_support | boolean | true | デフォルトはtrue、[ソースマップファイルを有効/無効にする] |
instance_var | string | “NODE_APP_INSTANCE” | ドキュメントを参照してください |
filter_env | array of string | [ “REACT_” ] | 「REACT_」で始まるグローバル変数を除外し、クラスターへの侵入を許可しません。 |
ログファイル
フィールド | タイプ | 例 | 説明 |
---|---|---|---|
log_date_format | (string) | “YYYY-MM-DD HH:mm Z” | ログの日付形式(ログセクションを参照) |
error_file | (string) | エラーファイルのパス(デフォルトは$HOME/.pm2/logs/<アプリ名>-error-<pid>.log) | |
out_file | (string) | 出力ファイルのパス(デフォルトは$HOME/.pm2/logs/<アプリ名>-out-<pid>.log) | |
log_file | (string) | 出力ログとエラーログ両方のファイルパス(デフォルトでは無効) | |
combine_logs | boolean | true | trueに設定すると、ログファイルにプロセスIDをサフィックスで付与することを回避します。 |
merge_logs | boolean | true | combine_logsのエイリアス |
pid_file | (string) | pidファイルのパス(デフォルトは$HOME/.pm2/pids/<アプリ名>-<pid>.pid) |
コントロールフロー
フィールド | タイプ | 例 | 説明 |
---|---|---|---|
min_uptime | (string) | アプリが起動したと見なされる最小稼働時間 | |
listen_timeout | number | 8000 | アプリがリッスンしていない場合にリロードを強制するまでの時間(ミリ秒単位) |
kill_timeout | number | 1600 | 最終的なSIGKILLを送信するまでの時間(ミリ秒単位) |
shutdown_with_message | boolean | false | process.kill(pid, SIGINT)の代わりに、process.send(‘shutdown’)でアプリケーションをシャットダウンします。 |
wait_ready | boolean | false | リッスンイベントを待ってリロードする代わりに、process.send(‘ready’)を待ちます。 |
max_restarts | number | 10 | アプリがエラーと見なされて再起動されなくなる前に発生する、連続した不安定な再起動の回数(1秒未満の間隔、またはmin_uptimeを介したカスタム時間)。 |
restart_delay | number | 4000 | クラッシュしたアプリを再起動するまでに待機する時間(ミリ秒単位)。デフォルトは0です。 |
autorestart | boolean | false | デフォルトはtrueです。falseの場合、アプリがクラッシュした場合、または正常に終了した場合、PM2はアプリを再起動しません。 |
cron_restart | string | “1 0 * * *” | アプリを再起動するためのcronパターン。cron機能が機能するには、アプリケーションが実行されている必要があります。 |
vizion | boolean | false | デフォルトはtrueです。falseの場合、PM2はvizion機能(バージョン管理メタデータ)なしで開始します。 |
post_update | list | [“npm install”, “echo launching the app”] | KeymetricsダッシュボードからPull/Upgrade操作を実行した後に実行されるコマンドのリスト |
force | boolean | true | デフォルトはfalseです。trueの場合、PM2では通常許可されていない同じスクリプトを複数回起動できます。 |
デプロイメント
エントリ名 | 説明 | タイプ | デフォルト |
---|---|---|---|
key | SSHキーのパス | String | $HOME/.ssh |
user | SSHユーザー | String | |
host | SSHホスト | [String] | |
ssh_options | コマンドラインフラグなしのSSHオプション。「man ssh」を参照してください | Stringまたは[String] | |
ref | GITリモート/ブランチ | String | |
repo | GITリモート | String | |
path | サーバー内のパス | String | |
pre-setup | ローカルマシン上のコマンドまたはスクリプトへのパス | String | |
post-setup | ホストマシン上のコマンドまたはスクリプトへのパス | String | |
pre-deploy-local | デプロイ前の操作 | String | |
post-deploy | デプロイ後の操作 | String |
考慮事項
JSONアプリ宣言を使用する際に渡されるすべてのコマンドラインオプションは削除されます。つまり
CWD
cwd:JSON宣言はスクリプトとともに存在する必要はありません。スクリプト以外の場所(たとえば、/etc/pm2/conf.d/node-app.json
)でJSONを保持したい場合は、cwd
機能を使用する必要があります(これは、シンボリックリンクを使用するcapistranoスタイルのディレクトリ構造に非常に役立ちます)。ファイルは、cwd
ディレクトリを基準とした相対パス、または絶対パスにすることができます(以下の例を参照)。
CLI/JSONオプション
すべてのキーはJSON構成ファイルで使用できますが、コマンドラインではほぼ同じままになります。例:
exec_mode -> --execute-command
max_restarts -> --max-restarts
force -> --force
エスケープを作成するための引用符の使用例。
$pm2 start test.js --node-args "port=3001 sitename='first pm2 app'"
nodeArgs
引数は次のように解析されます。
[
"port=3001",
"sitename=first pm2 app"
]
ただし、そうではありません
[
"port=3001",
"sitename='first",
"pm2",
"app'"
]
ログの無効化
ログの保存を無効にするには、error_file
または out_file
に /dev/null
を渡すことができます。注意: PM2 2.4.0
以降では、プラットフォームに関係なく /dev/null
または NULL
でログが無効になります。
ログのサフィックス
merge_logs: true
オプションを有効にすることで、ログへの自動IDサフィックス(例:app-name-ID.log
)を無効にできます。
環境定義
プロセスファイル内で定義された特定の環境を使用するように pm2 に指示するには、--env <envname>
を使用する必要があります。
{
"apps" : [{
"name" : "worker",
"script" : "./worker.js",
"watch" : true,
"env": {
"NODE_ENV": "development"
},
"env_production" : {
"NODE_ENV": "production"
}
},{
"name" : "api-app",
"script" : "./api.js",
"instances" : 4,
"exec_mode" : "cluster"
}]
}
この例では、pm2 start ecosystem.json
を実行すると、デフォルト環境(開発環境)でアプリケーションが起動します。次に、pm2 start ecosystem.json --env production
を使用すると、env_<name>
属性が使用されます。ここで name は production
なので、NODE_ENV=production
でアプリケーションが起動します。
特別な ext_type
min_uptime
の値は、次のいずれかになります。- 数値 例:
"min_uptime": 3000
は 3000 ミリ秒を意味します。 - 文字列 そのため、設定を簡単かつ短くするために、
h
、m
、s
を使用します。例:"min_uptime": "1h"
は1時間、"min_uptime": "5m"
は5分、"min_uptime": "10s"
は10秒を意味します(これらはミリ秒に変換されます)。
- 数値 例:
max_memory_restart
の値は、次のいずれかになります。- 数値 例:
"max_memory_restart": 1024
は 1024 バイト(ビットではなく)を意味します。 - 文字列 そのため、設定を簡単かつ短くするために、
G
、M
、K
を使用します。例:"max_memory_restart": "1G"
は1ギガバイト、"max_memory_restart": "5M"
は5メガバイト、"max_memory_restart": "10K"
は10キロバイトを意味します(これらはバイトに変換されます)。
- 数値 例:
-
オプションの値 例:
exec_mode
は、取りうる値としてcluster
(cluster_mode
)またはfork
(fork_mode
)を取ることができます。 - 知っておくべきこと
"instances": 0
は、PM2 が CPU の数に応じて可能な限り最大のプロセス数を起動することを意味します(クラスターモード)。- 配列
args
、node_args
、およびignore_watch
は、Array
型(例:"args": ["--toto=heya coco", "-d", "1"]
)またはstring
型(例:"args": "--to='heya coco' -d 1"
)にすることができます。
クラスタモード
クラスターモードを使用すると、ネットワーク化された Node.js アプリケーション(http(s)/tcp/udp サーバー)を、コードを変更せずに、使用可能なすべての CPU に拡張できます。これにより、使用可能な CPU の数に応じて、アプリケーションのパフォーマンスと信頼性が大幅に向上します。内部的には、Node.js のcluster モジュールを使用しているため、スケールされたアプリケーションの子プロセスは、サーバーポートを自動的に共有できます。詳細については、cluster モジュールに関する公式 Node.js ドキュメントの仕組みを参照してください。
使い方
クラスターモードを有効にするには、-i を渡すだけです。
pm2 start app.js -i max
max
は、PM2 が利用可能な CPU の数を自動的に検出し、可能な限り多くのプロセスを実行することを意味します。
または、js/yaml/json ファイルを介して。
module.exports = {
apps : [{
script : "api.js",
instances : "max",
exec_mode : "cluster"
}]
}
注意: 各インスタンス間でロードバランシングを行う場合は、exec_mode
を cluster
に設定する必要があります。デフォルトでは、ロードバランシングは行われません。
次に、プロセスファイルを起動します。
pm2 start processes.json
-i または instances オプションは次のいずれかになります。
- 0/max アプリケーションをすべての CPU に分散します。
- -1 アプリケーションをすべての CPU - 1 に分散します。
- 数値 アプリケーションを 数値 個の CPU に分散します。
再読み込み
プロセスを強制終了して再起動する restart
とは対照的に、reload
は、ダウンタイム0秒での再読み込みを実現します。
アプリケーションを再読み込みするには
pm2 reload <app_name>
または
pm2 reload process.json
pm2 reload process.json --only api
再読み込みシステムがアプリケーションの再読み込みに失敗した場合、タイムアウトが発生し、従来の再起動にフォールバックします。
正常なシャットダウン
本番環境では、アプリケーションを終了する前に、残りのクエリが処理されるのを待機したり、すべての接続を閉じたりする必要がある場合があります。PM2 reload コンテキストでは、これが非常に長い再読み込み、または機能しない再読み込み(再起動へのフォールバック)につながる可能性があります。これは、アプリケーションが終了時に開いている接続をまだ持っていることを意味します。または、すべてのデータベース接続を閉じたり、データキューをクリアしたりする必要がある場合もあります。
アプリケーションを正常にシャットダウンするには、SIGINT シグナル(PM2 によって終了時に送信される最初のシグナル)をキャッチし、これらの状態を待機/クリアするアクションを実行できます。
process.on('SIGINT', function() {
db.stop(function(err) {
process.exit(err ? 1 : 0);
});
});
正常なシャットダウン機能の詳細をご覧ください。
アプリケーションをステートレスにする
アプリケーションがステートレスであることを確認してください。これは、プロセスにローカルデータ(セッション/WebSocket接続、セッションメモリなど)が格納されていないことを意味します。プロセス間で状態を共有するには、Redis、Mongo、またはその他のデータベースを使用します。
効率的で本番環境に対応したステートレスアプリケーションの記述方法に関する別のリソースは、The Twelve Factor Application manifesto です。
貢献/開発モード
PM2 を使用するのは非常に簡単です。
pm2 kill # kill the current pm2
git clone my_pm2_fork.git
cd pm2/
DEBUG=* ./bin/pm2 --no-daemon
コードを編集するたびに、PM2 を強制終了して再起動して、変更を反映させるようにしてください。
DEBUG=”*“ を使用すると、~/.pm2/pm2.log に可能なすべてのデバッグログが表示されます。
PM2 開発版をインストール
npm install https://github.com/Unitech/pm2#development -g
テストを実行
本番サーバーで PM2 を使用する前に、必ずテストを試してください。
git clone https://github.com/Unitech/pm2.git
cd pm2
npm install # Or do NODE_ENV=development npm install if some packages are missing
npm test
テストが正しく機能しない場合は、こちらで問題を報告してください。また、必要な依存関係がすべて揃っていることを確認する必要があります。Ubuntu の場合
sudo apt-get install build-essential
# nvm is a Node.js version manager - https://github.com/creationix/nvm
wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh
nvm install 4
nvm use 4
デプロイメントシステム
PM2 には、本番環境でアプリケーションをプロビジョニングおよび更新できるシンプルながら強力なデプロイシステムが備わっています。これは、単一または複数のサーバーでベアメタルサーバーにアプリケーションをデプロイする場合に非常に便利です。
> pm2 deploy <configuration_file> <environment> <command>
Commands:
setup run remote setup commands
update update deploy to the latest release
revert [n] revert to [n]th last deployment or 1
curr[ent] output current release commit
prev[ious] output previous release commit
exec|run <cmd> execute the given <cmd>
list list previous deploy commits
[ref] deploy to [ref], the "ref" setting, or latest tag
基本的に、ecosystem.json に "deploy" 属性を追加するだけです。以下は、アプリケーションをデプロイするための最小限の設定です。
デプロイシステムを構成するには、アプリケーション構成ファイルに deploy
属性を追加します。
module.exports = {
apps : [{
script: 'api.js',
}, {
script: 'worker.js'
}],
// Deployment Configuration
deploy : {
production : {
"user" : "ubuntu",
"host" : ["192.168.0.13", "192.168.0.14", "192.168.0.15"],
"ref" : "origin/master",
"repo" : "git@github.com:Username/repository.git",
"path" : "/var/www/my-repository",
"post-deploy" : "npm install"
}
}
};
注意: ローカルフォルダー内のアプリケーション構成ファイルの名前が ecosystem.config.js または pm2.config.js のいずれかであることを確認してください。これにより、コマンドごとに構成ファイルの名前を入力する必要がなくなります。
リモートサーバーのプロビジョニング
リモートサーバーをプロビジョニングする前に、次のことを確認してください。
- リモートサーバーに PM2 がインストールされている
- リモートサーバーに、ターゲットリポジトリの GIT クローン作成権限が付与されている
リモートサーバーが構成されたら、それらのプロビジョニングを開始できます。
$ pm2 deploy production setup
注意: ローカルフォルダー内のアプリ構成ファイルの名前が ecosystem.config.js または pm2.config.js であるため、毎回ファイル名を指定する必要はありません。
アプリケーションのデプロイ
リモートサーバーがプロビジョニングされたら、アプリケーションをデプロイできるようになります。
$ pm2 deploy production
注意: git がローカルの変更があるというエラーを報告しても、リモート GIT にあるものをプッシュしたい場合は、--force
オプションを使用して強制的にデプロイできます。
以前のデプロイメントへのロールバック
以前のデプロイメントにロールバックする必要がある場合は、revert
オプションを使用できます。
# Revert to -1 deployment
$ pm2 deploy production revert 1
各サーバーでコマンドを実行
1回限りの実行コマンドを実行するには、exec
オプションを使用できます。
$ pm2 deploy production exec "pm2 reload all"
詳細
デプロイライフサイクル
PM2 でデプロイする場合、セットアップ前/後、および更新前/後に何を行うかを指定できます。
"pre-setup" : "echo 'commands or local script path to be run on the host before the setup process starts'",
"post-setup": "echo 'commands or a script path to be run on the host after cloning the repo'",
"pre-deploy" : "pm2 startOrRestart ecosystem.json --env production",
"post-deploy" : "pm2 startOrRestart ecosystem.json --env production",
"pre-deploy-local" : "echo 'This is a local executed command'"
マルチホストデプロイ
複数のホストに同時にデプロイするには、host
属性の下の配列に各ホストを宣言するだけです。
"host" : ["212.83.163.1", "212.83.163.2", "212.83.163.3"],
SSHキーの指定
公開鍵へのパスを持つ "key" 属性を追加するだけです。以下の例を参照してください。
"production" : {
"key" : "/path/to/some.pem", // path to the public key to authenticate
"user" : "node", // user used to authenticate
"host" : "212.83.163.1", // where to connect
"ref" : "origin/master",
"repo" : "git@github.com:repo.git",
"path" : "/var/www/production",
"post-deploy" : "pm2 startOrRestart ecosystem.json --env production"
},
トラブルシューティング
SSH クローンエラー
ほとんどの場合、これらのエラーは、pm2
がリポジトリをクローンするための正しいキーを持っていないことが原因で発生します。すべてのステップで、キーが利用可能であることを確認する必要があります。
ステップ 1 キーが正しく機能していることが確実な場合は、まずターゲットサーバーで git clone your_repo.git
を実行してみてください。成功した場合は、次のステップに進みます。失敗した場合は、キーがサーバーと git アカウントの両方に保存されていることを確認してください。
ステップ 2 デフォルトでは、ssh-copy-id
は、通常 id_rsa
という名前のデフォルトのアイデンティティをコピーします。それが適切なキーでない場合
ssh-copy-id -i path/to/my/key your_username@server.com
これにより、公開鍵が ~/.ssh/authorized_keys
ファイルに追加されます。
ステップ 3 次のエラーが発生した場合
--> Deploying to production environment
--> on host mysite.com
○ hook pre-setup
○ running setup
○ cloning git@github.com:user/repo.git
Cloning into '/var/www/app/source'...
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and that the repository exists.
**Failed to clone**
Deploy failed
…ssh 設定ファイルを作成する必要がある場合があります。これは、クローンしようとしている任意のリポジトリに対して正しい ssh キーが使用されるようにするための確実な方法です。この例を参照してください。
# ~/.ssh/config
Host alias
HostName myserver.com
User username
IdentityFile ~/.ssh/mykey
# Usage: `ssh alias`
# Alternative: `ssh -i ~/.ssh/mykey username@myserver.com`
Host deployment
HostName github.com
User username
IdentityFile ~/.ssh/github_rsa
# Usage:
# git@deployment:username/anyrepo.git
# This is for cloning any repo that uses that IdentityFile. This is a good way to make sure that your remote cloning commands use the appropriate key

Docker統合
コンテナーを使用していますか?私たちにお任せください。Node.js を本番環境で最大限に活用するための最適なコンパニオンである pm2-runtime を使って今日から始めましょう。
pm2-runtime の目標は、アプリケーションを適切な Node.js 本番環境にラップすることです。これにより、コンテナー内で Node.js アプリケーションを実行する際の主要な問題が解決されます。
- 高いアプリケーション信頼性のためのセカンドプロセスフォールバック
- プロセスのフロー制御
- 常に健全で高性能を維持するための自動アプリケーション監視
- 自動ソースマップ検出と解決のサポート
さらに、コンテナーとアプリケーションの間にレイヤーとして PM2 を使用すると、アプリケーション宣言ファイル、カスタマイズ可能なログシステム、その他、Node.js アプリケーションを本番環境で管理するための優れた機能など、PM2 の強力な機能がもたらされます。
コンテナー内で PM2 を使用
Dockerfile に次の行を追加して PM2 をインストールします。
RUN npm install pm2 -g
次に、node
バイナリを pm2-runtime
に置き換えます。
CMD ["node", "app.js"]
を
CMD ["pm2-runtime", "app.js"]
これで完了です! これで、Node.js アプリケーションが適切な Node.js 本番環境にラップされました。
構成ファイルの起動
PM2 で生の Node.js アプリケーションを実行する代わりに、構成ファイル(またはプロセスファイル)でアプリケーションを宣言し、クラスターモードの有効化などのいくつかの構成変数を設定できます。
この内容で ecosystem.config.js ファイルを作成しましょう。
module.exports = [{
script: 'app.js',
name: 'app',
exec_mode: 'cluster',
instances: 2
}, {
script: 'worker.js',
name: 'worker'
}]
利用可能なすべてのオプションはこちらにリストされています。
次に、CMD ディレクティブをこれで置き換えることができます。
CMD ["pm2-runtime", "process.yml"]
各プロセスを個別のDockerで分割するには、–only [app-name] オプションを使用できます。
CMD ["pm2-runtime", "process.yml", "--only", "APP"]
exec_mode cluster と nuxtjs を組み合わせて使用する
pm2をクラスターモードで実行すると、nuxt.jsがrootDirを解析する方法により、ecosystem.config.js
がcwdパスに追加されます。これを修正するには、argsセクションで設定パスを指定する必要があります。
module.exports = {
apps: [
{
name: 'my-nuxtjs-app',
exec_mode: 'cluster',
instances: 2,
cwd: '/var/www',
script: './node_modules/nuxt-start/bin/nuxt-start.js',
args: '-c /var/www/nuxt.config.js'
}
]
}
ログ形式オプション
ログ出力形式を変更したい場合は、次のいずれかのオプションを選択できます。
- –json: ログをJSON形式で出力します(logstash)。
- –format: ログを=形式で出力します。
- –raw: ログをそのまま出力します。
これらのフラグのいずれかを使用するには、pm2-runtimeに渡すだけです。
CMD ["pm2-runtime", "--json", "process.yml"]
グレースフルシャットダウンの有効化
コンテナがシャットダウンシグナルを受信すると、PM2はこのシグナルをアプリケーションに転送し、すべてのデータベース接続を閉じたり、すべてのクエリが処理されるのを待ったり、正常なグレースフルシャットダウンの前に他の最終処理を完了させたりすることができます。
シャットダウンシグナルの捕捉は簡単です。Node.jsアプリケーションにリスナーを追加し、アプリを停止する前に必要なものを実行する必要があります。
process.on('SIGINT', function() {
db.stop(function(err) {
process.exit(err ? 1 : 0);
});
});
デフォルトでは、PM2は最終的なSIGKILLシグナルを送信する前に1600ms待機します。アプリケーションの設定ファイル内で kill_timeout
オプションを設定することで、この遅延を変更できます。
アプリケーションの状態管理についての詳細はこちらをご覧ください。
開発環境
開発、テスト、本番の間で一貫した環境を維持するために、開発者にコンテナ内でプログラミングするように指示したい場合があります。
pm2-runtimeをpm2-devに置き換えると、ウォッチおよび再起動機能が有効になります。これは、ホストファイルがVOLUMEとしてコンテナに公開されている開発コンテナでは非常に興味深いものです。
PM2.io の利用
Keymetrics.io は、PM2上に構築された監視サービスであり、アプリケーションの監視と管理(ログ、再起動、例外監視など)を簡単に行うことができます。Keymetricsでバケットを作成すると、公開キーと秘密キーを取得できます。
pm2-runtimeでKeymetricsの監視を有効にするには、CLIオプションの –public XXX と –secret YYY を使用するか、環境変数 KEYMETRICS_PUBLIC と KEYMETRICS_SECRET を渡すことができます。
Dockerfileを介したCLIオプションの例
CMD ["pm2-runtime", "--public", "XXX", "--secret", "YYY", "process.yml"]
または環境変数を介して
ENV PM2_PUBLIC_KEY=XXX
ENV PM2_SECRET_KEY=YYY
または Docker run コマンドを介して
docker run --net host -e "PM2_PUBLIC_KEY=XXX" -e "PM2_SECRET_KEY=XXX" <...>
pm2-runtime ヘルパー
これがpm2-runtimeヘルパーです。
>>> pm2-runtime -h
Usage: pm2-runtime app.js
pm2-runtime is a drop-in replacement node.js binary with some interesting production features
Options:
-V, --version output the version number
-i --instances <number> launch [number] of processes automatically load-balanced. Increase overall performances and performance stability.
--secret [key] [MONITORING] keymetrics secret key
--public [key] [MONITORING] keymetrics public key
--machine-name [name] [MONITORING] keymetrics machine name
--raw raw log output
--json output logs in json format
--format output logs formatted like key=val
--delay <seconds> delay start of configuration file by <seconds>
--web [port] launch process web api on [port] (default to 9615)
--only <application-name> only act on one application of configuration
--no-auto-exit do not exit if all processes are errored/stopped or 0 apps launched
--env [name] inject env_[name] env variables in process config file
--watch watch and restart application on file change
--error <path> error log file destination (default disabled)
--output <path> output log file destination (default disabled)
-h, --help output usage information
Commands:
*
start <app.js|json_file> start an application or json ecosystem file
新しいプロセスの開始時
PM2は、新しいプロセスを開始するときに、次の順序で環境を注入します。
- まず、PM2 CLIは自身の環境を使用するため、シェルの現在の環境が注入されます。
- 次に、PM2は、エコシステムファイルで設定できる環境を注入します。
module.exports = {
apps : [
{
name: "myapp",
script: "./app.js",
watch: true,
env: {
"NODE_ENV": "development",
}
}
]
}
ここでは、PM2が現在の環境をオーバーライドして NODE_ENV=development
を追加することがわかります。ただし、次のように異なる環境を定義することもできます。
module.exports = {
apps : [
{
name: "myapp",
script: "./app.js",
watch: true,
env: {
"PORT": 3000,
"NODE_ENV": "development"
},
env_production: {
"PORT": 80,
"NODE_ENV": "production",
}
}
]
}
ここで、デフォルトの環境はenv
にありますが、pm2 start ecosystem.config.js --env production
を使用して env_production
を使用することもできます。
必要なだけ環境を定義できます。使用する環境の名前(env_
の後)を --env
で渡す必要があることを覚えておいてください。
特定の環境変数
NODE_APP_INSTANCE (PM2 2.5以上)
プロセスを区別するために使用される NODE_APP_INSTANCE
環境変数があります。たとえば、1つのプロセスでのみcronjobを実行したい場合、process.env.NODE_APP_INSTANCE === '0'
かどうかを確認するだけで済みます。2つのプロセスが同じ番号を持つことはありません。pm2 restart
および pm2 scale
コマンドの後でも同じです。
node-config で NODE_APP_INSTANCE
の名前で問題が発生する可能性があるため、instance_var
オプションで名前を変更できます。
module.exports = {
apps : [
{
name: "myapp",
script: "./app.js",
watch: true,
instance_var: 'INSTANCE_ID',
env: {
"PORT": 3000,
"NODE_ENV": "development"
}
}
]
}
この場合、変数は同じ動作をしますが、process.env.INSTANCE_ID
になります。
increment_var (PM2 2.5以上)
起動されるインスタンスごとに環境変数をインクリメントするようにPM2に要求するオプションがあります。たとえば
module.exports = {
apps : [
{
name: "myapp",
script: "./app.js",
instances: 2,
exec_mode: "cluster",
watch: true,
increment_var : 'PORT',
env: {
"PORT": 3000,
"NODE_ENV": "development"
}
}
]
}
この例では、pm2 start ecosystem.config.js
を実行すると
- PM2は、インスタンスごとに
PORT
変数をインクリメントしたいことを認識します。 - デフォルトを
3000
に定義したことがわかります。 - 最初のインスタンスには
process.env.PORT = 3000
があり、2番目のインスタンスにはprocess.env.PORT = 3001
があります。
注: pm2 scale myapp 4
を使用してスケーリングする場合にもインクリメントします。新しいインスタンスの両方には、PORT
変数として 3002
および 3003
があります。
Node.jsをセットアップせずにPM2を新規インストールしたい場合、pm2は .deb
パッケージとして利用できます。
これは、最新のUbuntuの長期サポートリリースで動作するように構築されています。
インストール
# 1. Add the PM2 repository signing key
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv D1EA2D4C
# 2. Add the PM2 repository
echo "deb http://apt.pm2.io/ubuntu stable main" | sudo tee /etc/apt/sources.list.d/pm2.list
# 3. Update list of available packages
sudo apt-get update
# 4. Install PM2
sudo apt-get install pm2
アプリケーションログ
PM2でアプリケーションが起動されると、ログを簡単に参照および管理できます。
ログファイルは、$HOME/.pm2/logs
フォルダーにあります。
ログビュー
アプリケーションのログを表示するには、コマンド pm2 logs
を使用できます。
-l --log [path] specify filepath to output both out and error logs
-o --output <path> specify out log file
-e --error <path> specify error log file
--time prefix logs with standard formatted timestamp
--log-date-format <format> prefix logs with custom formatted timestamp
--log-type <type> specify log output style (raw by default, or json)
--merge-logs when running multiple process with same app name, do not split file by id
使用法: logs [options] [id | name | namespace] |
ログファイルをストリーミングします。デフォルトではすべてのログをストリーミングします
オプション
--json json log output
--format formatted log output
--raw raw output
--err only shows error output
--out only shows standard output
--lines <n> output the last N lines, instead of the last 15 by default
--timestamp [format] add timestamps (default format YYYY-MM-DD-HH:mm:ss)
--nostream print logs without launching the log stream
--highlight [value] highlights the given value
-h, --help output usage information ```
重要なコマンド
# Display all apps logs in realtime
pm2 logs
# Display only `api` application logs
pm2 logs api
# Display new logs in json
pm2 logs --json
# Display 1000 lines of api log file
pm2 logs big-api --lines 1000
CLIダッシュボードでログを確認することもできます。
pm2 logs --json
アプリケーションの各行には、このメタデータが出力されます。
{
"message": "echo\n", // the actual message that has been `console.log`
"timestamp": "2017-02-06T14:51:38.896Z", // timestamp of the message, can be formatted
"type": "out", // the type of logs, can be `err`, `out` or `PM2`
"process_id": 0, // the process id used by PM2
"app_name": "one-echo" // the application name
}
ログサイズ制限
モジュール pm2-logrotate は、ディスク上の限られたスペースを使用して、すべてのログファイルを自動的にローテーションおよび保持します。
インストールするには
pm2 install pm2-logrotate
pm2-logrotateについての詳細はこちらをご覧ください。
ログのフラッシュ
これにより、PM2によって管理される現在のアプリケーションログが空になります。
pm2 flush
pm2 flush <api> # Clear the logs for the app with name/id matching <api>
アプリケーションログオプション
アプリケーションを起動するときに、多くのオプションで方法を指定できます
CLI
pm2 start app.js [OPTIONS]
を実行する場合、これらのオプションのいずれかをCLIに渡すことができます。
-l --log [path] specify filepath to output both out and error logs
-o --output <path> specify out log file
-e --error <path> specify error log file
--time prefix logs with standard formatted timestamp
--log-date-format <format> prefix logs with custom formatted timestamp
--merge-logs when running multiple process with same app name, do not split file by id
設定ファイル
設定ファイルを介してオプションを渡すことができます。
フィールド | タイプ | 例 | 説明 |
---|---|---|---|
error_file | (string) | エラーファイルのパス(デフォルトは$HOME/.pm2/logs/<アプリ名>-error-<pid>.log) | |
out_file | (string) | 出力ファイルのパス(デフォルトは$HOME/.pm2/logs/<アプリ名>-out-<pid>.log) | |
log_file | (string) | 出力ログとエラーログ両方のファイルパス(デフォルトでは無効) | |
pid_file | (string) | pidファイルのパス(デフォルトは$HOME/.pm2/pids/<アプリ名>-<pid>.pid) | |
merge_logs | boolean | true | trueに設定すると、ログファイルにプロセスIDをサフィックスで付与することを回避します。 |
log_date_format | (string) | “YYYY-MM-DD HH:mm Z” | ログの日付形式(ログセクションを参照) |
ログサフィックスの無効化
クラスターモード(node.js)のアプリのみ。クラスター化されたプロセスのすべてのインスタンスが同じファイルにログを記録するようにしたい場合は、オプション --merge-logs
または merge_logs: true
を使用できます。
ロギングの無効化
ディスクに書き込まれるすべてのログを無効にするには、オプション out_file
と error_file
を /dev/null
に設定できます。
module.exports = {
apps : [{
name: 'Business News Watcher',
script: 'app.js',
instances: 1,
out_file: "/dev/null",
error_file: "/dev/null"
cron_restart: '0 0 * * *'
[...]
}]
}
ログの出力として /dev/null
または NULL
を指定できます(プラットフォームに依存せず、ハードコードされた文字列です)。
ネイティブのログローテーションの設定
sudo pm2 logrotate -u user
これにより、次のような基本的なログローテーション設定が /etc/logrotate.d/pm2-user
に書き込まれます。
/home/user/.pm2/pm2.log /home/user/.pm2/logs/*.log {
rotate 12
weekly
missingok
notifempty
compress
delaycompress
create 0640 user user
}
最大メモリしきい値の自動再読み込み
PM2では、メモリ制限に基づいてアプリケーションを再読み込みできます(クラスター内ではない場合は再起動に自動的にフォールバックします)。PM2の内部ワーカー(メモリをチェックする)は30秒ごとに開始されるため、メモリしきい値に達した後、プロセスが自動的に再起動されるまでに少し待つ必要があることに注意してください。
CLI
pm2 start api.js --max-memory-restart 300M
設定ファイル (ecosystem.config.js)
module.exports = {
apps: [{
name: 'api',
script: 'api.js',
max_memory_restart: '300M'
}]
}
注: 単位は K(キロバイト)、M(メガバイト)、G(ギガバイト) です。
CPU/メモリの監視

PM2は、アプリケーションのリソース使用量を監視する簡単な方法を提供します。メモリとCPUをターミナルから簡単かつ直接監視できます。
pm2 monit
PM2.io
PM2でNode.jsアプリケーションを管理している場合は、PM2.io を試してみてください。これにより、サーバー全体でのアプリケーションの監視と管理がこれまで以上に簡単になります。
ぜひお試しください。PM2の監視ダッシュボードをご覧ください
PM2 API
PM2はプログラムで利用でき、コードから直接プロセスを管理できます。
クイックスタート
注: PM2への接続を解除し、アプリケーションを自動終了させるには、pm2.disconnect()
でpm2から切断してください。
まず、PM2を依存関係として追加します
npm install pm2 --save
次に、app.jsとpm2-control.jsというスクリプトを作成します。これには以下が含まれます。
const pm2 = require('pm2')
pm2.connect(function(err) {
if (err) {
console.error(err)
process.exit(2)
}
pm2.start({
script : 'api.js',
name : 'api'
}, function(err, apps) {
if (err) {
console.error(err)
return pm2.disconnect()
}
pm2.list((err, list) => {
console.log(err, list)
pm2.restart('api', (err, proc) => {
// Disconnects from PM2
pm2.disconnect()
})
})
})
})
- これにより、ローカルPM2がスポーンまたは接続されます。
- 次に、apiという名前でapp.jsを起動します
- PM2で管理されているすべてのアプリケーションを表示します
- 次に、apiという名前でアプリを再起動します
- そして、PM2から切断します
APIメソッド
pm2.connect([no_daemon_mode], fn)
ローカルPM2に接続するか、新しいPM2インスタンスをスポーンします。
パラメータ | タイプ | デフォルト | 説明 |
---|---|---|---|
[no_daemon_mode] | boolean | false | trueの場合、終了時に自動終了する独立したPM2を実行します |
fn | 関数 | コールバック |
- noDaemonMode: 最初の引数にtrueが渡された場合、pm2はデーモンとして実行されず、関連するスクリプトが終了すると終了します。デフォルトでは、pm2はスクリプトの終了後も存続します。pm2がすでに実行されている場合、スクリプトは既存のデーモンにリンクしますが、プロセスが終了すると終了します。
pm2.disconnect()
ローカルPM2から切断します
pm2.start(process, fn)
プロセスを開始します
パラメータ | タイプ | 説明 |
---|---|---|
プロセス | 文字列/オブジェクト | スクリプトパス(相対)またはオプションを介したオブジェクト |
fn | 関数 | コールバック |
pm2.stop(process, fn)
プロセスを停止します
パラメータ | タイプ | 説明 |
---|---|---|
プロセス | 文字列/数値 | ターゲットプロセスのIDまたは名前 |
fn | 関数 | コールバック |
pm2.restart(process, [options], fn)
プロセスを再起動します
パラメータ | タイプ | 説明 |
---|---|---|
プロセス | 文字列/数値 | ターゲットプロセスのIDまたは名前 |
[オプション] | object | オプション(更新を強制するために updateEnv: true も追加します) |
fn | 関数 | コールバック |
pm2.reload(process, fn)
プロセスをリロードします
パラメータ | タイプ | 説明 |
---|---|---|
プロセス | 文字列/数値 | ターゲットプロセスのIDまたは名前 |
fn | 関数 | コールバック |
pm2.delete(process, fn)
プロセスを削除します
パラメータ | タイプ | 説明 |
---|---|---|
プロセス | 文字列/数値 | ターゲットプロセスのIDまたは名前 |
fn | 関数 | コールバック |
pm2.killDaemon(fn)
pm2デーモンを強制終了します (pm2 kill と同じ)。デーモンが強制終了すると、そのすべてのプロセスも強制終了されることに注意してください。また、強制終了した後でも、デーモンから明示的に切断する必要があることに注意してください。
pm2.describe(process, fn)
pm2.connect(errback)
- 実行中の pm2 デーモン (“God”) に接続するか、デーモンを起動してデーモン化します。起動すると、pm2プロセスはスクリプトの終了後も実行され続けます。
pm2.connect(noDaemonMode, errback)
noDaemonMode
- (デフォルト: false) 最初の引数に true が渡された場合、pm2 はデーモンとして実行されず、関連するスクリプトが終了すると終了します。デフォルトでは、pm2 はスクリプトの終了後も存続します。pm2 が既に実行されている場合、スクリプトは既存のデーモンにリンクしますが、プロセスが終了すると終了します。errback(error)
- pm2 デーモンプロセスへの接続または起動が完了したときに呼び出されます。
pm2.start(options, errback)
- pm2 で管理されるスクリプトを起動します。
pm2.start(jsonConfigFile, errback)
pm2.start(script, errback)
pm2.start(script, options, errback)
pm2.start(script, jsonConfigFile, errback)
script
- 実行するスクリプトのパス。jsonConfigFile
-options
パラメータと同じオプションを含むことができる JSON ファイルへのパス。errback(err,proc)
-script
が開始されたときに呼び出されるエラーバック。proc
パラメータは、pm2 プロセスオブジェクトになります。options
- 次のオプションを含むオブジェクト(これらのオプションの追加説明はこちら)。name
- 後で他のコマンドでプロセスを操作(例:再起動)するために使用できる任意の名前。デフォルトは、拡張子なしのスクリプト名になります(例:"testScript"
("testScript.js"
の場合))。script
- 実行するスクリプトのパス。args
- スクリプトに渡す引数で構成される文字列または文字列の配列。interpreterArgs
- インタープリタプロセスを呼び出すための引数で構成される文字列または文字列の配列。例:「–harmony」または[”–harmony”,”–debug”]。interpreter
が「none」(デフォルトは「node」)以外のものの場合にのみ適用されます。cwd
- プロセスを開始する作業ディレクトリ。output
- (デフォルト:"~/.pm2/logs/app_name-out.log"
) stdout 出力を追加するファイルへのパス。error
と同じファイルにすることができます。error
- (デフォルト:"~/.pm2/logs/app_name-error.err"
) stderr 出力を追加するファイルへのパス。output
と同じファイルにすることができます。logDateFormat
- ログタイムスタンプの表示形式(例:「YYYY-MM-DD HH:mm Z」)。形式は、moment 表示形式です。pid
- (デフォルト:"~/.pm2/pids/app_name-id.pid"
) 開始したプロセスの pid を書き込むファイルへのパス。ファイルは上書きされます。ファイルは pm2 によっては使用されないため、ユーザーはいつでもそのファイルを操作または削除できます。ファイルは、プロセスが停止するかデーモンが強制終了されると削除されます。minUptime
- スクリプトが正常に開始されたと見なされるまでの最小稼働時間。maxRestarts
-min_uptime
より短い時間で終了した場合に、スクリプトが連続して再起動される最大回数。maxMemoryRestart
- 設定されていて、script
のメモリ使用量が設定された数値を超えると、pm2 はscript
を再起動します。人間が理解しやすい接尾辞を使用します。「K」はキロバイト、「M」はメガバイト、「G」はギガバイトなど。例:「150M」。killTimeout
- (デフォルト:1600
)stop
またはrestart
コマンドがSIGINT
シグナルを発行した後、SIGKILL
シグナルで強制的にスクリプトを強制終了するまで待機するミリ秒数。restartDelay
- (デフォルト:0
) 終了したスクリプトを再起動する前に待機するミリ秒数。interpreter
- (デフォルト:'node'
) スクリプトのインタープリタ(例:「python」、「ruby」、「bash」など)。値「none」は、バイナリ実行可能ファイルとして「script」を実行します。execMode
- (デフォルト:'fork'
) 「cluster」に設定すると、クラスタリング(script
の複数インスタンスの実行)が有効になります。詳細はこちら。instances
- (デフォルト:1
) 作成するscript
のインスタンス数。exec_mode
「cluster」でのみ関連します。mergeLogs
- (デフォルト:false
) true の場合、script
のすべてのインスタンスのログファイルを 1 つの stderr ログと 1 つの stdout ログにマージします。「cluster」モードでのみ適用されます。たとえば、pm2 を介して開始された「test.js」の 4 つのインスタンスがある場合、通常は 4 つの stdout ログファイルと 4 つの stderr ログファイルがありますが、このオプションを true に設定すると、stdout ファイルが 1 つ、stderr ファイルが 1 つのみになります。watch
-true
に設定されている場合、script
ファイルの変更時にアプリケーションが再起動されます。force
(デフォルト:false
) デフォルトでは、pm2 は、そのスクリプトがまだ実行されていない場合にのみスクリプトを開始します(スクリプトは、すでに実行中のアプリケーションの名前ではなく、アプリケーションへのパスです)。force
が true に設定されている場合、pm2 はそのスクリプトの新しいインスタンスを開始します。autorestart
(デフォルトtrue
)。false
の場合、pm2 は正常な完了またはプロセスの失敗後に再起動を試みません。cron
executeCommand
write
sourceMapSupport
disableSourceMapSupport
パラメータ | タイプ | 説明 |
---|---|---|
プロセス | 文字列/数値 | ターゲットプロセスのIDまたは名前 |
fn | 関数 | コールバック |
pm2.list(fn)
PM2 で管理されているすべてのプロセスを取得します。
高度なメソッド
pm2.sendDataToProcessId(packet)
ターゲットプロセスにデータを送信します。
パラメータ | タイプ | 説明 |
---|---|---|
packet.id | number | ターゲットプロセス ID |
packet.type | string | process:msg である必要があります。 |
packet.topic | boolean | true である必要があります。 |
packet.data | object | ターゲットプロセスに送信されるオブジェクトデータ |
データは、以下を介してターゲットプロセスによって受信されます。
process.on('message', function(packet) {})
pm2.launchBus(fn)
これにより、PM2 で管理されているプロセスからのメッセージを受信できます。
const pm2 = require('pm2')
pm2.launchBus(function(err, pm2_bus) {
pm2_bus.on('process:msg', function(packet) {
console.log(packet)
})
})
次に、PM2 で管理されているプロセスから
process.send({
type : 'process:msg',
data : {
success : true
}
})
pm2.sendSignalToProcessName(signal, process, fn)
カスタムシステムシグナルをターゲットプロセス名に送信します。
パラメータ | タイプ | 説明 |
---|---|---|
signal | string | システムシグナル名 |
プロセス | string | ターゲットプロセス名 |
fn | 関数 | Callback(err, process) |
pm2.sendSignalToProcessId(signal, process, fn)
カスタムシステムシグナルをターゲットプロセス ID に送信します。
パラメータ | タイプ | 説明 |
---|---|---|
signal | string | システムシグナル名 |
プロセス | number | ターゲットプロセス ID |
fn | 関数 | Callback(err, process) |
プロセス構造
上記のいずれかのメソッドを呼び出すと、変更されたプロセス配列が返されます。このオブジェクトには以下が含まれています。
- processDescription - プロセスに関する情報を含むオブジェクトの配列。各オブジェクトには次のプロパティが含まれています。
- name - 元の start コマンドで指定された名前。
- pid - プロセスの pid。
- pm_id - pm2 God デーモンプロセスの pid。
- monit - 次を含むオブジェクト
- memory - プロセスが使用しているバイト数。
- cpu - 現在プロセスで使用されている CPU の割合。
- pm2_env - プロセスの環境内のパス変数のリスト。これらの変数には以下が含まれます。
- pm_cwd - プロセスの作業ディレクトリ。
- pm_out_log_path - stdout ログファイルのパス。
- pm_err_log_path - stderr ログファイルのパス。
- exec_interpreter - 使用されるインタープリタ。
- pm_uptime - プロセスの稼働時間。
- unstable_restarts - プロセスが経験した不安定な再起動の回数。
- restart_time
- status - "online"、"stopping"、"stopped"、"launching"、"errored"、または "one-launch-status"
- instances - 実行中のインスタンスの数。
- pm_exec_path - このプロセスで実行されているスクリプトのパス。
例
プロセスにメッセージを送信する
pm2-call.js
const pm2 = require('pm2')
pm2.connect(function() {
pm2.sendDataToProcessId({
// id of process from "pm2 list" command or from pm2.list(errback) method
id : 1,
// process:msg will be send as 'message' on target process
type : 'process:msg',
// Data to be sent
data : {
some : 'data'
},
id : 0, // id of process from "pm2 list" command or from pm2.list(errback) method
topic: 'some topic'
}, function(err, res) {
})
})
// Listen to messages from application
pm2.launchBus(function(err, pm2_bus) {
pm2_bus.on('process:msg', function(packet) {
console.log(packet)
})
})
pm2-app.js
process.on('message', function(packet) {
process.send({
type : 'process:msg',
data : {
success : true
}
});
});
PM2 には、アプリケーションを起動し、ファイルの変更時に再起動できる便利な開発ツールが付属しています。
# Start your application in development mode
# it print the logs and restart on file change too
# Two way of running your application :
pm2-dev start my-app.js
# or
pm2-dev my-app.js
RPC メソッドの公開:プロセスアクション
RPC メソッドを公開すると、実行中のプロセスとリアルタイムで対話できます。
これは以下に役立ちます。
- 動作の変更(例:ログをデバッグに切り替える)
- データ構造の取得
- アクションのトリガー
クイックスタート
まず、tx2 モジュールをインストールします。
$ npm install tx2
次に、rpc.js という名前のアプリケーションを作成します。
const tx2 = require('tx2')
tx2.action('hello', (reply) => {
reply({ answer : 'world' })
i})
setInterval(function() {
// Keep application online
}, 100)
そして、それを PM2 で起動します。
$ pm2 start rpc.js
プロセスアクションをトリガーするには、次のコマンドを使用します。
$ pm2 trigger <application-name> <action-name>
# pm2 trigger rpc hello
利用可能な RPC メソッドのリスト
利用可能なすべての RPC メソッドを一覧表示するには
pm2 show <application-name>
# pm2 show rpc
パラメータの渡し
リモート関数にパラメータを渡すには、コールバックに param
属性を追加するだけです。
var tx2 = require('tx2')
tx2.action('world', function(param, reply) {
console.log(param)
reply({success : param})
})
アプリケーションを再起動し、このプロセス関数を PM2 で呼び出します。
pm2 trigger <application-name> <action-name> [parameter]
# pm2 trigger rpc world somedata
Web ダッシュボードからのトリガー
pm2.io に接続されると、アプリケーションから公開されたすべての RPC メソッドが Web インターフェースから表示および操作可能になります。
TX2 API ドキュメント
https://github.com/pm2/tx2/blob/main/API.md
アプリケーションの状態の管理
PM2 を使用すると、バックグラウンドでアプリケーションを簡単に起動/再起動/再読み込み/停止/一覧表示できます。
開始
アプリケーションを開始するには
$ pm2 start api.js
bash コマンド、スクリプト、バイナリなどのあらゆる種類のアプリケーションも起動できます。
$ pm2 start "npm run start"
$ pm2 start "ls -la"
$ pm2 start app.py
開始してログストリームを表示する
アプリを起動してログストリームを確認するには、--attach
オプションを使用します。
$ pm2 start api.js --attach
Ctrl-C で終了すると、アプリはバックグラウンドで実行されたままになります。
引数の渡し
--
の後に渡されたすべてのオプションは、アプリへの引数として渡されます。
$ pm2 start api.js -- arg1 arg2
設定ファイル
複数のアプリケーションを同時に管理する場合、または複数のオプションを指定する必要がある場合は、構成ファイルを使用できます。この ecosystem.config.js ファイルの例
module.exports = {
apps : [{
name : "limit worker",
script : "./worker.js",
args : "limit"
},{
name : "rotate worker",
script : "./worker.js",
args : "rotate"
}]
}
次に、両方のアプリを起動します。
$ pm2 start ecosystem.config.js
構成ファイルの詳細については、こちらをお読みください。
再起動
アプリケーションを再起動するには
$ pm2 restart api
すべてのアプリケーションを再起動するには
$ pm2 restart all
環境変数とオプションの更新
環境変数または PM2 オプションを更新するには、--update-env
CLI オプションを指定します。
$ NODE_ENV=production pm2 restart web-interface --update-env
停止
指定されたアプリケーションを停止するには
$ pm2 stop api
$ pm2 stop [process_id]
それらすべてを停止するには
$ pm2 stop all
注:これにより、PM2 アプリケーションリストからアプリケーションが削除されるわけではありません。アプリケーションを削除するには、次のセクションを参照してください。
削除
アプリケーションを停止して削除するには
$ pm2 delete api
それらすべてを削除するには
$ pm2 delete all
アプリケーションの一覧表示
実行中のすべてのアプリケーションを一覧表示するには
$ pm2 list
# Or
$ pm2 [list|ls|l|status]
アプリケーションを一覧表示する順序を指定するには
$ pm2 list --sort name:desc
# Or
$ pm2 list --sort [name|id|pid|memory|cpu|status|uptime][:asc|desc]
ターミナルダッシュボード
PM2 を使用すると、アプリケーションのリソース使用量を簡単に監視できます。メモリと CPU をターミナルから簡単に監視できます。
pm2 monit

アプリケーションのメタデータを表示
アプリケーションに関するメタデータを表示するには
$ pm2 show api
再起動回数のリセット
再起動カウンターをリセットするには
$ pm2 reset all
メトリクスの公開
カスタムメトリクスをコードに組み込むことで、コード内の値をリアルタイムで監視できます。
クイックスタート
まず、tx2 モジュールをインストールします。
$ npm install tx2
次に、monit.jsというアプリを作成します
const tx2 = require('tx2')
const http = require('http')
let meter = tx2.meter({
name : 'req/sec',
samples : 1,
timeframe : 60
})
http.createServer((req, res) => {
meter.mark()
res.writeHead(200, {'Content-Type': 'text/plain'})
res.write('Hello World!')
res.end()
}).listen(6001)
そして、それを PM2 で起動します。
$ pm2 start monit.js
次に、次のコマンドでメトリクスを表示します。
$ pm2 show [app]
# pm2 show monit
注意: メトリクスは「カスタムメトリクス」セクションにあります。
または、ターミナルベースのインターフェースを使用することもできます
$ pm2 monit
メトリクスヘルパーが利用可能
そして、重要な情報を追跡するための独自のメトリクスをプログラムできます。4種類のプローブが利用可能です
- 単純メトリクス: 即座に読み取ることができる値
- 例:変数の値を監視
- カウンター: 増減する値
- 例:処理中のダウンロード数、接続中のユーザー数
- メーター: イベント/間隔として測定される値
- 例:HTTPサーバーの1分あたりのリクエスト数
- ヒストグラム: 過去5分間に偏った統計的に関連性の高い値のリザーバーを保持し、その分布を調べます
- 例:データベースへのクエリ実行の平均値を監視
APIドキュメント
注意: TX2 APIドキュメントを参照してください
例
単純メトリクス:単純な値のレポート
これにより、即座に読み取ることができる値を公開できます。
const tx2 = require('tx2')
// Here the value function will be called each second to get the value
var metric = tx2.metric({
name : 'Realtime user',
value : function() {
return Object.keys(users).length
}
})
// Here we are going to call valvar.set() to set the new value
var valvar = tx2.metric({
name : 'Realtime Value'
})
valvar.set(23)
カウンター:連続的な値の変化
増減する値。
アクティブなHTTPリクエストをカウントする例
const tx2 = require('tx2')
var http = require('http')
var counter = tx2.counter({
name : 'Active requests'
})
http.createServer(function (req, res) {
counter.inc()
req.on('end', function() {
// Decrement the counter, counter will eq 0
counter.dec()
})
res.writeHead(200, {'Content-Type': 'text/plain'})
res.write('Hello World!')
res.end()
}).listen(6001)
メーター:平均計算値
イベント/間隔として測定される値。
1分あたりのクエリ数をカウントする例
const tx2 = require('tx2')
var http = require('http')
var meter = tx2.meter({
name : 'req/sec',
samples : 1,
timeframe : 60
})
http.createServer(function (req, res) {
meter.mark()
res.writeHead(200, {'Content-Type': 'text/plain'})
res.write('Hello World!')
res.end()
}).listen(6001)
オプション
samplesオプションはレート単位です。デフォルトは1秒です。 timeframeオプションは、イベントが分析される時間枠です。デフォルトは60秒です。
ヒストグラム
過去5分間に偏った統計的に関連性の高い値のリザーバーを保持し、その分布を調べます。
const tx2 = require('tx2')
var histogram = tx2.histogram({
name : 'latency',
measurement : 'mean'
})
var latency = 0
setInterval(function() {
latency = Math.round(Math.random() * 100)
histogram.update(latency)
}, 100)
再起動戦略
PM2でアプリケーションを起動すると、アプリケーションは自動終了、イベントループの空(node.js)、またはアプリケーションがクラッシュした場合に自動的に再起動されます。ただし、次のような追加の再起動戦略も構成できます
PM2ランタイムに新しい再起動モードが実装され、アプリケーションがよりスマートに再起動されるようになりました。例外が発生した場合(例:データベースがダウンしている場合)にアプリケーションをむやみに再起動する代わりに、指数バックオフ再起動は再起動間の時間を段階的に増やし、DBまたは外部プロバイダーへの負荷を軽減します…非常に使いやすいです
$ pm2 start app.js --cron-restart="0 0 * * *"
# Or when restarting an app
$ pm2 restart app --cron-restart="0 0 * * *"
構成ファイルを使用する場合は、cron_restart
属性を使用します
module.exports = {
apps : [{
name: 'Business News Watcher',
script: 'app.js',
instances: 1,
cron_restart: '0 0 * * *',
env: {
NODE_ENV: 'development'
},
env_production: {
NODE_ENV: 'production'
}
}]
}
ファイル変更時の再起動
PM2は、現在のディレクトリまたはそのサブディレクトリでファイルが変更されたときに、アプリケーションを自動的に再起動できます。
CLI経由
$ pm2 start app.js --watch
注意: アプリケーションが--watch
オプションで起動された場合、アプリを停止しても、ファイル変更時に再起動されるのを防ぐことはできません。監視機能を完全に無効にするには、pm2 stop app --watch
を実行するか、pm2 restart app --watch
を介してアプリケーションの再起動時に監視オプションを切り替えます。
構成ファイルを使用する場合は、watch: true
属性を使用します
module.exports = {
script: "app.js",
watch: true
}
次のオプションを使用して、変更を監視するフォルダ、無視するフォルダ、監視するファイルの間隔を指定できます
module.exports = {
script: "app.js",
// Specify which folder to watch
watch: ["server", "client"],
// Specify delay between watch interval
watch_delay: 1000,
// Specify which folder to ignore
ignore_watch : ["node_modules", "client/img"],
}
メモリベースの再起動戦略
PM2では、メモリ制限に基づいてアプリケーションを再読み込みできます(クラスター内ではない場合は再起動に自動的にフォールバックします)。PM2の内部ワーカー(メモリをチェックする)は30秒ごとに開始されるため、メモリしきい値に達した後、プロセスが自動的に再起動されるまでに少し待つ必要があることに注意してください。
CLI
$ pm2 start api.js --max-memory-restart 300M
構成ファイルを使用する場合は、max_memory_restart
属性を使用します
module.exports = {
script: 'api.js',
max_memory_restart: '300M'
}
注:単位は、K(キロバイト)(例:512K
)、M(メガバイト)(例:128M
)、G(ギガバイト)(例:1G
)にできます。
再起動遅延
再起動遅延戦略で自動再起動間の遅延を設定します
CLI
$ pm2 start app.js --restart-delay=3000
構成ファイルを使用する場合は、restart_delay
属性を使用します
module.exports = {
script: 'app.js',
restart_delay: 3000
}
自動再起動なし
これは、1回限りのスクリプトを実行する場合で、スクリプトの実行が完了した場合に、プロセスマネージャーがスクリプトを再起動しないようにする場合に役立ちます。
CLI
$ pm2 start app.js --no-autorestart
構成ファイルを使用する場合は、autorestart
属性を使用します
module.exports = {
script: 'app.js',
autorestart: false
}
特定の終了コードの自動再起動をスキップ
場合によっては、失敗した場合(つまり、ゼロ以外の終了コード)にアプリケーションを自動的に再起動したいが、プロセスマネージャーが正常にシャットダウンした場合(つまり、終了コードが0の場合)に再起動したくない場合があります。
この場合、自動再起動をスキップする必要がある終了コードに設定されたstop_exit_codes
オプションを使用して、PM2を問題なく使用できます
CLI
$ pm2 start app.js --stop-exit-codes 0
または、構成ファイルを使用する場合は、stop_exit_codes
属性を使用します
module.exports = [{
script: 'app.js',
stop_exit_codes: [0]
}]
指数バックオフ再起動遅延
PM2ランタイムに新しい再起動モードが実装され、アプリケーションがよりスマートに再起動されるようになりました。例外が発生した場合(例:データベースがダウンしている場合)にアプリケーションをむやみに再起動する代わりに、指数バックオフ再起動は再起動間の時間を段階的に増やし、DBまたは外部プロバイダーへの負荷を軽減します…非常に使いやすいです
CLI
$ pm2 start app.js --exp-backoff-restart-delay=100
構成ファイルを使用する場合は、exp_backoff_restart_delay
属性を使用します
module.exports = {
script: 'app.js',
exp_backoff_restart_delay: 100
}
アプリケーションが予期せずクラッシュし、--exp-backoff-restart-delay
オプションが有効になっている場合、新しいアプリケーションステータス再起動待ちが表示されます。
pm2 logs
を実行すると、再起動遅延が増加していることもわかります
PM2 | App [throw:0] will restart in 100ms
PM2 | App [throw:0] exited with code [1] via signal [SIGINT]
PM2 | App [throw:0] will restart in 150ms
PM2 | App [throw:0] exited with code [1] via signal [SIGINT]
PM2 | App [throw:0] will restart in 225ms
ご覧のとおり、再起動間の再起動遅延は、再起動間の最大15000ミリ秒に達するまで、指数移動平均で増加します。
その後、アプリケーションが安定モードに戻ると(30秒以上再起動せずに稼働している)、再起動遅延は自動的に0ミリ秒にリセットされます。
HTTPを介して静的ファイルを提供
PM2は、pm2 serve
機能を使用して、非常に簡単に静的ファイルを提供できます。指定されたフォルダから生のファイルを提供することをサポートするか、SPA(シングルページアプリケーション)を提供できます。
CLI
簡単なコマンドでHTTP経由で静的ファイル(フロントエンドアプリなど)を提供します
pm2 serve <path> <port>
<path>
を指定しない場合は現在のフォルダが使用され、ポートの場合のデフォルトは8080
です。--name
や--watch
のような通常のアプリケーションと同じオプションを使用できます。
プロセスファイル
プロセスファイルで、特別なディレクトリを提供したいと宣言できます。これを行うには
module.exports = {
script: "serve",
env: {
PM2_SERVE_PATH: '.',
PM2_SERVE_PORT: 8080
}
}
パスとポートを指定するために、PM2_SERVE_PATH
とPM2_SERVE_PORT
を環境変数に追加するだけで済みます。デフォルトはCLIと同じです。
SPAの提供:すべてをindex.htmlにリダイレクト
すべてのクエリをindex.htmlに自動的にリダイレクトするには、--spa
オプションを使用します
pm2 serve --spa
プロセスファイルを介して
module.exports = {
script: "serve",
env: {
PM2_SERVE_PATH: '.',
PM2_SERVE_PORT: 8080,
PM2_SERVE_SPA: 'true',
PM2_SERVE_HOMEPAGE: './index.html'
}
}
パスワードでアクセスを保護
公開されたファイルへのアクセスを基本的に保護するには、--basic-auth-username
と--basic-auth-password
を使用できます
pm2 serve --basic-auth-username <username> --basic-auth-password <password>
プロセスファイルを介して
module.exports = {
script: "serve",
env: {
PM2_SERVE_PATH: '.',
PM2_SERVE_PORT: 8080,
PM2_SERVE_BASIC_AUTH: 'true',
PM2_SERVE_BASIC_AUTH_USERNAME: 'example-login',
PM2_SERVE_BASIC_AUTH_PASSWORD: 'example-password'
}
}
CLI補完
PM2のタブ補完
pm2 completion install
または、補完スクリプトを~/.bashrcまたは~/.zshrcファイルに手動で追加します
pm2 completion >> ~/.bashrc # or ~/.zshrc
次に、現在のセッションのために.bashrcまたは.zshrcファイルをソースにします
source ~/.bashrc # or ~/.zshrc
この方法で現在のセッションにpm2補完を追加できます
. <(pm2 completion)
グレースフルストップ
プロセスをグレースフルに再起動/リロード/停止できるようにするには、SIGINTシグナルをインターセプトし、アプリケーションを終了させる前に、必要なものすべて(データベース接続、処理ジョブなど)をクリアしてください。
process.on('SIGINT', function() {
db.stop(function(err) {
process.exit(err ? 1 : 0)
})
})
これで、pm2 reload
がグレースフルリロードになります。
強制終了タイムアウトを設定
CLI経由で、これによりタイムアウトが3000ミリ秒に延長されます
pm2 start app.js --kill-timeout 3000
アプリケーション宣言経由で、kill_timeout
属性を使用します
module.exports = {
apps : [{
name: 'app',
script: './app.js',
kill_timeout : 3000
}]
}
グレースフルスタート
場合によっては、アプリケーションがDB/キャッシュ/ワーカーなどとの接続を確立するのを待つ必要がある場合があります。PM2は、アプリケーションをオンライン
と見なす前に待機する必要があります。これを行うには、CLIに--wait-ready
を提供するか、プロセスファイルにwait_ready: true
を提供する必要があります。これにより、PM2はそのイベントをリッスンします。アプリケーションでは、アプリケーションを準備完了と見なすときにprocess.send('ready');
を追加する必要があります。
var http = require('http')
var app = http.createServer(function(req, res) {
res.writeHead(200)
res.end('hey')
})
var listener = app.listen(0, function() {
console.log('Listening on port ' + listener.address().port)
// Here we send the ready signal to PM2
process.send('ready')
})
次に、アプリケーションを起動します
pm2 start app.js --wait-ready
準備完了タイムアウトを設定
デフォルトでは、PM2はready
シグナルを3000ミリ秒待ちます。
CLI経由で、これによりタイムアウトが10000ミリ秒に延長されます
pm2 start app.js --wait-ready --listen-timeout 10000
アプリケーション宣言経由で、listen_timeout
属性とwait_ready
属性を使用します
module.exports = {
apps : [{
name: 'app',
script: './app.js',
wait_ready: true,
listen_timeout: 10000
}]
}
http.Server.listenを使用したグレースフルスタート
http.Server.listen
メソッドにフックするデフォルトのシステムもまだあります。HTTPサーバーが接続を受け入れると、アプリケーションは自動的に準備完了としてステートされます。--wait-ready
グレースフルスタートと同じ変数を使用してリッスンするPM2の待機時間を増やすことができます。プロセスファイルのlisten_timeout
エントリ、またはCLIを介した--listen-timeout=XXXX
。
説明:シグナルの流れ
プロセスがPM2によって停止/再起動されると、特定の順序でいくつかのシステムシグナルがプロセスに送信されます。
最初に、プロセスにSIGINTシグナルが送信されます。これは、プロセスが停止しようとしていることを知るためにキャッチできるシグナルです。アプリケーションが1.6秒(カスタマイズ可能)以内に自動的に終了しない場合は、プロセスを強制終了するためにSIGKILLシグナルを受信します。
シグナルSIGINTは、環境変数PM2_KILL_SIGNALを設定することにより、他のシグナル(例:SIGTERM)に置き換えることができます。
Windowsのグレースフルストップ
シグナルが利用できない場合、プロセスは強制終了されます。その場合は、CLIを介して--shutdown-with-message
を使用するか、エコシステムファイルでshutdown_with_message
を使用し、shutdown
イベントをリッスンする必要があります。
CLI経由
pm2 start app.js --shutdown-with-message
アプリケーション宣言経由で、listen_timeout
属性とwait_ready
属性を使用します
module.exports = {
apps : [{
name: 'app',
script: './app.js',
shutdown_with_message: true
}]
}
shutdown
イベントをリッスン
process.on('message', function(msg) {
if (msg == 'shutdown') {
console.log('Closing all connections...')
setTimeout(function() {
console.log('Finished closing connections')
process.exit(0)
}, 1500)
}
})
BabelJS、Typescript、またはその他のJavascriptスーパーセットを使用している場合は、例外が発生したときに、スタックトレースがまったく意味がないことに気づいたかもしれません。興味深い情報を取得するには、ソースマップファイルを生成する必要があります。
これらのソースマップファイルが生成されると、PM2はそれらを自動的に検出し、エラーの調査に役立ちます。
ソースマップ
バージョン 1.0.2 以降、PM2 は JavaScript のソースマップをサポートするメカニズムを組み込んでいます。
PM2 は JavaScript のソースマップファイルを自動的に検出します。例えば、app.js を起動した場合、app.js.map も存在することを期待します。
異なるレイアウトを使用している場合は、アプリケーションを起動することでソースマップのサポートを強制できます。
CLI経由
pm2 start app.js --source-map-support
または JSON ファイル経由で指定することもできます。
module.exports = {
name: 'babel-app',
script: 'app.js',
source_map_support: true
}
例外の検査
例外は、アプリケーションのエラーログファイルに記録されます。
ログをチェックして例外を検出するには、次のコマンドを入力します。
pm2 logs main
または、keymetrics.io を使用して、新しいアラートを一覧表示したり、通知を受け取ったりできます。
ソースマップサポートの無効化
PM2 が JavaScript のソースマップを自動的にサポートしないようにする場合は、--disable-source-map-support
オプションを使用できます。
これは CLI と JSON ファイルの両方でサポートされています。
root 権限なしでポート 80 をリッスンする
一般的に、Node.js を root 権限で実行すべきではありません。しかし、1024 未満のポートにバインドできるのは root のみです。ここで authbind が役立ちます。Authbind を使用すると、root 権限のないユーザーが 1024 未満のポートにバインドできます。%user%
を pm2
を実行するユーザーに置き換えてください。
sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chown %user% /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80
また、pm2
を実行するユーザーのプロファイル(例えば、~/.bashrc
または ~/.zshrc
)にエイリアスを追加する必要があります(追加後、すぐに source ~/.bashrc
または source ~/.zshrc
を実行する必要があります)。
+alias pm2='authbind --deep pm2'
最後に、pm2
が authbind
で更新されていることを確認してください。
authbind --deep pm2 update
または、ユーザーのプロファイルにエイリアスを追加した場合は、単に pm2 update
を実行してください。
これで、PM2 を使用して、root 権限なしでポート 80 にバインドできるアプリケーションを起動できます!
同一サーバー上での複数 PM2
クライアントとデーモンは、$HOME/.pm2/pub.sock と $HOME/.pm2/rpc.sock にあるソケットファイル経由で通信します。
PM2_HOME
環境変数を変更することで、複数の PM2 インスタンスを起動できます。
PM2_HOME='.pm2' pm2 start echo.js --name="echo-node-1"
PM2_HOME='.pm3' pm2 start echo.js --name="echo-node-2"
これにより、2 つの異なる PM2 インスタンスが起動します。各インスタンスで管理されているプロセスを一覧表示するには、次のコマンドを実行します。
PM2_HOME='.pm2' pm2 list
PM2_HOME='.pm3' pm2 list
デーモンなしで PM2 を起動する
デーモンなしモードで PM2 を起動する前に、必ず PM2 インスタンスを終了させてください(pm2 kill
)。
PM2 をデーモン化せずに起動する
pm2 start app.js --no-daemon
PM2 のインストール時にデフォルトでインストールされる CLI pm2-runtime
もあり、これは Node.js バイナリのドロップイン代替となります。
ステートレスアプリ
一般的に、本番環境アプリケーションはステートレスであるべきです。すべてのデータ、状態、WebSocket セッション、セッションデータは、あらゆる種類のデータベースまたは PUB/SUB システム経由で共有する必要があります。
そうしないと、同一サーバー上および複数のサーバー間でのアプリケーションのスケーリングが困難になります。
例えば、connect-redis を使用してセッションを共有できます。
また、12 ファクターの規約に従うことをお勧めします:http://12factor.net/
サーバーに pm2 を設定する
Ubuntu VPS で Node.js 本番環境を設定するために pm2 を使用する方法.
ログと PID ファイル
デフォルトでは、ログ(エラーと出力)、PID ファイル、ダンプ、および PM2 ログは、~/.pm2/
に保存されます。
.pm2/
├── dump.pm2
├── custom_options.sh
├── pm2.log
├── pm2.pid
├── logs
└── pids
Harmony ES6 の有効化
--node-args
オプションを使用すると、Node.js インタープリターに引数を追加できます。プロセスで Harmony を有効にするには、次のコマンドを入力します。
pm2 start my_app.js --node-args="--harmony"
JSON 宣言内では、次のようになります。
[{
"name" : "ES6",
"script" : "es6.js",
"node_args" : "--harmony"
}]
CoffeeScript
CoffeeScript v1
pm2 install coffee-script
pm2 start app.coffee
CoffeeScript v2
pm2 install coffeescript
pm2 start app.coffee
以上です!
JSON のパイプ
プルリクエスト
#!/bin/bash
read -d '' my_json <<_EOF_
[{
"name" : "app1",
"script" : "/home/projects/pm2_nodetest/app.js",
"instances" : "4",
"error_file" : "./logz/child-err.log",
"out_file" : "./logz/child-out.log",
"pid_file" : "./logz/child.pid",
"exec_mode" : "cluster_mode",
"port" : 4200
}]
_EOF_
echo $my_json | pm2 start -
プロセスタイトル
PM2 でアプリケーションを起動する際に、環境変数 PROCESS_FILE
を指定できます。これにより、プロセスのタイトルが設定されます。例えば、ps -fC name
を使用して、プロセスから特定のデータを取得しようとする場合に非常に役立ちます。
トランスパイラー
PM2 でトランスパイラーを使用するチュートリアルを参照してください。
Issue からのユーザーのヒント
- Vagrant と pm2 #289
- 異なるポートで同じアプリケーションを起動する #322
- pm2 で ansible を使用する
- 引数としての Cron 文字列
- プロセスが特定のメモリ量に達したときに再起動する
- スティッキーセッションと socket.io の議論
- EACCESS - pm2 のユーザー/root 権限を理解する
外部リソースと記事
- PM2 — ユーティリティの概要とインストール
- Ubuntu 16.04 で Node.js アプリケーションを本番環境用に設定する方法
- チュートリアル:AWS で Node.js サーバーを作成および管理する(パート 2)
- さようなら node-forever、こんにちは pm2
- https://www.howtoforge.com/tutorial/how-to-deploy-nodejs-applications-with-pm2-and-nginx-on-ubuntu/
- https://serversforhackers.com/editions/2014/11/04/pm2/
- http://www.allaboutghost.com/keep-ghost-running-with-pm2/
- http://blog.ponyfoo.com/2013/09/19/deploying-node-apps-to-aws-using-grunt
- http://www.allaboutghost.com/keep-ghost-running-with-pm2/
- http://bioselemental.com/keeping-ghost-alive-with-pm2/
- http://blog.chyld.net/installing-ghost-on-ubuntu-13-10-aws-ec2-instance-with-pm2/
- http://blog.marvinroger.fr/gerer-ses-applications-node-en-production-pm2/
- https://www.codersgrid.com/2013/06/29/pm2-process-manager-for-node-js/
- http://www.z-car.com/blog/programming/how-to-rotate-logs-using-pm2-process-manager-for-node-js
- http://yosoftware.com/blog/7-tips-for-a-node-js/
- https://www.exponential.io/blog/nodeday-2014-moving-a-large-developer-workforce-to-nodejs
- http://blog.rapsli.ch/posts/2013/2013-10-17-node-monitor-pm2.html
- https://coderwall.com/p/igdqyw
- http://revdancatt.com/2013/09/17/node-day-1-getting-the-server-installing-node-and-pm2/
- https://medium.com/tech-talk/e7c0b0e5ce3c
永続的なアプリケーション:スタートアップスクリプトジェネレーター
PM2 は、スタートアップスクリプトを生成し、予期されるマシン再起動または予期しないマシン再起動を通じてプロセスリストを維持するように設定できます。
スタートアップスクリプトの生成
スタートアップスクリプトを自動的に生成および設定するには、次のコマンドを(sudo なしで)入力します:pm2 startup
$ pm2 startup
[PM2] You have to run this command as root. Execute the following command:
sudo su -c "env PATH=$PATH:/home/unitech/.nvm/versions/node/v14.3/bin pm2 startup <distribution> -u <user> --hp <home-path>
次に、表示されたコマンドをターミナルにコピー/ペーストします。
sudo su -c "env PATH=$PATH:/home/unitech/.nvm/versions/node/v14.3/bin pm2 startup <distribution> -u <user> --hp <home-path>
これで、PM2 は起動時に自動的に再起動されます。
注:--service-name <name>
オプションでサービス名をカスタマイズできます(#3213)。
再起動時に復元されるアプリリストを保存する
目的のすべてのアプリを起動したら、再起動後に再生成されるようにアプリリストを保存します。
pm2 save
手動でプロセスを復活させる
以前に保存したプロセスを(pm2 save を使用して)手動で復活させるには、次のコマンドを実行します。
pm2 resurrect
スタートアップシステムの無効化
現在のスタートアップ構成を無効化および削除するには、次のコマンドを実行します。
pm2 unstartup
前の行のコードを使用すると、PM2 がプラットフォームを検出できます。または、次のように指定された別の init システムを自分で使用できます。
Node.js のバージョンアップグレード後のスタートアップスクリプトの更新
ローカルの Node.js バージョンをアップグレードする場合は、インストールした最新の Node.js バイナリが実行されるように、必ず PM2 スタートアップスクリプトを更新してください。
最初に、現在のスタートアップ構成を無効化して削除します(そのコマンドの出力をコピー/ペーストします)。
$ pm2 unstartup
次に、新しいスタートアップスクリプトを復元します。
$ pm2 startup
ユーザー権限
スタートアップスクリプトを別のユーザーで実行したいとします。
-u <username>
オプションと --hp <user_home>
を変更するだけです。
pm2 startup ubuntu -u www --hp /home/ubuntu
init システムの指定
必要に応じて、使用するプラットフォームを自分で指定できます(プラットフォームは、上記のいずれかになります)。
pm2 startup [ubuntu | ubuntu14 | ubuntu12 | centos | centos6 | arch | oracle | amazon | macos | darwin | freebsd | systemd | systemv | upstart | launchd | rcd | openrc]
SystemD インストールチェック
# Check if pm2-<USER> service has been added
$ systemctl list-units
# Check logs
$ journalctl -u pm2-<USER>
# Cat systemd configuration file
$ systemctl cat pm2-<USER>
# Analyze startup
$ systemd-analyze plot > output.svg
PM2 が実行されるまでマシンがオンラインになるのを効率的に待機するには、次のコマンドを実行します。
[Unit]
Wants=network-online.target
After=network.target network-online.target
[....]
[Install]
WantedBy=multi-user.target network-online.target
Windows スタートアップスクリプト
Windows 互換のスタートアップスクリプトを生成するには、優れた pm2-installer を参照してください。
サポートされている init システム
- systemd:Ubuntu >= 16、CentOS >= 7、Arch、Debian >= 7
- upstart:Ubuntu <= 14
- launchd:Darwin、MacOSx
- openrc:Gentoo Linux、Arch Linux
- rcd:FreeBSD
- systemv:Centos 6、Amazon Linux
これらの init システムは、pm2 startup
コマンドを使用すると PM2 によって自動的に検出されます。
PM2の更新
PM2 の更新は非常に高速(数秒以内)で、シームレスです。
PM2 を更新するプロセス
最新の PM2 バージョンをインストールする
npm install pm2 -g
コマンドを使用して、メモリ内の PM2 デーモンを更新できるようになりました。
pm2 update
Node.js のバージョンアップグレード
Node.js のインストールをアップグレードする場合は、PM2 を起動する Node.js バージョンも必ず更新してください。
PM2 スタートアップスクリプトを更新するには、次のコマンドを実行します。
$ pm2 unstartup
$ pm2 startup
AWS Elastic Beanstalk での PM2/Keymetrics の使用
このページでは、Beanstalk 環境での PM2/Keymetrics の統合をステップバイステップで説明します。デプロイを簡単にするために、eb cli を使用することをお勧めします。
簡単なテストのために、pm2-ebs-demo リポジトリを作成しました。
Beanstalk の設定
アプリケーションディレクトリに移動し、eb init
を使用して Beanstalk を設定します。
Beanstalk が npm start
を使用してアプリケーションを起動しようとするようにする必要があります。そのためには、アプリケーションを起動するコマンドを指定するために、ソースバンドルのルートに Procfile という名前のファイルを追加します。
./Procfile
web: npm start
PM2 の統合
PM2 を使用してアプリケーションを監視する最も簡単で非侵襲的な方法は、npm モジュールとして要求することです。package.json
構造を少し変更するだけで、pm2 がアプリケーションを起動できるようになります。アプリの依存関係に pm2 を追加するだけです:npm install pm2 --save
次に、起動スクリプトを変更する必要があります。node_modules フォルダーから PM2 を呼び出します。
"scripts": {
"start": "./node_modules/pm2/bin/pm2-runtime app.js",
"poststart": "node ./node_modules/pm2/bin/pm2 logs"
}
"start"
スクリプトをニーズに合わせてカスタマイズします。"poststart"
スクリプトはオプションですが、AWS ダッシュボードで直接簡単なログチェックを実行できます。
以上です!eb deploy
を実行して、オーバーヘッドを最小限に抑えた ElasticBeanstalk インスタンスで PM2 インスタンスを取得します。
Keymetrics との PM2 の統合
Keymetrics とリンクするために、環境から PM2 に 2 つの変数:KEYMETRICS_PUBLIC
と KEYMETRICS_SECRET
を渡す必要があります。
- CLI から環境を作成する場合:
eb create --envvars KEYMETRICS_PUBLIC=XXXXX,KEYMETRICS_SECRET=XXXXXX
- これらの変数は、AWS ダッシュボードの [ソフトウェア構成] オプションにも追加できます。
次に、pm2 の統合手順に従うと、pm2 は起動時にアプリケーションを自動的にリンクします。
クラウドプロバイダーでの PM2 の使用
Node.js アプリケーションを起動するために CLI にアクセスできない状況が発生する可能性があります。
このような状況では、pm2 を依存関係として追加し、start スクリプトで呼び出す必要があります。
アプリの準備
エコシステムファイルの設定
ecosystem.config.js
テンプレートを生成するには、次のコマンドを実行します。
pm2 init
エコシステムファイルをニーズに合わせて変更します。
module.exports = {
apps : [{
name: "app",
script: "./app.js",
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
}
}]
}
エコシステムファイルの詳細については、こちらを参照してください。
モジュールとしての PM2 の追加
PM2 をプロジェクトの依存関係として追加します。
npm を使用する場合
npm install pm2
yarn を使用する場合
yarn add pm2
package.json の start スクリプト
package.json
で、start
スクリプトを次のように変更します。
{
"scripts": {
"start": "pm2-runtime start ecosystem.config.js --env production"
}
}
アプリのデプロイ
これで、通常の node.js アプリの場合と同様に、クラウドプロバイダーにアプリケーションをデプロイできます。
ファイル変更時のアプリの自動再起動
PM2は、現在のディレクトリまたはそのサブディレクトリでファイルが変更されたときに、アプリケーションを自動的に再起動できます。
pm2 start app.js --watch
または、構成ファイルで watch: true
オプションを設定します。
アプリケーションが--watch
オプション付きで起動された場合、アプリケーションを停止しても、ファイルの変更時に再起動が阻止されることはありません。watch機能を完全に無効にするには、pm2 stop app --watch
を実行するか、アプリケーションの再起動時にpm2 restart app --watch
でwatchオプションを切り替えてください。
特定のパスを監視するには、Ecosystemファイルを使用してください。watch
には、文字列またはパスの配列を指定できます。デフォルトはtrue
です。
module.exports = {
apps: [{
script: "app.js",
watch: ["server", "client"],
// Delay between restart
watch_delay: 1000,
ignore_watch : ["node_modules", "client/img"],
}]
}