使用pm2運(yùn)行node應(yīng)用的流程步驟
為什么使用 pm2
在生產(chǎn)環(huán)境中運(yùn)行 Node.js 應(yīng)用時(shí),我們面臨著一系列挑戰(zhàn):如何確保應(yīng)用崩潰后能夠自動(dòng)重啟?如何將應(yīng)用的日志輸出到指定文件以便分析?如何充分利用多核CPU來提升應(yīng)用性能?以及如何監(jiān)控應(yīng)用的資源占用情況?這些問題都可以通過PM2(Process Manager 2)來解決。
PM2是一個(gè)功能強(qiáng)大的進(jìn)程管理工具,專為 Node.js 應(yīng)用設(shè)計(jì)。
它提供了進(jìn)程管理、日志管理、負(fù)載均衡和性能監(jiān)控等功能,幫助開發(fā)者輕松應(yīng)對(duì)生產(chǎn)環(huán)境中的各種挑戰(zhàn)。
啟動(dòng) pm2
首先安裝 pm2:
npm install pm2 -g
跑一個(gè) node 應(yīng)用,這里跑 Nest 應(yīng)用:
nest new pm2-test -p npm cd pm2-test pnpm build pm2 start ./dist/main.js

這個(gè) node 已經(jīng)運(yùn)行并且被 pm2 管理起來了。
可以使用 pm2 start 跑多個(gè)進(jìn)程。
pm2 日志管理
查看下日志:
pm2 logs

pm2 會(huì)把所有進(jìn)程的日志打印出來,通過前面的 “進(jìn)程id|進(jìn)程名字” 來區(qū)分,比如 0|main。
所有的進(jìn)程會(huì)寫到日志文件中去,在 ~/.pm2/logs 下,以 “進(jìn)程名-out.log” 和 “進(jìn)程名-error.log” 分別保存不同進(jìn)程的日志:

比如 main-out.log 里保存了 main 進(jìn)程的正常日志,而 main-error.log 里保存了它的報(bào)錯(cuò)日志。
可通過 cat ~/.pm2/logs/main-out.log 查看。
查看單個(gè)進(jìn)程的日志:
pm2 logs 進(jìn)程名 pm2 logs 進(jìn)程id
日志清空,使用 pm2 flush 或者 pm2 flush 進(jìn)程名|id查看 main 進(jìn)程的前 100 行日志:pm2 logs main --lines 100
pm2 進(jìn)程管理
PM2提供了豐富的進(jìn)程管理功能,包括啟動(dòng)、重啟、停止和刪除進(jìn)程等。
只需要執(zhí)行 pm2 start 的時(shí)候帶上幾個(gè)選項(xiàng)就好了:
超過 100M 內(nèi)存自動(dòng)重啟:
pm2 start app.js --max-memory-restart 100M
支持 corn 表達(dá)式,每天午夜(00:00)重啟:
pm2 start app.js --cron-restart="0 0 * * *"
當(dāng)文件內(nèi)容改變自動(dòng)重啟:
pm2 start app.js --watch
不自動(dòng)重啟:
pm2 start app.js --no-autorestart
pm2 負(fù)載均衡
再就是負(fù)載均衡,node 應(yīng)用是單進(jìn)程的,而為了充分利用多核 cpu,我們會(huì)使用多進(jìn)程來提高性能。
node 提供的 cluster 模塊就是做這個(gè)的,pm2 就是基于這個(gè)實(shí)現(xiàn)了負(fù)載均衡。
我們只要啟動(dòng)進(jìn)程的時(shí)候加上 -i num 就是啟動(dòng) num 個(gè)進(jìn)程做負(fù)載均衡的意思:
pm2 start app.js -i max pm2 start app.js -i 0
-i max 讓 PM2 自動(dòng)設(shè)置進(jìn)程數(shù)為最大值。-i 0 則讓 PM2 自動(dòng)根據(jù) CPU 核心數(shù)動(dòng)態(tài)設(shè)置進(jìn)程數(shù)。
用多進(jìn)程的方式跑 nest 應(yīng)用:

可以看到啟動(dòng)了 8 個(gè)進(jìn)程,因?yàn)槲沂?8 核 cpu。
跑起來之后,還可以動(dòng)態(tài)調(diào)整進(jìn)程數(shù),通過 pm2 scale:
pm2 scale main 1

此時(shí) main 的集群調(diào)整為 1 個(gè)進(jìn)程。
我們同樣可以添加進(jìn)程數(shù):
pm2 scale main +3

現(xiàn)在變成 4 個(gè)進(jìn)程了,通過這些方式可以動(dòng)態(tài)伸縮進(jìn)程的數(shù)量,pm2 會(huì)把請(qǐng)求分配到不同進(jìn)程上去。這就是負(fù)載均衡功能。
我們同樣可以停止和刪除所有 pm2 的進(jìn)程:
pm2 stop all pm2 delete all
還可以停止刪除單個(gè)進(jìn)程:
pm2 stop app_name_or_id pm2 delete app_name_or_id
app_name_or_id 替換為應(yīng)用程序名稱或者 PM2 分配給應(yīng)用程序的 ID
可以通過 pm2 list 命令查看所有 PM2 管理的應(yīng)用程序及其狀態(tài)。

pm2 監(jiān)控
性能監(jiān)控功能,執(zhí)行 pm2 monit:
pm2 monit

這里可以看到不同進(jìn)程的 cpu 和內(nèi)存占用情況。
當(dāng)進(jìn)程多了之后,難道都要手動(dòng)通過命令行來啟動(dòng)么?
pm2 支持配置文件的方式啟動(dòng)多個(gè)應(yīng)用。執(zhí)行 pm2 ecosystem,會(huì)創(chuàng)建一個(gè)配置文件:
pm2 ecosystem


我們就可以把啟動(dòng)的選項(xiàng)保存在這個(gè)配置文件,pm2 根據(jù)配置文件自動(dòng)執(zhí)行這些命令。
然后用 pm2 start ecosystem.config.js 就可以批量跑一批應(yīng)用。
pm2 網(wǎng)站
訪問 pm2 的網(wǎng)站,登錄,創(chuàng)建 bucket:

然后執(zhí)行下面 pm2 link xxx:

再執(zhí)行 pm2 plus 就會(huì)打開 bucket 對(duì)應(yīng)的網(wǎng)頁,在線監(jiān)控本地的應(yīng)用。

docker 結(jié)合 pm2
一般都是 docker 鏡像內(nèi)安裝 pm2 來跑 node 應(yīng)用:
之前我們寫的 Nest 的 dockerfile 需要更改一下:

pm2-runtime 代表 node 命令跑應(yīng)用。

打包鏡像:
docker build -t nest-pm2-test:v1.0 .
運(yùn)行鏡像:
docker run -p 3000:3000 -d nest-pm2-test:v1.0

可以在 docker 看到 pm2 打印的日志。在 terminal 使用 pm2 的命令:

現(xiàn)在這個(gè)容器內(nèi)的 node 進(jìn)程在崩潰時(shí)就會(huì)自動(dòng)重啟。
以上就是使用pm2 運(yùn)行node應(yīng)用的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于pm2 運(yùn)行node應(yīng)用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解使用抽象語法樹AST實(shí)現(xiàn)一個(gè)AOP切面邏輯
這篇文章主要為大家介紹了使用抽象語法樹AST實(shí)現(xiàn)一個(gè)AOP切面邏輯的簡(jiǎn)單方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
node.js中實(shí)現(xiàn)同步操作的3種實(shí)現(xiàn)方法
這篇文章主要介紹了node.js中實(shí)現(xiàn)同步操作的3種實(shí)現(xiàn)方法,本文用實(shí)例講解一些需要同步操作的情況下,如何編程實(shí)現(xiàn),需要的朋友可以參考下2014-12-12
詳解nodejs微信公眾號(hào)開發(fā)——4.自動(dòng)回復(fù)各種消息
這篇文章主要介紹了詳解nodejs微信公眾號(hào)開發(fā)——4.自動(dòng)回復(fù)各種消息,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04
express提供http服務(wù)功能實(shí)現(xiàn)示例
這篇文章主要為大家介紹了express提供http服務(wù)功能實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
快速刪除 node_modules 目錄的集中方法(多種方法)
本文介紹了三種快速刪除node_modules目錄的方法:使用rimraf工具、通過npx運(yùn)行rimraf以及在Windows命令提示符中使用del命令,每種方法都適合不同的操作系統(tǒng)和使用場(chǎng)景2024-11-11
Express + Session 實(shí)現(xiàn)登錄驗(yàn)證功能
本文主要介紹在 Express 框架中,如何使用 Session 來實(shí)現(xiàn)用戶登錄身份驗(yàn)證。對(duì)express session實(shí)現(xiàn)登錄驗(yàn)證相關(guān)知識(shí),感興趣的朋友一起看看吧2017-09-09

