Как установить Node.js в Debian 12 и запустить Next.js приложение?

1. Установка Node.js 22.x LTS

Рекомендую установить через NodeSource репозиторий для получения актуальной версии:

# Обновляем систему
sudo apt update && sudo apt upgrade -y

# Устанавливаем необходимые пакеты
sudo apt install -y curl software-properties-common

# Добавляем NodeSource репозиторий для Node.js 22.x
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -

# Устанавливаем Node.js
sudo apt install -y nodejs

# Проверяем версии
node --version  # должно показать v22.x.x
npm --version

Альтернативный способ через NVM (Node Version Manager)

Если хотите иметь возможность легко переключаться между версиями Node.js:

# Устанавливаем NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

# Перезагружаем shell или выполняем
source ~/.bashrc

# Устанавливаем Node.js 22 LTS
nvm install --lts
nvm use --lts
nvm alias default lts/*

# Проверяем
node --version  # покажет v22.x.x

Node.js 22 LTS имеет ряд преимуществ:

  • Улучшенная производительность
  • Встроенная поддержка WebSocket клиента
  • Улучшенная поддержка ESM модулей
  • Обновлённый V8 движок
  • Поддержка до апреля 2027 года

2. Установка PM2 (менеджер процессов)

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

Основная проблема

Когда вы запускаете Node.js приложение обычным способом, оно работает только пока открыт терминал. Стоит закрыть окно терминала или разорвать SSH-соединение — приложение останавливается. Если приложение падает из-за ошибки, оно не перезапускается самостоятельно. После перезагрузки сервера приложение не запустится автоматически — нужно вручную подключаться и запускать его снова.

Что делает PM2

PM2 решает все эти проблемы. Он запускает ваше приложение в фоновом режиме и постоянно следит за его состоянием. Если приложение упадёт из-за ошибки, PM2 моментально его перезапустит. При перезагрузке сервера PM2 автоматически запустит все необходимые приложения без вашего участия.

Кроме базового функционала «держать приложение живым», PM2 предоставляет удобные инструменты для production-окружения: ведение логов, мониторинг потребления памяти и процессора, возможность запуска нескольких экземпляров приложения для распределения нагрузки, обновление кода без остановки сервиса.

Почему это важно

Для production-сервера критически важна стабильность и непрерывность работы. PM2 обеспечивает эту стабильность, автоматизируя рутинные задачи администрирования Node.js приложений. Это стандартный инструмент в индустрии — практически каждый Node.js проект в production использует PM2 или аналогичные решения.

В контексте Next.js приложения PM2 особенно полезен, так как позволяет эффективно использовать серверные ресурсы, автоматически перезапускать приложение при обновлениях и вести подробные логи работы приложения, что упрощает отладку и мониторинг.

sudo npm install -g pm2

3. Создание Next.js приложения

# Создаём директорию для проекта
mkdir -p /var/www/nextjs-app
cd /var/www/nextjs-app

# Создаём новое Next.js приложение
npx create-next-app@latest

# Устанавливаем зависимости
npm install

# Собираем production версию
npm run build

4. Настройка PM2 для Next.js

Создайте файл ecosystem.config.js в корне проекта:

module.exports = {
  apps: [{
    name: 'nextjs-app',
    script: 'npm',
    args: 'start',
    cwd: '/var/www/nextjs-app',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    }
  }]
}

Запустите приложение:

# Запускаем через PM2
pm2 start ecosystem.config.js

# Сохраняем конфигурацию PM2
pm2 save

# Настраиваем автозапуск при перезагрузке
pm2 startup systemd -u $USER --hp /home/$USER

Если всё сделано правильно, то вы увидите в консоли это:

image 2 - Как установить Node.js в Debian 12 и запустить Next.js приложение?

В процессе PM2 сгенерирует команду, которую нужно выполнить. Скопируйте и выполните эту команду:

sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u ВАШ_ЮЗЕР --hp /home/ВАШ_ЮЗЕР

5. Настройка nginx для проксирования

Создайте конфигурационный файл для вашего сайта:

sudo nano /etc/nginx/sites-available/nextjs-app

Добавьте следующую конфигурацию:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;  # Замените на ваш домен

    # Максимальный размер загружаемых файлов
    client_max_body_size 20M;

    # Gzip сжатие
    gzip on;
    gzip_comp_level 5;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # Проксирование на Next.js
    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_cache_bypass $http_upgrade;
        
        # Дополнительные заголовки
        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_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        
        # Таймауты
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # Кеширование статических файлов Next.js
    location /_next/static {
        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_cache_bypass $http_upgrade;
        
        # Кеширование на 1 год
        add_header Cache-Control "public, max-age=31536000, immutable";
    }
}

6. Активация конфигурации

# Создаём символическую ссылку
sudo ln -s /etc/nginx/sites-available/nextjs-app /etc/nginx/sites-enabled/

# Проверяем конфигурацию
sudo nginx -t

# Перезапускаем nginx
sudo systemctl reload nginx

7. Настройка SSL (опционально, но рекомендуется)

# Устанавливаем Certbot
sudo apt install -y certbot python3-certbot-nginx

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

# Автообновление сертификатов уже настроено автоматически

Теперь ваш Next.js сайт должен быть доступен по адресу вашего домена. Next.js будет работать на порту 3000, а nginx будет проксировать все запросы к нему.

Полезные команды для управления

# PM2 команды
pm2 status          # Статус приложений
pm2 logs           # Логи
pm2 restart all    # Перезапуск
pm2 monit          # Мониторинг

# Просмотр логов nginx
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

# Перезапуск после изменений в коде
cd /var/www/nextjs-app
git pull           # Если используете git
npm install        # Если изменились зависимости
npm run build      # Пересборка
pm2 restart nextjs-app

Запуск приложения Nextjs через менеджера процессов PM2

PM2 — это популярный процессный менеджер для Node.js приложений, который облегчает управление процессами в продакшн-среде. Он используется для мониторинга, управления и автоматического перезапуска Node.js приложений. PM2 предоставляет ряд удобных функций, которые делают развертывание и обслуживание серверных приложений более удобными и эффективными.

Зачем использовать PM2 для запуска приложений?

  1. Автоматический перезапуск: PM2 автоматически перезапускает ваше приложение в случае его сбоя или после внесения изменений в код. Это особенно полезно для продакшн-серверов, где важно минимизировать время простоя.
  2. Мониторинг процессов: PM2 предоставляет удобные инструменты для мониторинга приложений, такие как просмотр логов, статистики и состояния процессов. С помощью команды pm2 status вы можете быстро узнать, какие приложения запущены, их текущий статус, использование ресурсов и другую информацию.
  3. Управление несколькими процессами: PM2 позволяет запускать несколько экземпляров одного приложения, что идеально подходит для многозадачности и увеличения производительности, особенно на многоядерных серверах. Это важно для приложений, таких как Next.js, которые могут обрабатывать большое количество одновременных запросов.
  4. Простота конфигурации и использования: Запуск приложений через PM2 очень прост: всего несколько команд для запуска, мониторинга и перезапуска. PM2 также позволяет создавать конфигурационные файлы, которые помогают управлять приложениями в разных средах.
  5. Логирование: PM2 автоматически собирает логи ошибок и стандартного вывода, которые можно просматривать в реальном времени. Это помогает быстро диагностировать и устранять ошибки, а также отслеживать работу приложения.
  6. Поддержка автозапуска: PM2 может быть настроен для автоматического старта приложений при перезагрузке системы. Это гарантирует, что ваше приложение всегда будет запущено, даже если сервер был перезагружен.

Когда стоит использовать PM2?

PM2 полезен для тех случаев, когда ваше Node.js приложение:

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

Преимущества использования PM2 для Next.js

Next.js — это фреймворк, который часто используется для создания серверных приложений и сайтов с серверным рендерингом (SSR). Использование PM2 для запуска приложения Next.js в продакшн-среде помогает решить следующие задачи:

  • Обеспечивает устойчивость приложения (автоматический перезапуск в случае сбоев).
  • Поддерживает многопроцессность для лучшего использования серверных ресурсов.
  • Упрощает процесс развертывания, так как PM2 автоматически обрабатывает перезапуск после изменений в коде.
  • Предоставляет удобные средства мониторинга и логирования, что важно для эффективного обслуживания приложения.

Таким образом, PM2 — это мощный инструмент для продвинутых пользователей и разработчиков, который помогает надежно запускать, управлять и мониторить Next.js приложения в продакшн-среде.

Как развернуть Next.js приложение с использованием PM2 для продакшн-среды?

Сначала нужно собрать оптимизированную версию вашего приложения:

Шаг 1: Сборка приложения Next.js для продакшна

Это создаст оптимизированную версию вашего приложения в папке .next

cd /var/www/my-site
npm run build

Шаг 2: Установите PM2

npm install -g pm2

Шаг 3: Создайте файл конфигурации для PM2

Создайте файл ecosystem.config.js в корне вашего проекта:

module.exports = {
  apps: [
    {
      name: "my-app",
      script: "npm",
      args: "start",
      cwd: "/var/www/my-site",  // Путь к вашему проекту
      env: {
        NODE_ENV: "production",
        PORT: 3000
      },
      instances: 1,
      autorestart: true,
      watch: false,
      max_memory_restart: "1G",
      log_date_format: "YYYY-MM-DD HH:mm:ss Z"
    }
  ]
};

Шаг 4: Запустите приложение с помощью PM2

pm2 start ecosystem.config.js

Шаг 5: Настройте автозапуск PM2 при старте системы

pm2 startup systemd

Шаг 6: Сохраните текущую конфигурацию PM2

pm2 save

Мониторинг работы

Вы можете проверять состояние приложения с помощью pm2 status и просматривать логи с помощью pm2 logs.

Проверка памяти: Используйте pm2 monit для мониторинга использования памяти и CPU.

Обновление приложения

Для обновления приложения на проде:

cd /var/www/my-site
git pull # или другой способ обновления кода
npm install
npm run build
pm2 restart lic-app