以往開發 Node.js app 時常使用 nodemon 在測試環境中啟動 app,其 watch 的功能,可以在檔案變更後自動重新啟動 app,對開發人員來說相當方便。
不過當 app 要發佈到遠端的虛擬機及設定比較複雜時,PM2 似乎是比較理想的工具。個人的一個專案需求是,production 會同時需要 http 及 https, development 則只需使用 http,而且 http port number 不同。
PM2 說明文件
以下是大致上的使用步驟:
1. 安裝 PM2 (使用 ubuntu 18.04)
sudo npm i -g pm2
2. 在專案的資料夾內初始化建立 PM2 的設定檔 ecosystem.config.js
pm2 init
3. 修改 ecosystem.config.js
apps: [{
name: 'der_linebot',
script: 'app.js',
output: './logs/output.log',
error: './logs/error.log',
// log: './logs/combined.log',
// Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
args: 'one two',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'development',
HTTP_PORT: 3000,
HTTPS_PORT: 3002
},
env_production: {
NODE_ENV: 'production',
HTTP_PORT: 80,
HTTPS_PORT: 443
}
}],
主要是設定 logs 的輸出資料夾及檔名。另外就是開發和正式環境使用不同的埠號。
4. 設定 package.json 的 scripts
"scripts": {
"dev": "pm2 start",
"pro": "sudo pm2 start --env production"
},
5. 在正式環境時,已經使用 sudo 以 root 的權限啟動,但還是發生某些檔案讀取時發生權限不足的問題。又不想切換成為系統管理者(su root)。解法是完全停掉 pm2 後(sudo pm2 kill),將 ~/.pm2/ 裡的 .sock 檔變更所有者及所有者群組,例如:
sudo chown shinder:shinder /home/shinder/.pm2/rpc.sock /home/shinder/.pm2/pub.sock