Развертывание 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.
# Установка 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 --versionTIP
Для критически важных приложений рекомендуется использовать LTS (Long Term Support) версии Node.js, так как они обеспечивают долгосрочную поддержку и стабильность.
Установка PM2
Для удобства установим PM2 глобально:
npm install -g pm2Подготовка приложения Node.js
Клонирование проекта из репозитория
Склонируйте проект из Git-репозитория или загрузите его на сервер вручную:
# Клонирование проекта
git clone https://github.com/username/your-project.git
cd your-project
# Установка зависимостей
npm installНастройка и запуск приложения с PM2
Базовый запуск
Самый простой способ запустить приложение с PM2:
pm2 start app.js --name "my-app"Где my-app — имя приложения, которое вы будете указывать в командах PM2 для дальнейшего управления.
Создание файла конфигурации PM2
Для более детальной настройки создадим файл конфигурации ecosystem.config.js:
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
}
}]
}
EOLESM-проекты
Если в вашем package.json указано "type": "module", PM2 не сможет загрузить конфиг с расширением .js (ошибка ERR_REQUIRE_ESM). Назовите файл ecosystem.config.cjs и указывайте его явно (pm2 start ecosystem.config.cjs), так как при автоматическом поиске конфигурации PM2 учитывает только имя с расширением .js.
Запуск приложения с помощью файла конфигурации:
pm2 start ecosystem.config.js --env productionНастройка автозапуска PM2 при перезагрузке сервера
Чтобы приложение автоматически запускалось при перезагрузке сервера, выполните следующую команду:
pm2 startupВыполните команду, которую PM2 выведет в консоль.
После этого сохраните текущий список процессов:
pm2 saveТеперь приложение (или несколько приложений) будет запускаться после перезагрузки сервера автоматически, без ручного вмешательства.
Не запускайте приложение от root
pm2 startup создаёт systemd-сервис, привязанный к текущему пользователю. В целях безопасности запускайте приложение под отдельным пользователем без прав root, а не под root, и выполняйте pm2 startup от имени этого пользователя — тогда сервис и его права будут заданы корректно.
Настройка Nginx как обратного прокси
Чтобы предоставить публичный доступ к приложению (например, через домен), настройте Nginx:
# Установка Nginx
sudo apt install nginx
# Создание конфигурации сайта
sudo nano /etc/nginx/sites-available/my-appДобавьте следующую конфигурацию:
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:
sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginxTIP
После настройки Nginx рекомендуется установить SSL-сертификат с помощью Let's Encrypt для защищённого соединения. Инструкцию можно найти в нашей статье о настройке Let's Encrypt.
Базовые команды PM2
Мониторинг процессов
# Мониторинг в режиме реального времени
pm2 monit
# Просмотр списка процессов
pm2 list
# Детальная информация о процессе
pm2 show my-appУправление процессами
# Перезапуск приложения
pm2 restart my-app
# Остановка приложения
pm2 stop my-app
# Удаление процесса из списка PM2
pm2 delete my-appРабота с логами
# Просмотр общих логов всех приложений
pm2 logs
# Просмотр логов конкретного приложения
pm2 logs my-app
# Просмотр последних 200 строк логов
pm2 logs --lines 200Обновление приложения
Чтобы развернуть новую версию, обновите код, установите новые зависимости и перезапустите процесс:
# Обновляем код и устанавливаем зависимости
git pull
npm install
# Перезапуск приложения
pm2 restart my-appПерезапуск вызовет кратковременную приостановку приложения
pm2 restart останавливает процесс и запускает его заново, поэтому есть короткий промежуток (обычно не более пары секунд), когда приложение будет недоступно. Для большинства приложений это вполне приемлемо и не должно будет вызвать проблем. Если такая приостановка приложения недопустима, в таком случае рекомендуется реализовать балансировку приложения и обновлять их по очереди — вместо того чтобы полагаться на один инстанс PM2.
Мониторинг и статистика
PM2 предоставляет базовый бесплатный мониторинг, но для критически важных приложений стоит настроить более продвинутое решение:
PM2 Plus (платное решение)
pm2 plusИнтеграция с Prometheus + Grafana
Метрики можно экспортировать в Prometheus с помощью модуля PM2 pm2-metrics. Модули PM2 устанавливаются командой pm2 install — отдельная глобальная установка через npm install не нужна:
pm2 install pm2-metricsМодуль запускает HTTP-сервер, который отдаёт метрики PM2 по адресу http://<host>:9209/metrics. Направьте Prometheus на этот адрес:
# prometheus.yml
scrape_configs:
- job_name: pm2
static_configs:
- targets: ['localhost:9209']Затем используйте Grafana для визуализации собранных данных. Сторонние модули (например, pm2-prom-module) отдают метрики на других портах — точный адрес смотрите в документации модуля.
Устранение проблем
Приложение не запускается
Проверьте логи:
pm2 logs my-appЧастые причины проблем:
- Ошибки в коде приложения
- Порт уже занят
- Недостаточно прав доступа к файлам
- Зависимости не установлены
Приложение падает при высокой нагрузке
- Проверьте использование памяти:
pm2 monit - Возможно, стоит увеличить лимит памяти в конфигурации
- Рассмотрите возможность масштабирования приложения на несколько серверов
- Увеличьте тариф вашего сервера, если не хватает ресурсов
Проблема: PM2 не перезапускается после перезагрузки сервера
Повторно настройте автозапуск:
pm2 unstartup
pm2 startup
pm2 saveЗаключение
Правильная настройка Node.js приложения с PM2 на VPS обеспечивает надёжность, отказоустойчивость и лёгкость в управлении.
PM2 предоставляет множество инструментов для мониторинга и управления процессами, что делает его незаменимым для ваших проектов.
Если вам нужна помощь с настройкой Node.js приложения на нашем VPS, обратитесь в службу поддержки.