pm2 запуск с параметрами
fastcodenote
Страницы
вторник, 18 октября 2016 г.
Как развернуть Node.js приложение на рабочем сервере с ngnix? PM2 спешит на помощь!
Итак, предположим что вы уже умеете запускать node.js приложение =), т.е. выполнить команду примерно такого вида, для вас не составит особого труда:
тут, кто не в курсе:
Запустить получилось, все хорошо, работаем потихоньку, разрабатываем. Впринципе, устраивает. Но вот пришла пора выпускать свой зверь-сервис в жизнь, так сказать, поселить его надобно на сервере добротном. Да так чтобы работал не покладая сил :). Т.е. без демонизатора не обойтись, а где его взять удобный и понятный, мало кто знает. Я тоже не знал, пока не наткнулся на замечательный менеджер процессов, написанный на нашем любимом JavaScript и node.js, речь пойдет о PM2.
Pm2 это хороший менеджер процессов. До недавнего времени работающий только
с нодой, но теперь он поддерживает скрипты написанные на разных языках и технологиях.
Из основого что он может:
Для установки pm2 выполните эту «сложную» команду 🙂
Все теперь можно попробовать запустить ваше приложение
pm2 выведет информацию о запущенном приложении
По «App name» можно обращаться к приложению или по его «id», давайте попробуем перезагрузить его
Для остановки необходимо выполнить эту команду:
Можно вообще удалить прилоджения из менеджера для этого выполните
Логи (логи будут показывать в режим «онлайн»)
просмотреть состояние приложений можно командой
Так, управлять процессом это уже хорошо, но как управлять процессом автоматически? Для этого все что необходимо, можно сконфигурировать в файле, и «скормить» этот файл pm2
Создадим в корне проекта, рядом с package.json новый файл конфигурации для pm2 process.json с таким содержимым.
Запуск через кофигурационный файл можно осуществить так:
Как вы заметили в файле я также указал параметр deploy, он нужен для автоматического разворачивания приложения на удаленных для этого необходимо настроить доступ к вашим серверам, генерируем ключ
Затем копируем публичный ключ из /path/to/file.pub на сервер в файл
Проверяем авторизацию. Далее, наверняка есть желание проверить этот самый деплой. Запускаем
Тут deploy это команда для запуска процесса деплоя с использованием параметров, указанных в файле process.json а атрибуте «deploy», process.json это наш файл конфигурации, и production это параметр окружения, в нашем случае это production окружение.
Перед деплоем нашего свежего кода, не забываем его пушить в репозиторий, а незабыть нам поможет package.json с его параметром «scripts», добавляем команду:
После чего для релиза приложения достаточно будет в корне проекта выполнить команду
А для обновления тестового сервера
Я описал совершенно мизирную часть возможностей pm2, он еще много чего умеет. Больше информации можно найти тут на официальном сайте PM2
Менеджер процессов PM2¶
Для обеспечения непрерывной работоспособности Node.js сервера нужно либо постоянно держать открытой консоль, либо использовать менеджер процессов pm2. Он имеет встроенный балансировщик нагрузки, позволяет следить за потребляемыми ресурсами запущенных процессов, автоматически перезапускать процессы после системного сбоя и т. д.
Менеджер процессов pm2 имеется в репозитории npm и должен быть установлен в системе глобально.
Управление процессами¶
Перечень полей таблицы:
Выполнение restart увеличивает значение одноименного поля в списке процессов применительно к тому из них, для которого была выполнена команда.
После этого сохраненные процессы могут быть запущены следующим образом.
Распределение нагрузки (кластеризация)¶
В данном случае Node.js pm2 самостоятельно определит количество ядер процессора и создаст соответствующее количество дополнительных экземпляров.
Файл ecosystem.config.js¶
Чтобы сгенерировать шаблон ecosystem.config.js воспользуйтесь следующей командой.
Теперь в директории, откуда была выполнена команда, должен появиться файл ecosystem.config.js с таким содержимым.
В массиве apps каждый элемент является объектом, описывающим конфигурацию для запуска одного приложения набором параметров. Рассмотрим основные из них:
ПС полным списком параметров можно ознакомиться в официальной документации.
Для запуска описанных в ecosystem.config.js приложений, выполните команду start с указанием пути к файлу.
Лимит использования RAM¶
Значение параметра указывается в одном из трех возможных измерений:
Проверка использования процессами оперативной памяти осуществляется pm2 раз в 30 секунд.
Детектирование изменений¶
PM2: подходим к вопросу процесс-менеджмента с умом
Буквально пару часов назад у меня завязался спор на тему того, что Node.JS слишком медленная для крупных проектов и ей стоит предпочесть Golang, Rust, PHP, etc. Основным аргументом противоположной стороны в этом споре был факт однопоточности JavaScript. Якобы при разработке приложения производительность просто упрётся в эту однопоточность и ничего сделать уже нельзя — только переписать на каком-то другом языке. Однако дела с этим в NodeJS обстоят немного лучше, чем кажется на первый взгляд. Перед тем, как мы углубимся в эту тему хочу заявить, что уважаю право каждого разработчика использовать тот язык программирования, который пришёлся ему по душе и который он считает предпочтительным в той или иной задаче.
Сделав поиск по ключевому слову «PM2» на Хабре я не нашёл ни одной статьи, посвящённой этому process-менеджеру. Лишь одиночные упоминания в статьях других пользователей. Я загорелся (сильно сказано) идеей наверстать упущенное и пролить свет на этот тёмный уголок разработки backend на Node.JS (о котором многие знают, да, я в курсе). Всех заинтересовавшихся прошу под кат.
Пару слов о самом PM2
PM2 — это менеджер процессов с открытым исходным кодом, распространяющийся под лицензией AGPL-3.0. В момент написания статьи имеет
350k загрузок в неделю, согласно данным NPM. В основном применяется в средах, где необходимо запустить приложение на NodeJS и забыть о нём (с остальными языками тоже можно использовать, но об этом позднее), позволяющий кластеризировать приложение и гибко распределять нагрузку между ядрами процессора. Небольшая вырезка из репозитория PM2 на GitHub:
PM2 is a production process manager for Node.js applications with a built-in load balancer. It allows you to keep applications alive forever, to reload them without downtime and to facilitate common system admin tasks.
PM2 решает эту проблему одной командой:
Эта команда «демонизирует» (от англ. «daemonize») процесс NodeJS, следит за потреблением им памяти и считает нагрузку на процессор.
Вернёмся к нашим баранам
С ростом нагрузки на backend возникает необходимость его масштабирования — как вертикального, так и горизонтального — кому что удобнее в сложившихся обстоятельствах. Как мы знаем, один процесс может использовать несколько ядер процессора, но только в том случае, если внутри процесса имеется несколько потоков. В NodeJS приложениях поток — один. PM2 способен выручить в этой ситуации и распределить нагрузку между несколькими ядрами процессора. По-прежнему всего с одной командой:
В данном случае параметр max соответствует количеству ядер процессора. Т.е. для 8-ядерного процессора будет создано 8 отдельных процессов. Можно также вместо max задать значение -1 и тогда количество процессов будет соответствовать количество_ядер минус 1. Вся прелесть заключается в том, что и HTTP(S)/Websocket/TCP/UDP соединения будут равномерно распределены между этими процессами. Ну чем не горизонтальное масштабирование? Почитать подробнее о кластеризации в PM2 можно по ссылке — PM2 Cluster Mode.
Вы можете запустить сколько угодно процессов, но всё же рекомендуется придерживаться рекомендации «один процесс на одно ядро».
Бережное отношение к памяти
При разработке на PHP я однажды столкнулся с проблемой. По неопытности неосознанно заложил в движок системы баг, из-за которого при определённых условиях процессы начинали поедать слишком много оперативной памяти. Вдобавок к этому нагружался процессор, из-за чего виртуальная машина просто зависла и у меня не было к ней доступа совсем.
Как знают PHP-разработчики, в PHP-FPM можно задать тип распределения процессов (если вы вдруг не знали, то в PHP-FPM для каждого нового запроса создаётся новый процесс) — статический, когда задаётся минимальный и максимальный порог, и динамический — выделение сколь угодно большого количества процессов, по необходимости. Что будет в PM2, если запустить 8 процессов и все они начнут потреблять много памяти? И эту проблему PM2 в состоянии решить — лишь одним параметром в командной строке:
Каждый раз при достижении лимита по памяти PM2 автоматически перезапустит процесс. Распределять память проще чем процессы, не так ли? 8 процессов * 200 мегабайт = 1,6 гигабайт. Математика уровня второго класса.
Помимо перезапуска процесса можно также настроить и перезапуск через N интервал времени. Я пока не придумал в каких случаях это может пригодиться, но не стесняйтесь указать мне на пару примеров в комментариях 🙂
А если я перезагружу виртуальную машину?
Сюрприз-сюрприз! Эту проблему PM2 тоже решает за вас. Всё ещё не более чем одной единственной командой в консоли:
А надо ли перезапускать кластеры вручную при внесении изменений?
Конечно же нет! Ну, точнее, вы, конечно, можете перезапускать приложение вручную, но зачем? Автоматизируйте всё что можете и да прибудет с вами сила!
А можно и не перезапускать процессы. Для этого есть reload (нечто похожее на nginx reload):
Слишком много команд! И вообще я предпочитаю конфиги
Мне уже наскучило придумывать весёлые фразы, поэтому просто и банально: файл экосистемы — есть. Поддерживаются форматы JSON, YAML и JS. Например, когда необходимо следить за файлами в папках server и client:
Подробнее ознакомиться можно по ссылке — PM2 Application Declaration.
И даже мониторинг есть!
И не один. Выбирайте тот который нравится больше. Можно мониторить в консоли командой:
Или же воспользоваться полноценной веб-версией мониторинга:
Вы мне, конечно же, не поверите, но она устанавливается и запускается одной командой:
И многое-многое другое.
Заявлена поддержка Heroku и Docker, автоматическое инкрементирование портов с возможностью передачи в process.env (когда нужно каждый процесс запускать на отдельном порту), запуск нескольких инстансов PM2 в пределах одной ОС, наличие программного API и возможность запускать демонизированные Bash и Python скрипты!
Вероятно, я упустил ещё что-то важное или интересное, о чём всегда можно напомнить мне в комментариях. Надеюсь, что вы смогли почерпнуть для себя что-то новое из этой статьи.
Используем процесс-менеджмент на максимум. Установка и настройка PM2
В этой статье я расскажу о самом удобном, на мой взгляд, диспетчере процессов. Покажу, как его установить и настроить свои проекты (например: скрипт для автопостинга, сервис на ReactJS).
PM2 запускает приложения и скрипты в режиме 24/7 и решает проблему с их вылетами путем автоматического перезапуска с сохранением лога. Это решение особенно полезно для тех, кто держит на своем сервере большое количество скриптов и нуждается в их удобном управлении.
Рассмотрим установку и настройку на примере Ubuntu 18.04.
Установка
Так как PM2 написан на Node.js и устанавливается с помощью npm, нужно установить их на свой виртуальный сервер:
Теперь устанавливаем сам диспетчер процессов:
Готово! PM2 на сервере.
Настройка
PM2 в основном предназначен для приложений Node.js, но работает и с остальными языками программирования. Чтобы запустить приложение, используем команды в консоли.
Для остальных языков программирования (на примере Python 3):
Если ваше приложение завершит работу с ошибкой, PM2 автоматически перезапустит его, что очень удобно.
После запуска скриптов и приложений можно посмотреть информацию о них с помощью команды в консоли:
Пример того, что мы увидим:
В таблице показано количество рестартов, потребляемая память и нагрузка на процессор от приложений.
Для удаления, запуска, рестарта и остановки приложений из списка нужно посмотреть порядковый номер (id) процесса в таблице, которую можно вызвать командой, указанной выше, и написать команды в консоли.
Удаление из списка:
Также можно просмотреть логи отдельных приложений. Для этого используем эту команду:
И выбираем свое приложение из списка.
Если вам неудобно следить за логами и запуском приложений через консоль, то это можно делать даже в браузере, установив веб-версию PM2 одной командой:
После этого вводим свои данные для регистрации и переходим по ссылке, которая отобразится в консоли.
Пример того, что мы увидим:
Мы разобрали основные команды менеджера процессов. Удачи в ваших проектах!
Автозапуск nuxt приложения с помощью PM2
Установка PM2 и настройка приложения
Последнюю версию PM2 можно установить с помощью NPM
После установки PM2 в корне нашего проекта необходимо создать файл конфигурации с названием ecosystem.config.js и скопировать в него содержимое.
Немного о настройках. Подробнее о других параметрах можно прочитать на сайте PM2
Поле | Пример | Описание |
---|---|---|
name | «nuxtApp» | Имя приложения |
script | «./app/app.js» | Путь к скрипту |
args | «start» | Строка, содержащая все аргументы, переданные скрипту |
instances | «max» | Кол. запускаемых экземпляров |
exec_mode | «cluster» | Режим для запуска приложения |
Далее необходимо пересобрать приложение и запустить его через PM2 командой pm2 start
Проверяем состояния нашего приложения
Тут мы видим, что наше приложение в активном состоянии, не нагружает процессор и потребляет аж целых 142mb памяти.
Автозапуск
После того как запустили все наши приложения, нужно сохранить их список, если хотите чтобы они запустились при перезагрузке компьютера.
PM2 берет на себя действия по мониторингу и поддержания нашего приложений в рабочем состоянии, требуя от нас минимум действий. Конечно, это не все возможности которыми обладает PM2, о других его возвожностях более подробно можно почитать на официальном сайте.