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