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
- 先產生一個
ecosystem.config.js
- 設置範例
module.exports = {
apps : [{
name: "app",
script: "./app.js",
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
}
}]
}
- 運行指令
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變得更進化啦
進化為 Dev & Production 皆可適應的雙棲動物
獻唱一首蔡健雅的雙棲動物
很想哭~ 哭完無助~
打完收工!