JavaScript >> Javascript 文檔 >  >> Tags >> APP

使用 Forever 運行節點應用程序

簡介

對於許多人來說,在生產環境中實際運行代碼是事後才想到的,而僅僅編寫代碼才是真正的挑戰所在。雖然這在我的經驗中大部分是正確的,但找到一種可靠且簡單的方法來運行您的應用程序本身可能非常困難。

運行應用時需要考慮一些事項。

  • 輸出/日誌會去哪裡?
  • 如果應用崩潰了怎麼辦?
  • 如何跟踪我的所有守護進程?
  • 如何為每個進程提供配置?

這是節點 forever 包真的很有用。它可以幫助您輕鬆管理上述所有問題以及更多問題,我將在接下來的幾節中進行介紹。

什麼是永遠?

forever 是一個完全用 JavaScript 編寫的 Node 應用程序的命令行實用程序。它旨在通過管理(啟動、停止、重新啟動等)節點進程及其配置來簡化您在生產環境中的生活。您可以在命令行或以編程方式使用它(通過 forever-monitor ) 在您的節點代碼中。

您可以通過命令行或 JSON 配置文件指定這些配置。我個人更喜歡 JSON 文件,因為您可以在單個文件中配置多個 Node 進程,從而可以輕鬆地一次啟動所有進程。通過這種方式,我可以毫不猶豫地將一個大單體拆分成多個獨立的服務,因為有了 forever 之類的實用程序,管理它們會容易得多 .

它通過將 Flatiron 服務器作為守護進程運行來管理您的其他守護進程,因此如果/當您的代碼失敗和崩潰時,forever 將在那裡自動重新啟動它,並希望避免您的用戶停機。運行 forever 使用 Flatiron 服務器是一種在監視用戶輸入的同時保持實用程序正常運行的簡單方法,並且由於 CLI 插件,這對於 forever 來說很容易 開發商做的。如果您要創建像 forever 這樣的程序 (即接收用戶命令的長時間運行的守護進程)那麼我強烈建議您這樣做。這將使事情變得容易得多。

進程間通信通過套接字進行,由高級 nssocket 處理 圖書館。允許在進程之間重新打開通信的套接字文件位於 [forever.root]/socks 中 .自然地,進程之間的消息被序列化為 JSON。這是另一個有用的庫,可以檢查您是否需要基於事件的套接字通信。

我應該指出,關於 forever 的一項重要功能 (以及其他類似的進程管理工具)是您也可以將其用於非 Node 應用程序,例如 Python、Ruby 等。-c ,或命令標誌(稍後會看到),讓我們告訴 forever 如何運行您的應用程序。使用它,您可以告訴它使用任何其他解釋器來執行,例如 Python:

$ forever start -c python py_script.py

因此,即使您不喜歡 Node,或者只是需要為項目使用不同的語言,請記住這對您仍然有用。

如何永遠使用

好的,進入重要的部分,如何實際使用該死的東西。讓我們從一個簡單的例子開始,比如啟動和停止一個網絡應用程序。對於我們的示例,我們將啟動和停止“hello world”Express 服務器:

// index.js

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello World!');
});

var server = app.listen(8080);

安裝 forevernpm install forever -g ,並使用以下命令啟動服務器:

$ forever start -a index.js

這將作為後台進程啟動 Express 應用程序。 -a 標誌將日誌附加到位於 forever 中的默認日誌文件 的根目錄(~/.forever 默認情況下在 Unix 系統上)。您將無法 start 如果日誌文件已經存在,則應用沒有此標誌。

使用 forever list 檢查正在運行的進程 :

info:    Forever processes running
data:        uid  command                                         script   forever pid   id logfile                        uptime      
data:    [0] moMB /Users/scott/.nvm/versions/node/v4.1.2/bin/node index.js 21389   21390    /Users/scott/.forever/moMB.log 0:0:0:3.345

要停止該進程,只需通過 id (21390 ), uid (moMB ), pid (21389 ), 索引 (0 ) 或腳本名稱 (index.js ):

$ forever stop index.js

雖然這很好,但可能會更好。 index.js 對我們的應用來說不是很獨特,而且 PID 也很難記住,為什麼要給它起一個更好的名字呢?這樣您就不必繼續運行 forever list 獲取有關您正在運行的進程的信息。

$ forever start -a --uid myapp index.js

現在你可以停止它:

$ forever stop myapp

命令行上的兩個參數還不錯,但是當您開始為日誌文件、不同的 Node 可執行文件、工作目錄等添加參數時,它可能會變得有點多。因此,您可以使用 JSON 配置文件,而不是在命令行中指定所有內容:

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

{
    // Comments are allowed!
    "uid": "myapp",
    "append": true,
    "watch": true,
    "script": "index.js",
    "sourceDir": "/home/scott/myapp",
    "command": /Users/scott/.nvm/versions/node/v4.1.2/bin/node
}

假設此文件在您當前的工作目錄中並命名為 forever.json ,這樣使用:

$ forever start ./forever.json

如您所見,您甚至可以告訴 forever 使用哪個版本的 Node,當您在單個服務器上有多個需要不同版本的應用程序(如 io.js fork)時,這真的很方便。

[
  {
    // App using Node v0.11.8
    "uid": "myapp1",
    "append": true,
    "watch": true,
    "script": "index.js",
    "sourceDir": "/Users/scott/myapp1",
    "command": "/Users/scott/.nvm/versions/node/v0.11.8/bin/node"
  },
  {
    // App using io.js
    "uid": "myapp2",
    "append": true,
    "watch": true,
    "script": "index.js",
    "sourceDir": "/Users/scott/myapp2",
    "command": "/Users/scott/.nvm/versions/io.js/v2.2.1/bin/node",
    "args": ["--port", "8080"]
  }
]

結論

有一些工具可以幫助您運行 Node 應用程序,其中最著名的是 foreverpm2 .我都試過了,並認為 forever 使用起來更容易一些(主要是因為它更簡單並且需要擔心的功能/選項更少),而 pm2 更強大。如果你真的有野心,你可以試試 pm2 的集群模式或 API,以幫助監控有關您正在運行的應用程序的指標。

forever 等流程管理工具還有哪些有趣的配置和用途? ?請在評論中告訴我們!


Tutorial JavaScript 教程
  1. 空與未定義?答案:無

  2. 大 O 符號

  3. 6 分鐘了解 8 個 JavaScript 數組方法

  4. 反應基礎 |第 4 部分

  5. 為什麼我要從 React 切換到 Cycle.js

  6. 異步 JavaScript 詳細信息

  7. 為什麼 JavaScript 是一種多範式語言?

  1. 將數據動態加載到 rmarkdown html 輸出中

  2. 了解 JavaScript 中的閉包

  3. Neutralinojs + React 入門模板

  4. 跨域 iframe 內容加載檢測

  5. 在已觸發 js 函數的 div 中添加一個元素(輸入)

  6. DIFT:初學者的十幾個問題

  7. Leetcode 日記:1561 - 您可以獲得的最大硬幣數量

  1. 如何將應用程序部署到 GitLab 頁面

  2. Kinsta Kingpin:TechVoltz 的 Nikhil Vimal 訪談

  3. 使用 React 將文件上傳到 Azure Blob 存儲

  4. 使用 Notion 創建 NextJS 博客