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

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

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

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

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

PM2是什麼呢?
Screen Shot 2019-08-01 at 13敗50(58ipng]mhttps://g-Vtblog.csdnimg.cn/2098032129447.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_1009,text_aHR5cHM6Ly6ibG9nLmNzZG4ubmV0L3NvbmdmZW4z,size_1),color_FFFFFF,t_70/01908032129447.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NvbmdmZW5z,size_16,color_FFFFFF,t_70)]

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自動生成多個進程。

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

自動重啓
Screen Shot 2019-08-01 at 14.33.27.png
一旦啓動,您的應用程序將永遠保持活動狀態,在崩潰和機器重新啓動後自動重新啓動-所有這些都只需要一個簡單的命令:pm2 startup

進程管理
Screen Shot 2019-08-01 at 14.35.51.png
無論運行多少應用程序,PM2都有一套指令,是我們可以分別管理它們各自的狀態。下面是一些我們常用的一些的指令(無先後順序):
pm2 start process_prod.json-通過進程json文件啓動進程
pm2 ls-顯示所有應用程序的列表
pm2 stop -停止一個特定的應用程序
pm2 start -啓動一個特定的應用程序
pm2 scale N-將您指定的應用程序縮放到N個實例(可用於擴大或縮小)
pm2 kill-殺死所有正在運行的應用程序
pm2 restart-重新啓動所有正在運行的應用程序
pm2 reload-重新加載應用程序配置(當您修改應用程序的環境變量時,這很方便)

進程管理
![Screen Shot 2019-08-01 at 14.45.22.png](https://img-blog.csdnimg.cn/20190803213342697.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NvbmdmZW5z,size_16,color_FFFFFF,t_70
運行指令pm2 monit將返回關於應用程序健康狀況的豐富數據集。例如,您將看到CPU利用率、內存使用量、請求/分鐘等等!

日誌管理Screen Shot 2019-08-01 at 14.47.46.png

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擴展任何應用程序,並且幾乎沒有錯誤。

今天的分享就到這裏,希望本文能幫助到您!

點贊,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
關注公衆號「新前端社區」,享受文章首發體驗!
每週重點攻克一個前端技術難點。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章