Node.js
Как запустить Node.js в фоне: PM2, nohup и systemd простыми словами
Когда вы запускаете Node.js-сервер командой node server.js, он работает в текущем терминале. Если закрыть терминал, процесс обычно завершится. Поэтому для сервера нужен фоновый запуск: приложение продолжает работать, а вы можете закрыть окно терминала или выйти из SSH
Для большинства начинающих самый удобный способ — PM2. Он запускает Node.js-приложение как процесс, показывает логи, умеет перезапускать сервер и проще, чем ручная настройка systemd
Короткий ответ
Установите PM2
npm install -g pm2
Запустите приложение
pm2 start server.js
Посмотрите список процессов
pm2 list
Откройте логи
pm2 logs
Если в списке есть ваш server.js, Node.js-приложение работает в фоне
Минимальный сервер для проверки
Создайте файл server.js
const http = require("http")
const server = http.createServer((request, response) => {
response.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" })
response.end("Node.js server works")
})
server.listen(3000, () => {
console.log("Server started: http://localhost:3000")
})
Обычный запуск
node server.js
Фоновый запуск через PM2
pm2 start server.js --name node-demo
Теперь сервер можно проверить в браузере
http://localhost:3000
Как остановить фоновый процесс
Посмотрите процессы
pm2 list
Остановите по имени
pm2 stop node-demo
Запустите снова
pm2 restart node-demo
Удалите из списка PM2
pm2 delete node-demo
Эти команды важны: фоновый процесс нельзя просто “закрыть крестиком”, его нужно остановить явно
Когда подойдет nohup
nohup можно использовать для простой проверки на Linux или macOS
nohup node server.js > app.log 2>&1 &
Но для постоянного сервера это менее удобно. Нужно отдельно искать процесс, читать лог-файл, перезапускать приложение при падении. PM2 делает это понятнее
Когда нужен systemd
На настоящем Linux-сервере часто используют systemd. Это системный менеджер служб. Он хорош для продакшен-сценариев, но новичку сложнее: нужно создавать service-файл, указывать пользователя, рабочую папку, команду запуска и правила перезапуска
Если вы только учитесь или поднимаете небольшой проект, начните с PM2. Когда появится стабильный сервер и понятная инфраструктура, можно перейти к systemd
Как запустить npm-команду в фоне
Иногда проект запускается не через node server.js, а через команду из package.json
npm run start
PM2 можно запустить и так
pm2 start npm --name my-app -- run start
Если команда называется dev, для постоянного сервера это обычно плохой признак. dev часто запускает режим разработки, а для публикации нужен start или отдельная сборка
Мини-практика
Создайте server.js, запустите его через PM2, откройте http://localhost:3000, затем остановите процесс через pm2 stop
После этого измените текст ответа в server.js, выполните pm2 restart node-demo и проверьте страницу еще раз. Так вы увидите полный цикл: старт, логи, изменение, перезапуск
Частые ошибки
Ошибка первая: запустить node server.js, закрыть терминал и удивиться, что сервер остановился
Ошибка вторая: запустить несколько одинаковых процессов на одном порту. Если порт 3000 уже занят, второй сервер не стартует
Ошибка третья: не смотреть логи. При фоновом запуске ошибки не всегда видны на экране, поэтому используйте pm2 logs
Ошибка четвертая: запускать npm run dev как постоянный сервер. Режим разработки не всегда подходит для продакшена
Что почитать дальше по Node.js
Если нужен общий маршрут по теме, откройте рубрику Node.js. Для соседних задач пригодятся эти разборы:
- Как запустить JS-файл через Node.js: терминал, папка и первый вывод
- Как запустить backend на Node.js на хостинге: порт, env и процесс
- Как запустить проект Node.js: npm install, package.json и команды start/dev
- Как запустить сервер Node.js: простой HTTP-сервер и Express