Настройка Fork и Cluster в PM2
PM2 используется для запуска Frontend iEXExchanger, контроля его состояния и автоматического перезапуска при сбое.
Frontend работает через Node.js и принимает локальные подключения на порту 4000. Nginx передаёт запросы клиентского сайта на запущенный Frontend-процесс.
PM2 позволяет использовать один процесс Frontend или несколько процессов одновременно. Количество процессов необходимо выбирать с учётом мощности сервера и фактической нагрузки.
Для большинства проектов рекомендуется начинать с одного процесса, а затем увеличивать instances, если это действительно требуется.
Создание конфигурации PM2
В корневой директории Frontend создайте файл:
ecosystem.config.cjsДобавьте:
module.exports = {
apps: [
{
name: 'iexexchanger',
script: 'dist/exchanger/server/server.mjs',
cwd: __dirname,
instances: 1,
exec_mode: 'fork',
autorestart: true,
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'production',
PORT: 4000,
HOST: '127.0.0.1',
PM2: 'true',
},
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
error_file: 'logs/err.log',
out_file: 'logs/out.log',
merge_logs: true,
time: true,
listen_timeout: 10000,
kill_timeout: 5000,
exp_backoff_restart_delay: 100,
},
],
};Эта конфигурация запускает один Frontend-процесс в режиме fork.
После создания сохраните файл.
Что означают instances и exec_mode
На производительность Frontend в PM2 в первую очередь влияют два параметра:
instances определяет количество одновременно работающих экземпляров Frontend.
exec_mode определяет способ их запуска.
PM2 поддерживает режимы fork и cluster. В режиме cluster PM2 может запускать несколько экземпляров Node.js-приложения и распределять между ними входящие соединения.
Режим Fork
Базовая конфигурация:
В этом режиме работает один экземпляр Frontend.
Этот вариант рекомендуется использовать как начальный для большинства проектов.
Он подходит, когда:
обменный пункт только запускается;
нагрузка на Frontend небольшая или средняя;
на одном сервере также работают Backend, PostgreSQL, Redis и фоновые процессы;
нет необходимости использовать несколько процессов Frontend.
Преимущество такой конфигурации — предсказуемое потребление ресурсов и простая диагностика.
Если одного процесса достаточно для текущей нагрузки, увеличивать instances не требуется.
Режим Cluster
Для запуска нескольких Frontend-процессов используется cluster.
Например:
PM2 запустит два экземпляра Frontend и будет распределять входящие соединения между ними. Cluster Mode предназначен именно для использования нескольких процессов Node.js и распределения нагрузки между ними.
Например, можно использовать:
если сервер имеет достаточный запас ресурсов и такая конфигурация действительно требуется по нагрузке.
Каждый дополнительный instance — это отдельный процесс Node.js, который использует процессор и оперативную память.
Не увеличивайте количество процессов только потому, что сервер имеет несколько vCPU.
Можно ли использовать один процесс в Cluster Mode
Да. Допустима конфигурация:
Frontend будет работать с одним экземпляром, но через Cluster Mode.
При одном процессе преимуществ распределения нагрузки между несколькими экземплярами нет. Такой вариант можно использовать, если вы планируете в дальнейшем увеличивать instances и хотите сразу оставить Frontend в режиме cluster.
Например, сначала:
а при росте нагрузки изменить только количество:
После этого конфигурацию не потребуется переводить с fork на cluster.
Какой режим выбрать
Для большинства проектов используйте один из двух вариантов.
Стандартный
1 instance, fork
Рекомендуемый начальный вариант
Масштабируемый
1+ instances, cluster
Когда требуется несколько Frontend-процессов
Если вы не знаете, какой вариант нужен, начинайте с:
Если вы понимаете работу PM2, контролируете ресурсы сервера и планируете масштабировать Frontend, можно сразу использовать:
а затем постепенно увеличивать instances.
Сколько instances использовать
Не существует одного правильного количества процессов для всех серверов.
Количество зависит от:
количества vCPU;
объёма RAM;
нагрузки на Frontend;
количества одновременных посетителей;
нагрузки на остальные службы сервера.
Если Frontend, Backend, PostgreSQL, Redis и фоновые процессы работают на одном сервере, нельзя отдавать все ресурсы только PM2.
Для стандартных конфигураций iEXExchanger можно использовать следующую отправную точку:
2–4 vCPU, 8 GB RAM
1 instance
Оставить fork
4 vCPU, 16 GB RAM
1 instance
Начать с fork, при необходимости проверить 2 в cluster
8+ vCPU, 32+ GB RAM
1–2 instances
Увеличивать постепенно после проверки нагрузки
Эти значения не являются жёсткими ограничениями.
Например, сервер с 4 vCPU не означает, что нужно обязательно устанавливать:
Часть ресурсов требуется Backend, PostgreSQL, Redis, очередям и другим процессам.
Почему не рекомендуется сразу использовать max
PM2 позволяет автоматически использовать максимальное количество доступных процессорных ядер.
Например:
Также PM2 поддерживает значение 0, при котором количество процессов определяется по доступным CPU.
Для стандартной установки iEXExchanger использовать max без контроля ресурсов не рекомендуется.
Если сервер имеет 8 vCPU, PM2 может запустить несколько экземпляров Frontend, хотя на этом же сервере должны работать PostgreSQL, Redis, PHP и другие компоненты.
В результате увеличение количества Frontend-процессов может не ускорить проект, а создать дополнительную нагрузку.
Предпочтительнее самостоятельно указать количество:
и затем проверить результат.
Как увеличить количество процессов
Если Frontend уже работает в Cluster Mode, количество процессов можно изменить в конфигурации.
Например, было:
измените на:
После изменения перезагрузите приложение:
Для сетевых приложений Cluster Mode поддерживает перезагрузку процессов без обычного полного остановочного цикла restart: PM2 запускает новые workers и заменяет старые.
Количество процессов также можно изменять через PM2:
Например:
устанавливает четыре экземпляра процесса. Команда pm2 scale поддерживается PM2 для изменения количества workers.
Если вы изменили рабочую конфигурацию, не забудьте сохранить текущее состояние:
Как проверить нагрузку
Перед увеличением instances проверьте текущее состояние Frontend.
Список процессов
Выполните:
Команда показывает запущенные процессы, их состояние, использование памяти и другую основную информацию.
Если используется Cluster Mode с несколькими экземплярами, в списке будут отображаться отдельные процессы iexexchanger.
Мониторинг в реальном времени
Для наблюдения за CPU и памятью выполните:
PM2 откроет мониторинг процессов непосредственно в терминале.
Не оценивайте необходимость масштабирования сразу после запуска.
Проверяйте сервер во время обычной и повышенной нагрузки.
Как понять, нужно ли увеличивать instances
Увеличивать количество процессов имеет смысл, если Frontend действительно становится ограничением.
Перед изменением проверьте:
нагрузку CPU Frontend;
использование памяти процессами;
общую загрузку сервера;
остаётся ли запас ресурсов для PostgreSQL, Redis и Backend;
изменяется ли скорость работы Frontend при высокой нагрузке.
Если один Frontend-процесс работает стабильно и не создаёт ограничений, оставьте:
Большее количество процессов само по себе не означает более быстрый сайт.
Ограничение памяти
В конфигурации используется:
PM2 контролирует потребление памяти процесса и может перезапустить его после превышения установленного значения. Форматы K, M и G поддерживаются PM2.
Важно учитывать, что значение применяется к отдельному процессу.
Например:
означает запуск четырёх отдельных процессов Frontend.
Поэтому при увеличении instances всегда контролируйте общее использование RAM.
Автоматический перезапуск
Параметр:
разрешает PM2 автоматически перезапускать Frontend после аварийного завершения процесса.
Параметр:
используется для увеличивающейся задержки между повторными попытками запуска при последовательных сбоях.
Это помогает избежать слишком частых перезапусков, если приложение не может нормально запуститься.
Почему отключён watch
Используется:
Для production-сервера автоматический перезапуск Frontend при изменении файлов не требуется.
Обновление приложения должно выполняться контролируемо, после чего Frontend перезапускается или перезагружается через PM2.
PM2 поддерживает автоматический режим watch, но он предназначен для перезапуска приложения при изменении файлов.
Логи Frontend
В конфигурации используются:
Ошибки Frontend записываются в:
Обычный вывод:
Посмотреть текущие логи через PM2 можно командой:
Для вывода последних строк:
PM2 предоставляет просмотр логов непосредственно через pm2 logs.
Если Frontend не запускается или постоянно перезапускается, проверка логов должна быть одним из первых действий.
Запуск Frontend
После создания ecosystem.config.cjs перейдите в директорию Frontend и выполните:
Проверьте результат:
Процесс должен отображаться с названием:
и находиться в рабочем состоянии.
Перезапуск и перезагрузка
Для обычного перезапуска:
В режиме cluster предпочтительно использовать:
restart останавливает и заново запускает процесс, а reload в Cluster Mode предназначен для последовательной замены workers с минимизацией простоя.
После изменения ecosystem.config.cjs можно выполнить:
Автоматический запуск после перезагрузки сервера
Просто запустить Frontend через PM2 недостаточно. Необходимо также настроить восстановление процессов после перезагрузки Linux.
Сначала выполните:
PM2 определит используемую систему запуска и выведет дополнительную команду.
Скопируйте и выполните команду, которую покажет PM2.
После этого сохраните текущий список процессов:
PM2 использует сохранённый список для восстановления приложений после перезагрузки сервера.
pm2 save необходимо выполнять под тем пользователем, от которого запускается Frontend.
Не запускайте один и тот же Frontend одновременно через PM2 разных пользователей.
Проверка после перезагрузки
После настройки автозапуска рекомендуется проверить его реальной перезагрузкой сервера.
После запуска сервера выполните:
Убедитесь, что iexexchanger появился в списке автоматически.
Затем откройте клиентский сайт:
Frontend должен работать без ручного запуска PM2.
Если после перезагрузки Frontend не запустился
Сначала выполните:
Если список пустой, проверьте, выполнялись ли:
и:
При необходимости ранее сохранённый список процессов можно восстановить вручную:
PM2 использует resurrect для восстановления списка, ранее сохранённого через pm2 save.
Если процесс существует, но находится в состоянии ошибки, откройте его логи:
Рекомендуемая базовая конфигурация
Если у вас обычный production-сервер и нет отдельной причины использовать несколько экземпляров Frontend, используйте:
Если вы заранее хотите использовать Cluster Mode:
также является допустимым вариантом.
При росте нагрузки можно перейти на:
и проверить изменение нагрузки и производительности.
Дальнейшее увеличение:
или больше должно выполняться только после контроля CPU, RAM и общей нагрузки сервера.
Не используйте instances: 'max' только для того, чтобы задействовать все доступные vCPU. На сервере iEXExchanger ресурсы требуются не только Frontend, но и остальным компонентам проекта.
Проверка настройки
Настройка PM2 выполнена правильно, если:
pm2 listпоказывает процессiexexchanger;процесс находится в рабочем состоянии;
Frontend отвечает на локальном порту
4000;клиентский сайт открывается через Nginx;
в
logs/err.logнет постоянных ошибок запуска;после перезагрузки сервера процесс восстанавливается автоматически;
выбранное количество
instancesне создаёт нехватку CPU или оперативной памяти.
Начинайте с минимально необходимого количества процессов и увеличивайте его только после проверки реальной нагрузки. Это позволяет использовать ресурсы сервера предсказуемо и не отбирать их у Backend, PostgreSQL, Redis и других компонентов iEXExchanger.
Последнее обновление
Это было полезно?