Как заставить приложение node.js работать постоянно?


259

На сервере Debian я установил Node.js. Я понимаю, как запустить приложение из putty с помощью этой командной строки:

node /srv/www/MyUserAccount/server/server.js

и добраться до него по адресу 50.51.52.53:8080(IP и порт).

Но как только я закрою шпаклевку, я больше не смогу добраться до адреса 50.51.52.53:8080.

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

Как вы можете догадаться, я новичок в Linux и Node.js.


7
Обратите внимание, что pm2 - хорошая альтернатива Forever , если вы не хотите использовать Forever по какой-либо причине.
Кевин Б.

спасибо @KevinB github.com/Unitech/pm2 - действительно хорошая альтернатива
Сачин

Ответы:


221

Хотя другие ответы решают проблему ОП, все они излишни и не объясняют, почему он или она испытывает эту проблему.

Ключ этой строки: «Я закрываю замазку, тогда я не могу добраться до адреса»

Когда вы вошли на удаленный хост в Putty, вы запустили процесс SSH linux, и все команды, введенные из этого сеанса SSH, будут выполнены как дочерние элементы указанного процесса.

Ваша проблема в том, что когда вы закрываете Putty, вы выходите из сеанса SSH, который убивает этот процесс и все активные дочерние процессы. Когда вы закрываете замазку, вы случайно убиваете свой сервер, потому что запускаете его на переднем плане . Чтобы избежать этого, запустите сервер в фоновом режиме , добавив & к вашей команде:

node /srv/www/MyUserAccount/server/server.js &

Проблема здесь заключается в недостатке знаний Linux, а не в вопросе об узле. Для получения дополнительной информации проверьте: http://linuxconfig.org/understanding-foreground-and-background-linux-processes

ОБНОВИТЬ:

Как уже упоминалось, сервер узла все еще может умереть при выходе из терминала. Обычная ошибка, с которой я столкнулся, заключается в том, что, хотя процесс узла выполняется в bg, он является stdout, а stderr по-прежнему направлен на терминал. Это означает, что если сервер узла записывает в console.log или console.error, он получит сообщение об ошибке сломанного канала и сбое. Этого можно избежать, отправив выходные данные вашего процесса:

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

Если проблема не устраняется, вам следует изучить такие вещи, как tmux или nohup , которые по-прежнему более надежны, чем решения для конкретных узлов, поскольку их можно использовать для запуска всех типов процессов (базы данных, службы ведения журналов, другие языки).

Распространенная ошибка, которая может привести к выходу сервера, состоит в том, что после запуска nohup node your_path/server.js &вы просто закрываете терминал Putty простым щелчком мыши. exitВместо этого вы должны использовать команду, тогда ваш сервер узлов будет запущен.


7
Если вы все еще закрываете сессию Putty во время выполнения &услуги, она все равно закрывается. (Только что протестирован на Debian Jesse)
NiCk Newman

1
Как сказал @NiCkNewman, этот ответ неполон! Смотрите ответ Рика Роя для правильного решения.
thejonwithnoh

19
«&» Запускает процесс в фоновом режиме, но вам действительно нужно добавить «nohup» в начало этой команды, чтобы отсоединить его от окна консоли, чтобы приложение не останавливалось, когда окно переходит в спящий режим после нескольких часов, изменяя ранее упомянутую команду на:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge

2
AIX powersystem, nohup node myApp.js &запустила приложение в bg, но оно умирает, когда термин был закрыт. Не уверен, почему, хотя.
AnBisw

4
@ Annjawn, вы должны использовать exitкоманду для выхода из терминала.
Ionut Necula

342

Вы можете установить навсегда используя npm следующим образом:

sudo npm install -g forever

А затем запустите ваше приложение с:

forever server.js

Или как услуга:

forever start server.js

Навсегда перезапускает ваше приложение, когда оно по какой-либо причине падает или останавливается. Для ограничения перезапусков до 5 вы можете использовать:

forever -m5 server.js

Чтобы вывести список всех запущенных процессов:

forever list

Запишите целое число в скобках и используйте его следующим образом, чтобы остановить процесс:

forever stop 0

Перезапуск работающего процесса:

forever restart 0

Если вы работаете с файлом приложения, вы можете использовать этот -wпараметр для автоматического перезапуска при каждом server.jsизменении файла:

forever -w server.js

11
@MarthaJames, если он закрывается, когда закрывается ваша ssh-сессия / окно, то вы, вероятно, забыли включить «start» вforever start <file>
Kristian

8
Какая разница между использованием forever server.jsи forever start server.js? Я знаю, что это говорит, что это «как услуга», но что это значит?
Маркиззо

5
Когда я набираю forever server.js, он запускает сервер. Если я нажму Ctrl+ C, он остановит службу. Если я ввожу, forever start server.jsто он запускает службу, и даже если я нажимаю Ctrl+, Cон остается открытым. Затем вы можете выполнить другие указанные выше команды для остановки / просмотра списка. Это то, что я испытал по крайней мере.
Termato

6
Это запускает скрипт после перезапуска сервера?
Beingalex

1
foreverМодуль (v0.15.3) уязвима для регулярного выражения атак отказа в обслуживании и не должны быть использованы: github.com/foreverjs/forever/issues/960
Бенни Нойгебауером

82

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

Установить PM2

$ npm install pm2 -g

Запустить приложение

$ pm2 start app.js

Если вы используете экспресс, то вы можете запустить свое приложение, как

pm2 start ./bin/www --name="app"

Перечисление всех запущенных процессов:

$ pm2 list

Будет перечислен весь процесс. Затем вы можете остановить / перезапустить службу, используя идентификатор или имя приложения с помощью следующей команды.

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

Для отображения логов

$ pm2 logs ['all'|app_name|app_id]

1
Будьте здоровы! оно работает!! Forever и Nohup не работают на сервере bitnami nodejs веб-службы Amazon ( docs.bitnami.com/aws/infrastructure/nodejs ). PM2 отлично работает!
Полрас

Эта библиотека, похоже, имеет наибольшее количество запусков на github
DragonFire

41

Я бы порекомендовал поискать что-то типа Forever, чтобы перезапустить Node в случае сбоя, и обработать это для вас.


Я хотел бы отметить, что без nohup, узел будет выходить при выходе из сеанса ssh, если вы запустите его таким образом (если вы не используете что-то вроде screen to tmux).
Haozhun

1
@Haozhun, интересно, но это не так, как у меня работает на моих машинах. Когда я запускаю ssh и запускаю что-то с помощью этой команды, она всегда работает в фоновом режиме, даже после закрытия сеанса SSH.
Брэд

@Brad Пожалуйста, смотрите второй ответ на stackoverflow.com/questions/4018154/… . Похоже, некоторые люди согласны с 1-м комментарием этого вопроса, который объясняет nohup. Было бы здорово, если бы мы могли разрешить эту путаницу. Но я не знаю с чего начать.
Хаожун,

4
Для большинства unixen (включая большинство дистрибутивов Linux) запуск в фоновом режиме все равно приведет к остановке процесса, если вы закроете окно терминала. Чтобы предотвратить это, запустите nohup. Пример:nohup node app.js &
Slebetman

1
Я использую Forever с производственной средой Linux. Я обычно использую команду навсегда запустить --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

Если вы просто хотите всегда запускать приложение узла в терминале, просто используйте screen.

Установить на Ubuntu / Debian:

sudo apt-get install screen

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

$ screen
$ node /path/to/app.js

ctrl + a а потом ctrl + d уволить

Чтобы получить вернулся:

Один экран: screen -r

Если их несколько, вы можете перечислить все экраны с помощью: screen -ls

А потом: screen -r pid_number


1
Это хороший вариант, поскольку он также позволяет мне в любое время переключать процесс на передний план
aexl

26

Вы можете просто использовать это

nohup node /srv/www/MyUserAccount/server/server.js &

Это будет держать приложение запущенным, и чтобы закрыть его, вам придется убить его.

Для этого вы можете установить htopи затем найти узел и затем убить его


18
Важно отметить, что в этом случае пользователь должен был бы правильно выйти из сеанса PuTTY (то есть с помощью exitкоманды). Если пользователь просто закрывает окно, это может использовать сигнал, отличный от SIGHUPзавершения процесса, и, следовательно, узел в любом случае завершит работу.
thejonwithnoh

1
+1 за простое универсальное решение проблемы Linux. Это лучше, чем ответ DogNibbler .
thejonwithnoh

@thejonwithnoh после прочтения вашего комментария я попытался резко закрыть замазку, но сервер все еще работал, возможно, это было связано с настройкой env. Но я решил, что то, о чем спрашивал ОП, это будет самый простой способ добиться этого
Рик Рой

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

@ Нельсон Это убило бы все процессы узла, что если у вас запущено несколько сценариев и вы хотите завершить только один конкретный, я бы посоветовал вам найти этот процесс, а затем прекратить этот конкретный процесс на тот случай, если на рабочем сервере запущено несколько процессов узла и не хочу испытывать желание попасть в кошмар: D
Рик Рой

12

Forever - очень хороший модуль NodeJs, который делает именно это.

Установите forever, введя в командной строке

$ npm install forever -g

Затем используйте следующую команду для запуска сценария node.js

$ forever start /path/to/script.js

Тебе хорошо идти. Дополнительно вы можете запустить

$ forever list

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

$ forever stop [pid]

где [pid]идентификатор процесса скрипта, который вы получите из listкоманды. Чтобы остановить все сценарии, вы можете набрать

$ forever stopall

10

nohup работает, я проверил в AWS Ubunto VM следовать правильномуsyntax

ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &

затем нажмите Enter, вы увидите эту строку

ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to nohup.out

затем введите это

rm nohup.out

введите описание изображения здесь


3
Мне нравится, как вы убрали имя хоста в маленьком приглашении bash, но оставили его в большом заголовке окна 😂
conny

10

Монтаж

$ [sudo] npm install forever -g

Вы можете использовать вечно для запуска сценариев непрерывно

forever start server.js

forever list

для остановки службы

forever stop server.js

9

Вот новое решение, которое я использовал для своих личных проектов:

Поместите это в /etc/init/node_app_daemon.conf:

description "Node.js Daemon"
author      "Adam Eberlin"

stop on shutdown

respawn
respawn limit 3 15

script
  export APP_HOME="/srv/www/MyUserAccount/server"
  cd $APP_HOME
  exec sudo -u user /usr/bin/node server.js
end script

Это также будет обрабатывать ваше приложение в случае сбоя. Он будет отказываться от попыток возродить ваше приложение, если оно завершится 3 или более раз менее чем за 15 секунд.


9

Во время разработки я рекомендую использовать nodemon . Он перезапустит ваш сервер при каждом изменении файла. Как уже отмечали другие, Forever - это вариант, но в производстве все зависит от платформы, которую вы используете. Как правило, вы хотите использовать рекомендованный операционной системой способ обслуживания (например, http://www.freedesktop.org/wiki/Software/systemd/ ).


Это сработало для меня в приложении MEAN.JS - nodemonзапускает команду grunt, если вы не укажете файл JS сервера, поэтому я использую это для запуска mongo и узла навсегда / одновременно
J-Dizzle

8

Я нашел навсегда, чтобы сделать работу прекрасно.

Предполагая, что у вас уже установлен npm, если нет, просто выполните

sudo apt-get install npm

Тогда установите навсегда

npm install forever --global

Теперь вы можете запустить его так

forever start app.js

https://codingweb.io/run-nodejs-application-background/


npm rm -g навсегда за его удаление
DragonFire


5

Другой способ - создать системный блок для вашего приложения. создайте файл «XXX.service» в папке «/ etc / systemd / system», аналогично следующему:

[Unit]
Description=swagger
After=network.target

[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

Преимущество заключается в том, что приложение будет работать как служба, оно автоматически перезапускается в случае сбоя.

Вы также можете использовать sytemctl для управления этим:

systemctl start XXXзапустить службу, systemctl stop XXXостановить ее и systemctl enable XXXавтоматически запустить приложение при загрузке системы.


4

Я надеюсь, что это поможет вам.

В командной строке установите навсегда:

npm install forever -g

Создайте файл примера:

sudo nano server.js 

Вы можете редактировать файл и получать результаты прямо в браузере.
Вы можете использовать filezilla или любой редактор для редактирования файла. Запустите эту команду для запуска файла:

forever start --minUptime 1 --spinSleepTime 1000 -w server.js

введите описание изображения здесь


4

Нет необходимости устанавливать какой-либо другой пакет.

Запустите эту команду

node server.js > stdout.txt 2> stderr.txt &

server.js - это файл вашего сервера, или он может быть api.js

После этого нажмите « Выход », чтобы закрыть терминал.

exit

2

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

обратитесь по этой ссылке - https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-centos-7


1
Там уже есть ответ, рекомендующий PM2. stackoverflow.com/a/40254977/390718
Hopia

0

пакет навсегда работал для меня, только одно, это зависит от deep-equal , поэтому, если у вас возникли проблемы с его установкой, например:

npm -g install forever

Пытаться:

npm -g install forever deep-equal@1.1.1

вместо.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.