pm2 介紹
pm2是nodejs應用程序的進程管理工具,內置負載均衡。其可以幫助您保持node應用程序的永久活動,無需停機皆可重新加載node應用程序。
pm2的主要特性
- 內建負載均衡(使用了Node cluster 集群模塊)
- 后臺運行
- 0秒停機重載(我的理解: 在維護升級node應用程序時不需要停機)
- 停止不穩定的進程(避免無限循環)
- 提供 HTTP API
- 遠程控制和實時接口API(Nodejs模塊,允許和pm2交互)
- 控制臺檢測
安裝(全局)
npm install -g pm2
常用命令一覽
## 普通 ##
npm install -g pm2 # 安裝pm2
pm2 start app.js # 啟動&守護進程,自動重啟Node應用程序
pm2 start app.py # 啟動&守護進程,自動重啟python應用程序
pm2 start script.sh # 啟動&守護進程,自動重啟bash腳本
pm2 start app.json # 啟動&守護app.json中聲明的所有應用
## 集群模式(只支持node進程) ##
pm2 start app.js -i 4 # 啟動4個應用程序實例,并將網絡請求負載均衡到每個應用中。
pm2 start app.js -i max # 根據有效cpu數啟動最大的進程數
pm2 start app.js -x # 用fork模式啟動而非cluster
pm2 start app.js -e err.log -o out.log # 啟動應用程序并分別指定標準輸出日志文件和錯誤日志文件
pm2 reload all # 0秒重啟所有應用
pm2 scale [app-name] 10 # 將應用程序調整到10個實例
## 進程監控 ##
pm2 list # 列出所有由pm2啟動的進程
pm2 monit # 顯示每個應用占用的cpu和內存
pm2 show [app-name] # 顯示某個進程的所有信息
## 日志管理 ##
pm2 logs # 顯示所有應用的日志
pm2 logs [app-name] # 顯示某個應用的日志
pm2 logs --json # json化日志
pm2 flush # 清除日志
pm2 reloadLogs #重載日志
## 進程狀態管理 ##
pm2 start app.js --name="api" # 啟動應用并命名為api
pm2 start app.js -- -a 34 # 啟動應用,并傳遞參數“-a 34”(在--之后給app.js傳遞參數)
pm2 start app.js --watch # 啟動應用,并設置當文件改變時會重啟應用
pm2 start app.py # 啟動&守護進程,自動重啟python應用程序
pm2 start script.sh # 啟動&守護進程,自動重啟bash腳本
pm2 start app.json # 啟動&守護app.json中聲明的所有應用
pm2 reset [app-name] # 重置應用的重啟數量
pm2 stop all # 停止所有應用
pm2 stop 0 # 停止id為0的應用
pm2 restart all # 重啟所有應用
pm2 gracefulReload all # 在集群模式下,平穩的重新加載所有應用
pm2 delete all # 殺掉所有應用
pm2 delete 0 # 殺掉id為0的進程
## 重啟/引導管理 ##
pm2 startup # 自動檢測init系統 + 在服務器啟動時生成和配置pm2引導
pm2 startup [platform] # 手動指定啟動系統,可以是:systemd、upstart、launchd、rcd。
pm2 unstartup # 在服務器啟動時禁用和刪除pm2引導
pm2 save # 保存當前進程列表
pm2 resurrect # 恢復以前保存的進程
pm2 unstartup # 停用和刪除啟動系統
pm2 update # 保存進程,終止pm2并恢復進程
pm2 generate # 生成樣本json配置文件
## 部署 ##
pm2 deploy app.json prod setup # 設置“生產環境”遠程服務器
pm2 deploy app.json prod # 更新“生產環境”遠程服務器
pm2 deploy app.json prod revert # 將“生產環境”遠程服務器恢復
## 模塊系統 ##
pm2 module:generate [name] # 生成名為name的示例模塊
pm2 install pm2-logrotate # 安裝模塊(這里是日志循環模塊)
pm2 uninstall pm2-logrotate # 卸載模塊(這里是日志循環模塊)
pm2 publish # 增量邦本,git push和npm發布
命令詳解
## 進程管理 ##
pm2 list # 列出所有正在運行的由pm2啟動的應用程序
pm2 stop <app-name| id | “all” | json-conf> # 停止應用程序(某名稱| 某id| 所有| json文件內聲明的應用)
pm2 restart <app-name| id | “all” | json-conf> # 重啟應用程序
pm2 delete <app-name| id | “all” | json-conf> # 殺掉進行(應用程序)
pm2 describe <id | app-name> # 列出應用程序(某id| 某名稱)更詳細的信息
## 日志 ##
# 實時顯示指定進程or所有進程的日志,并提供標準、原始、JSON和格式化輸出
pm2 logs [ "all" | app-name | app-id ] [--json] [--format] [--raw]
特別說明
1. 生成啟動腳本
pm2可以生成和配置啟動腳本,以方便在每次服務器重啟時保持pm2和您進程的活動。
支持init系統,如下:
- systemd(Ubuntu 16 , CentOS, Arch)
- upstart( Ubuntu 14/12)
- launchd( MacOSx, Darwin)
- rcd( FreeBSD)
2. 模塊系統
pm2嵌入了一個簡單而強大的模塊系統,安裝模塊很簡單
pm2 install <module-name>
下面是一些pm2兼容模塊:
- pm2-logrotate # 自動輪換pm2的日志和管理的應用程序
- pm2-webshell # 在瀏覽器中展示一個功能完備的終端
- pm2-server-monit # 監控您的服務器運行狀態
配置pm2啟動文件(~~~~推薦重點關注)
可以通過配置一個pm2啟動文件,統一管理多個應用程序。
PS:
若想使用pm2啟動監控python進程,推薦通過sh腳本文件來啟動python文件# xxx.sh文件內容 # python ./web_service.py
## processes.json ##
{
"apps": [
{
"name": "my-app1",
"cwd": "/srv/node-app/current",
"script": "bin/xxx",
"log_date_format": "YYYY-MM-DD HH:mm:ss",
"error_file": "/var/log/node-app/node-app.stderr.log",
"out_file": "log/node-app.stdout.log",
"pid_file": "pids/node-geo-api.pid",
"instances": 6,
"min_uptime": "200s",
"max_restarts": 10,
"max_memory_restart": "1M",
"cron_restart": "1 0 * * *",
"watch": false,
"merge_logs": true,
"exec_interpreter": "node",
"exec_mode": "fork",
"autorestart": false,
"vizion": false
},
{
"name": "maoqiang-runner",
"cwd": "D:\\Projects\\ONU\\projects\\TelecomTest",
"script": "web_service.sh",
"log_date_format": "YYYY-MM-DD HH:mm:ss",
"error_file": "D:\\pm2\\logs\\maoqiang-runner.stderr.log",
"out_file": "D:\\pm2\\logs\\maoqiang-runner.stdout.log",
"pid_file": "D:\\pm2\\logs\\maoqiang-runner.pid",
"env": {
PYTHONIOENCODING:'utf-8'
},
"instances": 1,
"min_uptime": "60s",
"max_restarts": 10,
"max_memory_restart": "1M",
"watch": true,
"exec_interpreter": "bash",
"exec_mode": "fork",
"autorestart": true,
"vizion": true
}
]
}
processes.json說明:
- apps: json結構,apps是一個數組,每一個數組成員就是對應一個pm2中運行的應用
- name:應用程序名稱
- cwd:應用程序所在的目錄
- script:應用程序的腳本路徑
- log_date_format: 指定日志日期格式
- error_file:自定義應用程序的錯誤日志文件
- out_file:自定義應用程序日志文件
- pid_file:自定義應用程序的pid文件
- env: objects對象,可設置pm2的編碼格式等
- PYTHONIOENCODING:字符串,編碼,如: "utf-8"
- instances: 實例(進程)個數
- min_uptime:最小運行時間,這里設置的是60s即如果應用程序在60s內退出,pm2會認為程序異常退出,此時觸發重啟max_restarts設置數量
- max_restarts:設置應用程序異常退出重啟的次數,默認15次(從0開始計數)
- max_memory_restart : 最大內存限制,超出內存限制會自動重啟
- cron_restart:定時啟動,解決重啟能解決的問題
- watch:是否啟用監控模式,默認是false。如果設置成true,當應用程序變動時,pm2會自動重載。這里也可以設置你要監控的文件。
- merge_logs: 合并日志
- exec_interpreter:應用程序的腳本類型,這里使用的shell,默認是nodejs
- exec_mode:應用程序啟動模式,這里設置的是cluster_mode(集群),默認是fork
- autorestart:啟用/禁用應用程序崩潰或退出時自動重啟
- vizion:啟用/禁用vizion特性(版本控制)
配置好processes.json后,可以通過以下命令行啟動應用:
pm2 start processes.json
pm2設置開機自啟動
Linux
運行 pm2 startup,檢測init系統,并生成啟動腳本(若有提示需要執行命令,請直接照搬執行。)
運行 pm2 save,會將當前pm2所運行的應用保存在/[用戶路徑]/root/.pm2/dump.pm2下,當開機重啟時,運行pm2自啟動服務腳本,并且到/root/.pm2/dump.pm2下讀取應用并啟動。
Window
- 安裝并配置 pm2-windows-service
pm2-windows-service可以將 pm2 安裝成 windows service, 達到開機運行的目的。
npm i -g pm2-windows-service
PS:
將pm2安裝為 windows service,會導致只能以管理員身份運行pm2命令,普通用戶運行pm2命令會報如下錯誤:
圖片.png
添加pm2環境變量
添加系統環境變量 PM2_HOME=D:\.pm2
右鍵 [我的電腦] - [屬性] - [高級系統設置] - [環境變量] - 新建 [系統變量]
名稱PM2_HOME
路徑D:.pm2(.pm2路徑一般為:c:\Users<username>.pm2,具體以實際情況為準)安裝服務
# 以管理員權限打開新的命令行窗口,執行以下命令來安裝服務
pm2-service-install
# 拓展:卸載服務
pm2-service-uninstall
Perform environment setup ? 選 n, 繼續
此時, PM2服務已安裝成功并已啟動, 可以通過 Wn+R來查看,輸入services.msc即可看到服務
圖片.png
- 添加到自啟動服務
pm2 save很重要, 它保存當前pm2 正在管理的NodeJS服務, 并在開機后恢復這些服務。
pm2 save