Skip to content

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

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

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

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

  • Автоматический перезапуск при краше приложения
  • Балансировку нагрузки через кластеризацию
  • Мониторинг процессов в реальном времени
  • Управление логами
  • Автоматический запуск при старте системы
  • Развертывание без простоя (zero-downtime deployment)

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

  • 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.2/install.sh | bash

source ~/.bashrc

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

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

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

ПОДСКАЗКА

Рекомендуется использовать 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

# Установка dependencies
npm install

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

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

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

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

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

Запуск в кластерном режиме

Для использования нескольких ядер процессора и обеспечения высокой доступности вы можете воспользоваться следующей командой:

bash
# Автоматически создаст оптимальное количество процессов в зависимости от числа ядер CPU
pm2 start app.js --name "my-app" -i max

Обратите внимание: ваше приложение должно поддерживать кластеризацию.

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

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

bash
cat > ecosystem.config.js << 'EOL'
module.exports = {
  apps: [{
    name: "my-app",
    script: "app.js",
    instances: "max",
    exec_mode: "cluster",
    autorestart: true,
    watch: false,
    max_memory_restart: "200M",
    env: {
      NODE_ENV: "development",
    },
    env_production: {
      NODE_ENV: "production",
      PORT: 3000
    }
  }]
}
EOL

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

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

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

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

bash
pm2 startup

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

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

bash
pm2 save

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

Настройка 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

ПОДСКАЗКА

После настройки 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

Обновление приложения без простоя (Zero-Downtime Deployment)

Для обновления приложения без прерывания работы:

  1. Обновите код (например, через git pull)
  2. Выполните перезапуск приложения:
bash
pm2 reload my-app

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

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

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

bash
pm2 plus

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

Установите pm2-prometheus:

bash
npm install -g pm2-prometheus
pm2 install pm2-prometheus

Затем настройте Prometheus для сбора метрик с endpoint /metrics и Grafana для визуализации данных.

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

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

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

bash
pm2 logs my-app

Общие причины:

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

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

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

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

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

bash
pm2 unstartup
pm2 startup
pm2 save

Заключение

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

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

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