Задача: настроить Node.js с Next.js на Debian 12 и проксировать через nginx.
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
Если всё сделано правильно, то вы увидите в консоли это:

В процессе 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