Деплой Node.js приложения: PM2 и Nginx
Полное руководство по развёртыванию Node.js приложений на VPS. Установка Node.js через nvm, менеджер процессов PM2, обратный прокси Nginx, SSL-сертификат и управление переменными окружения.
Содержание
Деплой Node.js приложения: PM2 и Nginx
Развёртывание Node.js приложений в производственной среде — это систематический процесс при наличии правильных инструментов и конфигурации. В этом руководстве рассматривается всё: от установки Node.js через nvm до менеджера процессов PM2, настройки обратного прокси Nginx и установки SSL-сертификата.
Установка Node.js (через nvm)
nvm (Node Version Manager) позволяет управлять несколькими версиями Node.js и рекомендуется для производственных сред.
# Скачать и запустить скрипт установки 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
# Создать директорию приложения
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)
# Создать файл .env
nano /var/www/myapp/.env
NODE_ENV=production
PORT=3000
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
JWT_SECRET=ваш-секретный-ключ
REDIS_URL=redis://localhost:6379
# Защитить файл .env
chmod 600 /var/www/myapp/.env
Никогда не добавляйте файл .env в Git-репозиторий. Добавьте .env в файл .gitignore.
Менеджер процессов PM2
PM2 — самый популярный инструмент для управления Node.js приложениями в продакшене. Предлагает автоматический перезапуск, управление логами и кластерный режим.
Установка PM2
# Установить PM2 глобально
npm install -g pm2
# Проверить версию PM2
pm2 --version
Запуск приложения с PM2
# Простой запуск
pm2 start app.js --name myapp
# Через npm start
pm2 start npm --name myapp -- start
# Кластерный режим (экземпляры по числу ядер CPU)
pm2 start app.js --name myapp -i max
Файл экосистемы PM2
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
}
]
};
# Запустить с файлом экосистемы
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 при старте системы
# Сгенерировать скрипт запуска
pm2 startup
# Выполнить выведенную команду
# Сохранить текущий список PM2
pm2 save
Настройка обратного прокси Nginx
# Установить Nginx
sudo apt update
sudo apt install nginx -y
# Создать файл конфигурации
sudo nano /etc/nginx/sites-available/myapp
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;
}
}
# Активировать сайт
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
SSL-сертификат (Let's Encrypt)
# Установить 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
Рабочий процесс деплоя
# Получить новый код
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 выполнять обновления без простоя.
Связанные статьи
Деплой PHP приложения: LAMP и LEMP стек
Полное руководство по развёртыванию PHP приложений на VPS. Сравнение LAMP и LEMP, настройка Apache/Nginx + PHP-FPM + MySQL, конфигурация виртуальных хостов и управление версиями PHP.
Установка и оптимизация WordPress: руководство для VPS
Руководство по установке и оптимизации WordPress на VPS. Настройка LEMP стека, параметры wp-config.php, права доступа к файлам, SSL, оптимизация производительности OPcache и усиление безопасности.
Деплой Python/Django: продакшен с Gunicorn и Nginx
Руководство по развёртыванию Python/Django приложений на VPS. Настройка virtualenv, производственные настройки Django, WSGI-сервер Gunicorn, обратный прокси Nginx, systemd-сервис и управление статическими файлами.