Utilisation de Node.js uniquement par rapport à l'utilisation de Node.js avec Apache / Nginx


224

Dans quels cas doit-on préférer utiliser Node.js uniquement comme serveur dans un déploiement réel?

Quand on ne pas envie d'utiliser Node.js seulement, ce qui joue mieux avec Node.js? Apache ou Nginx?

Réponses:


207

Il y a plusieurs bonnes raisons de coller un autre serveur Web devant Node.js:

  • Ne pas avoir à vous soucier des privilèges / setuid pour le processus Node.js. Seul root peut se lier au port 80 en général. Si vous laissez nginx / Apache s'inquiéter de démarrer en tant que root, de se lier au port 80, puis de renoncer à ses privilèges root, cela signifie que votre application Node n'a pas à s'en soucier.
  • Servant des fichiers statiques comme des images, css, js et html. Le nœud peut être moins efficace que l'utilisation d'un serveur Web de fichiers statiques approprié (le nœud peut également être plus rapide dans certains scénarios, mais il est peu probable que ce soit la norme). En plus des fichiers qui fonctionnent plus efficacement, vous n'aurez pas à vous soucier de gérer les eTags ou les en-têtes de contrôle du cache comme vous le feriez si vous serviez des choses hors de Node. Certains frameworks peuvent gérer cela pour vous, mais vous voudrez en être sûr. Quoi qu'il en soit, toujours probablement plus lent.
  • Comme Matt Sergeant l'a mentionné dans sa réponse, vous pouvez plus facilement afficher des pages d'erreur significatives ou retomber sur un site statique si votre service de nœud se bloque. Sinon, les utilisateurs peuvent simplement obtenir une connexion expirée.
  • L'exécution d'un autre serveur Web devant Node peut aider à atténuer les failles de sécurité et les attaques DoS contre Node. Pour un exemple réel, CVE-2013-4450 est empêché en exécutant quelque chose comme Nginx devant Node .

Je mettrai en garde le deuxième point en disant que vous devriez probablement servir vos fichiers statiques via un CDN ou derrière un serveur de mise en cache comme Varnish. Si vous faites cela, peu importe si l'origine est Node ou Nginx ou Apache.

Attention à nginx en particulier: si vous utilisez des websockets, assurez-vous d'utiliser une version récente de nginx (> = 1.3.13), car il vient juste d'ajouter la prise en charge de la mise à niveau d'une connexion pour utiliser des websockets.


11
express.staticgérera très bien les ETags et les en-têtes de contrôle de cache.
— robertklep


4
pauljz, avez-vous des repères pour sauvegarder plus lentement? les articles soulignés par @pawlakpp semblent dire que Node.js est beaucoup plus rapide sous charge.
— Samuel Neff

3
Il y a une discussion connexe ici: stackoverflow.com/questions/9967887/… avec quelques perspectives supplémentaires. Les benchmarks là-bas (puisque vous avez demandé des benchmarks supplémentaires) montrent node.js / express, même en cluster, sous-performant sensiblement. Mon sentiment est qu'il est préférable de garder le service de fichiers statiques et la gestion des demandes hors de la boucle d'événements du nœud, enregistrez ces cycles pour le travail qui doit se produire dans le nœud. Mais honnêtement, si vous servez des éléments statiques hors de Node, tout ira bien. Ce n'est pas grave.
— pauljz

4
Il convient de noter que si vous utilisez uniquement un nœud directement, vous pouvez toujours vous lier à des ports réservés tels que :80sans exécuter le nœud en tant que root en utilisant simplement authbind: thomashunter.name/blog/using-authbind-with-node-js
— wyqydsyq

70

Juste pour ajouter une raison de plus à la réponse de pauljz, j'utilise un serveur frontal afin qu'il puisse afficher 502 pages d'erreur lorsque je redémarre le serveur principal ou qu'il se bloque pour une raison quelconque. Cela permet à vos utilisateurs de ne jamais obtenir d'erreur sur l'impossibilité d'établir une connexion.


28

Je pense que l'utilisation de Node pour servir des fichiers statiques est très bien dans toutes les circonstances tant que vous savez ce que vous faites . C'est certainement un nouveau paradigme d'utiliser le serveur d'applications pour servir des fichiers statiques car de nombreuses technologies concurrentes (PHP, Ruby, Python, etc.) nécessitent un serveur Web comme HTTPD ou Nginx devant le ou les serveurs d'applications. .

Chaque raison objective que j'ai jamais lue contre la diffusion de fichiers statiques avec Node tourne autour de l'idée d'utiliser ce que vous connaissez le mieux ou d'utiliser ce qui est perçu comme étant mieux testé / plus stable. Ce sont des raisons très valables sur le plan pratique, mais qui ont peu de pertinence purement technique.

À moins que vous ne trouviez une fonctionnalité possible avec un serveur Web classique qui n'est pas possible avec Node (et je doute que vous le fassiez), choisissez ce que vous connaissez le mieux ou ce que vous préférez travailler avec l'une ou l'autre approche.

Quant à Nginx vs Apache - ils "joueront" avec Node de la même manière. Vous devez les comparer sans tenir compte de Node.


2
Bonne perspective sur les comparaisons techniques en général: "Chaque raison objective que j'ai jamais lue contre la diffusion de fichiers statiques avec Node tourne autour de l'idée d'utiliser ce que vous connaissez le mieux ou d'utiliser ce qui est perçu comme étant mieux testé / plus stable. Ce sont des raisons très valables pratiquement, mais ont peu de pertinence purement technique. " Trop de comparaisons de nos jours sont biaisées et basées sur le bagage d'expérience et de confort sur des technologies inférieures mais éprouvées.
— Sunny

Oui, mais ce sont vraiment des raisons / subjectives. Un excellent exemple d'une raison objective serait un point de référence - dont la plupart indiquent nginx> nodejs (bien que je devrais vraiment faire le mien ...)
— Nick

@ Nick Tu as tout à fait raison. Et il y en a quelques-uns bien que je ne sois pas un expert en benchmarking scientifique, donc je vais laisser les gens le chercher sur le Web. Ce que je dirai cependant, c'est que je pense qu'il y a un avantage à la simplicité d'utilisation d'un serveur au lieu de deux. Il y a juste moins de risques que quelque chose se passe mal. D'autre part, Nginx a généralement un package sur tous les systèmes Unix avec une bonne configuration alors avec nœud dont vous avez besoin de savoir l' intégration avec systemd, pm2etc. Donc , il y a des points positifs et négatifs et l'utilisateur doivent choisir leur poison, pour ainsi dire .

Je pensais que c'était le contraire - le nœud ferait mieux sous charge (peut-être pas en vitesse déchargée pure) car il n'a pas à transférer un processus servant un fichier par demande, mais peut plutôt pousser des données lorsque le disque local ou les clients distants sont prêts sur le même thread que tous les autres milliers de clients. Bien sûr, cela tombe en panne lorsque vous avez plusieurs processeurs .. À moins que le nœud ne sache comment les utiliser maintenant. Ou les serveurs Web peuvent utiliser le multitâche coopératif pour mettre en ligne des pages statiques maintenant.
— Gerard ONeill

1

Un extra: Il est également important si vous avez besoin d'un proxy inverse, par exemple pour exécuter un serveur Websocket sur le même port, ou peut-être mélanger certaines technologies (répondez avec NodeJS certaines demandes et avec PHP d'autres ou autre)

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.