Question Pourquoi ai-je besoin de Nginx et de quelque chose comme Gunicorn?


Je cherche une réponse trop simplifiée à la question suivante. J'essaie de développer une compréhension fondamentale du fonctionnement de Nginx aux côtés de quelque chose comme Gunicorn.

Ai-je besoin de Nginx et de quelque chose comme Gunicorn pour déployer des applications Django sur Nginx?

Si oui, qu'est-ce qui gère réellement les requêtes HTTP?

Ps. Je ne veux pas utiliser Apache et mod_wsgi!


182
2017-11-15 21:16


origine


Apache et mod_wsgi constituent le moyen le plus simple d'implémenter le pont entre votre application django et les requêtes http, également très performant dans un environnement de production. Pour de nombreux développeurs, cela signifie «Apache est meilleur que nginx» s’ils le savaient, mais que «betamax est meilleur que VHS», hélas, les règles de Dogma - MagicLAMP


Réponses:


Trop simplifié: Vous avez besoin de quelque chose qui exécute Python, mais Python n'est pas le meilleur pour traiter tous les types de demandes.

[disclaimer: je suis un développeur de Gunicorn]

Moins simplifié: quel que soit le serveur d'application utilisé (Gunicorn, mod_wsgi, mod_uwsgi, cherrypy), tout type de déploiement non trivial aura quelque chose en amont qui gérera les demandes que votre application Django ne devrait pas traiter. Des exemples triviaux de telles demandes servent des actifs statiques (images / css / js).

Il en résulte deux premiers niveaux de la "architecture à trois niveaux" classique. C'est-à-dire que le serveur Web (Nginx dans votre cas) traitera de nombreuses demandes d'images et de ressources statiques. Les demandes devant être générées dynamiquement seront ensuite transmises au serveur d'applications (Gunicorn dans votre exemple). (En passant, le troisième des trois niveaux est la base de données)

Historiquement, chacun de ces niveaux était hébergé sur des machines distinctes (et il y aurait probablement plusieurs machines dans les deux premiers niveaux, c.-à-d.: 5 serveurs Web envoient des demandes à deux serveurs d'applications qui interrogent à leur tour une base de données unique).

À l'ère moderne, nous avons maintenant des applications de toutes formes et de toutes tailles. Ce ne sont pas tous les projets de week-end ou les sites de petites entreprises qui ont réellement besoin de la puissance de plusieurs machines et fonctionnent sans problème sur une seule boîte. Cela a engendré de nouvelles entrées dans la gamme de solutions d'hébergement. Certaines solutions associeront le serveur d'applications au serveur Web (Apache httpd + mod_wsgi, Nginx + mod_uwsgi, etc.). Et il n’est pas du tout inhabituel d’héberger la base de données sur le même ordinateur que l’une de ces combinaisons serveur Web / application.

Maintenant, dans le cas de Gunicorn, nous avons pris une décision spécifique (copie de la Licorne de Ruby) de séparer les éléments de Nginx tout en nous appuyant sur le comportement de proxy de Nginx. Plus précisément, si nous pouvons supposer que Gunicorn ne lira jamais les connexions directement à partir d'Internet, nous n'avons pas à nous inquiéter des clients lents. Cela signifie que le modèle de traitement pour Gunicorn est d'une simplicité embarrassante.

La séparation permet également à Gunicorn d’être écrit en Python pur, ce qui minimise les coûts de développement sans affecter de manière significative les performances. Cela permet également aux utilisateurs d’utiliser d’autres proxies (en supposant qu’ils tamponnent correctement).

En ce qui concerne votre deuxième question sur ce qui gère réellement la requête HTTP, la réponse simple est Gunicorn. La réponse complète est que Nginx et Gunicorn gèrent la demande. Fondamentalement, Nginx recevra la demande. S'il s'agit d'une demande dynamique (généralement basée sur des modèles d'URL), il donnera cette demande à Gunicorn, qui la traitera, puis renverra une réponse à Nginx qui la transmettra à nouveau à l'original. client.

Donc en terminant, oui. Nginx et Gunicorn (ou quelque chose de similaire) sont nécessaires pour un bon déploiement de Django. Si vous cherchez spécifiquement à héberger Django avec Nginx, je me renseignerais sur Gunicorn, mod_uwsgi et peut-être CherryPy en tant que candidats du côté Django.


267
2017-11-15 21:49



Merci d'avoir pris le temps d'écrire une réponse aussi détaillée! Toute lecture recommandée sur cette "architecture à 3 niveaux"? - a.m.
Excellente réponse, mais je ne comprends pas le problème avec les clients lents. - Mads Skjern
@MadsSkjern Je suppose que c'est ici, mais si vous supposez que tous les clients sont rapides, vous pouvez utiliser un pool fixe de processus de travail et ne pas avoir à coder pour le cas où plusieurs d'entre eux sont bloqués dans l'attente d'un client. - Jonathan Hartley
@un m. en.wikipedia.org/wiki/Multitier_architecture - Jonathan Hartley
mon application django ne sert que json pas de contenu statique puis-je juste aller avec gunicorn et pas de nginx - Sar009


J'ai aimé cette explication dans sa simplicité:

Nginx fera face au monde extérieur. Il servira des fichiers multimédia (images,   CSS, etc.) directement à partir du système de fichiers. Cependant, il ne peut pas parler   directement aux applications Django; il a besoin de quelque chose qui courra le   l’application, l’alimenter à la demande du Web et renvoyer les réponses.

C'est le travail de Gunicorn. Gunicorn va créer un socket Unix et servir   les réponses à nginx via le protocole wsgi - le socket transmet les données en   les deux directions:

The outside world <-> Nginx <-> The socket <-> Gunicorn

https://gist.github.com/Atem18/4696071


20
2017-12-13 07:52



Il n’est pas nécessaire que ce soit des sockets, au cas où d’autres se le demanderaient. - akshay


Je cherche une réponse trop simpliste ...

Ai-je besoin de Nginx et de quelque chose comme Gunicorn pour déployer des applications Django sur Nginx?

Si oui, qu'est-ce qui gère réellement les requêtes HTTP?

Réponse trop simplifiée:

OUI.

Nginx et Gunicorn.

Puisque vous déployez sur Nginx, vous avez évidemment besoin de Nginx.

Puisque vous déployez Django, qui est un framework Web, vous avez besoin de quelque chose qui jette un pont entre le serveur Web (Nginx) et le framework Web (Django). Dans le monde Python, une telle chose s'appelle un serveur WSGI (mais pensez-le comme un middleware), comme par exemple Gunicorn et uWSGI. Lors du traitement d'une requête, Nginx envoie un proxy à Gunicorn ou à uWSGI, qui appelle à son tour le code Django et renvoie la réponse.

Ce document et la réponse de Paul vous aidera à mieux l'apprendre.


0
2017-10-26 21:42