J'ai un Django site exécutant sur GunCorn avec un proxy inverse via Nginx. Nginx n'est-il pas une surcharge supplémentaire inutile? Comment ajoute-t-il cela au sommet de l'aide de gunlorn?
Je vais me concentrer sur le comportement du client lent et comment 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 la SSL, la gestion des ondes de trafic et d'autres aspects du service HTTP sur Internet.
Gunicorn est un logiciel pré-forking. Pour des communications de latence faible, telles que l'équilibreur de charge sur App Server ou les communications entre services, les systèmes de pré-fourche peuvent être très efficaces. Il n'y a aucun coût dans la filature d'un processus pour gérer la demande et un processus unique peut être dédié à la manipulation d'une seule demande; L'élimination de ces choses 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 gérer.
Dans votre situation, vous avez affaire à des clients de latence élevés sur Internet. Ces clients lents peuvent attacher ces mêmes processus. Lorsque QPS importe, le code d'application doit recevoir, gérer et résoudre la demande le plus rapidement possible afin de pouvoir passer à une autre demande. Lorsque les clients lents communiquent directement avec votre système, ils attachent ce processus et le ralentissent. Au lieu de manipuler et de disposer de la demande le plus rapidement possible, ce processus doit également attendre pour le client lent. QP efficace diminue.
Manipulation Un grand nombre de connexions avec très peu de processeur et de coût de la mémoire est ce que les serveurs asynchrones comme Nginx sont bons à. Ils ne sont pas affectés de la même manière négative par des clients lents, car ils sont aptes à gérer simultanément un grand nombre de clients. Dans le cas de Nginx, courir sur le matériel moderne, il peut gérer des dizaines de milliers de connexions à la fois.
Nginx devant un serveur de pré-forking est une grande combinaison. Nginx gère les communications avec les clients et ne souffre pas d'une pénalité pour la manipulation de clients lents. Il envoie des demandes au backend aussi rapidement que le backend peut gérer ces demandes, permettant ainsi que le backend soit aussi efficace avec les ressources du serveur que possible. Le backend renvoie le résultat dès qu'il le calcule et les tampons Nginx qui répondent à la nourrir pour lent des clients à leur propre rythme. Pendant ce temps, le backend peut passer à la manipulation d'une autre demande, même si le client lent reçoit toujours le résultat.
@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 de backend peut exécuter des poignées de connexion de base de données où il n'y a pas de proxy et il y a une pointe de la circulation. Cela est dû aux connexions lentes à libérer comme @Blueben décrit.
Un premier instinct de voir des poignées de base de données en cours d'exécution pourrait être de prendre en charge plus de connexions de 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 de manière significative et stabilisée, le niveau de connexion de la base de données ne craignait pas de presque autant quand il y a une pointe de la circulation.
Nginx est également génial de servir du contenu statique, de la mise en cache et de la variété d'autres tâches HTTP, permettant à votre serveur d'applications se concentrer sur un serveur d'applications.
@naill Donegan mentionne cela dans le commentaire ci-dessus, mais il est assez important de justifier une réponse.
Nginx arrête l'attaque lente de Loris que Gunicorn ne gère pas.