Node.js PM2:正式環境的最佳程序管理器與自動化維運

在正式環境中,你絕對不能直接使用 node app.js 來啟動服務。一旦發生未預期的報錯(如資料庫連線超時),程式會直接終止,導致網站掛掉。PM2 (Process Manager 2) 是 Node.js 生態系中最受歡迎的進階程序管理器,它能確保你的服務 24/7 永不中斷。

PM2 的核心價值

  • 守護行程 (Daemon):程式崩潰時自動重啟。
  • 叢集模式 (Cluster Mode):充分利用多核心 CPU 的效能。
  • 日誌管理:自動收集與美化日誌。
  • 零停機部署 (Zero-downtime):讓使用者在更新期間完全感覺不到服務中斷。

基礎指令速查

安裝:npm install pm2 -g

  • 啟動並命名pm2 start app.js --name "web-api"
  • 查看狀態pm2 list (或 pm2 status)
  • 即時監控pm2 monit (查看 CPU/記憶體使用率)
  • 查看日誌pm2 logs
  • 停止/重啟pm2 stop web-api / pm2 restart web-api

進階:Cluster 模式(壓榨 CPU 效能)

Node.js 是單執行緒的,預設只能用到 CPU 的一個核心。PM2 的 Cluster 模式能根據核心數啟動多個實例,這在生產環境是必開的功能。

# 啟動與核心數相同的實例數量
pm2 start app.js -i max

專業配置:Ecosystem File

與其每次手動輸入參數,不如撰寫 ecosystem.config.js 定義檔,這對版本控制與團隊協作非常有幫助。

module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      instances: 'max', // 使用 Cluster 模式
      exec_mode: 'cluster',
      watch: false, // 正式環境建議關閉監聽檔案變動
      max_memory_restart: '1G', // 記憶體超過 1GB 自動重開,防止漏水
      env: {
        NODE_ENV: 'development',
      },
      env_production: {
        NODE_ENV: 'production',
        PORT: 80,
      },
    },
  ],
};

一鍵啟動pm2 start ecosystem.config.js --env production

運維必備:開機自啟動與 Reload

  1. 開機自啟動:執行 pm2 startup 並照著螢幕輸出的指令複製貼上。完成後執行 pm2 save 凍結當前列表。
  2. 零停機重啟 (Reload)pm2 reload all

    [!NOTE] restart 會中斷所有連線再重開;reload 會逐一替換實例,確保任何時刻都有 Worker 在提供服務。

總結

  1. PM2 是 Node.js 應用程式在正式環境中的「保護傘」。
  2. 善用 Cluster 模式 能讓你的伺服器吞吐量瞬間提升數倍。
  3. 始終使用 Ecosystem 文件 管理配置,這是專業開發者的基本修養。