⚙️ Node.js + PM2

Node.js 應用程序管理與叢集模式

PM2 是 Node.js 應用的生產環境程序管理工具,支援零停機重啟(reload)、多核心叢集(cluster mode)、日誌輸出管理與系統啟動整合。

安裝

$ # 先安裝 Node.js(建議使用 nvm 或 NodeSource)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

# 安裝 PM2
sudo npm install -g pm2
pm2 --version

基本操作

$ pm2 start app.js --name myapp     # 啟動應用
pm2 start app.js -i max            # 叢集模式(使用所有 CPU)
pm2 list                           # 查看所有應用狀態
pm2 monit                          # 即時監控 CPU/記憶體
pm2 stop myapp                     # 停止
pm2 restart myapp                  # 重啟
pm2 reload myapp                   # 零停機重載(叢集模式)
pm2 delete myapp                   # 停止並移除
pm2 describe myapp                 # 查看詳細資訊

Ecosystem 設定檔(ecosystem.config.js)

將應用程式設定集中管理,適合多服務或多環境部署:

module.exports = {
  apps: [
    {
      name: 'api-server',
      script: './src/server.js',
      instances: 'max',          // 或指定數字,如 4
      exec_mode: 'cluster',
      env: {                     // 開發環境變數
        NODE_ENV: 'development',
        PORT: 3000,
      },
      env_production: {          // 生產環境變數
        NODE_ENV: 'production',
        PORT: 3000,
        DB_HOST: 'localhost',
      },
      error_file: '/var/log/pm2/api-error.log',
      out_file:   '/var/log/pm2/api-out.log',
      max_memory_restart: '512M', // 記憶體超過時自動重啟
    }
  ]
};
$ pm2 start ecosystem.config.js --env production
pm2 reload ecosystem.config.js --env production  # 更新設定並重載

叢集模式說明

叢集模式讓 PM2 建立多個 Node.js 程序,充分利用多核 CPU:

$ pm2 start app.js -i max --name api   # max = CPU 核心數
pm2 scale api +2                      # 動態增加 2 個實例
pm2 scale api 4                       # 調整為固定 4 個實例
💡 pm2 reload(而非 restart)在叢集模式下會逐一重啟每個實例,確保服務不中斷。

設定開機自動啟動

$ # 產生 systemd 設定(依提示執行輸出的 sudo 指令)
pm2 startup

# 儲存目前運行中的應用清單
pm2 save

# 之後重啟伺服器,PM2 會自動恢復所有應用

日誌管理

$ pm2 logs              # 查看所有應用的即時日誌
pm2 logs myapp        # 查看特定應用的日誌
pm2 logs --lines 200  # 查看最後 200 行
pm2 flush             # 清空所有日誌
$ # 安裝 pm2-logrotate 自動輪替日誌
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7