在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 -停止一個特定的應用程序
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利用率、內存使用量、請求/分鐘等等!
日誌管理
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擴展任何應用程序,並且幾乎沒有錯誤。
今天的分享就到這裏,希望本文能幫助到您!
點贊,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
關注公衆號「新前端社區」,享受文章首發體驗!
每週重點攻克一個前端技術難點。