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

195

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

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

respectTheCode
источник
6
Хм, мне кажется странным, что вы называете Forever как "развертывание node.js". Разве это не просто инструмент мониторинга / контроля процесса? Обычно веб-развертывание означает (по крайней мере, что я встречаю в статьях) несколько взаимосвязанных действий, которые делают веб-приложение доступным (этот инструмент процесса является его частью). Во всяком случае, это все еще отличный пост в StackOverflow, как я узнал из ответов каждого.
Миконг
Это самое простое развертывание node.js на Dreamhost. Целью было просто обеспечить надежную работу узла в качестве отправной точки для построения.
уважение TheCode
Как вы справились с переадресацией домена на работающий узел порта?
Grm
2
@grm Я использую HTTP-прокси github.com/nodejitsu/node-http-proxy
TheCode
Сейчас мы используем Elastic Beanstalk, и он работает довольно хорошо.
уважение TheCode

Ответы:

107

Ответ 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файл).

mikemaccana
источник
1
Есть идеи, как с этим бороться Failed to issue method call: Unit name ... is not valid.?
Жюльен Женесту
1
@JulienGenestoux имя устройства совпадает с названием вашей службы. Похоже, там есть расхождение. После того, как вы скопировали файл, /etc/systemd/systemвам может понадобиться запустить systemctl daemon-reload(systemd обычно сообщит вам, если это необходимо). TBH лучше всего задавать как отдельный вопрос.
mikemaccana
3
Вместо того, чтобы копировать ваш сервисный файл /etc/systemd/system, вы можете просто использовать systemctl enable /full/path/to/myapp.service, который создает символическую ссылку /etc/systemd/systemдля вас.
Арне
1
Как это соотносится с pm2? Может ли он заменить pm2 или pm2 предлагает больше необходимых функций?
Сергей Башаров
1
@VinodSrivastav nodeвызывается /var/www/myapp/app.jsсам по себе. В Unix, если вы сделаете файл исполняемым, и первая строка, начинающаяся с #!/some/fileфайла, будет интерпретирована с этим двоичным файлом. Google "переводчик Unix", чтобы узнать больше.
mikemaccana
101

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

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

  • forever start example.js начать процесс.
  • forever list чтобы увидеть список всех процессов, запущенных навсегда
  • forever stop example.jsчтобы остановить процесс или forever stop 0остановить процесс с индексом 0 (как показано forever list).
Дэвид Тан
источник
Это близко. Это начинается просто отлично, но не позволит мне что-нибудь остановить. Я смог выйти из системы и снова войти в нее, а затем убить процесс узла. Навсегда не перезапустил его. Так что я думаю о том, как это работает, не совместимо с DH.
уважение TheCode
@Kevin, вы не можете убить процесс узла, потому что Forever сам работает на узле! Я добавил несколько инструкций по использованию в мой ответ, в том числе как остановить процесс. Я использую это на моем VPS, и это работает как шарм.
Дэвид Тан
forever stop 0была ошибка, и вещи вроде как развалились оттуда. Я пытался сделать это без рута от своего собственного пользователя, чтобы я мог легко очистить, как только я найду правильное решение. Это может быть моей проблемой. Я посмотрю на это еще немного.
респект TheCode
У меня было что-то не так с npm, что вызывало проблемы. С npm и узлом, установленным правильно, всегда работает отлично. В итоге я добавил команды запуска навсегда в набор cronjob для запуска при перезапуске. Сейчас я работаю над небольшим приложением для узлов, которое позволит мне запускать и останавливать бесконечные процессы.
респект TheCode
Есть альтернатива Forever, которая использует собственный API кластера узла: github.com/superjoe30/naught
andrewrk
41

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

Коротко:

  • Используйте git post-receive hook
  • Джейк за инструмент для сборки
  • Upstart как служебная оболочка для узла
  • Мониторинг для мониторинга и перезапуска приложений, если они выходят из строя
  • nginx направляет запросы в разные приложения на одном сервере
Бен
источник
2
Если у меня всегда будет один узел Node на моем сервере, могу ли я безопасно отказаться от Nginx?
Дор
3
Ссылка кажется неработающей
verybadalloc
@ Да, я знаю, что это поздний ответ, но я бы не стал. Помимо таких вещей, как завершение SSL и кэширование, обратный прокси-сервер nginx перед хостом обеспечивает большую инфраструктурную гибкость, чем запуск узла непосредственно на порту 80. Это также означает, что вам не нужно запускать узел как root, что, я думаю, довольно веский аргумент в пользу установки nginx.
Крис Браун
16

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

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

nickleefly
источник
Совместимо ли это с такими сервисами, как Heroku?
FRD
@FRD Я не думаю, что это работает с heroku, проверьте эту статью
nickleefly
9

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

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

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

nponeccop
источник
2
Пользователь "Сергей Яроцкий" попытался отредактировать ваше сообщение, сказав, что Nginx теперь поддерживает WebSockets (начиная с версии 1.3). Я отклонил редактирование, так как считаю, что его следует публиковать как комментарий. (В противном случае у вас было бы два противоречивых предложения в одном посте, что сбивает с толку.)
Backlin
7

Я создал скрипт 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
Capy
источник
Спасибо, как раз то, что мне было нужно.
Нильсон Морейс
6

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

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

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

Рич Джонс
источник
Это выглядит великолепно. Я использую heroku для разработки и начального запуска, но в конечном итоге мне нужно будет масштабировать прошлое heroku и развернуть его непосредственно в EC2. Я буду играть с этим, когда у меня будет время.
респект TheCode
5

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

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

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

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

Рубен Вермерш
источник
5

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

Seldaek
источник
Я не думал, что у меня есть root, но мне кажется, что мне просто нужно включить его на веб-панели. Я дам этому шанс.
уважение TheCode
3

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

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

Marak
источник
Кто такой Кевин? ОП?
Питер Мортенсен
2

Как сказал 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» в командной строке консоли, и вы попадете в обычную оболочку.

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

cjcela
источник
Хорошая информация, чтобы иметь. Я согласен, что это не будет работать для производства, но может быть очень полезно при отладке на удаленном сервере.
респект TheCode
почему бы просто не использовать узел nohup myapp.js & 2> /var/log/myapp.log 1> / dev / null
markus_p
Я нашел этот ав полезный youtube.com/watch?v=P4mT5Tbx_KE объяснения nohupиforever
Винод Шривастав
1

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

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

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

martyman
источник
1

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

ruffrey
источник
1

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

Анатолий
источник
Мертвые ссылки для последних двух
Пэт
1

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

AndyGrom
источник