[譯] 在生產環境運行 PM2 & Node.js

原文:medium.com/hackernoon/…node

維護你的代碼庫並保持其相關性確有難度;但與之相比咱們會發現,維護一個應用時最大的挑戰來自於保持其存活和運行。不只如此,隨着 Node.js 變成大部分後端 API 的核心語言,單線程程序的伸縮也變得困難;這就是 PM2 出現並受到歡迎的緣由了。git

有不少進程管理工具,廣爲人知的如 Foreverstrong-pm,或是不錯的 Linux 系統工具 SystemD。還有就是本文的主角 PM2,有着 4100 多萬的總下載量和 31k GitHub stars(譯註:截止本文翻譯時)。究其緣由,簡單地說,就是其簡單易用而且讓管理一個生產環境變得完美無缺。github

何爲 PM2?

正如其新版首頁中所標榜的,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

安裝 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/… 找到。

若是發現你的實例常常被日誌填滿,也能夠考慮使用一個集中式日誌服務,如 LogglyPapertrail,或 ELK

最佳實踐

一般,我會樂於遵照 「應用十二因素」(12factor.net/)所述的實踐。這將幫助… PM2 全部的優點。若是你已經閱讀過其聲明,應該見到了這 12 條規則:

  1. 一個置於版本控制下的代碼庫, 多份部署
  2. 明確地聲明,並隔離依賴
  3. 在環境而非代碼中存儲配置
  4. 將後端服務視爲附加資源
  5. 嚴格區分構建和運行階段
  6. 以一個或多個無狀態進程運行應用
  7. 經過端口綁定輸出服務
  8. 經過進程模型擴展
  9. 經過快速啓動和優雅地關閉保證最大的健壯性
  10. 儘量保持開發和線上環境儘可能一致
  11. 把日誌視爲事件流
  12. 以一次性進程的形式運行後臺管理任務

若是遵照了以上規則,你將可以經過 PM2 高效而安全地擴展任何應用。



--End--

搜索 fewelife 關注公衆號

轉載請註明出處

相關文章
相關標籤/搜索