原文:medium.com/hackernoon/…node
維護你的代碼庫並保持其相關性確有難度;但與之相比咱們會發現,維護一個應用時最大的挑戰來自於保持其存活和運行。不只如此,隨着 Node.js 變成大部分後端 API 的核心語言,單線程程序的伸縮也變得困難;這就是 PM2 出現並受到歡迎的緣由了。git
有不少進程管理工具,廣爲人知的如 Forever、strong-pm,或是不錯的 Linux 系統工具 SystemD。還有就是本文的主角 PM2,有着 4100 多萬的總下載量和 31k GitHub stars(譯註:截止本文翻譯時)。究其緣由,簡單地說,就是其簡單易用而且讓管理一個生產環境變得完美無缺。github
正如其新版首頁中所標榜的,PM2 是一個「身經百戰(battle hardened)」的、適用於生產環境的 Node.js 應用運行時和進程管理工具。 也自帶了內建的 負載均衡器,這使得擴展應用越發容易。最棒的是,它在 Linux、Windows 和 macOS 都能工做。docker
經過一個 process.json
配置文件(譯註:該文件可自行命名,通常叫作 process.json、processes.json 或 ecosystem.json,該名稱將做爲參數傳入 pm2 start
等命令中),你能夠指定想要運行的進程及要擴展到多少個進程。當啓動 PM2 時,它將根據以上配置文件處理其餘全部的事情(甚至比配置文件指定的更多一些 😉)。json
全部這些意味着 PM2 能幫助你保持 Node.js 應用永遠運行下去,並在你更新應用或服務器時以 0 故障停機時間自動重啓。後端
安裝 PM2 就是小菜一碟。首先,確保你已經配置好了 process.json 文件,用以啓動進程。api
通常只需運行 yarn add global pm2 便可安裝。若是使用了一個 Docker 容器(對,也支持 Docker),按照 pm2.keymetrics.io/docs/usage/… 中的說明安裝。安全
若是你實在好奇它看起來長什麼樣,這裏有一個 process_prod.json 文件的例子,用於一個開源的 RSS & 播客 應用:bash
// process_prod.json { "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", // 啓動模式,默認爲 fork "watch": false, // 若是容許 watch,則其中的文件改變會引起重啓 "max_memory_restart": "150M" // 引起重啓的最大內存使用量 } ] } 複製代碼
如你所見,咱們運行了若干個進程,而且 PM2 輕鬆掌控了一切;其自動地使用了 Node.js 的 Cluster API 以實現多進程。服務器
譯註:配置文件的完整介紹見 pm2.keymetrics.io/docs/usage/…
對於任何應用(或者本例中的進程管理工具),從先行者那裏瞭解一些技巧和經驗都是有好處的。
一旦 PM2 啓動,你的應用就將永遠存活,並在應用崩潰和機器從新啓動後自動重啓 -- 全部這些只消一條簡單的命令(用於得到針對所在機器的自動配置過的啓動腳本):
pm2 startup
複製代碼
如:
$ pm2 startup [PM2] You have to run this command as root. Execute the following command: sudo su -c "env PATH=$PATH:/home/unitech/.nvm/versions/node/v4.3/bin pm2 startup <distribution> -u <user> --hp <home-path> 複製代碼
只要按照打印的結果,拷貝並運行獲得的腳本就好了。
無論你運行了多少個應用,PM2 的一套命令都能讓你管理它們各自的狀態。如下是經常使用的一些命令(不區分順序):
pm2 start process_prod.json
— 經過進程配置文件啓動進程pm2 ls
— 列出全部的應用pm2 stop <app>
— 中止指定的應用pm2 start <app>
— 啓動指定的應用pm2 <app> scale N
— 縮放指定應用的實例數量pm2 kill
— 殺掉全部運行中的應用pm2 restart
— 重啓全部運行中的應用pm2 reload
— 從新加載應用配置(這會在你修改了應用的環境變量時派上用場)運行命令 pm2 monit
會返回關於應用健康的豐富數據。好比,你將看到 CPU 利用率、內存使用量、請求分鐘數等等。
PM2 內建了日誌管理功能。它從全部你的應用中聚合日誌數據,並將其寫入一個用於閱讀的源文件中。你甚至能夠經過事實跟蹤日誌來看到應用背後正在發生什麼。 PM2 的日誌管理也提供了日誌循環,這一點很是重要,特別是當應用程序頻繁地輸出詳細日誌時。
有三條我常用的命令,想必你也應該同樣:
pm2 logs
— 從全部正在運行的應用中輸出日誌pm2 logs <app>
— 只從指定的應用中輸出日誌pm2 flush
— 刷新全部日誌數據,釋放磁盤空間請記住,確保日誌循環是最重要的事情。這樣作將會把一個巨大的日誌文件分割成若干易於 PM2 管理的小文件。要作到這點,運行以下命令:
pm2 install pm2\-logrotate
複製代碼
日誌管理的更多信息能夠在 pm2.keymetrics.io/docs/usage/… 找到。
若是發現你的實例常常被日誌填滿,也能夠考慮使用一個集中式日誌服務,如 Loggly、Papertrail,或 ELK。
一般,我會樂於遵照 「應用十二因素」(12factor.net/)所述的實踐。這將幫助… PM2 全部的優點。若是你已經閱讀過其聲明,應該見到了這 12 條規則:
若是遵照了以上規則,你將可以經過 PM2 高效而安全地擴展任何應用。
搜索 fewelife 關注公衆號
轉載請註明出處