Nodejs教程30(完結):PM2入門

LeeChen發表於2019-04-10

閱讀更多系列文章請訪問我的GitHub部落格,示例程式碼請訪問這裡

PM2簡介

PM2是常用的node程式管理工具,它可以提供node.js應用管理,如自動過載、效能監控、負載均衡等。同類工具有Supervisor、Forever等。

PM2安裝

使用PM2需要npm全域性安裝。

npm install -g pm2
複製程式碼

啟動PM2專案

本文的測試專案直接選用上一篇完成的專案,地址為/lesson29/

直接啟動專案

pm2支援直接執行server.js啟動專案,如下:

pm2 start server.js
複製程式碼

即可啟動Node.js應用,成功後會看到列印的資訊:

[PM2] Spawning PM2 daemon with pm2_home=C:\Users\23101\.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting C:\xxx\lesson29\server.js in fork_mode (1 instance)
[PM2] Done.
┌────────┬────┬──────┬────────┬───┬─────┬───────────┐
│ Name   │ id │ mode │ status │ ↺ │ cpu │ memory    │
├────────┼────┼──────┼────────┼───┼─────┼───────────┤
│ server │ 0  │ fork │ online │ 0 │ 0%  │ 32.0 MB   │
└────────┴────┴──────┴────────┴───┴─────┴───────────┘
 Use `pm2 show <id|name>` to get more details about an app
複製程式碼

在表格中顯示了應用的名稱為server、id為0,應用名稱和id都可以作為該應用的標識。

通過配置檔案管理應用

PM2還支援通過配置檔案管理應用,這種方式可以提供更豐富的配置,支援的配置格式是Javascript,JSON和YAML,具體可以檢視文件

資料夾結構

PM2啟動後,它將自動建立這些資料夾:

$HOME/.pm2 將包含所有PM2相關檔案 $HOME/.pm2/logs 將包含所有應用程式日誌 $HOME/.pm2/pids 將包含所有應用程式pids $HOME/.pm2/pm2.log PM2 日誌 $HOME/.pm2/pm2.pid PM2 pid $HOME/.pm2/rpc.sock 遠端命令的套接字檔案 $HOME/.pm2/pub.sock 可釋出事件的套接字檔案 $HOME/.pm2/conf.js PM2配置

在Windows中,$ HOME環境變數可以是$ HOMEDRIVE + $ HOMEPATH

檢視應用列表

使用命令pm2 list可以檢視應用列表:

┌──────────┬────┬─────────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐
│ App name │ id │ version │ mode │ pid   │ status │ restart │ uptime │ cpu │ mem       │ user  │ watching │
├──────────┼────┼─────────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤
│ server   │ 0  │ 1.0.0   │ fork │ 24776 │ online │ 9       │ 19m    │ 0%  │ 35.4 MB   │ 23101 │ disabled │
└──────────┴────┴─────────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘
複製程式碼

檢視應用詳情

在命令列中輸入pm2 show 0,彈出資訊如下:

 Describing process with id 0 - name server 
┌───────────────────┬─────────────────────────────────────────────┐
│ status            │ online                                      │
│ name              │ server                                      │
│ version           │ 1.0.0                                       │
│ restarts          │ 0                                           │
│ uptime            │ 3m                                          │
│ script path       │ C:\xxx\lesson29\server.js                   │
│ script args       │ N/A                                         │
│ error log path    │ C:\Users\23101\.pm2\logs\server-error.log   │
│ out log path      │ C:\Users\23101\.pm2\logs\server-out.log     │
│ pid path          │ C:\Users\23101\.pm2\pids\server-0.pid       │
│ interpreter       │ node                                        │
│ interpreter args  │ N/A                                         │
│ script id         │ 0                                           │
│ exec cwd          │ C:\xxx\lesson29                             │
│ exec mode         │ fork_mode                                   │
│ node.js version   │ 11.9.0                                      │
│ node env          │ N/A                                         │
│ watch & reload    │ ✘                                           │
│ unstable restarts │ 0                                           │
│ created at        │ 2019-04-09T14:07:23.918Z                    │
└───────────────────┴─────────────────────────────────────────────┘
 Revision control metadata 
┌──────────────────┬──────────────────────────────────────────┐
│ revision control │ git                                      │
│ remote url       │ https://github.com/chencl1986/Blog.git   │
│ repository root  │ C:\xxx\Blog                              │
│ last update      │ 2019-04-09T14:07:24.928Z                 │
│ revision         │ 08f1efdfeb48bcc87f96b563d4d013a22e42ed9f │
│ comment          │                                          │
│ branch           │ master                                   │
└──────────────────┴──────────────────────────────────────────┘
 Actions available 
┌────────────────────────┐
│ km:heapdump            │
│ km:cpu:profiling:start │
│ km:cpu:profiling:stop  │
│ km:heap:sampling:start │
│ km:heap:sampling:stop  │
└────────────────────────┘
 Trigger via: pm2 trigger server <action_name>

 Code metrics value 
┌────────────────────────┬───────┐
│ Heap Size              │ 13.70 │
│ Heap Usage             │ 59.91 │
│ Used Heap Size         │ 8.21  │
│ Active requests        │ 0     │
│ Active handles         │ 4     │
│ Event Loop Latency     │ 2.30  │
│ Event Loop Latency p95 │ 7.15  │
│ HTTP Mean Latency      │ 10    │
│ HTTP P95 Latency       │ 10038 │
│ HTTP                   │ 0     │
└────────────────────────┴───────┘
 Add your own code metrics: http://bit.ly/code-metrics
 Use `pm2 logs server [--lines 1000]` to display logs
 Use `pm2 env 0` to display environement variables
 Use `pm2 monit` to monitor CPU and Memory usage server
複製程式碼

監控CPU/記憶體

使用pm2 monit方法,即可監控CPU和記憶體的使用情況,同時應用的報錯資訊也會列印在Global Logs視窗中,如下:

Nodejs教程30(完結):PM2入門

監聽程式碼變化

使用如下命令,可以監聽程式碼儲存,並更新應用。

pm2 start server.js --watch
複製程式碼

PM2不止監聽server.js檔案,還監聽了它引用的所有模組,只要任意模組程式碼進行了儲存,如鍵盤按下ctrl + s,或新建檔案,PM2就會進行重啟。

如果需要忽略某些檔案,則可以在配置檔案中設定,如下:

{
  "watch": ["server", "client"],
  "ignore_watch" : ["node_modules", "client/img"],
  "watch_options": {
    "followSymlinks": false
  }
}
複製程式碼
  • watch可以是布林值,路徑陣列或表示路徑的字串。預設為false。
  • ignore_watch可以是一個路徑陣列或一個字串,它將被chokidar解釋為glob或正規表示式。
  • watch_options是一個替代chokidar的選項的物件。有關定義,請參閱chokidar文件

環境管理

在專案開發時,通常需要進行環境管理,PM2可以使用配置檔案與命令列引數設定環境。

新增配置檔案

首先,使用pm2 init命令,建立一個ecosystem.config.js檔案,其中已經有預設的配置。

module.exports = {
  apps : [{
    name: 'API',
    script: 'app.js',

    // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
    args: 'one two',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'development'
    },
    env_production: {
      NODE_ENV: 'production'
    }
  }],

  deploy : {
    production : {
      user : 'node',
      host : '212.83.163.1',
      ref  : 'origin/master',
      repo : 'git@github.com:repo.git',
      path : '/var/www/production',
      'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production'
    }
  }
};
複製程式碼

修改配置

其中,對環境管理有用的為:

{
  env: {
    NODE_ENV: 'development'
  },
  env_production: {
    NODE_ENV: 'production'
  }
}
複製程式碼

為了配合我們的專案,可以將配置修改為如下:

{
  env: {
    NODE_ENV: 'dev'
  },
  env_development: {
    NODE_ENV: 'dev'
  },
  env_production: {
    NODE_ENV: 'prod'
  }
}
複製程式碼

他們對應的啟動命令分別為:

  • pm2 start ecosystem.config.js --watch --env
  • pm2 start ecosystem.config.js --watch --env development
  • pm2 start ecosystem.config.js --watch --env production

啟動開發環境

在服務端的程式碼中,可以通過process.env.NODE_ENV,拿到設定的值。

例如我們使用pm2 start ecosystem.config.js --watch --env development命令啟動專案,則可以列印出process.env.NODE_ENV的值為`dev:

示例程式碼:/lesson29/config/index.js

const process = require('process')
console.log(process.env.NODE_ENV) // dev
mode = process.env.NODE_ENV // dev
複製程式碼

日誌管理

PM2提供了十分強大的日誌管理功能,支援以多種方式檢視日誌。

  1. 以特殊日期格式檢視日誌

    # 以特殊日期格式檢視server應用的日誌
    pm2 logs server --format
    複製程式碼

    結果如下:

    timestamp=2019-04-10-23:13:25+0800 app=server id=0 type=out message=dev
    timestamp=2019-04-10-23:13:26+0800 app=server id=0 type=out message=Server started at 8080
    複製程式碼
  2. 以JSON格式檢視日誌

    pm2 logs server --json
    複製程式碼

    結果如下:

    {"timestamp":"2019-04-10T15:14:52.376Z","type":"process_event","status":"exit","app_name":"server"}
    {"timestamp":"2019-04-10T15:14:52.479Z","type":"process_event","status":"exit","app_name":"server"}
    {"message":"dev","timestamp":"2019-04-10T15:14:53.246Z","type":"out","process_id":0,"app_name":"server"}
    {"timestamp":"2019-04-10T15:14:53.284Z","type":"process_event","status":"online","app_name":"server"}
    {"message":"Server started at 8080","timestamp":"2019-04-10T15:14:53.474Z","type":"out","process_id":0,"app_name":"server"}
    複製程式碼
  3. 檢視近3行日誌

    pm2 logs server --lines 3
    複製程式碼

    結果如下:

    [TAILING] Tailing last 3 lines for [server] process (change the value with --lines option)
    C:\xxx\.pm2\logs\server-error.log last 3 lines:
    0|server   |   code: 'ETIMEDOUT',
    0|server   |   syscall: 'connect',
    0|server   |   fatal: true }
    
    C:\xxx\.pm2\logs\server-out.log last 3 lines:
    0|server   | Server started at 8080
    0|server   | dev
    0|server   | Server started at 8080
    複製程式碼

CLI參考

除了上面介紹的命令之外,PM2還有許多其他實用命令,在此就不一一列舉,有需要的話可以檢視文件

相關文章