PM2 是 Node.js 服務常用的 process manager,可以啟動服務、維持背景執行、監控記憶體、管理日誌,並用 cluster 模式啟動多個進程。若 Node.js 服務要長時間在線,PM2 是很實用的基礎工具。
PM2 基本操作有哪些?
PM2 基本操作包含安裝、啟動、重啟、監控與記憶體限制。開發者先熟悉這幾個指令,就能處理多數 Node.js 服務管理情境。
```bash
npm install pm2 -g
pm2 start app.js
pm2 start app.js -i N --name SERVICE_NAME
pm2 restart SERVICE_NAME
pm2 start app.js --max_memory_restart 1024M
pm2 monit
```
原文的 `npm restart SERVICE_NAME` 比較像 npm script 用法;PM2 管理服務時,建議使用 `pm2 restart SERVICE_NAME`。
如何判斷 PM2 要開幾個進程?
PM2 cluster 進程數通常會參考 CPU 核心數與服務負載。CPU-bound 任務不能只靠多開進程解決,I/O-bound Node.js API 則常用 cluster 提升吞吐。
Linux 查看 CPU 資訊:
```bash
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
cat /proc/cpuinfo | grep "cpu cores" | uniq
cat /proc/cpuinfo | grep "processor" | wc -l
```
實務上可以先用邏輯 CPU 數作為上限,再透過壓力測試觀察 CPU、記憶體、response time 與錯誤率。
PM2 需要搭配 Nginx 嗎?
PM2 負責 Node.js process 管理,Nginx 負責反向代理、TLS、快取與負載分流。正式服務通常會讓 Nginx 站在 PM2 前面。
Nginx 常見用途:
- 反向代理,把外部流量導到 Node.js port。
- 簡單負載均衡,支援多台伺服器或多個 port。
- 靜態資源快取,提高 JS、CSS、圖片等資源回應效率。
- TLS 憑證與 HTTP header 管理。
若只有內部小工具,PM2 單獨使用也可以。若要面向公開網路,建議搭配 Nginx 或雲端 load balancer。
PM2 日誌在哪裡?
PM2 日誌預設存放在 `$HOME/.pm2/`。應用服務的 stdout 與 stderr 會分開保存,方便排查錯誤。
PM2 相關日誌位置:
| 類型 | 預設位置 |
|---|---|
| PM2 自身日誌 | `$HOME/.pm2/pm2.log` |
| 應用標準輸出 | `$HOME/.pm2/logs/${APP_NAME}_out.log` |
| 應用錯誤輸出 | `$HOME/.pm2/logs/${APP_NAME}_error.log` |
正式環境還要搭配 log rotation,避免長期運行後磁碟被 log 塞滿。
如何用 ecosystem 設定檔啟動 PM2?
PM2 ecosystem 設定檔可以把服務名稱、script、instance、記憶體限制與 log 路徑寫成版本化設定。多人維護服務時,比手動輸入指令更穩定。
常見操作:
```bash
pm2 ecosystem
pm2 startOrRestart /file/path/ecosystem.json
```
範例設定:
```js
{
apps: [
{
name: "nova",
max_memory_restart: "300M",
script: "/root/nova/app.js",
out_file: "/logs/nova_out.log",
error_file: "/logs/nova_error.log",
instances: 4,
exec_mode: "cluster",
env: {
NODE_ENV: "production"
}
}
]
}
```
這個設定使用 cluster 模式啟動 4 個服務進程;如果服務記憶體超過 300M,PM2 會自動重啟。
PM2 如何支援自動化部署?
PM2 deploy 可以把遠端主機、Git repo、部署路徑與 post-deploy 指令寫進設定檔。小型服務可以用這種方式快速建立部署流程。
`process.json` 範例:
```json
{
"apps": [{
"name": "HTTP-API",
"script": "http.js"
}],
"deploy": {
"production": {
"user": "ubuntu",
"host": ["192.168.0.13"],
"ref": "origin/master",
"repo": "[email protected]:Username/repository.git",
"path": "/var/www/my-repository",
"post-deploy": "npm install; grunt dist"
}
}
}
```
部署指令:
```bash
pm2 deploy production setup
pm2 deploy production update
pm2 deploy production revert 1
pm2 deploy production exec "pm2 reload all"
```
若團隊已使用 GitHub Actions、GitLab CI 或雲端部署平台,PM2 deploy 可以只保留給簡單服務,不必勉強取代完整 CI/CD。
常見問題
PM2 是什麼?
PM2 是 Node.js process manager,用來管理背景服務、重啟、cluster、監控與日誌。PM2 特別適合需要長時間運行的 Node.js API。
PM2 可以自動重啟當掉的服務嗎?
PM2 可以在服務崩潰後自動重啟,也可以設定記憶體超過門檻後重啟。正式環境仍應搭配監控與告警。
PM2 cluster 要開幾個 instances?
PM2 cluster instances 可先參考 CPU 邏輯核心數。最終數量應透過壓力測試與實際監控決定。
PM2 和 Nginx 是替代關係嗎?
PM2 和 Nginx 不是替代關係。PM2 管理 Node.js process,Nginx 處理反向代理、TLS、快取與流量入口。
PM2 log 需要清理嗎?
PM2 log 需要清理或輪替。長時間運行的服務若沒有 log rotation,可能因 log 檔過大造成磁碟空間問題。
參考資料
- PM2 官方文件:https://pm2.keymetrics.io/docs/usage/quick-start/
- PM2 ecosystem file:https://pm2.keymetrics.io/docs/usage/application-declaration/
- PM2 deployment:https://pm2.keymetrics.io/docs/usage/deployment/
最後更新
Sun Oct 06 2019 08:00:00 GMT+0800 (Taiwan Standard Time)
延伸閱讀
關於作者 {#author}
Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。
首次發布:2019-10-06
