シングルページドキュメント

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]

https://i.imgur.com/LmRD3FN.png

ログの表示

リアルタイムでログを表示するには

$ pm2 logs

古いログを詳しく調べるには

$ pm2 logs --lines 200

ターミナルベースのダッシュボード

これは、ターミナルに直接収まるリアルタイムダッシュボードです。

$ pm2 monit

https://i.imgur.com/xo0LDb7.png

pm2.io:監視と診断のためのWebインターフェース

Webベースのダッシュボード、診断システムを備えたクロスサーバー

$ pm2 plus

https://i.imgur.com/sigMHli.png

クラスタモード

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”} injectpm2 restart app.yml --envを実行する場合
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 ミリ秒を意味します。
    • 文字列 そのため、設定を簡単かつ短くするために、hms を使用します。例:"min_uptime": "1h" は1時間、"min_uptime": "5m" は5分、"min_uptime": "10s" は10秒を意味します(これらはミリ秒に変換されます)。
  • max_memory_restart の値は、次のいずれかになります。
    • 数値 例:"max_memory_restart": 1024 は 1024 バイト(ビットではなく)を意味します。
    • 文字列 そのため、設定を簡単かつ短くするために、GMK を使用します。例:"max_memory_restart": "1G" は1ギガバイト、"max_memory_restart": "5M" は5メガバイト、"max_memory_restart": "10K" は10キロバイトを意味します(これらはバイトに変換されます)。
  • オプションの値 例:exec_mode は、取りうる値として clustercluster_mode)または forkfork_mode)を取ることができます。

  • 知っておくべきこと
    • "instances": 0 は、PM2 が CPU の数に応じて可能な限り最大のプロセス数を起動することを意味します(クラスターモード)。
    • 配列 argsnode_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 ドキュメントの仕組みを参照してください。

http://i.imgur.com/kTAowsL.png

使い方

クラスターモードを有効にするには、-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_modecluster に設定する必要があります。デフォルトでは、ロードバランシングは行われません。

次に、プロセスファイルを起動します。

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-runtimepm2-devに置き換えると、ウォッチおよび再起動機能が有効になります。これは、ホストファイルがVOLUMEとしてコンテナに公開されている開発コンテナでは非常に興味深いものです。

PM2.io の利用

Keymetrics.io は、PM2上に構築された監視サービスであり、アプリケーションの監視と管理(ログ、再起動、例外監視など)を簡単に行うことができます。Keymetricsでバケットを作成すると、公開キーと秘密キーを取得できます。

pm2-runtimeでKeymetricsの監視を有効にするには、CLIオプションの –public XXX–secret YYY を使用するか、環境変数 KEYMETRICS_PUBLICKEYMETRICS_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-configNODE_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_fileerror_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

image

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]

image

アプリケーションを一覧表示する順序を指定するには

$ 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

drawing

再起動回数のリセット

再起動カウンターをリセットするには

$ 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_PATHPM2_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)
  }
})

BabelJSTypescript、またはその他の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'

最後に、pm2authbind で更新されていることを確認してください。

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 からのユーザーのヒント

外部リソースと記事

永続的なアプリケーション:スタートアップスクリプトジェネレーター

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_PUBLICKEYMETRICS_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"],
  }]
}
このページに貢献する