Pourquoi choisir Nginx comme proxy inverse est-il une bonne idée?

42

J'ai un site Django fonctionnant sur Gunicorn avec un proxy inverse via Nginx. Nginx n’est-il pas simplement une surcharge inutile? Comment l'ajout de cela au-dessus de Gunicorn aide-t-il?

Celui
la source

Réponses:

53

Je vais me concentrer sur le comportement lent du client 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 présente également des avantages pour les clients rapides, la gestion SSL, la gestion des pics de trafic et d'autres aspects de la gestion du protocole HTTP sur Internet.

Gunicorn est un logiciel de pré-forgeage. Pour les communications à faible temps de latence, telles que l'équilibrage de charge sur le serveur d'applications ou les communications entre services, les systèmes pré-branchés peuvent être très efficaces. Le lancement d'un processus pour traiter la demande est gratuit, et un processus unique peut être dédié au traitement d'une seule demande; l'élimination de ces choses peut conduire à un système global plus rapide et plus efficace jusqu'à ce que le nombre de connexions simultanées dépasse le nombre de processus disponibles pour les gérer.

Dans votre cas, vous avez affaire à des clients à latence élevée via Internet. Ces clients lents peuvent relier ces mêmes processus. Lorsque QPS est important, le code de l'application doit recevoir, gérer et résoudre la demande le plus rapidement possible pour pouvoir passer à une autre demande. Lorsque des clients lents communiquent directement avec votre système, ils lient ce processus et le ralentissent. Au lieu de traiter et d'éliminer la demande le plus rapidement possible, ce processus doit désormais attendre également pour le client lent. QPS efficace diminue.

Gérer un grand nombre de connexions avec très peu de ressources processeur et de mémoire représente l’atout majeur des serveurs asynchrones tels que Nginx. Les clients lents ne sont pas affectés de la même manière par les clients lents car ils savent manipuler simultanément un grand nombre de clients. Dans le cas de Nginx, fonctionnant sur du matériel moderne, il peut gérer des dizaines de milliers de connexions à la fois.

Nginx devant un serveur de pré-forgeage est une excellente combinaison. Nginx gère les communications avec les clients et ne subit aucune pénalité pour la gestion des clients lents. Il envoie des requêtes au serveur aussi rapidement que le serveur le permet, ce qui lui permet d'être aussi efficace que possible avec les ressources du serveur. Le système retourne le résultat dès qu'il le calcule, et les mémoires tampons de Nginx qui le répondent pour le transmettre aux clients lents à leur propre rythme. Pendant ce temps, le serveur peut passer au traitement d’une autre demande alors même que le client lent reçoit toujours le résultat.

Blueben
la source
3
nitpicking: gunicorn est un serveur basé sur des événements préforking. chaque processus gère plusieurs connexions de manière asynchrone. Cela ne change rien au fait que nginx a un coût par connexion plus bas, ce qui rend le reste de votre explication valide.
Javier
4
Et, en prime, Nginx arrête très efficacement les "attaques par DOS HTTP lentes". Le seul point que je voudrais ajouter est que, lorsque vous utilisez Nginx, il peut gâcher tout ce qui concerne l’IP que vous pourriez faire dans Gunicorn, par exemple, l’autorisation par ip, la journalisation, etc., à moins que Gunicorn ne prenne en compte l’en-tête X-Forwarded-For. Je ne connais pas bien Gunicorn, je ne peux donc pas vous dire à quel point ce problème sera pour vous.
Niall Donegan
Merci pour l'info Javier, je ne connais pas très bien le gunicorn.
Blueben
Votre réponse devrait correspondre à cette question: stackoverflow.com/q/13182892/719276
arthur.sw
Cela at-il quelque chose à voir avec l'option * _busy_buffer_size?
CMCDragonkai
2

@blueben a raison. Un exemple spécifique et courant de ce qui peut arriver quand un proxy inverse n'est pas utilisé est qu'une base de données principale peut être saturée par les traitements de connexion à la base de données lorsqu'il n'y a pas de proxy et qu'il y a un pic de trafic. Cela est dû au fait que les connexions sont lentes à libérer comme décrit dans @blueben.

Un premier instinct pour voir les descripteurs de bases de données épuisés 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 de base de données requises pour une charge élevée chuter et se stabiliser de manière significative: le niveau de connexion à la base de données ne augmentera pas autant si un pic de trafic se produit.

Nginx est également idéal pour la gestion de contenu statique, la mise en cache et diverses autres tâches HTTP, laissant ainsi votre serveur d'applications se concentrer sur son rôle de serveur d'applications.

Mark Stosberg
la source
0

@naill Donegan le mentionne dans le commentaire ci-dessus, mais il est suffisamment important pour justifier une réponse.

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

rox0r
la source