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

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

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

Время чтения: 15 мин Веб-хостинг / Приложения
nodejspm2nginxdeployvpsjavascriptreverse proxyssl

Содержание

Деплой 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 выполнять обновления без простоя.