Установка и настройка 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.

Перейдите в каталог и установите зависимости:
cd hakase-app
npm installЗапустите тестовый запуск приложения в режиме отладки:
DEBUG=myapp:* npm startПо умолчанию Express-приложение слушает порт 3000. Откройте в браузере http://192.168.33.10:3000 (пример IP сервера).

Приложение запущено под пользователем yume и отвечает на порт 3000.
Шаг 3 — Установка pm2
pm2 устанавливается через npm (как глобальный пакет). Выполните под root или через sudo:
npm install pm2 -gПерейдите в каталог приложения (если вы не root, переключитесь обратно на пользователя yume):
su - yume
cd ~/hakase-app/Посмотрите package.json, чтобы увидеть стартовую команду:
cat package.json
Запустите приложение через pm2, передав стартовый исполняемый файл express (обычно ./bin/www):
pm2 start ./bin/www(Примечание: если команда pm2 не найдена под пользователем, убедитесь, что npm глобальные бинари находятся в PATH или запустите через sudo.)
После запуска вы увидите процесс в списке pm2:
pm2 show www
Просмотр логов приложения:
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
Важно: для корректного автозапуска нужно, чтобы пользователь и пути в команде 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 — Тестирование
Откройте в браузере домен (пример):
Вы должны увидеть Express-приложение, обслуживаемое через Nginx.

Проверьте автозапуск после перезагрузки сервера:
pm2 save
sudo rebootПосле входа снова под пользователем yume проверьте статус:
su - yume
pm2 status www
Если статус “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
- Логи сконфигурированы для централизованной обработки
Мини-методология развёртывания (шаги)
- Подготовка сервера: обновление пакетов, создание пользователя.
- Установка Node.js и зависимостей приложения.
- Локальный запуск и тестирование приложения на порту 3000.
- Установка pm2 и создание процесса.
- Генерация systemd-конфигурации для pm2 и pm2 save.
- Установка Nginx и настройка reverse proxy.
- Тестирование через домен и проверка автозапуска після reboot.
Критерии приёмки
- Приложение отвечает на запросы по домену через Nginx.
- pm2 показывает процесс в состоянии online после reboot.
- Логи приложения доступны через pm2 logs и не содержат критических ошибок на старте.
Безопасность и рекомендации
- Всегда используйте HTTPS в проде: настройте certbot / Let’s Encrypt в Nginx-конфиге.
- Не запускайте приложение под root: используйте отдельного пользователя с минимальными правами.
- Ограничьте доступ к административным портам и используйте фаервол (ufw/iptables).
- Регулярно обновляйте Node.js и пакеты, чтобы закрывать уязвимости.
Небольшой пример ролевого runbook (быстрая реакция при падении)
- Проверить статус: pm2 status
- Посмотреть логи: pm2 logs
- Перезапустить процесс: pm2 restart
- Если проблема не решена — проверить системные логи (journalctl -u pm2-
.service) и логи Nginx - Откат последнего релиза (если применяется) или запустить предыдущую версию из резервной копии
Краткий глоссарий (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
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента