Перейти к основному содержимому
Вернуться в категорию

Деплой Node.js приложения: PM2 и Nginx

Полное руководство по развёртыванию Node.js приложений на VPS. Установка Node.js через nvm, менеджер процессов PM2, обратный прокси Nginx, SSL-сертификат и управление переменными окружения.

Время чтения: 15 мин Веб-хостинг / Приложения
nodejspm2nginxdeployvpsjavascriptreverse proxyssl
Автор
REXE Teknoloji Network & Security Team
Редактор
REXE Teknoloji Technical Editorial
Первая публикация
Последнее обновление

Деплой Node.js приложения: PM2 и Nginx

Развёртывание Node.js приложений в производственной среде — это систематический процесс при наличии правильных инструментов и конфигурации. В этом руководстве рассматривается всё: от установки Node.js через nvm до менеджера процессов PM2, настройки обратного прокси Nginx и установки SSL-сертификата.

Установка Node.js (через nvm)

nvm (Node Version Manager) позволяет управлять несколькими версиями Node.js и рекомендуется для производственных сред.

hljs bash
# Скачать и запустить скрипт установки nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

# Перезагрузить оболочку
source ~/.bashrc

# Проверить версию nvm
nvm --version

# Установить последнюю LTS-версию
nvm install --lts

# Установить конкретную версию
nvm install 20.11.0

# Установить версию по умолчанию
nvm use --lts
nvm alias default node

# Проверить версии Node.js и npm
node --version
npm --version

В производственной среде всегда используйте LTS-версию (Long Term Support). LTS-версии получают обновления безопасности дольше.

Перенос приложения на сервер

Клонирование через Git

hljs bash
# Создать директорию приложения
sudo mkdir -p /var/www/myapp
sudo chown $USER:$USER /var/www/myapp

# Клонировать репозиторий
cd /var/www
git clone https://github.com/user/myapp.git
cd myapp

# Установить зависимости (для продакшена)
npm install --production

Переменные окружения (.env)

hljs bash
# Создать файл .env
nano /var/www/myapp/.env
hljs env
NODE_ENV=production
PORT=3000
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
JWT_SECRET=ваш-секретный-ключ
REDIS_URL=redis://localhost:6379
hljs bash
# Защитить файл .env
chmod 600 /var/www/myapp/.env

Никогда не добавляйте файл .env в Git-репозиторий. Добавьте .env в файл .gitignore.

Менеджер процессов PM2

PM2 — самый популярный инструмент для управления Node.js приложениями в продакшене. Предлагает автоматический перезапуск, управление логами и кластерный режим.

Установка PM2

hljs bash
# Установить PM2 глобально
npm install -g pm2

# Проверить версию PM2
pm2 --version

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

hljs bash
# Простой запуск
pm2 start app.js --name myapp

# Через npm start
pm2 start npm --name myapp -- start

# Кластерный режим (экземпляры по числу ядер CPU)
pm2 start app.js --name myapp -i max

Файл экосистемы PM2

hljs javascript
module.exports = {
  apps: [
    {
      name: 'myapp',
      script: './app.js',
      instances: 'max',
      exec_mode: 'cluster',
      env_production: {
        NODE_ENV: 'production',
        PORT: 3000
      },
      error_file: '/var/log/pm2/myapp-error.log',
      out_file: '/var/log/pm2/myapp-out.log',
      max_memory_restart: '500M',
      autorestart: true
    }
  ]
};
hljs bash
# Запустить с файлом экосистемы
pm2 start ecosystem.config.js --env production

# Основные команды PM2
pm2 list              # Список запущенных приложений
pm2 logs myapp        # Просмотр логов
pm2 restart myapp     # Перезапуск
pm2 reload myapp      # Перезагрузка без простоя
pm2 stop myapp        # Остановка
pm2 monit             # Мониторинг в реальном времени

Автозапуск PM2 при старте системы

hljs bash
# Сгенерировать скрипт запуска
pm2 startup

# Выполнить выведенную команду
# Сохранить текущий список PM2
pm2 save

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

hljs bash
# Установить Nginx
sudo apt update
sudo apt install nginx -y

# Создать файл конфигурации
sudo nano /etc/nginx/sites-available/myapp
hljs nginx
server {
    listen 80;
    server_name example.com www.example.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_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}
hljs bash
# Активировать сайт
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

SSL-сертификат (Let's Encrypt)

hljs bash
# Установить Certbot
sudo apt install certbot python3-certbot-nginx -y

# Получить SSL-сертификат
sudo certbot --nginx -d example.com -d www.example.com

# Проверить автоматическое обновление
sudo certbot renew --dry-run

Рабочий процесс деплоя

hljs bash
# Получить новый код
cd /var/www/myapp
git pull origin main

# Обновить зависимости
npm install --production

# Перезапуск без простоя через PM2
pm2 reload myapp

# Проверить логи
pm2 logs myapp --lines 50

На серверах REXE вы можете закрыть порт 3000 через Path Panel. Поскольку Nginx перенаправляет трафик с портов 80/443, внешний доступ к порту Node.js не нужен.

Заключение

Ваше Node.js приложение теперь работает в производственной среде под управлением PM2, за обратным прокси Nginx и защищено SSL. С кластерным режимом PM2 вы можете полностью использовать ядра CPU, а с pm2 reload выполнять обновления без простоя.

Часто задаваемые вопросы

Почему моё Node.js приложение падает с PM2?

Проверьте логи PM2 командой 'pm2 logs myapp'. Частые причины: отсутствующие переменные окружения, конфликт портов или синтаксическая ошибка. Мониторьте использование CPU/RAM в реальном времени с 'pm2 monit'. При утечке памяти добавьте параметр 'max_memory_restart' в ecosystem.config.js.

Получаю ошибку 502 Bad Gateway от Nginx, что делать?

Эта ошибка обычно означает, что Node.js приложение не запущено. Проверьте статус 'running' командой 'pm2 status'. Просмотрите сообщения об ошибках через 'pm2 logs'. Убедитесь, что Nginx проксирует на правильный порт с помощью 'sudo nginx -t'.

Как запустить несколько Node.js приложений на одном сервере?

Каждое приложение должно использовать разный порт (3000, 3001, 3002 и т.д.). Дайте каждому уникальное имя в PM2. Создайте отдельный серверный блок в Nginx для каждого домена и проксируйте на соответствующий порт. Все приложения будут доступны через порты 80/443 через Nginx.

Повлияет ли обновление версии Node.js на моё приложение?

Будьте осторожны при смене версий через nvm. Установите новую версию, протестируйте приложение, затем обновите значение по умолчанию с 'nvm alias default'. Возможно, потребуется заново сгенерировать скрипт запуска PM2 с новым путём Node.js.

Связанные статьи

Деплой PHP приложения: LAMP и LEMP стек

Полное руководство по развёртыванию PHP приложений на VPS. Сравнение LAMP и LEMP, настройка Apache/Nginx + PHP-FPM + MySQL, конфигурация виртуальных хостов и управление версиями PHP.

18 мин
phplamplemp

Деплой Python/Django: продакшен с Gunicorn и Nginx

Руководство по развёртыванию Python/Django приложений на VPS. Настройка virtualenv, производственные настройки Django, WSGI-сервер Gunicorn, обратный прокси Nginx, systemd-сервис и управление статическими файлами.

18 мин
pythondjangogunicorn
Сетевой трафикВходящий GbpsИсходящий Gbps