J'utilise le module forever de node pour maintenir mon serveur de nœuds en marche. Forever cependant se termine quand il y a un redémarrage du système. Existe-t-il un moyen de démarrer automatiquement le serveur de nœuds (pour toujours) lorsque le système redémarre?
191
Réponses:
Je suggérerais d'utiliser crontab. C'est facile à utiliser.
Comment
Pour commencer l'édition, exécutez ce qui suit en remplaçant "testuser" par l'utilisateur d'exécution souhaité pour le processus de nœud. Si vous choisissez un autre utilisateur que vous, vous devrez l'exécuter avec sudo.
Si vous ne l'avez jamais fait auparavant, il vous demandera avec quel éditeur vous souhaitez éditer. J'aime vim, mais je recommanderai nano pour sa facilité d'utilisation.
Une fois dans l'éditeur, ajoutez la ligne suivante:
Enregistrez le fichier. Vous devriez obtenir des informations indiquant que le cron a été installé.
Pour une confirmation supplémentaire de l'installation du cron, exécutez ce qui suit (en remplaçant à nouveau "testuser" par votre nom d'utilisateur cible) pour lister les crons actuellement installés:
Notez qu'à mon avis, vous devez toujours utiliser des chemins complets lors de l'exécution de binaires dans cron. De plus, si le chemin d'accès à votre script forever n'est pas correct, exécutez
which forever
pour obtenir le chemin complet.Étant donné que les
forever
appelsnode
, vous pouvez également fournir le chemin complet versnode
:Lectures complémentaires
la source
@reboot
cron est exécuté sur le démon cron à partir de. Pour ajouter, je n'ai jamais rencontré de situation qui suggérerait que mes cron qui sont définis sur@reboot
ne fonctionnent pas au démarrage du système. La façon dont vous l'arrêtez n'a pas d'importance pour cela./home
n'est pas encore monté, donc cela ne fonctionnera pas si votre code existe/home
.@reboot varname=value ...
Vous pouvez utiliser forever-service pour ce faire.
Cela mettra à disposition app.js dans l'annuaire actuel en tant que service pour toujours. Le service redémarrera automatiquement à chaque redémarrage du système. Une fois arrêté, il tentera également un arrêt progressif. Ce script provisionne également le script logrotate.
URL Github: https://github.com/zapty/forever-service
REMARQUE: je suis l'auteur de forever-service.
la source
forever-service install test
,test
sera le nom du service , mais pas le nom du fichier .js du programme / nœud à exécuter. Par défaut, il prend le nom du programme estapp.js
, mais vous pouvez la remplacer par le--script
drapeau, comme suit:forever-service install test --script main.js
. (Non testé, veuillez donc me corriger s'il y a un détail de syntaxe incorrect.)Installez PM2 globalement à l'aide de NPM
npm install pm2 -g
Commencez votre script avec pm2
pm2 start app.js
générer un script de démarrage actif
pm2 startup
REMARQUE: le démarrage de pm2 sert à démarrer le PM2 lors du redémarrage du système. PM2 une fois démarré, redémarre tous les processus qu'il gérait avant l'arrêt du système.
Si vous souhaitez désactiver le démarrage automatique, utilisez simplement pm2 unstartup
Si vous souhaitez que le script de démarrage soit exécuté sous un autre utilisateur, utilisez simplement l'
-u <username>
option et le--hp <user_home>:
la source
Ce cas est valable pour Debian.
Ajoutez ce qui suit à
/etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
remplace votre nom d'utilisateur.{{app path}}
remplace le chemin de votre application. Par exemple,/var/www/test/app.js
la source
/etc/rc.local
, pas/etc/init.d/rc.local
app.js
pour vous assurer que les fichiers relatifs sont chargés correctement -process.chdir('/your/path/to/your/app');
Node.js ref docs here/etc/rc.local
fait l'affaire pour moi:( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
Une méthode crontab alternative inspirée de cette réponse et de cet article de blog.
1. Créez un fichier de script bash (remplacez bob par l'utilisateur souhaité).
2. Copiez et collez-le dans le fichier que vous venez de créer.
Assurez-vous d'éditer les chemins ci-dessus en fonction de votre configuration!
3. Assurez-vous que le script bash peut être exécuté.
4. Testez le script bash.
5. Remplacez "bob" par l'utilisateur d'exécution du nœud.
6. Copiez et collez (changez bob à l'utilisateur souhaité).
Enregistrez le crontab.
Vous avez atteint la fin, votre prix est un redémarrage (à tester) :)
la source
Réponse copiée de la question ci- jointe .
Vous pouvez utiliser PM2 , c'est un gestionnaire de processus de production pour les applications Node.js avec un équilibreur de charge intégré.
Installez PM2
Lancer une application
Si vous utilisez express, vous pouvez démarrer votre application comme
Liste de tous les processus en cours:
Il listera 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.
Pour afficher les journaux
la source
$pm2 startup
Après cela, vous verrez pm2 demander d'exécuter manuellement une commande, de la copier et de l'exécuter. Ensuite,$pm2 save
maintenant, votre app.js survivra aux redémarrages du systèmeVous devez créer un script shell dans le dossier /etc/init.d pour cela. C'est un peu compliqué si vous ne l'avez jamais fait, mais il y a beaucoup d'informations sur le Web sur les scripts init.d.
Voici un exemple de script que j'ai créé pour exécuter un site CoffeeScript avec pour toujours:
Je devais m'assurer que le dossier et les PATH étaient explicitement définis ou disponibles pour l'utilisateur root car les scripts init.d sont exécutés en tant que root.
la source
Utilisez le PM2
Quelle est la meilleure option pour exécuter le serveur de production du serveur
Quels sont les avantages d'exécuter votre application de cette façon?
PM2 redémarrera automatiquement votre application si elle plante.
PM2 gardera un journal de vos exceptions non gérées - dans ce cas, dans un fichier à /home/safeuser/.pm2/logs/app-err.log.
Avec une seule commande, PM2 peut garantir que toutes les applications qu'il gère redémarrent lorsque le serveur redémarre. Fondamentalement, votre application de nœud démarrera en tant que service.
réf: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
la source
Forever n'a pas été conçu pour que les applications de nœud s'exécutent en tant que services. La bonne approche consiste soit à créer une entrée / etc / inittab (anciens systèmes Linux) soit à créer une entrée (systèmes Linux plus récents).
Voici une documentation sur la façon de configurer cela comme un parvenu: https://github.com/cvee/node-upstart
la source
crontab
ne fonctionne pas pour moi sur CentOS x86 6.5. @reboot semble ne pas fonctionner.Enfin, j'ai eu cette solution:
Éditer:
/etc/rc.local
Ajoutez cette ligne à la fin du fichier. Changez
USER_NAME
etPATH_TO_PROJECT
faites votre propre.NODE_ENV=production
signifie que l'application s'exécute en mode production. Vous pouvez ajouter plus de lignes si vous devez exécuter plusieurs applications node.js.Ne définissez pas
NODE_ENV
dans une ligne distincte, votre application fonctionnera toujours en mode de développement, car pour toujours ne pas obtenirNODE_ENV
.Enregistrez et quittez vi (appuyez sur
ESC : w q return
). Vous pouvez essayer de redémarrer votre serveur. Après le redémarrage de votre serveur, votre application node.js devrait s'exécuter automatiquement, même si vous ne vous connectez à aucun compte à distance via ssh.Vous feriez mieux de définir l'
NODE_ENV
environnement dans votre shell.NODE_ENV
sera défini automatiquement lorsque votre compte seUSER_NAME
connectera.Ainsi, vous pouvez exécuter des commandes comme pour toujours stop / start
/PATH_TO_PROJECT/app.js
via ssh sans configurer àNODE_ENV
nouveau.la source
J'ai écrit un script qui fait exactement ceci:
https://github.com/chovy/node-startup
Je n'ai pas essayé depuis toujours, mais vous pouvez personnaliser la commande qu'il exécute, donc cela devrait être simple:
la source
Le problème avec rc.local est que les commandes sont accessibles en tant que root, ce qui est différent de la connexion en tant qu'utilisateur et de l'utilisation de sudo.
J'ai résolu ce problème en ajoutant un script .sh avec les commandes de démarrage que je veux etc / profile.d. Tout fichier .sh dans profile.d se chargera automatiquement et toute commande sera traitée comme si vous utilisiez le sudo normal.
Le seul inconvénient est que l'utilisateur spécifié doit se connecter pour que les choses commencent, ce qui dans ma situation a toujours été le cas.
la source
J'ai essayé beaucoup des réponses ci-dessus. Aucun d'eux n'a fonctionné pour moi. Mon application est installée dans
/home
et en tant qu'utilisateur, pas en tant que root. Cela signifie probablement que lorsque les scripts de démarrage mentionnés ci-dessus s'exécutent, ils/home
ne sont pas encore montés, donc l'application n'est pas démarrée.Ensuite, j'ai trouvé ces instructions par Digital Ocean:
https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
Utiliser PM2 comme expliqué était très simple et fonctionne parfaitement: mes serveurs virtuels ont eu deux plantages physiques depuis - le temps d'arrêt n'était que d'environ une minute.
la source
exemple complet de crontab (situé dans / etc / crontab).
la source
Vous pouvez utiliser la commande suivante dans votre shell pour démarrer votre nœud pour toujours:
Vous devez garder à l'esprit que le serveur sur lequel votre application s'exécute doit toujours être activé.
la source