使用pm2運行node應(yīng)用的流程步驟
為什么使用 pm2
在生產(chǎn)環(huán)境中運行 Node.js 應(yīng)用時,我們面臨著一系列挑戰(zhàn):如何確保應(yīng)用崩潰后能夠自動重啟?如何將應(yīng)用的日志輸出到指定文件以便分析?如何充分利用多核CPU來提升應(yīng)用性能?以及如何監(jiān)控應(yīng)用的資源占用情況?這些問題都可以通過PM2(Process Manager 2)來解決。
PM2是一個功能強大的進程管理工具,專為 Node.js 應(yīng)用設(shè)計。
它提供了進程管理、日志管理、負載均衡和性能監(jiān)控等功能,幫助開發(fā)者輕松應(yīng)對生產(chǎn)環(huán)境中的各種挑戰(zhàn)。
啟動 pm2
首先安裝 pm2:
npm install pm2 -g
跑一個 node 應(yīng)用,這里跑 Nest 應(yīng)用:
nest new pm2-test -p npm cd pm2-test pnpm build pm2 start ./dist/main.js
這個 node 已經(jīng)運行并且被 pm2 管理起來了。
可以使用 pm2 start 跑多個進程。
pm2 日志管理
查看下日志:
pm2 logs
pm2 會把所有進程的日志打印出來,通過前面的 “進程id|進程名字”
來區(qū)分,比如 0|main
。
所有的進程會寫到日志文件中去,在 ~/.pm2/logs
下,以 “進程名-out.log”
和 “進程名-error.log”
分別保存不同進程的日志:
比如 main-out.log 里保存了 main 進程的正常日志,而 main-error.log 里保存了它的報錯日志。
可通過 cat ~/.pm2/logs/main-out.log
查看。
查看單個進程的日志:
pm2 logs 進程名 pm2 logs 進程id
日志清空,使用 pm2 flush
或者 pm2 flush 進程名|id
查看 main 進程的前 100 行日志:pm2 logs main --lines 100
pm2 進程管理
PM2提供了豐富的進程管理功能,包括啟動、重啟、停止和刪除進程等。
只需要執(zhí)行 pm2 start 的時候帶上幾個選項就好了:
超過 100M 內(nèi)存自動重啟:
pm2 start app.js --max-memory-restart 100M
支持 corn 表達式,每天午夜(00:00)重啟:
pm2 start app.js --cron-restart="0 0 * * *"
當文件內(nèi)容改變自動重啟:
pm2 start app.js --watch
不自動重啟:
pm2 start app.js --no-autorestart
pm2 負載均衡
再就是負載均衡,node 應(yīng)用是單進程的,而為了充分利用多核 cpu,我們會使用多進程來提高性能。
node 提供的 cluster 模塊就是做這個的,pm2 就是基于這個實現(xiàn)了負載均衡。
我們只要啟動進程的時候加上 -i num 就是啟動 num 個進程做負載均衡的意思:
pm2 start app.js -i max pm2 start app.js -i 0
-i max
讓 PM2 自動設(shè)置進程數(shù)為最大值。-i 0
則讓 PM2 自動根據(jù) CPU 核心數(shù)動態(tài)設(shè)置進程數(shù)。
用多進程的方式跑 nest 應(yīng)用:
可以看到啟動了 8 個進程,因為我是 8 核 cpu。
跑起來之后,還可以動態(tài)調(diào)整進程數(shù),通過 pm2 scale:
pm2 scale main 1
此時 main 的集群調(diào)整為 1 個進程。
我們同樣可以添加進程數(shù):
pm2 scale main +3
現(xiàn)在變成 4 個進程了,通過這些方式可以動態(tài)伸縮進程的數(shù)量,pm2 會把請求分配到不同進程上去。這就是負載均衡功能。
我們同樣可以停止和刪除所有 pm2 的進程:
pm2 stop all pm2 delete all
還可以停止刪除單個進程:
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
這里可以看到不同進程的 cpu 和內(nèi)存占用情況。
當進程多了之后,難道都要手動通過命令行來啟動么?
pm2 支持配置文件的方式啟動多個應(yīng)用。執(zhí)行 pm2 ecosystem
,會創(chuàng)建一個配置文件:
pm2 ecosystem
我們就可以把啟動的選項保存在這個配置文件,pm2 根據(jù)配置文件自動執(zhí)行這些命令。
然后用 pm2 start ecosystem.config.js
就可以批量跑一批應(yīng)用。
pm2 網(wǎng)站
訪問 pm2 的網(wǎng)站,登錄,創(chuàng)建 bucket:
然后執(zhí)行下面 pm2 link xxx:
再執(zhí)行 pm2 plus 就會打開 bucket 對應(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 .
運行鏡像:
docker run -p 3000:3000 -d nest-pm2-test:v1.0
可以在 docker 看到 pm2 打印的日志。在 terminal 使用 pm2 的命令:
現(xiàn)在這個容器內(nèi)的 node 進程在崩潰時就會自動重啟。
以上就是使用pm2 運行node應(yīng)用的流程步驟的詳細內(nèi)容,更多關(guān)于pm2 運行node應(yīng)用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
node.js中的fs.realpathSync方法使用說明
這篇文章主要介紹了node.js中的fs.realpathSync方法使用說明,本文介紹了fs.realpathSync的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12深入解析桶排序算法及Node.js上JavaScript的代碼實現(xiàn)
桶排序Radix Sort算法利用分治思想將元素分入各桶中排序后匯總,以下我們就來深入解析桶排序算法及Node.js上JavaScript的代碼實現(xiàn),需要的朋友可以參考下2016-07-07node koa2實現(xiàn)上傳圖片并且同步上傳到七牛云存儲
這篇文章主要介紹了node koa2實現(xiàn)上傳圖片并且同步上傳到七牛云存儲,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07node.js在Linux下執(zhí)行shell命令、.sh腳本的問題
很多時候需要多個命令來完成一項工作,而這個工作又常常是重復(fù)的,這個時候我們自然會想到將這些命令寫成sh腳本,下次執(zhí)行下這個腳本一切就都搞定了,下面就是發(fā)布代碼的一個腳本示例2022-01-01Node.js中安全調(diào)用系統(tǒng)命令的方法(避免注入安全漏洞)
這篇文章主要介紹了Node.js中安全調(diào)用系統(tǒng)命令的方法(避免注入安全漏洞),本文講解的一般是連接字符串會時出的安全問題情況,需要的朋友可以參考下2014-12-12