pm2:帶負載均衡功能的Node應用進程管理工具

pm2 介紹

pm2是nodejs應用程序的進程管理工具,內置負載均衡。其可以幫助您保持node應用程序的永久活動,無需停機皆可重新加載node應用程序。

pm2的主要特性

  1. 內建負載均衡(使用了Node cluster 集群模塊)
  2. 后臺運行
  3. 0秒停機重載(我的理解: 在維護升級node應用程序時不需要停機)
  4. 停止不穩定的進程(避免無限循環)
  5. 提供 HTTP API
  6. 遠程控制和實時接口API(Nodejs模塊,允許和pm2交互)
  7. 控制臺檢測

安裝(全局)

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

  1. 運行 pm2 startup,檢測init系統,并生成啟動腳本(若有提示需要執行命令,請直接照搬執行。)

  2. 運行 pm2 save,會將當前pm2所運行的應用保存在/[用戶路徑]/root/.pm2/dump.pm2下,當開機重啟時,運行pm2自啟動服務腳本,并且到/root/.pm2/dump.pm2下讀取應用并啟動。

Window

  1. 安裝并配置 pm2-windows-service
    pm2-windows-service可以將 pm2 安裝成 windows service, 達到開機運行的目的。
npm i -g pm2-windows-service

PS:
將pm2安裝為 windows service,會導致只能以管理員身份運行pm2命令,普通用戶運行pm2命令會報如下錯誤:


圖片.png
  1. 添加pm2環境變量
    添加系統環境變量 PM2_HOME=D:\.pm2
    右鍵 [我的電腦] - [屬性] - [高級系統設置] - [環境變量] - 新建 [系統變量]
    名稱PM2_HOME
    路徑D:.pm2(.pm2路徑一般為:c:\Users<username>.pm2,具體以實際情況為準)

  2. 安裝服務

# 以管理員權限打開新的命令行窗口,執行以下命令來安裝服務
pm2-service-install

# 拓展:卸載服務
pm2-service-uninstall

Perform environment setup ? 選 n, 繼續
此時, PM2服務已安裝成功并已啟動, 可以通過 Wn+R來查看,輸入services.msc即可看到服務


圖片.png
  1. 添加到自啟動服務
    pm2 save很重要, 它保存當前pm2 正在管理的NodeJS服務, 并在開機后恢復這些服務。
pm2 save

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容