Node.js非常擅長(zhǎng)處理I / O操作,但是當(dāng)涉及到CPU密集型任務(wù)時(shí),它會(huì)崩潰。您可以通過(guò)運(yùn)行繁重的操作來(lái)輕松停止應(yīng)用程序,并且由于 Node.js是單線(xiàn)程的,因此它將阻止進(jìn)一步的請(qǐng)求。
現(xiàn)在,要處理此問(wèn)題,您可以生成與主進(jìn)程并行的子進(jìn)程,以便每當(dāng)有新請(qǐng)求傳入時(shí),它都將由此新進(jìn)程處理。Node.js中的本機(jī)群集模塊允許您手動(dòng)配置應(yīng)用程序以生成子進(jìn)程的群集。但是,如果有一個(gè)包可以為您處理它,那不是更好嗎?
PM2是一個(gè)進(jìn)程管理器,它負(fù)責(zé)從處理多個(gè)進(jìn)程到設(shè)置特定于環(huán)境的部署策略,再到將日志保存到系統(tǒng)中的所有事務(wù)。這是一個(gè)功能豐富的庫(kù),是Node.js社區(qū)中粉絲的最?lèi)?ài),這篇博客文章將介紹其中的一些關(guān)鍵功能。讓我們開(kāi)始!
基本設(shè)置
要將其安裝在系統(tǒng)上,可以鍵入 。最好將其全局安裝,以便您可以直接在命令行中使用pm2。我們將使用具有單個(gè)終結(jié)點(diǎn)的簡(jiǎn)單快速應(yīng)用程序。因此,在空目錄中,首先通過(guò)鍵入 來(lái)創(chuàng)建節(jié)點(diǎn)項(xiàng)目。之后,您可以通過(guò)鍵入 來(lái)安裝 express?,F(xiàn)在,創(chuàng)建一個(gè)名為 main.js的文件,并將此代碼段復(fù)制到該文件中。npm i -g pm2npm init -ynpm i express
現(xiàn)在,我們通常使用 來(lái)運(yùn)行我們的應(yīng)用程序,但現(xiàn)在我們使用 pm2,我們可以使用 。node main.jspm2 start main.js
您將獲得此表,其中顯示名稱(chēng)/ID、CPU/內(nèi)存消耗以及運(yùn)行應(yīng)用程序的進(jìn)程的狀態(tài)等詳細(xì)信息。您還可以選擇使用標(biāo)志為進(jìn)程顯式提供名稱(chēng)。如果您沒(méi)有顯式為其指定名稱(chēng),它將使用文件名作為進(jìn)程的名稱(chēng)。name
現(xiàn)在在屏幕截圖中,應(yīng)用程序似乎已停止。在表格之前,您會(huì)看到“完成”消息,但在表格之后,您看不到任何內(nèi)容。但是,如果您打開(kāi)瀏覽器并轉(zhuǎn)到相應(yīng)鏈接,您將看到我們從 API 終端節(jié)點(diǎn)發(fā)回的“請(qǐng)求成功”消息。因此,應(yīng)用程序仍在運(yùn)行。只是pm2守護(hù)它,這基本上意味著它在后臺(tái)運(yùn)行進(jìn)程,僅此而已。
進(jìn)程管理命令
在任何給定點(diǎn),都可以通過(guò)鍵入 或 或 來(lái)查看進(jìn)程的狀態(tài)。pm2 statuspm2 lspm2 list
您可以通過(guò) 使用后跟進(jìn)程的名稱(chēng)或 ID(或 )來(lái)停止進(jìn)程。您還可以使用 來(lái)停止所有進(jìn)程。停止進(jìn)程后,請(qǐng)嘗試向應(yīng)用程序發(fā)出請(qǐng)求,看看它是否正常工作。附言:不應(yīng)該。pm2 stoppm2 stop mainpm2 stop 0pm2 stop all
pm2 delete后跟進(jìn)程的名稱(chēng)或 ID,將從列表中刪除該進(jìn)程。( 或 )。您還可以使用 刪除所有進(jìn)程。pm2 delete mainpm2 delete 0pm2 delete all
還有 2 個(gè)命令可幫助您管理流程。一個(gè)是命令,另一個(gè)是命令。這兩個(gè)命令本質(zhì)上都重新運(yùn)行進(jìn)程,但區(qū)別在于它們?nèi)绾螆?zhí)行。restartreload
A 將首先終止該進(jìn)程,然后再次啟動(dòng)它。因此,重新啟動(dòng)進(jìn)程時(shí)會(huì)涉及一些停機(jī)時(shí)間。pm2 restart
另一方面,A 將在后臺(tái)創(chuàng)建一個(gè)新進(jìn)程。只有當(dāng)這個(gè)新進(jìn)程被創(chuàng)建時(shí),它才會(huì)殺死舊的進(jìn)程。這可確保在重新加載進(jìn)程時(shí)不會(huì)出現(xiàn)停機(jī)。如果由于某種原因重新加載不起作用,它最終會(huì)在特定時(shí)間后回退到經(jīng)典重啟。pm2 reload
熱重載
使用 Node.js 運(yùn)行應(yīng)用程序時(shí),每次在應(yīng)用程序中進(jìn)行更改時(shí)都需要重新啟動(dòng)服務(wù)器。Nodemon是一個(gè)流行的庫(kù),每當(dāng)服務(wù)器檢測(cè)到更改時(shí),它就會(huì)重新啟動(dòng)服務(wù)器。您可以使用該標(biāo)志在pm2中實(shí)現(xiàn)相同的目標(biāo)。因此,如果在結(jié)束時(shí)提供監(jiān)視標(biāo)志,則在啟動(dòng)任何進(jìn)程時(shí),它將偵聽(tīng)更改,然后自動(dòng)重新啟動(dòng)服務(wù)器(watchpm2 start main.js --watch)
其他一些啟動(dòng)選項(xiàng)
最大內(nèi)存重啟<200MB> — 此選項(xiàng)將在進(jìn)程達(dá)到特定內(nèi)存限制時(shí)重新啟動(dòng)進(jìn)程。您可以指定內(nèi)存限制,單位為千字節(jié) (K)、兆字節(jié) (M) 或千兆字節(jié) (G)
日志 <文件路徑> — Log 將指定要在其中存儲(chǔ)應(yīng)用程序日志的文件。嘗試啟動(dòng)進(jìn)程,但這次,請(qǐng)?jiān)谀┪彩褂脦в腥罩疚募Q(chēng)的日志標(biāo)志。
現(xiàn)在,如果向光源終結(jié)點(diǎn)發(fā)出請(qǐng)求,則會(huì)在項(xiàng)目文件夾中看到一個(gè)名為 logFile.txt。此文件的頂部將包含 log 語(yǔ)句。pm2 start main.js --log ./logFile.txt
重新啟動(dòng)延遲<以毫秒為單位>將在自動(dòng)重新啟動(dòng)之間添加延遲。
時(shí)間標(biāo)志將為所有日志添加時(shí)間戳。重新啟動(dòng)應(yīng)用程序,但這次在末尾附加時(shí)間標(biāo)志。.現(xiàn)在向終結(jié)點(diǎn)發(fā)出請(qǐng)求,你將在日志文件中看到記錄的消息之前的時(shí)間戳。pm2 restart 0 --time
無(wú)自動(dòng)重新啟動(dòng)將禁用自動(dòng)重新啟動(dòng)。當(dāng)您想要執(zhí)行一次性腳本并且不希望進(jìn)程管理器在腳本完成運(yùn)行后重新啟動(dòng)腳本時(shí),這是有道理的。
cron標(biāo)志將根據(jù)您添加的cron表達(dá)式間隔重新啟動(dòng)該過(guò)程,我有一個(gè)單獨(dú)的視頻詳細(xì)解釋了cron表達(dá)式,如果您想了解更多信息,可以查看它。
無(wú)守護(hù)進(jìn)程標(biāo)志不會(huì)妖魔化您的 pm2 進(jìn)程。因此,您現(xiàn)在不會(huì)在后臺(tái)運(yùn)行它,而是在控制臺(tái)本身上看到所有日志和事件,就像在典型的節(jié)點(diǎn)執(zhí)行中一樣。
現(xiàn)在,我們?cè)趩?dòng)或重新啟動(dòng)進(jìn)程時(shí)手動(dòng)添加這些選項(xiàng)是沒(méi)有意義的。相反,我們要做的是添加一個(gè)配置文件,該文件將包含所有這些選項(xiàng),以便每當(dāng)我們啟動(dòng)應(yīng)用程序時(shí),它始終在啟用這些選項(xiàng)的情況下運(yùn)行。
創(chuàng)建 pm2 配置文件
要生成此配置文件,請(qǐng)?jiān)诳刂婆_(tái)中鍵入 。這將創(chuàng)建一個(gè)名為生態(tài)系統(tǒng).config.js。如果要?jiǎng)?chuàng)建自己的配置文件,請(qǐng)確保它以 結(jié)尾,以便 PM2 能夠?qū)⑵渥R(shí)別為配置文件。在文件中,復(fù)制此代碼段。pm2 init simple.config.js
我將解釋我們?cè)谶@里使用的選項(xiàng)。
名稱(chēng):進(jìn)程的名稱(chēng)
腳本:要執(zhí)行的腳本的位置
監(jiān)視:跟蹤更改并重新啟動(dòng)進(jìn)程
ignore_watch:不會(huì)跟蹤一組文件/文件夾的更改
time:將時(shí)間戳附加到日志文件中的日志語(yǔ)句
out_file和error_file:將相應(yīng)的日志語(yǔ)句添加到這些文件
您還可以添加特定于環(huán)境的選項(xiàng),例如,如果環(huán)境變量值在測(cè)試和生產(chǎn)模式之間發(fā)生更改,則可以在內(nèi)部或分別添加這些變量。envenv_production
稍后在切換到群集模式時(shí),我們將添加一些額外的選項(xiàng),但就目前而言,這看起來(lái)不錯(cuò)。
現(xiàn)在,我們可以運(yùn)行配置文件 (),而不是使用 ,它將反過(guò)來(lái)為我們運(yùn)行腳本。您可以在應(yīng)用程序數(shù)組中添加多個(gè)非節(jié)點(diǎn).js應(yīng)用程序,它仍然可以工作。PM2不僅局限于節(jié)點(diǎn).js。您可以從其他語(yǔ)言(如python)運(yùn)行進(jìn)程,例如,使用pm2。pm2 start main.jspm2 start ecosystem.config.js
現(xiàn)在我們對(duì)pm2有了一些了解,讓我們看看它如何幫助管理多個(gè)進(jìn)程。在配置文件中,添加 2 個(gè)額外的選項(xiàng),exec_mode和實(shí)例。
當(dāng)您想要為應(yīng)用程序啟動(dòng)進(jìn)程集群時(shí),需要將exec_mode設(shè)置為“集群”。默認(rèn)情況下,它設(shè)置為“分叉”。
設(shè)置集群時(shí),您需要說(shuō)明需要多少個(gè)流程實(shí)例。您可以傳遞 0/max,這將使進(jìn)程旋轉(zhuǎn)等于系統(tǒng)中的內(nèi)核數(shù)。-1 將比最大值少旋轉(zhuǎn) 1,如果你傳入任何其他數(shù)字,它將啟動(dòng)那么多進(jìn)程。
現(xiàn)在,如果您運(yùn)行配置文件,您將看到一堆進(jìn)程同時(shí)運(yùn)行(在我的情況下是8,因?yàn)槲矣幸粋€(gè)8核系統(tǒng))。您還會(huì)注意到,執(zhí)行模式已更改為“群集”。
PM2具有高級(jí)儀表板,可讓您監(jiān)控流程。您可以運(yùn)行配置文件,然后使用命令打開(kāi)此儀表板。pm2 monit
它為您提供了所有流程的更實(shí)時(shí)視圖。您可以單獨(dú)檢查系統(tǒng)中每個(gè)進(jìn)程的資源消耗和分配。還有一個(gè)日志部分,您可以在其中實(shí)時(shí)跟蹤所有日志。
好吧,這篇博客文章差不多就是這樣。這是對(duì)pm2及其方便功能的簡(jiǎn)要概述。