2019-02-09

正式環境使用 PM2 啟動 Node.js app

以往開發 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




沒有留言:

FB 留言