Рубрики
Без рубрики

Вы никогда не должны бежать напрямую против Node.js в производстве. Может быть.

Иногда мне интересно, знаете ли я много чего-либо вообще. Всего несколько недель назад я разговаривал с другом, который упомянул от руки, – вы никогда не будете запускать приложение непосредственно против узла в производстве ». Я энергично кивнул, чтобы сигнал, чтобы я никогда не пробежал против узла

Автор оригинала: FreeCodeCamp Community Member.

Иногда мне интересно, знаете ли я много чего-либо вообще.

Всего несколько недель назад я разговаривал с другом, который упомянул от руки, – вы никогда не будете запускать приложение непосредственно против узла в производстве ».

Я энергично кивнул, чтобы сигнализировать, что я Также никогда не пробежал против узла в производстве, потому что … Хахаха …everyyone знает это. Но я этого не знал! Должен ли я знать это?! ?? Мне все еще разрешено программировать?

Если бы я был нарисовать диаграмму в Венде того, что я знаю, против того, что я чувствую, что все остальные знают, это выглядит так …

Кстати, эта крошечная точка становится меньше, чем старше, которую я получаю.

Есть лучшая диаграмма, созданная Алисия Лю Такого рода изменил мою жизнь. Она говорит, что это больше похоже на это …

Я так сильно люблю эту диаграмму, потому что хочу, чтобы это было правдой. Я не хочу проводить остаток своей жизни как крошечной, сокращая синюю точку незначительности.

Так драматично Виноват Пандора. Я не контролирую то, что играет дальше, пока я пишу эту статью и Приборная панель конфессиональная это препарат Helluva.

Ну, предполагая, что диаграмма Алиции верна, я хотел бы поделиться с вами, что я сейчас Знайте о запуске приложений узла в производстве. Возможно, наши относительные диаграммы Venn не пересекаются на эту тему.

Во-первых, давайте обратимся к заявлению «Никогда не запускайте приложения непосредственно против узла в производстве».

Никогда не бегайте прямо против узла в производстве

Может быть. Но, возможно, нет. Давайте поговорим о рассуждении этого заявления. Во-первых, давайте посмотрим на почему нет.

Скажем, у нас есть простой экспресс-сервер. Самый простой экспресс-сервер, о котором я могу подумать …

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

// viewed at 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}!`));

Мы бы запустили это с помощью сценария START в Package.json файл.

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

Здесь есть такие две проблемы. Первый – проблема развития, а вторая – это проблема производства.

Проблема разработки в том, что когда мы изменяем код, мы должны остановиться и запустить приложение, чтобы получить наши изменения.

Чтобы решить, что мы обычно используем какой-то диспетчер процессов узла, как руководитель или Номемон Отказ Эти пакеты будут смотреть на наш проект и перезапустить наш сервер всякий раз, когда мы внесем изменения. Я обычно делаю это, как это …

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

Тогда я бегу NPM запустить dev Отказ Обратите внимание, что я бегу NPX Supervisor Вот что позволяет мне использовать руководитель Пакет без необходимости устанавливать его. I ❤️ 2019. В основном.

Наша другая проблема в том, что мы все еще бегаем прямо против узла, и мы уже говорили, что это плохо, и теперь мы собираемся выяснить, почему.

Я собираюсь добавить еще один маршрут здесь, что пытается прочитать файл с диска, который не существует. Это ошибка, которая может быть легко отображаться в любом реальном применении.

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

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

app.get("/read", function(req, res) {
  // this does not exist
  fs.createReadStream("my-self-esteem.txt");
});

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

Если мы запустим это прямо против узла с NPM начать и перейдите к читать Конечная точка, мы получаем ошибку, потому что этот файл не существует.

Что – нет большого значения правильно? Это одна ошибка. Такое случается.

НЕТ. Большое дело. Если вы вернетесь к вашему терминалу, вы увидите, что приложение полностью вниз.

Это означает, что если вы вернетесь к браузеру и попробуйте перейти к корневому URL-адресу сайта, вы получаете ту же страницу ошибки. Одна ошибка в одном методе приняла приложение на Все Отказ

Плохо. Как очень плохо. Это одна из главных причин, почему люди говорят «Никогда не бегайте прямо против узла в производстве» Отказ

ОК. Поэтому, если мы не можем бежать против узла в производстве, каковы правильный путь к запуску узла в производстве?

Варианты для производства узла

У нас есть несколько вариантов.

Один из них будет просто использовать что-то вроде руководитель или Номемон При производстве так же мы используем их в разработке. Это будет работать, но эти инструменты немного на легкой стороне. Лучший вариант – это что называется PM2.

PM2 спасение

PM2 – это менеджер процессов узла, который имеет много колоколов и свистков. Как и все остальное “JavaScript”, вы устанавливаете его (глобально) из NPM – или вы можете просто использовать NPX очередной раз. Я не хочу говорить вам, как жить своей жизнью.

Есть много способов запуска вашего приложения с PM2. Самый простой способ – просто позвонить PM2 начать на вашей точке входа.

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

И вы увидите что-то вроде этого в терминале …

Это наш процесс, работающий на заднем плане, контролируемом PM2. Если вы посетите читать Конечная точка и аварийный приложение, PM2 автоматически перезапустит его. Вы не увидите ничего из этого в терминале, потому что он работает на заднем плане. Если вы хотите посмотреть PM2, вы должны запустить PM2 Log 0 Отказ 0 Является ли идентификатор процесса, который мы хотим увидеть журналы.

Там мы идем! Вы можете увидеть PM2 перезапустите приложение, когда он опустится из-за нашей необразованной ошибки.

Мы также можем вытащить нашу команду Dev и у нас есть файлы PM2 для нас и перезапустить любые изменения.

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

Обратите внимание, что поскольку PM2 пробегает вещи на заднем плане, вы не можете просто Ctrl + C Ваш выход из бегущего процесса PM2. Вы должны остановить его, передавая идентификатор или имя.

PM2 Стоп 0.

PM2 Stop index

Кроме того, обратите внимание, что PM2 сохраняет ссылку на процесс, чтобы вы могли перезапустить его.

Если вы хотите удалить эта ссылка на процесс, вам нужно запустить PM2 Удалить Отказ Вы можете остановить и удалить процесс в одной команде с Удалить Отказ

PM2 Удалить индекс

Мы также можем использовать PM2 для запуска нескольких процессов нашего приложения. PM2 автоматически сбалансирует нагрузку на эти экземпляры.

Несколько процессов с вилкой PM2

PM2 имеет тонна параметров конфигурации, а те, которые содержатся в файле «экосистема». Создать один, запустить PM2 init Отказ Вы получите что-то вроде этого …

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 запустить и контролировать. Вы можете бежать более одного. Многие из этих настроек конфигурации, вероятно, самоуверенно. Тот, который я хочу сосредоточиться здесь, – это экземпляры параметр.

PM2 может запускать несколько экземпляров вашего приложения. Вы можете пройти в ряде экземпляров, которые вы хотите запустить, и PM2 будет вращаться так много. Поэтому, если мы хотели запустить 4 экземпляра, мы могли бы иметь следующий файл конфигурации.

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 начать Отказ

PM2 теперь работает в режиме «кластера». Каждый из этих процессов работает на другом процессоре на моей машине, в зависимости от того, сколько я имеет ядер. Если бы мы хотели запустить процесс для каждого ядра, не зная, сколько ящиков у нас, мы можем просто передать Макс Параметр к экземпляры значение.

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

Давайте узнаем, сколько ядер у меня в этой машине.

8 ядер! Святое дерьмо. Я собираюсь установить Subnautica на моей машине Microsoft выпущенной. Не говорите им, что я сказал это.

Хорошая вещь о запущенных процессах на отдельных процессорах заключается в том, что если у вас есть процесс, который запускает AMOK и занимает 100% процессора, остальные все равно будут работать. Если вы проходите в большем количестве случаев, чем у вас есть ядра, PM2 будет удвоить процессы на процессоре по мере необходимости.

Вы можете сделать намного больше с PM2, в том числе мониторинг и иным образом, делая эти наживые Переменные среды Отказ

Еще один пункт примечания: если по какой-то причине вы хотите PM2 запустить ваш NPM начать Сценарий, вы можете сделать это, запустив NPM в качестве процесса и передача - начать Отказ Пространство до «начала» здесь супер важно.

pm2 start npm -- start

В Azure Appservice Мы включаем PM2 по умолчанию на заднем плане. Если вы хотите использовать PM2 в Azure, вам не нужно включать его в свой Package.json файл. Вы можете просто добавить файл экосистема, и вы хорошо пойти.

ОК! Теперь, когда мы узнали все о PM2, давайте поговорим о том, почему вы не можете использовать его, и это действительно может быть в порядке, чтобы бежать непосредственно против узла.

Бег прямо против узла в производстве

У меня были несколько вопросов по этому поводу, поэтому я добрался до Tierney Cyren Кто является частью огромного оранжевого круга знаний, особенно когда дело доходит до узла.

Tierney отметил несколько недостатков для использования руководителей процессов на основе узлов, таких как PM2.

Основная причина в том, что вы не должны использовать узел для мониторинга узла. Вы не хотите использовать то, что вы контролируете, чтобы отслеживать эту вещь. Как вы спрашиваете, вы спрашиваете моего подростка, чтобы контролировать себя в пятницу вечером: будет ли это заканчиваться? Это может, и это не может. Но вы собираетесь выяснить трудный путь.

Tierney рекомендует, чтобы у вас нет узел Process Manager, выполняющий ваше приложение вообще. Вместо этого есть что-то на более высоком уровне, которое наблюдает за несколькими отдельными экземплярами вашего приложения. Например, идеальная установка была бы, если бы у вас была кластер Kubernetes с вашим приложением, работающим на отдельных контейнерах. Затем Kubernetes могут затем отслеживать эти контейнеры, и если кто-то из них снизится, он может принести их обратно и сообщать о своем здоровье.

В этом случае вы может Бегите прямо против узла, потому что вы мониторинг на более высоком уровне.

Как оказывается, Azure уже делает это. Если мы не вытащим файл Ecosystem PM2 для Azure, он начнет приложение с нашими Package.json Сценарий запуска файла, и мы можем запустить напрямую против узла.

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

В этом случае мы бежим прямо против узла, и все в порядке. Если приложение было сбой, вы заметите, что он возвращается. Это потому, что в Azure ваше приложение работает в контейнере. Azure является оркестровым контейнером, в котором работает ваше приложение и знает, когда это зубчатые лица.

Но у вас все еще есть только один экземпляр здесь. Требуется контейнер секунду, чтобы вернуться в Интернете после того, как он сбивает, что означает, что для ваших пользователей могут быть несколько секунд простоя.

В идеале, вы хотели бы более одного контейнера. Решением для этого было бы развертывание нескольких экземпляров вашего приложения на множественные сайты Azure Appservice, а затем использовать переднюю дверцу Azure для загрузки баланса приложений за одним IP-адресом. Входная дверь будет знать, когда контейнер находится вниз, и будет направлять трафик к другим здоровым экземплярам вашего приложения.

Azure Front Дверь обслуживание | Microsoft Azure Доставить, защитить и отслеживать показатели эффективности вашего глобально распределенных приложений микросервиса с азазухой входной двери … Azure.microsoft.com.

Systemd.

Еще одно предположение о том, что имел Tierney, – это запустить узел Systemd Отказ Я не понимаю слишком много (или что-нибудь вообще) о Systemd И я уже пробил эту формулировку однажды, поэтому я позволю Tierney сказать это в своих словах …

Запуск приложения Node.js с SystemD – часть 1 Вы написали следующее замечательное приложение, в узле, и вы готовы раскрыть его на мире. Что означает, что вы можете … Nodesource.com.

Node.js рабочие потоки

Tierney также хочет, чтобы вы знали, что рабочие потоки идут в узле. Это позволит вам начать свое приложение на несколько «рабочих» (потоков), отслеживающих необходимость чего-то вроде PM2. Может быть. Я не знаю. Я не очень читал статью.

Node.js v11.14.0 Документация Модуль Working_Threads позволяет использовать резьбы, которые выполняют JavaScript параллельно. Чтобы получить доступ к нему: Const Worder = … nodejs.org.

Быть взрослым

Последнее предложение Tierney было просто справиться с ошибкой и написать некоторые тесты, такие как взрослый. Но у кого есть время для этого?

Крошечный круг пребывает

Теперь вы знаете большую часть чего в крошечном синем круге. Остальные – это просто бесполезные факты о эмополосных группах и пивах.

Для получения дополнительной информации о PM2, узле и Azure, проверьте следующие ресурсы …