Node.js + PM2 設置環境變數,更彈性地開發與部屬

Node.js + PM2 設置環境變數,更彈性地開發與部屬

背景

在使用 node.js 時一定會遇到
開發(dev)生產(production),甚至更多階段的不同環境
可能每一種環境都有不同的設定檔案
例如:
開發階段要連線到本機的資料庫
生產階段要連線到另一台伺服器的資料庫
這時候就需要更彈性的來做設定

在 Node.js 設定 config

可以針對不同的階段環境來設定各種連線參數
例如:

const env = process.env.NODE_ENV; // 'dev' or 'prod'
const configs = {}
configs.dev = {
  db: {
    host: 'YourHost1',
    port: 3306,
    user: "YourUser",
    password: 'yourPassword1',
    database: 'YourDB1'
  }
};

configs.prod = {
  db: {
    host: 'YourHost2',
    port: 3306,
    user: "YourUser2",
    password: 'yourPassword2',
    database: 'YourDB2'
  }
}

module.exports = configs[env];

如此一來 Node.js 就會根據環境變數來 exports 不同的設定

使用 PM2 來運行 Node.js 時

PM2 是一個 node 的程序管理器
主要功能有自動重啟服務, 叢集功能更有效的利用多核CPU等等
網路上介紹非常多,可以參考這些連結來看介紹與用法

我主要想分享的是,當我們使用 PM2 時
希望在叢集模式(cluster)下運行Node服務,又要設定環境變數時的作法
一開始直覺的想法是直接都打在參數

後來發現比較好的做法,是設置一個PM2的參數設定檔
(後來才發現其實官方的文件就寫得很清楚了)

使用 Ecosystem File

PM2官方文件

  1. 先產生一個ecosystem.config.js
  2. 設置範例
module.exports = {
  apps : [{
    name: "app",
    script: "./app.js",
    env: {
      NODE_ENV: "development",
    },
    env_production: {
      NODE_ENV: "production",
    }
  }]
}
  1. 運行指令
pm2 start ecosystem.config.js --env production

這裡值得留意的是
在上面的例子中,--env這個參數後面接是production而不是env_production
我原本想說應該是要輸入設定檔的 Object key
結果直接失敗,我還不夠難嗎?
差點躺在床上蓋著面被抱著自己哭出來

後來又發現其實在更下面的官方文件
又有說明了

Example:

# Inject what is declared in env_production
pm2 start process.json --env production

# Inject what is declared in env_staging
pm2 restart process.json --env staging

( 害我不能怪官方沒寫清楚了 )
( 改怪他怎麼分那麼開好了 QQ )

廢話時間

改造完自己的設置
是不是覺得自己的Node.js Server變得更進化啦
evolution
進化為 Dev & Production 皆可適應的雙棲動物
獻唱一首蔡健雅的雙棲動物

很想哭~ 哭完無助~

打完收工!