Гид по технологиям

Установка и настройка pm2 для Node.js с Nginx

• 6 min read • DevOps • Обновлено 19 Nov 2025
Установка pm2 для Node.js с Nginx
Установка pm2 для Node.js с Nginx

Основная идея

pm2 — менеджер процессов для приложений Node.js. Он поддерживает перезапуск при падении, zero-downtime reload и кластеризацию. Nginx используется как обратный прокси, принимающий внешние запросы и перенаправляющий их на Node.js-приложение, работающее локально (обычно на порту 3000).

Что нужно (Prerequisites)

  • Ubuntu 16.04 — 64-bit
  • Привилегии root или sudo

Важно: в примерах используется пользователь yume для запуска приложения (немедленно создавайте или заменяйте на своё имя пользователя).

Шаг 1 — Установка Node.js LTS

Мы начнём проект с нуля. В примере использована ветка LTS Node.js 6.x из репозитория nodesource.

Установите пакет python-software-properties и добавьте репозиторий nodesource:

sudo apt-get install -y python-software-properties
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -

Установите Node.js:

sudo apt-get install -y nodejs

Проверьте версии:

node -v
npm -v

Примечание: можно использовать более новые LTS-ветки (например, 8.x, 10.x или 12.x) — замените setup_6.x на нужную версию в скрипте nodesource.

Шаг 2 — Генерация простого Express-приложения

Для быстрого старта используем express-generator.

npm install express-generator -g

Ключ -g устанавливает пакет глобально в систему.

Создадим системного пользователя, под которым будет работать приложение (в примере — yume):

useradd -m -s /bin/bash yume
passwd yume

Переключитесь на нового пользователя:

su - yume

Сгенерируем проект:

express hakase-app

Команда создаст каталог hakase-app.

Сгенерированный скелет приложения express-generator

Перейдите в каталог и установите зависимости:

cd hakase-app
npm install

Запустите тестовый запуск приложения в режиме отладки:

DEBUG=myapp:* npm start

По умолчанию Express-приложение слушает порт 3000. Откройте в браузере http://192.168.33.10:3000 (пример IP сервера).

Express-приложение запущено на порту 3000

Приложение запущено под пользователем yume и отвечает на порт 3000.

Шаг 3 — Установка pm2

pm2 устанавливается через npm (как глобальный пакет). Выполните под root или через sudo:

npm install pm2 -g

Перейдите в каталог приложения (если вы не root, переключитесь обратно на пользователя yume):

su - yume
cd ~/hakase-app/

Посмотрите package.json, чтобы увидеть стартовую команду:

cat package.json

Конфигурация сервисов express в package.json

Запустите приложение через pm2, передав стартовый исполняемый файл express (обычно ./bin/www):

pm2 start ./bin/www

(Примечание: если команда pm2 не найдена под пользователем, убедитесь, что npm глобальные бинари находятся в PATH или запустите через sudo.)

После запуска вы увидите процесс в списке pm2:

pm2 show www

Запуск приложения под pm2

Просмотр логов приложения:

pm2 logs www

Чтобы pm2 автоматически восстанавливал процессы после перезагрузки, сгенерируем systemd-юнит:

pm2 startup systemd

Вы получите подсказку выполнить сгенерированную команду от root. Выполните её (пример для пользователя yume):

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u yume --hp /home/yume

Эта команда создаст конфигурацию systemd, которая позволит запускать процессы pm2 при старте системы.

После этого сохраните текущие процессы pm2, чтобы они рестартовали после reboot:

pm2 save

Добавление pm2 в автозапуск systemd

Важно: для корректного автозапуска нужно, чтобы пользователь и пути в команде startup совпадали с теми, под которыми вы запускаете процессы.

Шаг 4 — Установка и конфигурация Nginx как обратного прокси

Установим Nginx из репозитория Ubuntu:

sudo apt-get install -y nginx

Создайте файл виртуального хоста в /etc/nginx/sites-available/hakase-app:

cd /etc/nginx/sites-available/
vim hakase-app

Вставьте конфигурацию:

upstream hakase-app {
    # Node.js app upstream
    server 127.0.0.1:3000;
    keepalive 64;
}

# Server on port 80
server {
    listen 80;
    server_name hakase-node.co;
    root /home/yume/hakase-app;

    location / {
        # Proxy_pass configuration
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_max_temp_file_size 0;
        proxy_pass http://hakase-app/;
        proxy_redirect off;
        proxy_read_timeout 240s;
    }
}

Сохраните файл и создайте символьную ссылку в sites-enabled:

ln -s /etc/nginx/sites-available/hakase-app /etc/nginx/sites-enabled/

Проверка конфигурации Nginx:

nginx -t

Запустите и включите Nginx в автозапуск:

systemctl start nginx
systemctl enable nginx

Пояснение: в конфигурации Nginx server_name указан hakase-node.co — замените домен на ваш реальный домен или используйте IP.

Шаг 5 — Тестирование

Откройте в браузере домен (пример):

http://hakase-app.co

Вы должны увидеть Express-приложение, обслуживаемое через Nginx.

Node.js приложение под pm2 и Nginx

Проверьте автозапуск после перезагрузки сервера:

pm2 save
sudo reboot

После входа снова под пользователем yume проверьте статус:

su - yume
pm2 status www

Процесс Node.js запущен в автозапуске pm2

Если статус “online”, приложение запустилось успешно.

Отладка и типичные проблемы

  • Nginx выдаёт 502 Bad Gateway: проверьте, что процесс pm2 слушает порт 3000 и localhost:3000 отвечает: curl http://127.0.0.1:3000
  • pm2 не запускается после reboot: убедитесь, что вы выполнили pm2 save и правильно сгенерировали systemd-команду с флагом -u и –hp
  • Права доступа: если файлы проекта принадлежат root, а pm2 запускается от непривилегированного пользователя, установите права и владельца каталога: sudo chown -R yume:yume /home/yume/hakase-app
  • PATH для pm2: если pm2 установлен глобально, но при логине пользователя команда недоступна, добавьте путь к npm глобальным бинарям в профиль пользователя или используйте полный путь /usr/lib/node_modules/pm2/bin/pm2

Important: при использовании WebSocket убедитесь, что в конфигурации Nginx выставлены заголовки Upgrade и Connection “upgrade” (как в примере).

Альтернативные подходы

  • systemd unit вместо pm2 startup: можно создать собственный systemd-юнит, который будет запускать node ./bin/www под нужным пользователем. Это даёт более тонкий контроль.
  • Docker: контейнеризация приложения и запуск через docker-compose вместе с nginx как reverse proxy (подходит для более сложных окружений).
  • Foreman/pm2-runtime: для продакшена в контейнерах используйте pm2-runtime или process managers совместимые с контейнерами.

Чек-лист для разных ролей

Для разработчика:

  • Установлен Node.js и npm
  • Локально работает npm start
  • Приложение корректно логирует ошибки

Для системного администратора:

  • pm2 установлен глобально и процессы сохранены (pm2 save)
  • systemd-юнит создан через pm2 startup и запущен
  • Nginx настроен и тест nginx -t пройден
  • SELinux/AppArmor (если есть) не блокируют порты

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

  • Домен использует HTTPS (сертификат от Let’s Encrypt)
  • Заголовки безопасности добавлены в конфигурацию Nginx
  • Логи сконфигурированы для централизованной обработки

Мини-методология развёртывания (шаги)

  1. Подготовка сервера: обновление пакетов, создание пользователя.
  2. Установка Node.js и зависимостей приложения.
  3. Локальный запуск и тестирование приложения на порту 3000.
  4. Установка pm2 и создание процесса.
  5. Генерация systemd-конфигурации для pm2 и pm2 save.
  6. Установка Nginx и настройка reverse proxy.
  7. Тестирование через домен и проверка автозапуска після reboot.

Критерии приёмки

  • Приложение отвечает на запросы по домену через Nginx.
  • pm2 показывает процесс в состоянии online после reboot.
  • Логи приложения доступны через pm2 logs и не содержат критических ошибок на старте.

Безопасность и рекомендации

  • Всегда используйте HTTPS в проде: настройте certbot / Let’s Encrypt в Nginx-конфиге.
  • Не запускайте приложение под root: используйте отдельного пользователя с минимальными правами.
  • Ограничьте доступ к административным портам и используйте фаервол (ufw/iptables).
  • Регулярно обновляйте Node.js и пакеты, чтобы закрывать уязвимости.

Небольшой пример ролевого runbook (быстрая реакция при падении)

  1. Проверить статус: pm2 status
  2. Посмотреть логи: pm2 logs
  3. Перезапустить процесс: pm2 restart
  4. Если проблема не решена — проверить системные логи (journalctl -u pm2-.service) и логи Nginx
  5. Откат последнего релиза (если применяется) или запустить предыдущую версию из резервной копии

Краткий глоссарий (1 строка)

  • pm2: менеджер процессов Node.js — автоматически перезапускает и балансирует процессы.
  • Nginx: высокопроизводительный HTTP-сервер и обратный прокси.
  • systemd: менеджер инициализации в современных дистрибутивах Linux.

Заключение

Вы создали простую, устойчивую к падениям архитектуру: Express-приложение запускается под pm2, а Nginx выполняет роль обратного прокси. Такой подход подходит для небольших и средних проектов и легко масштабируется: добавлением кластеризации в pm2, балансировкой на уровне Nginx или внедрением контейнеризации.

Ключевые действия: установить Node.js → сгенерировать/разработать приложение → запустить под pm2 → обеспечить автозапуск через systemd → настроить Nginx как reverse proxy → протестировать и настроить HTTPS.

Дополнительные ссылки:

  • Ubuntu
  • Node.js
  • Nginx
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро