node.js lui-même ou frontend nginx pour servir des fichiers statiques?

90

Existe-t-il un point de repère ou une comparaison plus rapide: placez nginx devant le nœud et laissez-le servir directement les fichiers statiques ou utilisez uniquement le nœud et diffusez les fichiers statiques en l'utilisant?

La solution nginx semble être plus gérable pour moi, des pensées?

artvolk
la source
3
Je dirais que cela dépend également de la quantité de configuration et de code que vous devez écrire pour utiliser un serveur par rapport à l'autre. Si vous ne prévoyez pas de passer en IPO et que votre serveur d'applications est déjà configuré et fait tout ce dont vous avez besoin, vous pouvez simplement vous en tenir jusqu'à ce que ce ne soit pas suffisant.
m33lky

Réponses:

118

Je vais devoir être en désaccord avec les réponses ici. Alors que Node fonctionnera bien, nginx sera certainement plus rapide lorsqu'il est configuré correctement. nginx est implémenté efficacement en C suivant un modèle similaire (retour à une connexion uniquement lorsque cela est nécessaire) avec une petite empreinte mémoire. De plus, il prend en charge la sendfile syscall pour servir ces fichiers qui est aussi vite que vous pouvez éventuellement obtenir au service de fichiers, car il est le noyau du système d'exploitation lui - même qui est de faire le travail.

Désormais, nginx est devenu le standard de facto en tant que serveur frontal. Vous pouvez l'utiliser pour ses performances dans la diffusion de fichiers statiques, gzip, SSL et même l'équilibrage de charge plus tard.

PS: Cela suppose que les fichiers sont vraiment "statiques" comme au repos sur le disque au moment de la requête.

m33lky
la source
7
Juste une petite note: node.js prend également en charge sendfile- mais il semble que vous deviez écrire du code, voir par exemple. blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo
En dehors de la diffusion de contenu statique, pourquoi les performances de Nginx sont-elles meilleures que la simple exposition du serveur Web principal (Tomcat / Jetty / IIS, etc.) sur le domaine public?
raffian
1
Si une demande est faite à votre application, cette demande ne sera pas faite comme par magie plus rapide en la routant d'abord via nginx (elle peut être sensiblement plus rapide dans le meilleur des cas lorsque nginx gère les CSS statiques et js, gzip et SSL). Cependant, nginx est également l'un des meilleurs équilibreurs de charge logiciels, ce qui peut être critique car la plupart des serveurs sont connus pour se retourner à des charges modérément élevées.
m33lky
Mais vous pouvez serveur les fichiers de manière asynchrone en utilisant Node.js. Pouvez-vous faire cela avec NGINX?
Dragos C.
1
@lwansbrough apporte ces repères à la table. Au moins une personne dans ce sujet a fait ses propres expériences.
m33lky
73

J'ai fait un rapide ab -n 10000 -c 100pour servir un octet statique de 1406 favicon.ico, en comparant nginx, Express.js (middleware statique) et Express.js en cluster. J'espère que cela t'aides:

entrez la description de l'image ici

Malheureusement, je ne peux pas tester 1000 ou même 10000 requêtes simultanées car nginx, sur ma machine, commencera à générer des erreurs.

EDIT : comme suggéré par artvolk, voici les résultats du cluster + staticmiddleware (plus lent):

entrez la description de l'image ici

gremo
la source
Merci, très utile! Avez-vous utilisé ce middleware pour favicon: senchalabs.org/connect/favicon.html ou l' avez -vous simplement servi comme fichier statique?
artvolk
@artvolk the favicon one :)
gremo
3
Avez-vous défini NODE_ENV = production pour les tests? Parce que cela ferait une différence incroyable en raison du staticmiddleware de mise en cache en production.
ruffrey
19
pour ceux d'entre vous qui ne parlent pas italien, l'axe des x correspond au nombre de demandes et l'axe des Y correspond au nombre de ms qu'il a fallu pour servir le fichier. J'ai dû traduire sur Google parce que je voulais m'assurer que je ne lisais pas mal les données. ces données ont été incroyablement utiles et j'apprécie vraiment le test de référence ici. restera avec nginx après tout
JL Griffin
1
NODE_ENV = ensemble de production?
basickarl
11

J'ai une interprétation différente des graphiques de @ gremo. Il me semble que les nœuds et les nginx sont mis à l'échelle avec le même nombre de requêtes (entre 9-10k). Bien sûr, la latence de la réponse pour nginx est inférieure d'une constante de 20 ms, mais je ne pense pas que les utilisateurs percevront nécessairement cette différence (si votre application est bien construite). Étant donné un nombre fixe de machines, il faudrait une quantité assez importante de charge avant de convertir une machine à nœuds en nginx, étant donné que ce nœud est l'endroit où la plupart de la charge se produira en premier lieu. Le seul contrepoint à cela est si vous dédiez déjà une machine à nginx pour l'équilibrage de charge. Si tel est le cas, vous pouvez également le faire diffuser votre contenu statique.

ssotangkur
la source
1
"Bien sûr, la latence de la réponse pour nginx est inférieure d'une constante de 20 ms, mais je ne pense pas que les utilisateurs percevront nécessairement cette différence"? J'espère sérieusement que vous ne faites pas ça. Il est prouvé que les utilisateurs percevront une différence de 1 ms!
Navin
4
Citation nécessaire
David Burrows
9

Quoi qu'il en soit, je configurerais Nginx pour mettre en cache les fichiers statiques ... vous verrez une énorme différence là-bas. Ensuite, que vous les serviez à partir d'un nœud ou non, vous obtenez essentiellement les mêmes performances et le même allégement de charge sur votre application de nœud.

Personnellement, je n'aime pas l'idée de mon frontend Nginx servant des actifs statiques dans la plupart des cas, en ce sens

1) Le projet doit maintenant être sur la même machine - ou doit être divisé en actifs (sur une machine nginx) et application Web (sur plusieurs machines pour la mise à l'échelle)

2) La configuration de Nginx doit maintenant maintenir les emplacements des chemins pour les actifs statiques / recharger lorsqu'ils changent.

Will Stern
la source
0

C'est une question délicate à répondre. Si vous avez écrit un serveur de nœuds vraiment léger pour ne servir que des fichiers statiques, il fonctionnerait probablement mieux que nginx, mais ce n'est pas si simple. ( Voici un "benchmark" comparant un serveur de fichiers nodejs et lighttpd - dont les performances sont similaires à celles de ngingx lors du service de fichiers statiques).

Les performances en ce qui concerne la diffusion de fichiers statiques ne se limitent pas au serveur Web qui effectue le travail. Si vous voulez les meilleures performances possibles, vous utiliserez un CDN pour servir vos fichiers afin de réduire la latence pour les utilisateurs finaux et bénéficier de la mise en cache périphérique.

Si cela ne vous inquiète pas, node peut très bien servir des fichiers statiques dans la plupart des situations. Node se prête au code asynchrone, sur lequel il s'appuie également car il est monothread et toute entrée / sortie bloquante peut bloquer l'ensemble du processus et dégrader les performances de vos applications. Il est plus que probable que vous écrivez votre code de manière non bloquante, mais si vous faites quelque chose de manière synchrone, vous pouvez provoquer un blocage, ce qui dégraderait la vitesse à laquelle les autres clients peuvent obtenir leurs fichiers statiques. La solution simple est de ne pas écrire de code de blocage, mais parfois ce n'est pas une possibilité, ou vous ne pouvez pas toujours l'appliquer.

Brad Harris
la source
9
Tout cela n'a aucun sens. Cette question concerne nginx et non Apache. Nginx et node utilisent tous deux libev pour leur boucle d'événements. Nginx sera plusieurs fois plus rapide que node. L'un d'eux n'a pas la surcharge d'une machine virtuelle et est écrit spécifiquement pour effectuer cette opération sur votre système de fichiers.
Evan Carroll
1
libev était le premier nœud. Libuv a adopté ce rôle pour permettre à node d'exécuter crossplatform.
tsturzl
1
Je ne vois pas comment le code asynchrone entre en jeu. Les performances de Node seront bien pires que celles de Nginx et ce sera probablement à cause du blocage des E / S que vous rencontriez lorsque vous avez un tas de clients vous demandant de lire des fichiers à partir du disque. La meilleure pratique consiste à toujours utiliser Nginx pour les actifs statiques afin que votre application Node puisse gérer la logique d'application. Nous pourrions parler de scénarios théoriques où Node fonctionnera mieux mais dans le monde réel Nginx gagnera d'un mile 9 fois sur 10.
wgp
-11

Je suis certain que purement node.js peut surpasser nginx à bien des égards.

Tous ont dit que je devais rester NginX a un cache intégré, alors que node.js n'est pas livré avec celui-ci installé en usine (VOUS DEVEZ CRÉER VOTRE PROPRE CACHE DE FICHIERS). Le cache de fichiers personnalisé surpasse nginx et tout autre serveur du marché car il est super simple.

Nginx fonctionne également sur plusieurs cœurs. Pour utiliser tout le potentiel de Node, vous devez mettre en cluster des serveurs de nœuds. Si vous souhaitez savoir comment faire, veuillez pm.

Vous avez besoin de creuser profondément pour atteindre le nirvana des performances avec le nœud, c'est le seul problème. Une fois fait bon sang ouais ... ça bat Nginx.

utilisateur2379441
la source
1
vous devez apporter des faits, comme j'aimerais croire ce que vous dites, mais vous avez besoin de repères, s'ils sont basés sur le monde réel, c'est parfait! mais pas les cas
extrêmes
5
Ce qui est drôle, c'est que cette réponse contient autant de faits que la réponse choisie avec le plus de votes positifs. Je pense que les gens préfèrent juste un serveur Web à l'avant parce que c'est ainsi qu'on leur a appris à le faire dans [insérer toute autre technologie d'application Web]. Ce n'est pas une bonne réponse mais +1 par pitié.