目次




PM2で環境ごとに環境変数を設定する

1. jsonファイルで環境変数私

本格的にNode.jsのアプリを開発していると、環境ごとに環境変数の値を変更したいことが多いです。有名なものだとNODE_ENVのような変数だったり、ファイルの保存先ディレクトリだったり、APIのエンドポイントだったり、と様々です。

PM2では起動時に、環境変数を指定してNode.jsのインスタンスを立ち上げることが可能です。

具体的にはまず、起動用の設定ファイルに、以下のような記述(envenv_production)を追加します。

// pm2config.json { "name": "myapp", //이것이 현재 돌아가고 있는 어플의 이름이됨. 나중에 stop 시킬 때 name에서 설정한 이름을 사용함. pm2 stop myapp "script": "app.js", //디렉토리 구성은 app.js(실행파일)과 pm2설정 파일이 같은 디렉토리에 위치하는 것 "env": { "NODE_ENV": "local", "SECRET_KEY": "my-local-secret" }, "env_production": { "NODE_ENV": "production", "SECRET_KEY": "my-production-secret" } }

そして、以下のようにコマンドで利用することで、環境変数をインスタンスに渡します。

# envを指定しない場合には、設定ファイル内のenvが利用されます。
$ pm2 start pm2config.json

# envを指定すると、該当の環境(env_xxxの「xxx」の部分)の環境変数が適用されます。
$ pm2 start pm2config.json --env production

と、こんな感じで、簡単に環境変数を使い分けることができます。上記はenv_productionですが、env_localenv_developなど、複数の環境ごとに指定することも可能です。便利♪

アプリ側で、例えば以下のような出力をしている場合には、

// 環境変数のテスト(PM2の設定ファイルより指定)
console.log('NODE_NEV:', process.env.NODE_ENV);
console.log('SECRET_KEY:', process.env.SECRET_KEY);

pm2 logsより、その出力を確認することができます。

$ pm2 logs
3|myapp    | NODE_NEV: production                          <==== ここ
3|myapp    | SECRET_KEY: my-production-secret              <==== ここ
3|myapp    | Express app starts, linstening port on 3000.


2. CMDで環境変数渡し

$ NODE_ENV=development PORT=3004 pm2 start app.js --name=3004
環境変数として渡したPORTの番号は下記のコードでNodejsから手に入れられる。
const port = process.env.PORT






3. Shell scriptで複数のpm2コマンド渡し



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!bin/bash
 
if [ $# -ne 1 ]; then
  echo "argument of processNum is nessacery" 1>&2
  exit 1
fi
 
cd '/srv/app/'
for i in `seq 3000 $((3000 + $1 - 1))`
do
  echo "PORT=${i} pm2 start app.js --name=${i}" 1>&2
  PORT=${i} pm2 start app.js --name=${i}
done
 
exit 0
 
cs







今回のサンプルコード

今回のサンプルコードは、下記におきましたので、適宜ご参照いただけたら幸いです。

https://github.com/yoheiMune/node-playground/tree/master/010-pm2



参考資料

下記ドキュメントを参照しました。ありがとうございます。

PM2 - Environment management(公式、英語)



最後に

pm2には色々な機能が備わっていて助かります。本番で利用するための設定を他にもいくつか行なっているので、その辺も今後ブログにアウトプットできたらなと思います。

最後になりますが本ブログでは、Node.js・Linux・インフラ・開発環境・Python・フロントエンド・Go言語・Swift・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!

+ Recent posts