PM2簡易使用手冊
很簡單也很水,就是我今天因為公司專案正好在研究這個東西,權當自己記錄了,不喜勿噴~~~萬分感謝
背景
對於線上專案,如果直接通過 node app 來啟動,如果報錯了可能直接停止導致整個服務崩潰,一般監控 node 有幾種方案。
- supervisor: 一般用作開發環境的使用。
- forever: 管理多個站點,一般每個站點的訪問量不大的情況,不需要監控。
- PM2: 網站的訪問量比較大,需要完整的監控頁面。
公司原來的專案採用的是 forever 的形式,不過如果 node 出現問題的時候,沒有辦法獲取到有效的監控資料進行錯誤排查,因此新開發的系統準備採用 pm2 的形式進行前端以及 node 層的監控。
PM2 的主要特性
- 內建負載均衡(使用 Node cluster 叢集模組)
- 後臺執行
- 0 秒停機過載,我理解大概意思是維護升級的時候不需要停機.
- 具有 Ubuntu 和 CentOS 的啟動指令碼
- 停止不穩定的程序(避免無限迴圈)
- 控制檯檢測
- 提供 HTTP API
- 遠端控制和實時的介面 API ( Nodejs 模組,允許和 PM2 程序管理器互動 )
安裝
// 全域性安裝pm2,依賴node和npm npm install -g pm2 複製程式碼
用法
- 基本啟動命令
pm2 start
// start命令啟動對應的node server檔案 $ pm2 start ./build/server.js 複製程式碼
- 通過配置檔案進行啟動稍後詳細講解
啟動之後,控制檯會看到如下訊息:

如上圖所示,可以看到專案 kafazhe
成功啟動,id 是 0,並且狀態時 online.
- 檢視詳細狀態資訊
pm2 show (appname|id)
$ pm2 show kaifazhe 複製程式碼

如上圖所示,可以檢視到 kaifazhe 程序的詳細資訊
- 檢視所有啟動的程序列表
pm2 list
$ pm2 list 複製程式碼

- 監控每個 node 程序的 cpu 和記憶體使用情況
pm2 monit
$ pm2 monit 複製程式碼

可以使用 pm2 monit 功能監控所有 node 程序的執行情況,包括各種響應,錯誤資訊。
- 顯示所有程序的日誌資訊
pm2 logs
$ pm2 logs 複製程式碼

- 監控執行這些程序的機器的狀態
pm2 web
$ pm2 web 複製程式碼



我只能說,這也太 NB 了吧,不僅可以監控這些程序,還能監控執行這些程序的機器的狀態,逆天了。然後它會自動起一個服務在指定埠,如圖在 9615 啟動了一個服務,我們可以訪問。雖然我看不太懂,但是對於測試運維同學來說,應該挺有用的吧。
- 停止 指定/所有 程序
pm2 stop (id|all)
// 停止id為0的程序 $ pm2 stop 0 // 停止所有程序 $ pm2 stop all 複製程式碼

如圖,我們運行了兩個服務狀態都是 online,使用 stop 0 之後,kaifazhe 的服務變成了 stopped,然後使用 stop all,所有程序狀態全變成了 stopped。
- 重啟 指定/所有 程序
pm2 restart (id|all)
// 重啟id為0的程序 $ pm2 restart 0 // 重啟所有程序 $ pm2 restart all 複製程式碼
- 殺死 指定/所有 程序
pm2 delete (id|all)
// 殺死id為0的程序 $ pm2 delete 0 // 殺死所有程序 $ pm2 delete all 複製程式碼

從上圖我們可以看出,restart 0 之後,0 程序從 stopped 狀態變成了 online,然後我們使用 delete 0,程序 0 就消失不見了,我們再 delete all,可以看到現在沒有任何程序在執行。
配置 PM2 啟動檔案
pm2 啟動的方式可以進行很多的擴充套件,比如設定環境,設定錯誤資訊列印,設定輸入資訊列印等等高階功能。那麼一條命令就不能完成這些任務,所有 pm2 提供了配置檔案的方式來啟動~
pm.config.js
// 名稱任意,按照個人習慣來 module.exports = { apps: [ { name: 'kaifazhe', // 應用名稱 script: './build/server.js', // 啟動檔案地址 cwd: './', // 當前工作路徑 watch: [ // 監控變化的目錄,一旦變化,自動重啟 'src', 'build', ], ignore_watch: [ // 忽視這些目錄的變化 'node_modules', 'logs', 'public', ], node_args: '--harmony', // node的啟動模式 env: { NODE_ENV: 'development', // 設定執行環境,此時process.env.NODE_ENV的值就是development ORIGIN_ADDR: 'http://www.yoduao.com' }, env_production: { NODE_ENV: 'production', }, out_file: './logs/out.log', // 普通日誌路徑 error_file: './logs/err.log', // 錯誤日誌路徑 merge_logs: true, log_date_format: 'YYYY-MM-DD HH:mm Z', }, ], }; 複製程式碼
對於上面的 env,我們可以在內部新增很多個引數變數,這樣我們所使用的process.env.XXX 就會對應發生變化,例如上面,我們 process.env.ORIGIN_ADDR 的值就是 http://www.youdao.com
~
負載均衡
最 666 的功能來了~自動給你做負載均衡,只需要一條命令,以前那些複雜的概念懂不懂無所謂。
pm2 start server.js -i (number|max)
# 開啟三個程序執行專案 pm2 start app.js -i 3 # 根據機器CPU核數,開啟對應數目的程序執行專案 pm2 start app.js -i max 複製程式碼
配置檔案裡對應的: "instance": (number|max)
// pm2.config.js "instances": 2,// 啟動兩個例項 複製程式碼