49 votes

Pourquoi la configuration de Nginx comme proxy inverse est-elle une bonne idée ?

J'ai un site Django fonctionnant sur Gunicorn avec un proxy inverse via Nginx. Nginx n'est-il pas simplement une surcharge inutile supplémentaire ? En quoi le fait de l'ajouter à Gunicorn est-il utile ?

62voto

Jeffrey Hantin Points 189

Je vais me concentrer sur le comportement des clients lents et sur la façon dont votre configuration le gère, mais ne soyez pas tenté de croire que c'est le seul avantage. La même méthode qui profite aux clients lents a également des avantages pour les clients rapides, la gestion de SSL, la gestion des pics de trafic et d'autres aspects de l'utilisation de HTTP sur Internet.

Gunicorn est un logiciel de pré-forking. Pour les communications à faible latence, comme l'équilibreur de charge vers le serveur d'applications ou les communications entre les services, les systèmes de pré-bifurcation peuvent être très efficaces. L'élimination de ces éléments peut conduire à un système globalement plus rapide et plus efficace jusqu'à ce que le nombre de connexions simultanées dépasse le nombre de processus disponibles pour les traiter.

Dans votre situation, vous avez affaire à des clients à forte latence sur Internet. Ces clients lents peuvent bloquer ces mêmes processus. Lorsque le QPS est important, le code de l'application doit recevoir, traiter et résoudre la demande aussi rapidement que possible afin de pouvoir passer à une autre demande. Lorsque des clients lents communiquent directement avec votre système, ils bloquent ce processus et le ralentissent. Au lieu de traiter et d'éliminer la demande aussi rapidement que possible, ce processus doit maintenant attendre le client lent. Le QPS effectif diminue.

La gestion d'un grand nombre de connexions avec des coûts de processeur et de mémoire très faibles est ce que les serveurs asynchrones comme Nginx savent faire. Ils ne sont pas affectés de la même manière négative par des clients lents car ils sont capables de gérer un grand nombre de clients simultanément. Dans le cas de Nginx, qui fonctionne sur du matériel moderne, il peut gérer des dizaines de milliers de connexions en même temps.

Nginx en face d'un serveur de pré-forking est une excellente combinaison. Nginx gère les communications avec les clients, et n'est pas pénalisé par la gestion des clients lents. Il envoie les requêtes au backend aussi vite que le backend peut les traiter, ce qui permet au backend d'être aussi efficace que possible avec les ressources du serveur. Le backend renvoie le résultat dès qu'il l'a calculé, et Nginx met en mémoire tampon cette réponse pour la transmettre aux clients lents à leur propre rythme. Pendant ce temps, le backend peut passer à la gestion d'une autre requête alors même que le client lent reçoit toujours le résultat.

3voto

Mark Stosberg Points 3665

@blueben a raison. Un exemple spécifique et courant de ce qui peut se produire lorsqu'un proxy inverse n'est pas utilisé est qu'une base de données dorsale peut manquer de gestionnaires de connexion de base de données lorsqu'il n'y a pas de proxy et qu'il y a un pic de trafic. Ceci est dû au fait que les connexions sont lentes à se libérer comme @blueben l'a décrit.

Un premier réflexe face à l'épuisement des gestionnaires de base de données pourrait être de prendre en charge davantage de connexions à la base de données. Mais en ajoutant un proxy inverse devant l'application, vous verrez le nombre de connexions requises à la base de données pour une charge élevée diminuer de manière significative et se stabiliser - le niveau de connexion à la base de données ne sera pas aussi élevé en cas de pic de trafic.

Nginx est également excellent pour servir du contenu statique, mettre en cache et diverses autres tâches HTTP, ce qui permet à votre serveur d'applications de se concentrer sur son rôle de serveur d'applications.

0voto

rox0r Points 147

@naill Donegan en parle dans le commentaire ci-dessus, mais c'est suffisamment important pour mériter une réponse.

Nginx arrête l'attaque lente de loris que gunicorn ne gère pas.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X