Comment faire fonctionner une application node.js en permanence?


259

Sur un serveur Debian, j'ai installé Node.js. Je comprends comment lancer une application à partir de putty avec cette ligne de commande:

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

et y accéder sur l'adresse 50.51.52.53:8080(IP et port).

Mais dès que je ferme le mastic, je ne peux plus atteindre l'adresse 50.51.52.53:8080.

Comment faire fonctionner une application Node.js en permanence?

Comme vous pouvez le deviner, je suis un débutant avec Linux et Node.js.


7
Notez que pm2 est une bonne alternative à Forever , si vous ne souhaitez pas utiliser Forever pour une raison quelconque.
Kevin B

merci @KevinB github.com/Unitech/pm2 est vraiment une bonne alternative
Sachin Chavan

Réponses:


221

Bien que les autres réponses résolvent le problème du PO, elles sont toutes excessives et n'expliquent pas pourquoi il ou elle rencontre ce problème.

La clé est cette ligne, "je ferme le mastic, alors je ne peux pas atteindre l'adresse"

Lorsque vous êtes connecté à votre hôte distant sur Putty, vous avez démarré un processus Linux SSH et toutes les commandes saisies à partir de cette session SSH seront exécutées en tant qu'enfants dudit processus.

Votre problème est que lorsque vous fermez Putty, vous quittez la session SSH qui tue ce processus et tous les processus enfants actifs. Lorsque vous fermez du mastic, vous tuez par inadvertance votre serveur car vous l'avez exécuté au premier plan . Pour éviter ce comportement, exécutez le serveur en arrière - plan en ajoutant & à votre commande:

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

Le problème ici est un manque de connaissances Linux et non une question sur le nœud. Pour plus d'informations, consultez: http://linuxconfig.org/understanding-foreground-and-background-linux-processes

METTRE À JOUR:

Comme d'autres l'ont mentionné, le serveur de nœud peut toujours mourir à la sortie du terminal. Un piège commun que j'ai rencontré est que même si le processus de nœud s'exécute en bg, c'est stdout et stderr est toujours pointé vers le terminal. Cela signifie que si le serveur de noeud écrit dans console.log ou console.error, il recevra une erreur de canal cassé et un plantage. Cela peut être évité en canalisant la sortie de votre processus:

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

Si le problème persiste, vous devriez examiner des choses comme tmux ou nohup , qui sont toujours plus robustes que les solutions spécifiques aux nœuds, car elles peuvent être utilisées pour exécuter tous les types de processus (bases de données, services de journalisation, autres langues).

Une erreur courante qui pourrait entraîner la nohup node your_path/server.js &fermeture du serveur est qu'après avoir exécuté le, vous fermez simplement le terminal Putty par un simple clic. Vous devez utiliser la exitcommande à la place, votre serveur de noeud sera alors opérationnel.


7
Si vous fermez toujours la session Putty pendant que vous effectuez &le service, il se ferme cependant. (Vient d'être testé sur Debian Jesse)
NiCk Newman

1
Comme l'a dit @NiCkNewman, cette réponse est incomplète! Voir la réponse de Rick Roy pour la bonne solution.
thejonwithnoh

19
Le "&" fait que le processus s'exécute en arrière-plan, mais vous devrez en fait ajouter "nohup" au début de cette commande pour le détacher de la fenêtre de la console afin que l'application ne s'arrête pas lorsque la fenêtre se met en veille après quelques instants. heures, en modifiant la commande mentionnée précédemment en:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge

2
AIX powersystem, a nohup node myApp.js &exécuté l'application dans le bg mais elle meurt lorsque le terme a été fermé. Je ne sais pas pourquoi.
AnBisw

4
@Annjawn, vous devez utiliser la exitcommande pour quitter le terminal.
Ionut Necula

342

Vous pouvez installer pour toujours en utilisant npm comme ceci:

sudo npm install -g forever

Et puis démarrez votre candidature avec:

forever server.js

Ou en tant que service:

forever start server.js

Forever redémarre votre application lorsqu'elle se bloque ou s'arrête pour une raison quelconque. Pour limiter les redémarrages à 5, vous pouvez utiliser:

forever -m5 server.js

Pour répertorier tous les processus en cours d'exécution:

forever list

Notez l'entier entre crochets et utilisez-le comme suit pour arrêter un processus:

forever stop 0

Le redémarrage d'un processus en cours se déroule comme suit:

forever restart 0

Si vous travaillez sur votre fichier d'application, vous pouvez utiliser le -wparamètre pour redémarrer automatiquement chaque fois que votre server.jsfichier change:

forever -w server.js

11
@MarthaJames si sa fermeture lorsque votre session / fenêtre ssh se ferme, alors vous avez probablement oublié d'inclure "start" dans leforever start <file>
Kristian

8
Quelle est la différence entre utiliser forever server.jset forever start server.js? Je sais que c'est dit "en tant que service" mais qu'est-ce que cela signifie?
Marquizzo

5
Lorsque je tape forever server.js, il démarre le serveur. Si j'appuie sur Ctrl+ C, il arrête alors le service. Si je tape forever start server.jsalors il démarre le service et même si j'appuie sur Ctrl+ Cil reste ouvert. Vous pouvez ensuite exécuter les autres commandes référencées ci-dessus pour arrêter / consulter la liste. C'est du moins ce que j'ai vécu.
Termato

6
Cela démarre-t-il le script après un redémarrage du serveur?
beingalex

1
Le forevermodule (v0.15.3) est vulnérable aux attaques par déni de service par expression régulière et ne doit pas être utilisé: github.com/foreverjs/forever/issues/960
Benny Neugebauer

82

Vous pouvez utiliser PM2 , c'est un gestionnaire de processus de production pour les applications Node.js avec un équilibreur de charge intégré.

Installer PM2

$ npm install pm2 -g

Lancer une application

$ pm2 start app.js

Si vous utilisez express, vous pouvez démarrer votre application comme

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

Liste de tous les processus en cours d'exécution:

$ pm2 list

Il répertorie tous les processus. Vous pouvez ensuite arrêter / redémarrer votre service en utilisant l'ID ou le nom de l'application avec la commande suivante.

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

Pour afficher les journaux

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

1
Dieu te bénisse! Ça marche!! Forever et Nohup ne fonctionnent pas sur le serveur bitnami nodejs d'Amazon Web Service ( docs.bitnami.com/aws/infrastructure/nodejs ). PM2 fonctionne très bien!
polras

Cette bibliothèque semble avoir le plus grand nombre de démarrages sur github
DragonFire

41

Je recommande de rechercher quelque chose comme Forever pour redémarrer Node en cas de plantage, et de gérer la démonétisation pour vous.


Je voudrais souligner que sans nohup, node quittera lorsque vous quitterez la session ssh si vous l'exécutez de cette façon (sauf si vous utilisez quelque chose comme screen pour tmux).
Haozhun

1
@Haozhun, intéressant, mais ce n'est pas ainsi que cela a fonctionné pour moi sur mes machines. Lorsque je ssh dedans et démarre quelque chose à l'aide de cette commande, elle s'exécute indéfiniment en arrière-plan, même après la fermeture de la session SSH.
Brad

@Brad Veuillez voir la 2e réponse sur stackoverflow.com/questions/4018154/… . Il semble que certaines personnes soient d'accord avec le premier commentaire de cette question qui l'explique nohup. Ce serait formidable si nous pouvions résoudre cette confusion. Mais je ne sais pas par où commencer.
Haozhun

4
Pour la plupart des Unixen (y compris la plupart des distributions de Linux), l'exécution de choses en arrière-plan tuera toujours le processus si vous fermez la fenêtre du terminal. Pour éviter cela, exécutez-le avec nohup. Exemple:nohup node app.js &
slebetman

1
J'utilise Forever avec un environnement de production Linux. J'utilise généralement la commande forever start --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

Si vous souhaitez toujours exécuter votre application de nœud dans le terminal, utilisez simplement screen.

Installez sur ubuntu / debian:

sudo apt-get install screen

Usage:

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

ctrl + apuis ctrl + dde rejeter

Pour revenir est de retour:

Un écran: screen -r

S'il y en a plusieurs, vous pouvez lister tous les écrans avec: screen -ls

Puis: screen -r pid_number


1
C'est une bonne option car elle me permet également de basculer le processus au premier plan à tout moment
aexl

26

Vous pouvez simplement utiliser ceci

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

Cela gardera l'application en cours d'exécution et pour la fermer, vous devrez la tuer.

Pour cela, vous pouvez installer htopet rechercher un nœud, puis le tuer


18
Il est important de noter que dans ce cas, l'utilisateur devra quitter correctement la session PuTTY (c'est-à-dire via la exitcommande). Si l'utilisateur ferme simplement la fenêtre, cela peut utiliser un signal autre que SIGHUPpour mettre fin au processus, et donc le nœud s'arrêterait de toute façon.
thejonwithnoh

1
+1 pour être une simple solution Linux polyvalente au problème. C'est mieux que la réponse de DogNibbler .
thejonwithnoh

@thejonwithnoh après avoir lu votre commentaire, j'ai essayé de fermer le mastic brusquement mais le serveur fonctionnait toujours, peut-être que cela avait à voir avec la configuration de l'env. Mais j'ai pensé que ce que le PO demandait, ce serait le moyen le plus simple d'y parvenir
Rick Roy

J'aime cette approche simple, c'est celle que j'utilise, car pour la tuer, la plus simple est juste une killall node, qui tuera tous les processus de nœuds, dans mon cas un seul.
Nelson

@Nelson Cela tuerait tous les processus de nœuds et si vous avez plusieurs scripts en cours d'exécution et que vous souhaitez en terminer un seul, je vous suggère de trouver le processus, puis de terminer celui-ci au cas où vous auriez plusieurs processus de nœuds en cours d'exécution sur un serveur de production et ne veux pas avoir envie de faire un cauchemar: D
Rick Roy

12

Forever est un très bon module NodeJs pour faire exactement cela.

Installez foreveren tapant dans la ligne de commande

$ npm install forever -g

Utilisez ensuite la commande suivante pour exécuter un script node.js

$ forever start /path/to/script.js

Tu es prêt. De plus, vous pouvez exécuter

$ forever list

pour voir tous les scripts en cours d'exécution. Vous pouvez terminer tout script spécifique en tapant

$ forever stop [pid]

[pid]est l'ID de processus du script que vous obtiendrez à partir de la listcommande. Pour arrêter tous les scripts, vous pouvez taper

$ forever stopall

10

nohup travaillant j'ai vérifié dans AWS Ubunto vm suivre le bonsyntax

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

puis appuyez sur entrée, vous verrez cette ligne

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

puis tapez ceci

rm nohup.out

entrez la description de l'image ici


3
J'aime la façon dont vous avez supprimé le nom d'hôte dans la petite invite bash, mais l'avez laissé dans le grand titre de la fenêtre conn
conny

10

Installation

$ [sudo] npm install forever -g

Vous pouvez utiliser éternellement pour exécuter des scripts en continu

forever start server.js

forever list

pour arrêter le service

forever stop server.js

9

Voici une solution novatrice que j'utilise pour mes projets personnels:

Placez-le dans /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

Cela gérera également la réapparition de votre application en cas de panne. Il abandonnera les tentatives de réapparition de votre application si elle se bloque 3 fois ou plus en moins de 15 secondes.


9

Pendant le développement, je recommande d'utiliser nodemon . Il redémarrera votre serveur chaque fois qu'un fichier change. Comme d'autres l'ont souligné, Forever est une option mais en production, tout dépend de la plateforme que vous utilisez. Vous souhaiterez généralement utiliser la méthode recommandée par le système d'exploitation pour maintenir les services à jour (par exemple http://www.freedesktop.org/wiki/Software/systemd/ ).


Cela a fonctionné pour moi sur une application MEAN.JS - nodemonexécute la commande grunt sauf si vous spécifiez un fichier JS de serveur, donc je l'utilise pour exécuter mongo et node pour toujours / simultanément
J-Dizzle

8

J'ai trouvé pour toujours faire le travail parfaitement bien.

En supposant que vous avez déjà installé npm, sinon, faites-le

sudo apt-get install npm

Puis installez pour toujours

npm install forever --global

Maintenant, vous pouvez l'exécuter comme ceci

forever start app.js

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


npm rm -g forever pour le supprimer
DragonFire

6

Première installation de pm2 dans le monde

npm install -g pm2

Puis commencez

pm2 start bin/www 

5

Une autre façon consiste à créer une unité système pour votre application. créez un fichier "XXX.service" dans le dossier "/ etc / systemd / system", similaire à ceci:

[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

Un avantage est que l'application fonctionnera en tant que service, elle redémarre automatiquement en cas de panne.

Vous pouvez également utiliser sytemctl pour le gérer:

systemctl start XXXpour démarrer le service, systemctl stop XXXpour l'arrêter et systemctl enable XXXpour démarrer automatiquement l'application au démarrage du système.


4

J'espère que cela t'aidera.

Sur la ligne de commande, installez pour toujours:

npm install forever -g

Créez un exemple de fichier:

sudo nano server.js 

Vous pouvez modifier le fichier et obtenir des résultats directement dans votre navigateur.
Vous pouvez utiliser filezilla ou n'importe quel éditeur pour modifier le fichier. Exécutez cette commande pour exécuter le fichier:

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

entrez la description de l'image ici


4

Pas besoin d'installer un autre package.

Exécutez cette commande

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

server.js est votre fichier serveur ou il peut être api.js

Après cela, cliquez sur " Quitter " pour fermer le terminal

exit


0

Forever Package a fonctionné pour moi, juste une chose, cela dépend de deep-equal , donc si vous avez eu un problème avec son installation comme:

npm -g install forever

Essayer:

npm -g install forever deep-equal@1.1.1

au lieu.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.