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

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

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

Ответы

Ответ 1

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

Создайте файл myapp.service (очевидно, заменив "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).

Ответ 2

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

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

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

Ответ 3

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

Короче:

  • Использовать git хук после приема
  • Jake для инструмента сборки
  • Upstart как служебная обертка для node
  • Монит для мониторинга и перезапуска приложений, с которыми они идут.
  • nginx для маршрутизации запросов к различным приложениям на одном сервере

Ответ 4

pm2 выполняет трюки.

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 8

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

Ответ 9

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

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

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

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

Ответ 10

Forever будет делать трюк.

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

Ответ 11

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

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

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

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

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

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

Ответ 14

Forever - хороший вариант для поддержки приложений (и он доступен для установки в качестве модуля, который хорош).

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

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

Ответ 15

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

Ответ 16

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