web-dev-qa-db-fra.com

Déploiement d'un serveur de production Node.js

J'ai écrit une application Node.js, je cherche à la faire fonctionner sur l'une de nos machines de production. Cela semble être une demande assez commune mais je ne trouve pas de solution adéquate. N'existe-t-il pas de solutions éprouvées pour le déploiement d'applications de production Node.js?

L'application est simple (<100 LOC), mais doit être très efficace, fiable et peut fonctionner en continu pendant des années sans redémarrer. Il sera exécuté sur un grand site, avec des dizaines de connexions/seconde. (l'application n'est pas utilisée comme serveur Web, elle ne dispose que d'une API JSON)

Voici les approches que j'ai envisagées mais dont je ne suis toujours pas sûr:

tilisation d'un framework (ex. Express)

Parce que l'application doit être très simple et performante, je souhaite éviter d'ajouter des ballonnements sous forme de framework.

Démarrage du serveur avec Nohup

Le problème principal ici concerne la gestion des exceptions. Nous ne souhaitons évidemment pas que le serveur entier tombe en panne à cause d'une exception. D'après ce que j'ai compris, emballer l'intégralité de l'application dans une boucle try {} catch {} Ne vous aidera pas, car l'interpréteur Javascript reste dans un état imprévisible après une exception. Est-ce exact?

tiliser quelque chose comme Forever

J'ai installé Forever dans une de nos machines FreeBSD et c'était très bogué. Cela a fini par engendrer d'innombrables processus qui ne pourraient pas être éliminés de Forever. J'ai dû exécuter kill -9 Pour récupérer ma machine et je ne me sens pas trop confiant pour exécuter une application de production sur Forever. Il semble également que Upstart (outil similaire, mais plus générique) ne fonctionne pas sur FreeBSD.

Solutions hébergées (par exemple Heroku, Rackspace, Amazon EC2, etc.)

C'est probablement la solution la plus simple, mais nous avons déjà le matériel sérieux pour le reste de nos serveurs Web. Pour des raisons financières, cela n’a aucun sens.

Il doit sûrement y avoir une solution établie à cela? Est-ce que je manque quelque chose?

75
David Chouinard
  • Vous devriez vraiment vraiment utiliser un framework (je recommande quelque chose comme Express car il a été testé au combat) sauf si vous voulez gérer vous-même des sessions, des cookies, des middlewares, etc. Express est vraiment léger.
  • Démarrer le serveur avec Nohup: ne le faites pas, lancez-le simplement avec la commande "node" habituelle. De plus, Express encapsule les itinéraires dans un try-catch, afin que votre serveur ne tombe pas en panne dans un itinéraire. Cependant, si votre serveur a un problème sérieux, vous ne devriez pas craindre de le redémarrer (de plus, si vous avez au moins 2-3 processus, un seul mourra, il en restera au moins un et l'utilisateur aura gagné. t sentir une chose).
  • Pour la surveillance, je préfère personnellement quelque chose de plus au niveau du système d'exploitation, tel que pstart et Monit .
  • Solution d'hébergement: puisque vous avez déjà votre propre matériel sérieux, inutile d'investir de l'argent dans autre chose. Utilisez simplement un équilibreur de charge (peut-être nginx ou node-http-proxy) pour créer des proxy.
40
alessioalex

Voir Hébergement Node Apps .

Ce didacticiel vous explique comment configurer un serveur pouvant héberger des applications node.js pour les applications JavaScript côté serveur. Pour le moment, les options d'hébergement de node.js se résument à l'exécution de processus de démon de nœud qui communiquent avec un serveur Web. La plupart des serveurs Web peuvent utiliser des connexions proxy sur un autre port. Vous pourrez donc utiliser Apache ou nginx à cette fin.

15
helpermethod

Il y a trois questions ici, je pense.

Question 0: "Devrais-je utiliser un framework pour mon application de nœud?"

Question 1: "Comment exécuter des serveurs de nœuds sur des machines de production?"

Question 2: "Comment déployer des applications de nœud en production".

Pour Question 1 , j'aime beaucoup Cluster (bien que le dernier Node version ait quelque chose Vous pouvez vérifier cela avec Monit/Upstart pour surveiller les événements au niveau du système d’exploitation et s’assurer que vos serveurs sont en bon état de santé. (Cela surveillait N clusters de === Ruby Thin serveurs, mais même chose).

En fonction du trafic, vous pouvez exécuter le cluster sur plusieurs ordinateurs, puis placer un équilibreur de charge devant celui-ci. Cela dépend de votre trafic, du temps nécessaire à l'exécution des requêtes/du temps pendant lequel vous bloquez la boucle d'événements et du nombre de processeurs/instances de nœuds que vous lancez par machine.

Une infrastructure vous permet de mieux gérer les erreurs et détecte les erreurs qui pourraient quitter les applications normales de node.js. Si vous le faites sans framework, assurez-vous de lire le traitement des erreurs dans node.js.

Pour Question 2 , je ne pense pas que la communauté de nœuds dispose d'un bon standard de déploiement. Vous pouvez essayer d’utiliser l’outil Capistrano de Ruby (et voici ne entrée de blog expliquant le déploiement d’un cluster avec Capinstrano ).

La mauvaise chose à propos de Capistrano est qu’elle suppose certaines hypothèses qui pourraient ne pas être vraies (c’est-à-dire que vous déployez un projet Rails)], de sorte que vous risquez de vous disputer beaucoup avec le framework.

Ma solution de déploiement goto en général est l'outil Fabric de Python, qui vous fournit des outils de déploiement et vous permet de faire ce que vous devez faire.

Une autre option de déploiement est "le nuage", avec des choses comme Nodester : laissez-les s'en charger.

5
RyanWilcox

Essayez d'utiliser pm2 car il s'agit d'une interface de ligne de commande simple et intuitive, installable via NPM. Il suffit de démarrer votre application avec PM2 et votre application est prête à gérer une tonne de trafic.

Lien officiel PM2

Comment configurer une application de noeud js pour la production à l'aide de pm2

5
Sunil Hirole

Vous obtiendrez peut-être de meilleures réponses sur ServerFault, mais il existe une description de expérience d'un utilisateur ici en utilisant supervisord . Vous devrez utiliser une sorte d'observateur de processus pour conserver le processus node, et une autre recommandation courante semble consister à inverser les connexions au processus node. Je voterais probablement pour nginx (de cette façon, vous pourrez laisser nginx gérer la journalisation, l'authentification ou toute autre fonctionnalité HTTP de niveau supérieur dont vous avez besoin, au lieu de les intégrer au noeud), mais l'article précité mentionne haproxy dans les commentaires ici et là, qui sont peut-être plus légers. Votre choix de proxy inverse dépendra probablement en grande partie de votre besoin de support WebSocket.

Je ne suis pas sûr qu'il existe encore un flux de travail "standard" pour le noeud; ce n'est pas aussi mature que quelque chose comme Rails) qui a une multitude de façons de garder une application web en marche.

2
Wyatt Anderson

Les gars de Cloudkick ont ​​écrit une excellente solution à cela. Cela s'appelle Cast, http://cast-project.org/ .

Installez cast sur votre serveur et sur votre poste de travail. Vous démarrez l'agent de distribution sur le serveur et votre poste de travail signe avec l'instance de distribution des serveurs. Vous pouvez ensuite créer des "ensembles", les télécharger sur le serveur, créer/mettre à niveau/détruire à partir d’eux ainsi que démarrer/arrêter vos instances. Cast lancera automatiquement vos services quand ils plantent. Vous pouvez également personnaliser le stdout/strerr à distance, obtenir une liste des instances en cours d'exécution et des PID # et gérer vos instances/serveurs à partir de votre poste de travail (aucun SSHing requis). Les documents sont légèrement obsolètes, mais les résultats valent le peu de travail supplémentaire. Toutes les interactions/commandes se font via HTTPS et une API RESTful.

Avant cela, je faisais toutes les mises à jour à la main avec SCP/SSH. Nous avons supervise garder les choses. Nous n'avons pas regardé en arrière.

0
Ryan Olds