PM2簡易使用手冊

PM2 使用手冊

很簡單也很水,就是我今天由於公司項目正好在研究這個東西,權當本身記錄了,不喜勿噴~~~萬分感謝前端

背景

對於線上項目,若是直接經過 node app 來啓動,若是報錯了可能直接中止致使整個服務崩潰,通常監控 node 有幾種方案。node

  • supervisor: 通常用做開發環境的使用。
  • forever: 管理多個站點,通常每一個站點的訪問量不大的狀況,不須要監控。
  • PM2: 網站的訪問量比較大,須要完整的監控頁面。

公司原來的項目採用的是 forever 的形式,不過若是 node 出現問題的時候,沒有辦法獲取到有效的監控數據進行錯誤排查,所以新開發的系統準備採用 pm2 的形式進行前端以及 node 層的監控。git

PM2 的主要特性

  • 內建負載均衡(使用 Node cluster 集羣模塊)
  • 後臺運行
  • 0 秒停機重載,我理解大概意思是維護升級的時候不須要停機.
  • 具備 Ubuntu 和 CentOS 的啓動腳本
  • 中止不穩定的進程(避免無限循環)
  • 控制檯檢測
  • 提供 HTTP API
  • 遠程控制和實時的接口 API ( Nodejs 模塊,容許和 PM2 進程管理器交互 )

安裝

// 全局安裝pm2,依賴node和npm
npm install -g pm2
複製代碼

用法

  • 基本啓動命令

pm2 startgithub

// start命令啓動對應的node server文件
$ pm2 start ./build/server.js
複製代碼
  • 經過配置文件進行啓動稍後詳細講解

啓動以後,控制檯會看到以下消息:web

如上圖所示,能夠看到項目kafazhe成功啓動,id 是 0,而且狀態時 online.npm

  • 查看詳細狀態信息

pm2 show (appname|id)json

$ pm2 show kaifazhe
複製代碼

如上圖所示,能夠查看到 kaifazhe 進程的詳細信息瀏覽器

  • 查看全部啓動的進程列表

pm2 listbash

$ pm2 list
複製代碼

  • 監控每一個 node 進程的 cpu 和內存使用狀況

    pm2 monitapp

$ 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 提供了配置文件的方式來啓動~

pm2.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,  // 啓動兩個實例
複製代碼

日誌相關

這裏是時隔一年後補充的,當初只是爲了簡單寫寫總結,不過沒想到這麼多人點贊喜歡了,那麼一年以後隨着使用加深,對於pm2有個其餘的總結,就補充一下~

pm2日誌

上面配置文件能夠看出來,咱們能夠配置logs,包括普通的out和錯誤的error日誌。其實也不須要咱們作什麼,咱們只須要在config裏面配置好就行,他就會自動往裏面寫日誌:

很簡單的功能,就包含了日誌,真是美妙到不行,可是,真的那麼美妙嗎?哈哈,好像不是?咱們的日誌所有輸出到了err.logout.log內,日積月累,OMG不敢想象,排查問題確定很費勁,因此就有了下面的日誌分割~

日誌分割

咱們正常意義上的日誌,以node爲例,應該都是使用的log4js來進行按日期寫入的,那麼pm2可不能夠按日期寫入呢?答案確定是:能夠。

pm2爲咱們提供了插件系統,而日期分割功能就正好用到了插件系統:pm2-logrotate

安裝:

pm2 install pm2-logrotate // 看好了,是pm2 install而不是npm install
複製代碼

你裝完以後它就自動啓動,而後你還能夠配置各類參數

而後就完成了日誌按日期分割~

細心的小夥伴可能發現了,你上面讓我安裝的是pm2-logrotate,爲啥你安裝的是pm2-logrotate-ext,嗯,由於聽說官方的pm2-logrotate存在一個bug,就是日期會正常分割,可是若是你前一天的文件沒有寫滿好比你設置了1M但只寫了500K那麼次日的日誌仍是會插入到原來的out.log(err.log),因此大牛就寫了這個解決了這個問題pm2-logrotate-ext

配合pm2-web實現監控可視化

可能不少人不喜歡控制檯,喜歡把監控數據進行可視化更方便查看和分析。沒關係,高手們已經爲咱們提供了工具,pm2-web,一看就是專門配合pm2來使用的。

安裝

npm install -g pm2-web
複製代碼

使用

默認pm2-web會自動啓動一個端口8080,可是咱們仍是喜歡可控狀態的,所以按照配置文件的方式啓動。

$ pm2-web --config pm2-web-config.json
複製代碼
// pm2-web-config.json
{
  "www": {
      "host": "localhost",
      "address": "0.0.0.0",
      "port": 6688
  }                         
}
複製代碼

這樣你就能夠在瀏覽器查看可視化的監控狀態了~

說明一下,圖片是我從網上找的,爲何沒在本地啓動呢,緣由是pm2-web依賴node-inspector,而node-inspector對於高版本node沒法安裝,不少人提了issue,可是感受開發者也處於放棄了的狀態。我也不打算在本地安裝低版本node,因此感興趣的你們能夠安裝個低版本的試試~

謝謝~~~

相關文章
相關標籤/搜索