Как стать автором
Обновить

Комментарии 12

У pm2 есть одна ублюдочная особенность — он преобразует логи при помощи .toString() даже если в настройках стоит тип "json", что делает невозможным нормальный анализ логов теми же ELK или хотя бы Cloudwatch insights

Наверно вам уже не актуально, но возможно кто-то столкнется с такой же проблемой:
нашел решение:
1) pm2 ecosystem
2) в файлеecosystem.config.js

module.exports = {
  // ...
  apps: [
    {
      // ...
      error_file: 'path/to/error.log',
      out_file: 'path/to/out.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss',
      log_type: 'json',  // Указываем формат JSON
      // ...
    },
  ],
  // ...
};

3) перезапусте апку
pm2 restart ecosystem.config.js

логи будут в json формате

PM2 штука полезная, да, но я как-то неуверен что «запустить процесс много раз» это то, что имел ввиду Ваш оппонент. Даже если оставить в стороне различия между процессами и потоками, это все равно не про «как их пачку стартануть».
Однако дела с этим в NodeJS обстоят немного лучше, чем кажется на первый взгляд

Никто не говорил про серебряную пулю в сфере node.js.

у меня с pm2 вечная проблема с потерей всего состояния при обновлении ноды. unstartup/startup недостаточно, нода установлена через nvm и у неё меняются пути при установке новой версии. это надёжно убивает все записи сохранённые в дампе (pm2 save), потому что там абсолютные пути. получается так что я обновляю ноду, переустанавливаю pm2 (npm i -g pm2) так как путь к глобальному node_modules тоже изменился, делаю pm2 update – и после перезапуска у меня девственно чистый список процессов (pm2 ls)… :(


приходится заниматься жостким колхозингом – руками править startup-скрипты, руками править pm2.dump и то – как повезёт всё равно…


с логами тоже не всё идеально, pm2 logs неудобен, monit даёт кучу информации, но как раз по логам отмотать на произвольное время в прошлом не получается… в итоге приходится руками лезть в ~/.pm2/logs и там искать нужное…


по итогу несмотря на то что вроде инструмент хороший, в проде оказывается проще поднять докер, задеплоить с docker-compose up -d с параметром --scale, чтобы поднять нужное количество копий и позволить докеру самому разруливать между ними подключения… обновление версии ноды выполняется вместе с обновлением самого сервиса, а там и до интеграции с ci/cd недалеко, для автоматического прогона тестов перед деплоем, например…


на долю pm2 остаётся случай когда надо по-быстренькому что-то сунуть на сервер, всякие времянки, стейджинг – такого рода вещи…

А вы не пробовали поставить pm2 без nvm, а при создании процессов указывать запуск нужной ноды через опцию --interpreter?

а в том проекте amazon linux 2, у него nvm – это стандартный способ установки ноды, в официальных репах её нет… собственно «поставить pm2 без nvm» там не выйдет…

Ну, значит, надо поставить отдельную ноду для pm2.

Предположим у меня есть чат на nodejs и websockets которым пользуется куча народа. 1 ядро уже не справляется и я хочу его смаштабировать на свободные ядра. ЗХапускаю кучу процессов а они все слушают на одном порту? Как передать разные настройки?
Я решил эту проблему модулем Cluster. Там и общение между процессами можно организовать. А перезаупскать падающий процесс есть supervisor/ мониторинг это пкфафтф. Всеже pm это как то не unix-way. шаг в сторону и дикие костыли.
Спорное решение запускать с флагом `-i N`. Производительность у этого подхода сильно меньше, чем запустить столько-же отдельных экземпляров приложения на разных портах и балансировать их, например, через nginx.

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

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации