web-dev-qa-db-fra.com

Comment exécuter une application Node.js en tant que processus propre?

Quel est le meilleur moyen de déployer Node.js?

J'ai un VPS Dreamhost (c'est ce qu'ils appellent un VM ), et j'ai pu installer Node.js et configurer un proxy. Cela fonctionne très bien tant que je garde la connexion SSH avec laquelle j'ai démarré le noeud avec open.

192
respectTheCode

2016 answer : presque toutes les distributions Linux sont livrées avec systemd, ce qui signifie pour toujours, monit, PM2, etc. ne sont pas plus nécessaire - votre système d'exploitation gère déjà ces tâches .

Créez un fichier myapp.service (En remplaçant évidemment "myapp" par le nom de votre application):

[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

Notez si vous êtes nouveau sur Unix: /var/www/myapp/app.js Devrait avoir #!/usr/bin/env node Sur la toute première ligne.

Copiez votre fichier de service dans le dossier /etc/systemd/system.

Parlez à Systemd du nouveau service avec systemctl daemon-reload.

Commencez avec systemctl start myapp.

Activez-le au démarrage avec systemctl enable myapp.

Voir les journaux avec journalctl -u myapp

Cela provient de Comment nous déployons les applications de nœud sur Linux, édition 2018, qui inclut également des commandes permettant de générer un AWS/DigitalOcean./Azure CloudConfig pour créer des serveurs Linux/nœud (y compris le fichier .service).

100
mikemaccana

Utilisez Forever . Il exécute les programmes Node.js dans des processus distincts et les redémarre le cas échéant.

Usage:

  • forever start example.js pour démarrer un processus.
  • forever list pour voir la liste de tous les processus lancés depuis toujours
  • forever stop example.js pour arrêter le processus, ou forever stop 0 pour arrêter le processus avec l'index 0 (comme indiqué par forever list).
100
David Tang

J'ai écrit à propos de ma méthode de déploiement ici: Déploiement d'applications node.js

En bref:

  • Utiliser le crochet post-réception git
  • Jake pour l'outil de construction
  • Upstart en tant que wrapper de service pour le noeud
  • Surveillez et redémarrez les applications si elles tombent en panne
  • nginx pour router les requêtes vers différentes applications sur le même serveur
41
Ben

pm2 fait les astuces.

Les fonctions sont les suivantes: surveillance, rechargement de code à chaud, équilibreur de charge intégré, script de démarrage automatique et processus de résurrection/dump.

16
nickleefly

Vous pouvez utiliser monit, forever, upstart ou systemd pour démarrer votre serveur.

Vous pouvez utiliser Varnish ou HAProxy à la place de Nginx (il est connu que Nginx ne fonctionne pas avec les websockets).

Comme solution rapide et sale, vous pouvez utiliser Nohup node your_app.js & pour éviter que votre application ne se termine avec votre serveur, mais forever, monit et les autres solutions proposées sont préférables.

9
nponeccop

J'ai créé un script Upstart actuellement utilisé pour mes applications:

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

Personnalisez tout avant ##########, créez un fichier dans /etc/init/your-service.conf et collez-le à cet endroit.

Ensuite vous pouvez:

start your-service
stop your-service
restart your-service
status your-service
7
Capy

J'ai écrit un guide assez complet sur le déploiement de Node.js, avec des fichiers d'exemple:

Tutoriel: Comment déployer des applications Node.js, avec exemples

Il couvre des choses comme http-proxy, SSL et Socket.IO .

6
Rich Jones

Si vous avez un accès root, vous feriez mieux de configurer un démon pour qu'il soit sain et sauf en arrière-plan. Vous pouvez lire comment faire cela pour Debian et bunt dans un article de blog Exécuter Node.js en tant que service sur Ubunt.

5
Seldaek

Voici un article plus long sur la résolution de ce problème avec systemd: http://savanne.be/articles/deploying-node-js-with-systemd/

Quelques points à garder à l'esprit:

  • Qui va commencer votre surveillance de processus? Forever est un excellent outil, mais il lui faut un outil de surveillance pour continuer à fonctionner. C'est un peu bête, pourquoi ne pas simplement utiliser votre système d'initialisation?
  • Pouvez-vous surveiller correctement vos processus?
  • Avez-vous plusieurs backends? Si tel est le cas, avez-vous des dispositions en place pour empêcher l’un d’eux de faire tomber les autres en termes d’utilisation des ressources?
  • Le service sera-t-il nécessaire tout le temps? Sinon, envisagez l'activation du socket (voir l'article).

Toutes ces choses se font facilement avec systemd.

5
Ruben Vermeersch

Forever fera l'affaire.

@ Kevin: Vous devriez être capable de tuer les processus bien. Je revérifierais un peu la documentation. Si vous parvenez à reproduire l'erreur, nous vous conseillons de la publier comme un problème sur GitHub.

3
Marak

Comme Box9 l'a dit, Forever est un bon choix pour le code de production. Mais il est également possible de garder un processus en marche même si la connexion SSH est fermée à partir du client.

Bien que cela ne soit pas forcément une bonne idée pour la production, cela est très pratique lorsque vous êtes au milieu de longues sessions de débogage, ou que vous suivez la sortie de la console sur de longs processus, ou qu’il est utile de déconnecter votre connexion SSH, tout en maintenant le terminal actif sur le serveur. pour vous reconnecter plus tard (par exemple, démarrez l'application Node.js à la maison et reconnectez-vous à la console plus tard au travail pour vérifier comment les choses se passent).

En supposant que votre serveur est une boîte * nix, vous pouvez utiliser la commande screen de l'environnement de ligne de commande Shell pour que le processus reste actif même si le client SSH est fermé. Vous pouvez télécharger/installer l’écran à partir du Web s’il n’est pas déjà installé (recherchez un paquet pour votre distribution sous Linux, ou utilisez MacPorts sous OS X).

Cela fonctionne comme suit:

  1. Lorsque vous ouvrez la connexion SSH pour la première fois, tapez 'screen' - ceci démarrera votre session screen.
  2. Commencez à travailler normalement (c.-à-d. Démarrez votre application Node.js)
  3. Lorsque vous avez terminé, fermez votre terminal. Vos processus de serveur continueront à s'exécuter.
  4. Pour vous reconnecter à votre console, ssh est de retour sur le serveur, connectez-vous et entrez "screen -r" pour vous reconnecter. Votre ancien contexte de console réapparaîtra pour que vous puissiez continuer à l'utiliser.
  5. Pour quitter l'écran, une fois connecté au serveur, tapez 'exit' sur l'invite de la console - cela vous déposera sur le shell standard.

Si vous avez besoin de plusieurs sessions d'écran simultanées, vous pouvez vous connecter à n'importe quelle session à partir de n'importe quel client. Lisez la documentation en ligne pour toutes les options.

2
cjcela

Essayez ceci: http://www.technology-ebay.de/the-teams/mobile-de/blog/deploying-node-applications-with-capistrano-github-nginx-and-upstart.html =

Un guide complet et détaillé pour le déploiement d'applications Node.js avec Capistrano, Upstart et Nginx

2
Pono

https://paastor.com est un service relativement nouveau qui effectue le déploiement pour vous, sur un VPS ou un autre serveur. Il y a une CLI pour pousser le code. Paastor a un niveau gratuit, du moins il l’a fait au moment de l’afficher.

1
ruffrey

Essayez node-deploy-server . C'est un ensemble d'outils complexes pour déployer une application sur vos serveurs privés. Il est écrit dans Node.js et utilise npm pour l’installation.

1
AndyGrom

Forever est une bonne option pour garder les applications en marche (et c'est npm installable en tant que module agréable).

Mais pour un "déploiement" plus sérieux, comme la gestion à distance du déploiement, le redémarrage, l'exécution de commandes, etc., j'utiliserais capistrano avec l'extension de noeud.

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

1
martyman

Dans votre cas, vous pouvez utiliser le démon pstart . Pour une solution de déploiement complète, je peux suggérer capistrano . Deux guides utiles sont Comment configurer Node.js env et Comment déployer via capistrano + upstart.

1
Anatoliy