閱讀更多系列文章請訪問我的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視窗中,如下:
監聽程式碼變化
使用如下命令,可以監聽程式碼儲存,並更新應用。
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提供了十分強大的日誌管理功能,支援以多種方式檢視日誌。
-
以特殊日期格式檢視日誌
# 以特殊日期格式檢視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 複製程式碼
-
以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行日誌
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還有許多其他實用命令,在此就不一一列舉,有需要的話可以檢視文件