PM2入門實踐指南

VALR發表於2018-06-26

PM2簡介

 PM2(Process Manager 2)是一個基於Node.js開發的應用程式管理器,支援多種指令碼語言(ruby,python,bash等等)

 提供了效能/程式實時監控,負載均衡(僅限於node.js),自動重啟,日誌管理等等。

PM2重要特性

1.內建負載均衡(使用Node cluster 叢集模組、子程式)

2.執行緒守護,keep alive

3.0秒停機過載,維護升級的時候不需要停機.

4.Linux (stable) & MacOSx (stable) & Windows (stable).多平臺支援

5.停止不穩定的程式(避免無限迴圈)

6.控制檯實時監測執行情況

7.提供 HTTP API

8.遠端控制和實時的介面API (Nodejs 模組,允許和PM2程式管理器互動 )

9.模組擴充機制

安裝

npm install pm2 -g

命令列表

1.啟動/引導管理

  • pm2 startup    開機自啟動(自動檢測init系統+在伺服器啟動時生成並設定PM2啟動)
  • pm2 startup [platform]    手動指定啟動系統,可以是:systemd,upstart,launchd,rcd
  • pm2 unstartup    在伺服器啟動時禁用並刪除PM2引導

2.程式資訊管理

  • pm2 save    在重新啟動時儲存/凍結程式列表
  • pm2 resurrect    過載儲存的應用列表
  • pm2 update    儲存程式,殺死pm2程式,恢復儲存的程式
  • pm2 init     ### Generate a sample js configuration file

3.全域性命令

  • pm2 start app.js     啟動並守護程式,重啟Node應用
  • pm2 satrt app.py     啟動並守護程式,重啟Python應用

4.叢集模式 (僅限Node應用程式)

  • pm2 start app.js -i 4    在叢集模式下啟動4個應用例項,自動分配請求給每個例項,實現負載均衡
  • pm2 scale [app-name] 10    將叢集應用例項縮放到10個
  • pm2 scale [app-name] +10    增加10個應用程式

5.程式監控

  • pm2 list/ls    列出所有已啟動的程式(應用例項)
  • pm2 list --sort=    列出指定欄位的程式資訊
  • pm2 monit    顯示每個程式的記憶體以及cpu使用情況
  • pm2 show [app-name]    顯示指定程式的所有資訊

6.日誌管理

  • pm2 logs    顯示所有應用例項的日誌資訊
  • pm2 logs [app-name]    顯示指定應用例項的日誌資訊
  • pm2 logs --json    日誌資訊以JSON格式顯示
  • pm2 flush    清除所有的l日誌資訊
  • pm2 reloadLogs    過載所有的日誌資訊

7.程式狀態管理

  • pm2 start app.js --name="api"    啟動應用並給應用命名api(注:應用名稱可以自定義)
  • pm2 start app.js -- -a 34    啟動應用並傳遞引數"a 34"
  • pm2 start app.js --watch    監聽專案檔案變化,當檔案發生變化時重啟應用
  • pm2 start app.json    使用配置檔案方式啟動應用
  • pm2 reset [app-name]    重置所有應用的計數器
  • pm2 stop all    停止所有的應用
  • pm2 stop 0    停止id為0的應用程式
  • pm2 restart all    重啟所有應用
  • pm2 reload all    0秒停機過載應用
  • pm2 gracefulReload all    叢集模式下優雅地重啟所有應用
  • pm2 delete all    終止並刪除所有的應用程式
  • pm2 delete 0    終止並id為0的應用程式
  • pm2 kill    殺掉所有pm2管理的應用程式

8.應用部署

  • pm2 deploy app.json prod setup    通過配置檔案給遠端伺服器(生產環境)部署專案
  • pm2 deploy app.json prod    通過配置檔案給遠端伺服器(生產環境)更新已部署專案
  • pm2 deploy app.json prod revert 2    ### Revert "prod" remote server by 2

9.模組系統

  • pm2 module:generate [name]    建立一個模組並且命名
  • pm2 install pm2-logrotate    安裝模組
  • pm2 uninstall pm2-logrotate    解除安裝模組
  • pm2 publish    模組版本增量釋出到git或者npm中(當模組做了更新,通過該命令推送釋出更新)

實踐部分

1.安裝 在伺服器全域性安裝(根據專案需求也可以區域性安裝pm2),執行 npm install pm2 -g(區域性安裝無需加-g)

2.PM2配置

命令列配置方式:pm2 start [option]    例如:pm2 start /path/app.js --watch -i 4 -save

  path:表示專案入口檔案所在的目錄

  --watch:表示監控整個專案檔案的變化,一旦變化發生就重啟應用

  -i 4 :表示使用叢集模式,開啟4個專案例項程式

  -save:儲存專案列表資訊,用於過載

  更多配置可參考上面的命令列表

  下面以啟動一個koa2專案為例,調取控制檯輸入命令 pm2 start ./bin/app.js --watch,按下enter鍵。

  到這裡,使用pm2啟動管理一個專案的部已經完成。

start
appstart.gif

配置檔案方式:(支援.yml , .json , .config.js 結尾的配置檔案啟動)

  這裡我們把配置檔案命名為pm2.config.js,完整配置如下:(可根據專案實際需求進行刪減)

module.exports = {
  "apps": [{
    "name": "koaServer", //專案名稱
    "cwd": './bin/', //應用的啟動路徑
    "script": "app.js", //應用的啟動檔案
    "exec_mode": "cluster", //可選值fork,cluster(開啟叢集模式實現負載均衡),預設fork
    "instances": "max", //叢集模式下啟動例項個數,當值為0或者max,啟動程式數量為CPU執行緒數
    "args": "", //傳遞給指令碼的引數
    "interpreter": "node", //指定的指令碼直譯器,預設node
    "interpreter_args": "", //傳遞給直譯器的引數
    "watch": ['controllers', 'bin'], //監聽變化,重啟應用。預設true,監聽整個專案,false不啟用監聽,也可指定監聽資料夾
    "ignore_watch": ["node_modules", "logs", "static"], //忽略監聽的資料夾,支援正規表示式
    "log_date_format": "YYYY-MM-DD HH:mm:ss", //設定日誌的時間格式
    "log_type": "json", //輸出的日誌資訊為json格式
    "error_file": "./logs/system/error/error.log", //設定標準錯誤流日誌要寫入到哪個檔案,程式碼錯誤可在此檔案查詢
    "out_file": "./logs/system/output/console.log", //設定標準輸出流日誌要寫入到哪個檔案,如應用的console.log()
    "pid_file": "./logs/system/pid/pid.log", //設定pid要寫入到哪個檔案
    "min_uptime": 60, //應用執行少於時間被認為是異常啟動
    "max_restarts": 10, //最大異常重啟次數,即小於min_uptime執行時間重啟次數
    "max_memory_restart": "100M", //最大記憶體限制數,超出自動重啟
    "autorestart": false, //預設為true,發生異常的情況下自動重啟
    "cron_restart": "", //crontab時間格式重啟應用, 目前只支援cluster模式
    "force": false, //預設false, 如果true, 可以重複啟動一個指令碼,pm2不建議這麼做
    "restart_delay": "100ms", //異常重啟情況下,延時重啟時間
    "env": {
      "NODE_ENV": "development"
    }, //配置開發環境變數
    "env_production": {
      "NODE_ENV": "production"
    }, //配置生產環境變數

  }]
}
複製程式碼

configStart
configStart.gif

3.PM2的監控

  pm2 list/ls 顯示PM2管理的所有應用的資訊

list
list.gif

  pm2 monit 實時監控PM2管理的所有應用的資訊

monit
monit.gif

以上方式其實是存在也有缺點的,list方式沒法實現實時監控,monit方式雖然可以實現實時監控,但是隻能監控具體某一臺伺服器。

當使用多臺伺服器時(即伺服器叢集),不便於實現集中化監控管理且資訊相對較少。因此,PM2官方推出了keymetrics監控用於對PM2服務程式的監控與管理

keymetrics
螢幕截圖.png

優點:

  • 便於對於多臺伺服器(即伺服器叢集)進行集中監控管理

  • 可以實時觀察程式執行的穩定性

  • 支援遠端進行基本的管理操作,比如啟動,停止,重啟等等。

缺點:

  • 該軟體為商業付費軟體,免費版本功能受限,且只有2臺伺服器免費配額且最多隻能監控4個程式。

  • 該軟體的服務端非自建,採用的是將應用監控資料定時上拋給第三方平臺,如伺服器與程式有敏感資訊存在一定的資料安全問題

選用指南:

  • 伺服器數量有限或者能夠支付昂貴的使用費用且無需關心資料的安全問題可以選用Keymetrics,畢竟有官方團隊開發維護,且特性功能豐富

  • 此外,國內有大神開源一個PM2專案開源專案PM2.5,目前網上暫無相關部署使用教程,有興趣可以點選這裡瞭解下

4.fork模式與cluser模式的區別

  • fork不支援socket地址埠複用,cluster支援地址埠複用
  • fork不支援定時重啟,cluster支援定時重啟
  • 為了實現最大的CPU資源利用,一般都採用cluser模式(僅限於node應用)
  • fork模式下實現多程式可以使用建立多個應用,app0,app1,app2,每個應用對映到不同的埠

5.一些命令的區別

  • resurrect:
  • reload:
  • stop:
  • restart: