1. 程式人生 > 實用技巧 >在生產環境中執行PM2和Node.js

在生產環境中執行PM2和Node.js

在Stream,我們構建了許多應用程式來展示我們的服務所提供的出色功能。對於幾乎所有的應用程式,我們都將它們放在一個雲伺服器上—通常是DigitalOcean或AWS EC2。

雖然維護程式碼庫和維持它的相關性是有困難的,但我們發現,在維護應用程式時,最具挑戰性的是保持它的活動和執行。

此外,由於Node.js是大多數後端API的核心語言,因此很難擴充套件單個執行緒程序;這就是PM2發揮作用的地方,也是我們如此喜歡使用它的原因。

現在有很多流程管理器,最著名的是Forever、StrongLoop的流程管理器和good ol ' SystemD。還有PM2,下載量超過6000萬次,GitHub之星達到2.5萬顆(而且還在不斷上升!)我們喜歡PM2,因為簡單地說,它易於使用,並且可以完美的管理生產環境。

PM2是什麼呢?

PM2是一個經過測試的,Node.js應用程式的生產執行時和程序管理器。它還配備了內建的負載均衡器,使擴充套件應用程式更加容易。最重要的是,它可以在Linux、Windows和MacOS上工作。

我們使用配置檔案(process.json),就可以指定要執行哪些程序以及要擴充套件到多少程序。啟動PM2時,可以指定process.json檔案,而PM2負責其餘的事務。所有這些都意味著PM2允許我們永遠保持Node.js應用程式的活躍,而且還是0秒停機過載,維護升級的時候不需要停機。

安裝PM2
安裝PM2簡直就是小菜一碟。首先,您需要確保process.json檔案已經準備好進入程式碼,這樣我們就可以開始這個過程了。如果您在MacOS上,是非常簡單的,用yarn安裝PM2就可以了。如果您在Linux、Windows或使用Docker容器(是的,它也支援Docker),請按照這裡的說明操作。如果您想知道它應該是什麼樣子的話,下面是一個用於Winds的process_prod.json檔案的示例,這是我們的開源rss和播客應用程式。

{
  "apps": [
    {
      "name": "api",
      "cwd": "api/dist",
      "script": "server.js",
      "watch": false
    },
    {
      "name": "conductor",
      "cwd": "api/dist/workers",
      "script": "conductor.js",
      "watch": false
    },
    {
      "name": "rss-worker",
      "cwd": "api/dist/workers",
      "script": "rss.js",
      "instances": 2,
      "exec_mode": "cluster",
      "watch": false
    },
    {
      "name": "podcast-worker",
      "cwd": "api/dist/workers",
      "script": "podcast.js",
      "instances": 2,
      "exec_mode": "cluster",
      "watch": false
    },
    {
      "name": "og-worker",
      "cwd": "api/dist/workers",
      "script": "og.js",
      "instances": 2,
      "exec_mode": "cluster",
      "watch": false
    }
  ]
}

正如您所見,我們正在執行多個程序,而PM2在沒有任何問題的情況下處理它們,使用Node.js叢集API自動生成多個程序。

提示和技巧
對於任何應用程式(我們這裡是程序管理器),最好從以前使用過它的人那裡瞭解一些技巧。

自動重啟

一旦啟動,您的應用程式將永遠保持活動狀態,在崩潰和機器重新啟動後自動重新啟動-所有這些都只需要一個簡單的命令:pm2 startup

程序管理


無論執行多少應用程式,PM2都有一套指令,是我們可以分別管理它們各自的狀態。下面是一些我們常用的一些的指令(無先後順序):
pm2 start process_prod.json-通過程序json檔案啟動程序
pm2 ls-顯示所有應用程式的列表
pm2 stop <app>-停止一個特定的應用程式
pm2 start <app>-啟動一個特定的應用程式
pm2 <app> scale N-將您指定的應用程式縮放到N個例項(可用於擴大或縮小)
pm2 kill-殺死所有正在執行的應用程式
pm2 restart-重新啟動所有正在執行的應用程式
pm2 reload-重新載入應用程式配置(當您修改應用程式的環境變數時,這很方便)

程序管理

執行指令pm2 monit將返回關於應用程式健康狀況的豐富資料集。例如,您將看到CPU利用率、記憶體使用量、請求/分鐘等等!

廣州VI設計公司https://www.houdianzi.com

日誌管理

PM2有內建的日誌管理。它匯聚裡來自所有應用程式的日誌資料,並將其寫入單個源以供檢視。您甚至可以實時跟蹤日誌,以檢視應用程式的幕後情況。來自PM2的日誌管理也伴隨著日誌迴圈,這一點非常重要,尤其是當應用程式頻繁地輸出冗長的日誌時。

我經常使用三個命令,你也應該這樣做:
pm2 logs—從所有執行的應用程式輸出日誌
pm2 logs app—僅從應用程式輸出日誌
pm2 flush—重新整理所有日誌資料,釋放磁碟空間
記住,要做的最重要的事情是啟用日誌迴圈。這樣做將把一個巨大的日誌檔案分割成許多更小的檔案,這些檔案對於PM2來說更便於管理。為此,執行以下指令:
pm2 install pm2-logrotate
有關日誌管理的更多資訊可以在這裡找到。

如果您發現您的伺服器上經常充滿日誌,請考慮使用集中式日誌服務,如Loggly、Papertrail或ELK。

最佳做法
總的來說,我喜歡遵循應用程式The Twelve-Factor App中列出的慣例。它們將幫助您充分利用PM2。如果你還沒有讀過這份宣言,它可以歸結為以下12條規則:

1.在修訂控制中監測一個程式碼基,有效利用多個程式碼基
2.顯式宣告和隔離依賴項
3.在環境中儲存配置
4.將支援服務視為附加資源
5.嚴格分開構建和執行階段
6.將應用程式作為一個或多個無狀態程序執行
7.通過埠繫結匯出服務
8.通過流程模型向外擴充套件
9.以快速啟動和優雅的關機最大化魯棒性
10.保持開發、分期和生產儘可能相似
11·將日誌視為事件流
12· 一次性執行管理任務

如果您遵循上面的規則,您將能夠有效地使用PM2擴充套件任何應用程式,並且幾乎沒有錯誤。今天的分享就到這裡,希望本文能幫助到您!