← Все статьи

Next.js без 502 при деплое: PM2 reload и сравнение с Kubernetes

Zero-downtime на VPS: cluster mode, reload вместо restart, не удалять .next при сборке — и когда имеет смысл оркестратор.

Содержание

Коротко

Каждый деплой Next.js на VPS — лотерея: 502 Bad Gateway на минуту или обошлось. На Habr разобрали рабочий рецепт с PM2: reload вместо restart, cluster mode и дисциплина вокруг каталога .next.

Что произошло

Автор описывает типичный сценарий: пуш в main, CI собирает проект, на сервере pm2 restart — и nginx отдаёт 502, пока процесс поднимается заново. Проблема массовая у команд без Kubernetes: обсуждения на GitHub, Stack Overflow, Reddit.

Два частых промаха:

  1. pm2 restart — процесс умирает, порт пустует, пользователи видят 502.
  2. rm -rf .next перед сборкой на живом сервере — приложение теряет артефакты до окончания next build.

Решение — pm2 reload в cluster mode: PM2 поднимает новые воркеры, потом гасит старые (zero-downtime на уровне Node).

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

Для малого и среднего трафика VPS + PM2 часто дешевле и быстрее в настройке, чем кластер Kubernetes. Но без правильного reload деплой остаётся «ручным даунтаймом».

Сравнение из материала:

Подход Плюсы Минусы
PM2 на VPS Простой старт, знакомый CI, мало moving parts Сами следите за SSL, бэкапами, масштабом
Kubernetes Rolling update из коробки, autoscaling Сложность, стоимость, избыточен для одного Next-приложения

На практике

  1. Запуск Next в cluster (instances: max или фиксированное число воркеров).
  2. В CI/CD после сборки — pm2 reload ecosystem.config.cjs, не restart.
  3. Сборку .next делать в CI или в отдельной директории; на сервер не удалять .next под работающим процессом.
  4. Healthcheck nginx на upstream после reload; логировать время простоя.

Если уже на Docker — смотрите в сторону blue-green или rolling update; идея та же: новый инстанс до выключения старого.

Итог

502 при деплое Next — не «проклятие фреймворка», а сигнал неверного процесса релиза. Для VPS-стека PM2 с reload и аккуратной сборкой часто достаточно; Kubernetes нужен, когда выросли требования к отказоустойчивости и масштабу.