Skip to content

Развертывание Node.js приложения на VPS с PM2

В этом руководстве мы рассмотрим процесс развёртывания Node.js приложения на VPS-сервере с помощью менеджера процессов PM2 — для повышения надёжности, автоматического перезапуска и масштабирования приложений.

Что такое PM2 и почему его стоит использовать

PM2 (Process Manager 2) — это продвинутый менеджер процессов для Node.js приложений, который предоставляет:

  • Автоматический перезапуск при сбое приложения
  • Мониторинг процессов в реальном времени
  • Управление логами
  • Автоматический запуск при старте системы

Предварительные требования

  • VPS-сервер с Linux (в качестве примера используется Ubuntu 24)
  • Права root
  • Базовые знания командной строки Linux
  • Готовый к развёртыванию проект на Node.js

Установка Node.js и npm

Для начала установим Node.js и npm с помощью менеджера версий NVM (Node Version Manager), который позволяет легко переключаться между разными версиями Node.js.

bash
# Установка curl, если его нет
sudo apt update
sudo apt install curl

# Установка NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.6/install.sh | bash

source ~/.bashrc

# Проверяем, успешно ли установился NVM
nvm --version

# Установка последней LTS версии Node.js
nvm install --lts

# Проверка версий Node.js и npm
node --version
npm --version

TIP

Для критически важных приложений рекомендуется использовать LTS (Long Term Support) версии Node.js, так как они обеспечивают долгосрочную поддержку и стабильность.

Установка PM2

Для удобства установим PM2 глобально:

bash
npm install -g pm2

Подготовка приложения Node.js

Клонирование проекта из репозитория

Склонируйте проект из Git-репозитория или загрузите его на сервер вручную:

bash
# Клонирование проекта
git clone https://github.com/username/your-project.git
cd your-project

# Установка зависимостей
npm install

Настройка и запуск приложения с PM2

Базовый запуск

Самый простой способ запустить приложение с PM2:

bash
pm2 start app.js --name "my-app"

Где my-app — имя приложения, которое вы будете указывать в командах PM2 для дальнейшего управления.

Создание файла конфигурации PM2

Для более детальной настройки создадим файл конфигурации ecosystem.config.js:

bash
cat > ecosystem.config.js << 'EOL'
module.exports = {
  apps: [{
    name: "my-app",
    script: "app.js",
    autorestart: true,          // автоматически перезапускать процесс при завершении
    watch: false,
    max_memory_restart: "300M", // перезапустить процесс при превышении лимита памяти
    env: {
      NODE_ENV: "development",
    },
    env_production: {
      NODE_ENV: "production",
      PORT: 3000
    }
  }]
}
EOL

ESM-проекты

Если в вашем package.json указано "type": "module", PM2 не сможет загрузить конфиг с расширением .js (ошибка ERR_REQUIRE_ESM). Назовите файл ecosystem.config.cjs и указывайте его явно (pm2 start ecosystem.config.cjs), так как при автоматическом поиске конфигурации PM2 учитывает только имя с расширением .js.

Запуск приложения с помощью файла конфигурации:

bash
pm2 start ecosystem.config.js --env production

Настройка автозапуска PM2 при перезагрузке сервера

Чтобы приложение автоматически запускалось при перезагрузке сервера, выполните следующую команду:

bash
pm2 startup

Выполните команду, которую PM2 выведет в консоль.

После этого сохраните текущий список процессов:

bash
pm2 save

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

Не запускайте приложение от root

pm2 startup создаёт systemd-сервис, привязанный к текущему пользователю. В целях безопасности запускайте приложение под отдельным пользователем без прав root, а не под root, и выполняйте pm2 startup от имени этого пользователя — тогда сервис и его права будут заданы корректно.

Настройка Nginx как обратного прокси

Чтобы предоставить публичный доступ к приложению (например, через домен), настройте Nginx:

bash
# Установка Nginx
sudo apt install nginx

# Создание конфигурации сайта
sudo nano /etc/nginx/sites-available/my-app

Добавьте следующую конфигурацию:

nginx
server {
    listen 80;
    server_name your-domain.com www.your-domain.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Активируйте конфигурацию и перезапустите Nginx:

bash
sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

TIP

После настройки Nginx рекомендуется установить SSL-сертификат с помощью Let's Encrypt для защищённого соединения. Инструкцию можно найти в нашей статье о настройке Let's Encrypt.

Базовые команды PM2

Мониторинг процессов

bash
# Мониторинг в режиме реального времени
pm2 monit

# Просмотр списка процессов
pm2 list

# Детальная информация о процессе
pm2 show my-app

Управление процессами

bash
# Перезапуск приложения
pm2 restart my-app

# Остановка приложения
pm2 stop my-app

# Удаление процесса из списка PM2
pm2 delete my-app

Работа с логами

bash
# Просмотр общих логов всех приложений
pm2 logs

# Просмотр логов конкретного приложения
pm2 logs my-app

# Просмотр последних 200 строк логов
pm2 logs --lines 200

Обновление приложения

Чтобы развернуть новую версию, обновите код, установите новые зависимости и перезапустите процесс:

bash
# Обновляем код и устанавливаем зависимости
git pull
npm install

# Перезапуск приложения
pm2 restart my-app

Перезапуск вызовет кратковременную приостановку приложения

pm2 restart останавливает процесс и запускает его заново, поэтому есть короткий промежуток (обычно не более пары секунд), когда приложение будет недоступно. Для большинства приложений это вполне приемлемо и не должно будет вызвать проблем. Если такая приостановка приложения недопустима, в таком случае рекомендуется реализовать балансировку приложения и обновлять их по очереди — вместо того чтобы полагаться на один инстанс PM2.

Мониторинг и статистика

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

PM2 Plus (платное решение)

bash
pm2 plus

Интеграция с Prometheus + Grafana

Метрики можно экспортировать в Prometheus с помощью модуля PM2 pm2-metrics. Модули PM2 устанавливаются командой pm2 install — отдельная глобальная установка через npm install не нужна:

bash
pm2 install pm2-metrics

Модуль запускает HTTP-сервер, который отдаёт метрики PM2 по адресу http://<host>:9209/metrics. Направьте Prometheus на этот адрес:

yaml
# prometheus.yml
scrape_configs:
  - job_name: pm2
    static_configs:
      - targets: ['localhost:9209']

Затем используйте Grafana для визуализации собранных данных. Сторонние модули (например, pm2-prom-module) отдают метрики на других портах — точный адрес смотрите в документации модуля.

Устранение проблем

Приложение не запускается

Проверьте логи:

bash
pm2 logs my-app

Частые причины проблем:

  • Ошибки в коде приложения
  • Порт уже занят
  • Недостаточно прав доступа к файлам
  • Зависимости не установлены

Приложение падает при высокой нагрузке

  • Проверьте использование памяти: pm2 monit
  • Возможно, стоит увеличить лимит памяти в конфигурации
  • Рассмотрите возможность масштабирования приложения на несколько серверов
  • Увеличьте тариф вашего сервера, если не хватает ресурсов

Проблема: PM2 не перезапускается после перезагрузки сервера

Повторно настройте автозапуск:

bash
pm2 unstartup
pm2 startup
pm2 save

Заключение

Правильная настройка Node.js приложения с PM2 на VPS обеспечивает надёжность, отказоустойчивость и лёгкость в управлении.

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

Если вам нужна помощь с настройкой Node.js приложения на нашем VPS, обратитесь в службу поддержки.

Авторы статьи

Загрузка авторов...