新しいプロセスを開始する場合
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
変数をインクリメントしたいことを認識します。 - PM2は、デフォルトが
3000
に定義されていることを認識します。 - 最初のインスタンスは
process.env.PORT = 3000
を持ち、2番目のインスタンスはprocess.env.PORT = 3001
を持ちます。
注 : pm2 scale myapp 4
を使用してスケーリングする場合にもインクリメントされます。両方の新しいインスタンスは、 PORT
変数として 3002
と 3003
を持ちます。