Как запустить приложение Node.js как его собственный процесс? - PullRequest
191 голосов
/ 13 января 2011

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

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

Ответы [ 16 ]

100 голосов
/ 16 февраля 2015

2016 answer : почти каждый дистрибутив Linux поставляется с systemd, что означает, что forever, 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).

100 голосов
/ 13 января 2011

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

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

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

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

Короче говоря:

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

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

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

9 голосов
/ 11 сентября 2011

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

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

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

7 голосов
/ 24 апреля 2013

Я создал скрипт 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
6 голосов
/ 15 января 2012

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

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

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

5 голосов
/ 22 января 2013

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

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

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

Все эти вещи легко выполняются с помощью systemd.

5 голосов
/ 13 января 2011

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

3 голосов
/ 14 января 2011

Навсегда добьются цели.

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

...