Node.js
Развертывание приложений Node.js в производстве
Поиск…
Настройка NODE_ENV = "производство"
Производственные развертывания будут разными способами, но стандартное соглашение при развертывании в производстве - это определить переменную среды, называемую NODE_ENV
и установить ее значение в «production» .
Флаги времени выполнения
Любой код, запущенный в вашем приложении (включая внешние модули), может проверить значение NODE_ENV
:
if(process.env.NODE_ENV === 'production') {
// We are running in production mode
} else {
// We are running in development mode
}
зависимости
Когда для переменной среды NODE_ENV
установлено значение «production», все devDependencies
в вашем файле package.json будут полностью игнорироваться при запуске npm install
. Вы также можете обеспечить это с помощью флага --production
:
npm install --production
Для установки NODE_ENV
вы можете использовать любой из этих методов
метод 1: установите NODE_ENV для всех приложений узла
Windows:
set NODE_ENV=production
Linux или другая система на основе unix:
export NODE_ENV=production
Это устанавливает NODE_ENV
для текущего сеанса bash, поэтому все приложения запускаются после того, как этот оператор будет иметь NODE_ENV
установленный для production
.
метод 2: установите NODE_ENV для текущего приложения
NODE_ENV=production node app.js
Это установит только NODE_ENV
для текущего приложения. Это помогает, когда мы хотим протестировать наши приложения в разных средах.
метод 3: создать файл .env
и использовать его
Здесь используется идея, описанная здесь . См. Это сообщение для более подробного объяснения.
В основном вы создаете файл .env
и запускаете некоторый скрипт bash, чтобы установить их в среде.
Чтобы избежать написания сценария bash, пакет env-cmd можно использовать для загрузки переменных среды, определенных в файле .env
.
env-cmd .env node app.js
метод 4: используйте пакет cross-env
Этот пакет позволяет устанавливать переменные среды для каждой платформы.
После установки с помощью npm вы можете просто добавить его в свой сценарий развертывания в package.json
следующим образом:
"build:deploy": "cross-env NODE_ENV=production webpack"
Управление приложением с диспетчером процессов
Хорошая практика для запуска приложений NodeJS, контролируемых менеджерами процессов. Менеджер процессов помогает поддерживать работоспособность приложения навсегда, перезагружается при сбое, перезагружается без простоя и упрощает администрирование. Самые мощные из них (например, PM2 ) имеют встроенный балансировщик нагрузки. PM2 также позволяет управлять ведением журнала приложений, мониторингом и кластеризацией.
Менеджер процессов PM2
Установка PM2:
npm install pm2 -g
Процесс можно запустить в режиме кластера с интегрированным балансировщиком нагрузки для распространения нагрузки между процессами:
pm2 start app.js -i 0 --name "api"
( -i - указать количество процессов для появления. Если это 0, то номер процесса будет основан на подсчете количества ядер процессора)
Имея несколько пользователей в производстве, он должен иметь единственную точку для PM2. Поэтому команда pm2 должна иметь префикс местоположения (для конфигурации PM2), иначе он будет порождать новый процесс pm2 для каждого пользователя с конфигурацией в соответствующем домашнем каталоге. И это будет непоследовательно.
Использование: PM2_HOME=/etc/.pm2 pm2 start app.js
Развертывание с использованием PM2
PM2
- это менеджер производственных процессов для приложений Node.js
, который позволяет сохранять приложения навсегда и перезагружать их без простоя. PM2 также позволяет управлять ведением журнала приложений, мониторингом и кластеризацией.
Установите pm2
глобально.
npm install -g pm2
Затем запустите приложение node.js
, используя PM2.
pm2 start server.js --name "my-app"
Следующие команды полезны при работе с PM2
.
Список всех запущенных процессов:
pm2 list
Остановить приложение:
pm2 stop my-app
Перезапустите приложение:
pm2 restart my-app
Чтобы просмотреть подробную информацию о приложении:
pm2 show my-app
Чтобы удалить приложение из реестра PM2:
pm2 delete my-app
Развертывание с помощью диспетчера процессов
Диспетчер процессов обычно используется в производстве для развертывания приложения nodejs. Основными функциями диспетчера процессов являются перезапуск сервера, если он сбой, проверка потребления ресурсов, улучшение производительности во время выполнения, мониторинг и т. Д.
Некоторые из популярных менеджеров процессов, созданных сообществом узлов, навсегда, pm2 и т. Д.
Forvever
forever
- инструмент интерфейса командной строки для обеспечения непрерывного выполнения заданного сценария. forever
«s простой интерфейс делает его идеальным для запуска небольших развертываний Node.js
приложений и скриптов.
forever
контролирует ваш процесс и перезапускает его, если он сработает.
Установите forever
глобально.
$ npm install -g forever
Запустить приложение:
$ forever start server.js
Это запустит сервер и дает идентификатор для процесса (начинается с 0).
Перезапустить приложение:
$ forever restart 0
Здесь 0
- идентификатор сервера.
Остановить применение:
$ forever stop 0
Подобно перезагрузке, 0
является идентификатором сервера. Вы также можете указать идентификатор процесса или имя сценария вместо идентификатора, заданного вечным.
Дополнительные команды: https://www.npmjs.com/package/forever
Использование разных свойств / конфигурации для разных сред, таких как dev, qa, настройка и т. Д.
Крупномасштабные приложения часто нуждаются в разных свойствах при работе в разных средах. мы можем добиться этого, передав аргументы в приложение NodeJs и используя тот же аргумент в процессе узла для загрузки файла свойств среды.
Предположим, у нас есть два файла свойств для разных условий.
dev.json
{ "PORT": 3000, "DB": { "host": "localhost", "user": "bob", "password": "12345" } }
qa.json
{ "PORT": 3001, "DB": { "host": "where_db_is_hosted", "user": "bob", "password": "54321" } }
Следующий код в приложении будет экспортировать соответствующий файл свойств, который мы хотим использовать.
process.argv.forEach(function (val) {
var arg = val.split("=");
if (arg.length > 0) {
if (arg[0] === 'env') {
var env = require('./' + arg[1] + '.json');
exports.prop = env;
}
}
});
Мы приводим аргументы для приложения, как показано ниже.
node app.js env=dev
если мы используем диспетчер процессов как навсегда, чем это так просто, как
forever start app.js env=dev
Воспользовавшись кластерами
Один экземпляр Node.js работает в одном потоке. Чтобы воспользоваться преимуществами многоядерных систем, пользователь иногда захочет запустить кластер из процессов Node.js для обработки нагрузки.
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// In real life, you'd probably use more than just 2 workers,
// and perhaps not put the master and worker in the same file.
//
// You can also of course get a bit fancier about logging, and
// implement whatever custom logic you need to prevent DoS
// attacks and other bad behavior.
//
// See the options in the cluster documentation.
//
// The important thing is that the master does very little,
// increasing our resilience to unexpected errors.
console.log('your server is working on ' + numCPUs + ' cores');
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('disconnect', function(worker) {
console.error('disconnect!');
//clearTimeout(timeout);
cluster.fork();
});
} else {
require('./app.js');
}