Как запустить приложение Node.js как его собственный процесс?

Каков наилучший способ развертывания Node.js?

У меня есть Dreamhost VPS (это то, что они называют виртуальной машиной), и я смог установить Node.js и настроить прокси. Это прекрасно работает до тех пор, пока я поддерживаю соединение SSH, которое я запустил, с открытым узлом.

17 ответов

Решение

Ответ 2016 года: почти каждый дистрибутив Linux поставляется с systemd, что означает, что навсегда, monit и т. Д. Больше не нужны - ваша ОС уже выполняет эти задачи.

Делать myapp.service file (заменив 'myapp' на имя вашего приложения, очевидно):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nobody
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Обратите внимание, если вы новичок в Unix: /var/www/myapp/app.js должен иметь #!/usr/bin/env node на самой первой линии.

Скопируйте файл службы в /etc/systemd/system папка.

Расскажите systemd о новом сервисе с systemctl daemon-reload,

Начни с systemctl start myapp,

Включить его при загрузке с systemctl enable myapp,

Смотрите логи с journalctl -u myapp

Это взято из того, как мы разворачиваем приложения для узлов в Linux, выпуск 2018, который также включает команды для генерации AWS/DigitalOcean/Azure CloudConfig для построения серверов Linux/ узлов (включая .service файл).

Используйте навсегда. Он запускает программы Node.js в отдельных процессах и перезапускает их в случае смерти.

Использование:

  • forever start example.js начать процесс.
  • forever list чтобы увидеть список всех процессов, запущенных навсегда
  • forever stop example.js чтобы остановить процесс, или forever stop 0 остановить процесс с индексом 0 (как показано forever list).

Я написал о моем методе развертывания здесь: Развертывание приложений node.js

Короче:

  • Используйте git post-receive hook
  • Джейк за инструмент для сборки
  • Upstart как служебная оболочка для узла
  • Monit для мониторинга и перезапуска приложений, если они отключаются
  • nginx для маршрутизации запросов в разные приложения на одном сервере

pm2 делает трюки.

Возможности: Мониторинг, горячая перезагрузка кода, встроенный балансировщик нагрузки, сценарий автоматического запуска и восстановление / сброс процессов.

Ты можешь использовать monit, forever, upstart или же systemd запустить свой сервер.

Вы можете использовать Varnish или HAProxy вместо Nginx (известно, что Nginx не работает с веб-сокетами).

В качестве быстрого и грязного решения вы можете использовать nohup node your_app.js & чтобы предотвратить завершение вашего приложения на вашем сервере, но forever, monit и другие предложенные решения лучше.

Я создал скрипт Upstart, который в настоящее время используется для моих приложений:

description "YOUR APP NAME"
author "Capy - http://ecapy.com"

env LOG_FILE=/var/log/node/miapp.log
env APP_DIR=/var/node/miapp
env APP=app.js
env PID_NAME=miapp.pid
env USER=www-data
env GROUP=www-data
env POST_START_MESSAGE_TO_LOG="miapp HAS BEEN STARTED."
env NODE_BIN=/usr/local/bin/node
env PID_PATH=/var/opt/node/run
env SERVER_ENV="production"

######################################################

start on runlevel [2345]
stop on runlevel [016]

respawn
respawn limit 99 5

pre-start script
    mkdir -p $PID_PATH
    mkdir -p /var/log/node
end script

script
    export NODE_ENV=$SERVER_ENV
    exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
end script

post-start script
    echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
end script

Настройте все перед #########, создайте файл в /etc/init/your-service.conf и вставьте его туда.

Тогда ты можешь:

start your-service
stop your-service
restart your-service
status your-service

Я написал довольно полное руководство по развертыванию No de.js с примерами файлов:

Учебник. Как развертывать приложения Node.js, с примерами

Он охватывает такие вещи, как http-прокси, SSL и Socket.IO.

Если у вас есть root-доступ, вам лучше настроить демон так, чтобы он работал безопасно и работал в фоновом режиме. Вы можете прочитать, как это сделать для Debian и Ubuntu, в блоге. Запустите Node.js как сервис в Ubuntu.

Вот более длинная статья о решении этой проблемы с помощью systemd: http://savanne.be/articles/deploying-node-js-with-systemd/

Некоторые вещи, которые нужно иметь в виду:

  • Кто начнет мониторинг вашего процесса? Навсегда это отличный инструмент, но для его работы нужен инструмент мониторинга. Это немного глупо, почему бы просто не использовать вашу систему инициализации?
  • Можете ли вы адекватно контролировать свои процессы?
  • Вы используете несколько бэкэндов? Если да, есть ли у вас положения, позволяющие никому из них не сбить других с точки зрения использования ресурсов?
  • Будет ли услуга нужна постоянно? Если нет, рассмотрите возможность активации сокетов (см. Статью).

Все эти вещи легко сделать с помощью systemd.

Навсегда сделаем свое дело.

@ Кевин: Вы должны быть в состоянии убить процессы в порядке. Я бы немного проверил документацию немного. Если вы можете воспроизвести ошибку, было бы здорово опубликовать ее как проблему на GitHub.

Попробуйте это: http://www.technology-ebay.de/the-teams/mobile-de/blog/deploying-node-applications-with-capistrano-github-nginx-and-upstart.html

Отличное и подробное руководство по развертыванию приложений Node.js с Capistrano, Upstart и Nginx

Как сказал Box9, Forever - хороший выбор для производственного кода. Но также возможно продолжать процесс, даже если SSH- соединение закрыто от клиента.

Хотя это не обязательно хорошая идея для производства, это очень удобно, когда вы находитесь в середине длительных сеансов отладки, или для отслеживания вывода на консоль длинных процессов, или всякий раз, когда полезно отключить ваше соединение SSH, но поддерживать терминал на сервере. подключиться позже (например, запустить приложение Node.js дома и подключиться к консоли позже на работе, чтобы проверить, как идут дела).

Предполагая, что ваш сервер - это *nix box, вы можете использовать команду screen из оболочки, чтобы сохранить процесс работающим, даже если клиентский SSH закрыт. Вы можете загрузить / установить экран из Интернета, если он еще не установлен (найдите пакет для своего дистрибутива, если Linux, или используйте MacPorts, если OS X).

Это работает следующим образом:

  1. Когда вы впервые открываете соединение SSH, введите "screen" - это запустит ваш сеанс экрана.
  2. Начните работать как обычно (т.е. запустите приложение Node.js)
  3. Когда вы закончите, закройте свой терминал. Ваш серверный процесс (ы) продолжит работать.
  4. Для повторного подключения к вашей консоли, ssh вернитесь на сервер, войдите в систему и введите "screen -r" для повторного подключения. Ваш старый контекст консоли снова откроется, и вы сможете возобновить его использование.
  5. Чтобы выйти из экрана, когда он подключен к серверу, введите "exit" в командной строке консоли, и вы попадете в обычную оболочку.

При необходимости вы можете запускать несколько сеансов экрана одновременно, как это, и вы можете подключиться к любому из них с любого клиента. Прочитайте документацию онлайн для всех вариантов.

В вашем случае вы можете использовать демона upstart. Для полного решения по развертыванию я могу предложить capistrano. Два полезных руководства: как настроить Node.js env и как выполнить развертывание через capistrano + upstart.

Forever - это хороший вариант для поддержания работы приложений (и его можно установить в виде модуля npm).

Но для более серьезного "развертывания" - таких как удаленное управление развертыванием, перезапуском, выполнением команд и т. Д. - я бы использовал capistrano с расширением узла.

https://github.com/loopj/capistrano-node-deploy

https://paastor.com/ - это относительно новый сервис, который выполняет развертывание для вас, на VPS или другой сервер. Существует CLI для push-кода. У Paastor есть свободный уровень, по крайней мере, он был на момент публикации этого.

Попробуйте узел-развертывание-сервер. Это сложный набор инструментов для развертывания приложения на ваших частных серверах. Он написан на Node.js и использует npm для установки.

Я использую экспресс на Dreamhost и запускаю pm2 в фоновом режиме.pm2 start app.js. Удобный. Может просматривать журналы и даже сохранять файлы журналов.pm2 logs <PM2_ID> mylogs.txt,

      pm2 monit - monitoring metrics of app

pm2 list - table view of processes

Вы можете настроить PM2 для автоматического перезапуска процесса, если он превышает определенный порог использования памяти. Это помогает предотвратить утечки памяти или чрезмерное использование памяти.

      pm2 start app.js --name=myapp --max-memory-restart 200M
Другие вопросы по тегам