成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[譯] 如果可以,永遠(yuǎn)不要在生產(chǎn)中直接運(yùn)行 Node.js

Tony_Zby / 1093人閱讀

摘要:就在幾周前,我正在和一個(gè)朋友談話,他不經(jīng)意間提到,你永遠(yuǎn)都不會(huì)在生產(chǎn)中直接使用來運(yùn)行程序。我強(qiáng)烈點(diǎn)頭,表示我也不會(huì)在生產(chǎn)中直接運(yùn)行,原因可能每個(gè)人都知道。首先,讓我們弄清楚永遠(yuǎn)不要在生產(chǎn)中直接通過運(yùn)行程序的說法。


原文地址:You should never ever run directly against Node.js in production. Maybe.

原文作者:Burke Holland

譯文出自:掘金翻譯計(jì)劃

本文永久鏈接:github.com/xitu/gold-m…

譯者:fireairforce

校對(duì)者:HearFishle, JasonLinkinBright

有時(shí)候我也在想我是否真的知道很多東西。

就在幾周前,我正在和一個(gè)朋友談話,他不經(jīng)意間提到,“你永遠(yuǎn)都不會(huì)在生產(chǎn)中直接使用 Node 來運(yùn)行程序”。我強(qiáng)烈點(diǎn)頭,表示我不會(huì)在生產(chǎn)中直接運(yùn)行 Node,原因可能每個(gè)人都知道。但是我并不知道,我應(yīng)該知道原因嗎?我還能繼續(xù)寫代碼嗎?

如果讓我繪制一個(gè)維恩圖來表示我所知道的和其他人都知道的東西,它看起來就像這樣:

順便一提,我年紀(jì)越大,那個(gè)小點(diǎn)就會(huì)越小。

Alicia Liu 創(chuàng)建了一個(gè)更好的圖表,改變了我的生活。她說這種情況更像是...

我非常喜歡這個(gè)圖表,因?yàn)槲蚁M钦鎸?shí)的。我不想把余生都過得像一個(gè)微不足道的萎縮藍(lán)點(diǎn)一樣。

太戲劇化了。怪潘多拉。當(dāng)我寫這篇文章的時(shí)候,我無(wú)法控制接下來要發(fā)生什么。而 Dashboard Confessional 真是一副毒藥。

好吧,假設(shè) Alicia 的圖表是真的,我想與大家分享一下我現(xiàn)在對(duì)在生產(chǎn)中運(yùn)行 Node 應(yīng)用程序的一些認(rèn)識(shí)。也許在這個(gè)問題上我們的相對(duì)維恩圖沒有重疊。

首先,讓我們弄清楚“永遠(yuǎn)不要在生產(chǎn)中直接通過 Node 運(yùn)行程序”的說法。

永遠(yuǎn)不要直接運(yùn)行生產(chǎn)中的 Node

這個(gè)說法可能對(duì),也可能不對(duì)。我們一起來探討下這個(gè)說法是怎么得到的。首先,讓我們看看為什么不對(duì)。

假設(shè)我們有一個(gè)簡(jiǎn)單的 Express 服務(wù)器。我能想到的最簡(jiǎn)單的 Express 服務(wù)器如下:

const express = require("express");
const app = express();
const port = process.env.PORT || 3000;

// 查看 http://localhost:3000
app.get("/", function(req, res) {
  res.send("Again I Go Unnoticed");
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

通過定義在 package.json 中的啟動(dòng)腳本來運(yùn)行它。

"scripts": {
  "start": "node index.js",
  "test": "pfffft"
}

這里會(huì)有兩個(gè)問題。第一個(gè)是開發(fā)問題,還有一個(gè)是生產(chǎn)問題。

開發(fā)問題指的是當(dāng)我們修改代碼的時(shí)候,我們必須停止并且再次啟動(dòng)應(yīng)用程序來得到我們更改后的效果。

我們通常會(huì)使用某種 Node 進(jìn)程管理器,例如 supervisornodemon 來解決這個(gè)問題。這些包會(huì)監(jiān)聽我們的項(xiàng)目,并會(huì)在我們提交更改時(shí)重啟服務(wù)器。我通常都會(huì)這樣做。

"scripts": {
  "dev": "npx supervisor index.js",
  "start": "node index.js"
}

然后運(yùn)行 npm run dev。請(qǐng)注意,我在這里運(yùn)行 npx supervisor,它允許我們?cè)谖窗惭b supervisor 包的情況下使用它。

我們的另外一個(gè)問題是我們?nèi)匀恢苯釉卺槍?duì) Node 運(yùn)行,我們已經(jīng)說過這很糟糕,現(xiàn)在我們將要找出原因。

我要在這里添加另一個(gè)路由,嘗試從不存在的磁盤讀取文件。這是一個(gè)很容易在任何實(shí)際應(yīng)用程序中出現(xiàn)的錯(cuò)誤。

const express = require("express");
const app = express();
const fs = require("fs");
const port = process.env.PORT || 3000;

// 查看 http://localhost:3000
app.get("/", function(req, res) {
  res.send("Again I Go Unnoticed");
});

app.get("/read", function(req, res) {
  // 這個(gè)路由不存在
  fs.createReadStream("my-self-esteem.txt");
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

如果我們直接針對(duì) Node 運(yùn)行 npm start 并且導(dǎo)航到 read 端點(diǎn),頁(yè)面會(huì)報(bào)錯(cuò),因?yàn)檫@個(gè)文件不存在。

這沒什么大不了的,對(duì)吧?這只是一個(gè)錯(cuò)誤,碰巧發(fā)生了。

不。這很重要。如果你返回終端,你會(huì)看到應(yīng)用程序已經(jīng)完全關(guān)閉了。

這意味著,如果你回到瀏覽器并嘗試訪問站點(diǎn)的根 URL,你會(huì)得到相同的錯(cuò)誤頁(yè)面。一個(gè)方法中的錯(cuò)誤導(dǎo)致應(yīng)用中所有的路由都失效了。

這是很糟糕的。這就是人們說 “永遠(yuǎn)都不要直接在生產(chǎn)中運(yùn)行 Node”

好。如果我們無(wú)法在生產(chǎn)中直接運(yùn)行 Node,那么在生產(chǎn)中運(yùn)行 Node 的正確方法是什么?

生產(chǎn)中 Node 的選項(xiàng)

我們有幾個(gè)選擇。

其中之一就是在生產(chǎn)中簡(jiǎn)單地使用類似 supervisornodemon 的工具,就像我們?cè)陂_發(fā)中使用它們一樣。這可行,但這些工具有點(diǎn)輕量級(jí)。更好的選擇是 pm2。

pm2 支援

pm2 是一個(gè) Node 進(jìn)程管理器,有很多有用的功能。就像其他的 “JavaScript” 庫(kù)一樣,你可以使用 npm 全局安裝它 —— 或者你也可以再次使用 npx。這里不再贅述。

有很多使用 pm2 運(yùn)行程序的方法。最簡(jiǎn)單的就是在入口文件調(diào)用 pm2 start。

"scripts": {
  "start": "pm2 start index.js",
  "dev": "npx supervisor index.js"
},

終端會(huì)顯示這些內(nèi)容:

這是我們?cè)?pm2 監(jiān)控的后臺(tái)運(yùn)行的進(jìn)程。如果你訪問 read 端點(diǎn)把程序搞崩了,pm2 將自動(dòng)重新啟動(dòng)它。你在終端不會(huì)看到任何內(nèi)容,因?yàn)樗诤笈_(tái)運(yùn)行。如果你想看到 pm2 正在做什么,你可以運(yùn)行 pm2 log 0。這個(gè) 0 是我們想要查看日志的進(jìn)程的 ID。

接下來!你可以看到,pm2 會(huì)在應(yīng)用程序由于未處理的錯(cuò)誤而停機(jī)時(shí)重新啟動(dòng)應(yīng)用程序。

我們還可以提取開發(fā)命令,并為我們準(zhǔn)備PM2監(jiān)視文件,在任何更改發(fā)生時(shí)重新啟動(dòng)程序。

"scripts": {
  "start": "pm2 start index.js --watch",
  "dev": "npx supervisor index.js"
},

請(qǐng)注意,因?yàn)?pm2 在后臺(tái)運(yùn)行,所以你不能只是通過 ctrl+c 來終止正在運(yùn)行的 pm2 進(jìn)程。你必須通過傳遞進(jìn)程的 ID 或者名稱來停止進(jìn)程。

pm2 stop 0

pm2 stop index

另請(qǐng)注意,pm2 會(huì)保存對(duì)進(jìn)程的引用,以便你可以重新啟動(dòng)它。

如果要?jiǎng)h除該進(jìn)程引用,則需要運(yùn)行 pm2 delete。你可以使用一個(gè)命令 delete 來停止和刪除進(jìn)程。

pm2 delete index

我們也可以使用 pm2 來運(yùn)行我們應(yīng)用程序的多個(gè)進(jìn)程。pm2 會(huì)自動(dòng)平衡這些實(shí)例的負(fù)載。

使用 pm2 fork 模式的多個(gè)進(jìn)程

pm2 有很多配置選項(xiàng),它們包含在一個(gè) “ecosystem” 文件中??梢酝ㄟ^運(yùn)行 pm2 init來創(chuàng)建一個(gè)。你會(huì)得到以下的內(nèi)容:

module.exports = {
  apps: [
    {
      name: "Express App",
      script: "index.js",
      instances: 4,
      autorestart: true,
      watch: true,
      max_memory_restart: "1G",
      env: {
        NODE_ENV: "development"
      },
      env_production: {
        NODE_ENV: "production"
      }
    }
  ]
};

本文不會(huì)去講關(guān)于“部署”的內(nèi)容,因?yàn)槲覍?duì)“部署”也不太了解。

“應(yīng)用程序”部分定義了希望 pm2 運(yùn)行和監(jiān)視的應(yīng)用程序。你可以運(yùn)行不止一個(gè)應(yīng)用程序。許多這些配置設(shè)置可能是不言而喻的。這里我要關(guān)注的是實(shí)例設(shè)置。

pm2 可以運(yùn)行你的應(yīng)用程序的多個(gè)實(shí)例。你可以傳入多個(gè)你想運(yùn)行的實(shí)例,pm2 都可以啟動(dòng)它們。因此,如果我們想運(yùn)行 4 個(gè)實(shí)例,我們可以創(chuàng)建以下配置文件。

module.exports = {
  apps: [
    {
      name: "Express App",
      script: "index.js",
      instances: 4,
      autorestart: true,
      watch: true,
      max_memory_restart: "1G",
      env: {
        NODE_ENV: "development"
      },
      env_production: {
        NODE_ENV: "production"
      }
    }
  ]
};

然后我們使用 pm2 start 來運(yùn)行它。

pm2 現(xiàn)在會(huì)以“集群”模式運(yùn)行。這些進(jìn)程中的每一個(gè)都會(huì)在我的計(jì)算機(jī)上的不同 CPU 上運(yùn)行,具體取決于我擁有的內(nèi)核數(shù)量。如果我們想在不知道擁有多個(gè)內(nèi)核的情況下為每個(gè)內(nèi)核運(yùn)行一個(gè)進(jìn)程,我們就可以將 max 參數(shù)傳遞給 instances 參數(shù)來進(jìn)行配置。

{
   ...
   instances: "max",
   ...
}

讓我們看看我的這臺(tái)機(jī)器上有幾個(gè)內(nèi)核。

8個(gè)內(nèi)核!哇。我要在我的微軟發(fā)行的機(jī)器上安裝 Subnautica。別告訴他們我說過。

在分隔的 CPU 上運(yùn)行進(jìn)程的好處是,即使有一個(gè)進(jìn)程運(yùn)行異常,占用了 100% 的 CPU,其他進(jìn)程依然可以保持運(yùn)行。pm2 將根據(jù)需要將 CPU 上的進(jìn)程加倍。

你可以使用 pm2 進(jìn)行更多操作,包括監(jiān)視和以其他方式處理那些討厭的 environment variables。

另外一個(gè)注意事項(xiàng):如果由于某種原因,你希望 pm2 運(yùn)行 npm start 指令。你可以通過運(yùn)行 npm 作為進(jìn)程并傳遞 -- start?!皊tart” 之前的空格在這里非常重要。

pm2 start npm -- start

在 Azure AppService 中,默認(rèn)在后臺(tái)包含 pm2。如果要在 Azure 中使用 pm2,則無(wú)需將其包含在 package.json 文件中。你可以添加一個(gè) ecosystem 文件,然后就可以使用了。

好!既然我們已經(jīng)了解了關(guān)于 pm2 的所有內(nèi)容,那么讓我們談?wù)劄槭裁茨憧赡懿幌胧褂盟?,而且它可能確實(shí)可以直接針對(duì) Node 運(yùn)行。

在生產(chǎn)中直接針對(duì) Node 運(yùn)行

我對(duì)此有一些疑問,所以我聯(lián)系了 Tierney Cyren,它是巨大的橙色知識(shí)圈的一部分,特別是在 Node 方面。

Tierney 指出使用基于 Node 的進(jìn)程管理器(如 pm2)有一些缺點(diǎn)。

主要原因是不應(yīng)該使用 Node 來監(jiān)視 Node。你肯定不希望用你正在監(jiān)視的東西監(jiān)視它自己。就像你在周五晚上讓我十幾歲的兒子監(jiān)督他自己一樣:結(jié)果會(huì)很糟糕嗎?可能,也可能不會(huì)。。

Tierney 建議你不要使用 Node 進(jìn)程管理器來運(yùn)行應(yīng)用程序。相反,在更高級(jí)別上有一些東西可以監(jiān)視應(yīng)用程序的多個(gè)多帶帶實(shí)例。例如,一個(gè)理想的設(shè)置是,如果你有一個(gè) Kubernetes 集群,你的應(yīng)用程序在不同的容器上運(yùn)行。然后 Kubernetes 可以監(jiān)控這些容器,如果其中任何容器發(fā)生故障,它可以將它們恢復(fù)并且報(bào)告健康狀況。

在這種情況下,你可以直接針對(duì)Node運(yùn)行,因?yàn)槟阏诟呒?jí)別進(jìn)行監(jiān)視。

事實(shí)證明,Azure 已經(jīng)在做這件事了。如果我們不將 pm2 ecosystem 文件推送到 Azure,它將使用我們的 package.json 文件運(yùn)行腳本來啟動(dòng)應(yīng)用程序,我們可以直接針對(duì)Node運(yùn)行。

"scripts": {
  "start": "node index.js"
}

在這種情況下,我們直接針對(duì) Node 運(yùn)行,沒關(guān)系。如果應(yīng)用程序崩潰,你會(huì)發(fā)現(xiàn)它又回來了。那是因?yàn)樵?Azure 中,你的應(yīng)用程序在一個(gè)容器中運(yùn)行。Azure 負(fù)責(zé)容器調(diào)度,并知道何時(shí)去更新。

但這里仍然只有一個(gè)實(shí)例。容器崩潰后需要一秒鐘才能重新聯(lián)機(jī),這意味著你的用戶可能會(huì)有幾秒鐘的停機(jī)時(shí)間。

理想情況下,你希望運(yùn)行多個(gè)容器。解決方案是將應(yīng)用程序的多個(gè)實(shí)例部署到多個(gè) Azure AppService 站點(diǎn),然后使用 Azure Front Door 在單個(gè) IP 地址下對(duì)應(yīng)用程序進(jìn)行負(fù)載均衡。Front Door 知道容器何時(shí)關(guān)閉,并且將流量路由到應(yīng)用程序的其他健康實(shí)例。

Azure Front Door Service | Microsoft Azure
使用 Azure Front Door 交付,保護(hù)和跟蹤全球分布式微服務(wù)應(yīng)用程序的性能

systemd

Tierney 的另一個(gè)建議是使用 systemd 運(yùn)行 Node。我不是很了解(或者說根本不知道)systemd,我已經(jīng)把這句話弄錯(cuò)過一次了,所以我會(huì)用 Tierney 自己的原話來表述:

只有在部署中訪問 Linux 并控制 Node 在服務(wù)級(jí)別上啟動(dòng)的方式時(shí),才有可能實(shí)現(xiàn)此選項(xiàng)。如果你在一個(gè)長(zhǎng)時(shí)間運(yùn)行的 Linux 虛擬機(jī)中運(yùn)行 node.js 進(jìn)程,比如說 Azure 虛擬機(jī),那么使用 systemd 運(yùn)行 node.js 是個(gè)不錯(cuò)的選擇。如果你只是將文件部署到類似于 Azure AppService 或 Heroku 的服務(wù)中,或者運(yùn)行在類似于 Azure 容器實(shí)例的容器化環(huán)境中,那么你可以避開此選項(xiàng)。

使用 Systemd 運(yùn)行 Node.js 應(yīng)用程序 —— 第一部分

你已經(jīng)在 Node 中編寫了下一個(gè)很棒的應(yīng)用程序,并且你已經(jīng)準(zhǔn)備發(fā)布它。這意味著你可以...

Node.js 工作線程

Tierney 還希望你知道 Node 中有工作線程,這可以讓你在多個(gè)線程上啟動(dòng)你的應(yīng)用程序,從而無(wú)需像 pm2 這樣的東西。也許吧。我不知道,我沒看過這篇文章。

Node.js v11.14.0 Documentation

The worker_threads module enables the use of threads that execute JavaScript in parallel. To access it: const worker =…

做個(gè)成熟的開發(fā)者

Tierney 的最后一個(gè)建議就是像一個(gè)成熟的開發(fā)者一樣處理錯(cuò)誤和編寫測(cè)試。但是誰(shuí)有時(shí)間呢?

小圓圈永駐

現(xiàn)在你知道這個(gè)藍(lán)色小圓圈里的大部分東西了。剩下的只是關(guān)于 emo 樂隊(duì)和啤酒的無(wú)用事情。

有關(guān) pm2, Node 和 Azure 的更多信息,請(qǐng)查看以下資源:

pm2.keymetrics.io/

VS Code 上的 Node.js 部署

將簡(jiǎn)單的 Node 站點(diǎn)部署到 Azure

如果發(fā)現(xiàn)譯文存在錯(cuò)誤或其他需要改進(jìn)的地方,歡迎到 掘金翻譯計(jì)劃 對(duì)譯文進(jìn)行修改并 PR,也可獲得相應(yīng)獎(jiǎng)勵(lì)積分。文章開頭的 本文永久鏈接 即為本文在 GitHub 上的 MarkDown 鏈接。


掘金翻譯計(jì)劃 是一個(gè)翻譯優(yōu)質(zhì)互聯(lián)網(wǎng)技術(shù)文章的社區(qū),文章來源為 掘金 上的英文分享文章。內(nèi)容覆蓋 Android、iOS、前端、后端、區(qū)塊鏈、產(chǎn)品、設(shè)計(jì)、人工智能等領(lǐng)域,想要查看更多優(yōu)質(zhì)譯文請(qǐng)持續(xù)關(guān)注 掘金翻譯計(jì)劃、官方微博、知乎專欄。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/6813.html

相關(guān)文章

  • [] JavaScript 性能優(yōu)化殺手

    摘要:原文引言這篇文檔包含了如何避免使代碼性能遠(yuǎn)低于預(yù)期的建議尤其是一些會(huì)導(dǎo)致牽涉到等無(wú)法優(yōu)化相關(guān)函數(shù)的問題一些背景在中并沒有解釋器但卻有兩個(gè)不同的編譯器通用編譯器和優(yōu)化編譯器這意味著你的代碼總是會(huì)被編譯為機(jī)器碼后直接運(yùn)行這樣一定很快咯并不是 原文:http://dev.zm1v1.com/2015/08/19/javascript-optimization-killers/引言 這篇文檔包...

    MockingBird 評(píng)論0 收藏0
  • []Express生產(chǎn)環(huán)境下的最佳實(shí)踐 - 性能和可靠性

    摘要:前言這將是一個(gè)分為兩部分,內(nèi)容是關(guān)于在生產(chǎn)環(huán)境下,跑應(yīng)用的最佳實(shí)踐。第一部分會(huì)關(guān)注安全性,第二部分則會(huì)關(guān)注性能和可靠性。關(guān)于第一部分,請(qǐng)參閱在生產(chǎn)環(huán)境下的最佳實(shí)踐安全性。 前言 這將是一個(gè)分為兩部分,內(nèi)容是關(guān)于在生產(chǎn)環(huán)境下,跑Express應(yīng)用的最佳實(shí)踐。第一部分會(huì)關(guān)注安全性,第二部分則會(huì)關(guān)注性能和可靠性。當(dāng)你讀這篇文章時(shí),會(huì)假設(shè)你已經(jīng)對(duì)Node.js和web開發(fā)有所了解,并且對(duì)生產(chǎn)環(huán)...

    Luosunce 評(píng)論0 收藏0
  • []教程:如何使用Rollup打包JavaScript

    摘要:教程如何使用打包通過這個(gè)系列教程一步一步學(xué)習(xí)如何使用更小更快的取代和打包文件。安裝并且創(chuàng)建配置文件。提示是告訴我們實(shí)際需要哪些插件的集合。通過下面的命令安裝兩個(gè)插件更新然后,引入插件并添加進(jìn)配置注意屬性是為了幫助模塊遷移到的一部分。 教程:如何使用Rollup打包JavaScript 通過這個(gè)系列教程一步一步學(xué)習(xí)如何使用更小更快的Rollup取代webpack和Browserify打包...

    luoyibu 評(píng)論0 收藏0
  • []Express生產(chǎn)環(huán)境下的最佳實(shí)踐 - 安全性

    摘要:前言這將是一個(gè)分為兩部分,內(nèi)容是關(guān)于在生產(chǎn)環(huán)境下,跑應(yīng)用的最佳實(shí)踐。潛在的攻擊者可以通過它們進(jìn)行針對(duì)性的攻擊。 前言 這將是一個(gè)分為兩部分,內(nèi)容是關(guān)于在生產(chǎn)環(huán)境下,跑Express應(yīng)用的最佳實(shí)踐。第一部分會(huì)關(guān)注安全性,第二部分最會(huì)關(guān)注性能和可靠性。當(dāng)你讀這篇文章時(shí),假設(shè)你已經(jīng)對(duì)Node.js和web開發(fā)有所了解,并且對(duì)生產(chǎn)環(huán)境有了概念。 概覽 生產(chǎn)環(huán)境,指的是軟件生命循環(huán)中的某個(gè)階段。...

    Forelax 評(píng)論0 收藏0
  • Node.js 前端開發(fā)指南

    摘要:定時(shí)器在和瀏覽器中的表現(xiàn)形式是相同的。關(guān)于定時(shí)器的一個(gè)重要的事情是,我們提供的延遲不代表在這個(gè)時(shí)間之后回調(diào)就會(huì)被執(zhí)行。它的真正含義是,一旦主線程完成所有操作包括微任務(wù)并且沒有其它具有更高優(yōu)先級(jí)的定時(shí)器,將在此時(shí)間之后執(zhí)行回調(diào)。 眾成翻譯 原文鏈接 關(guān)于作者 2018年6月21日出版? 本指南面向了解Javascript但尚未十分熟悉Node.js的前端開發(fā)人員。我這里不專注于語(yǔ)言本身...

    CntChen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<