Je cherche une réponse trop simplifiée à la question suivante. J'essaie de construire une compréhension fondamentale du fonctionnement de Nginx aux côtés de quelque chose comme Gunicorn.
Ai-je besoin à la fois 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!
Trop simplifié: vous avez besoin de quelque chose qui exécute Python mais Python n'est pas le meilleur pour gérer tous les types de demandes).
[Avertissement: je suis un développeur Gunicorn]
Moins simplifié: quel que soit le serveur d'application que vous utilisez (Gunicorn, mod_wsgi, mod_uwsgi, cherrypy), toute sorte de déploiement non trivial aura quelque chose en amont qui gérera les demandes que votre Django app ne devrait pas Des exemples triviaux de telles demandes servent des actifs statiques (images/css/js).
Il en résulte deux premiers niveaux de l '"architecture à trois niveaux" classique. C'est-à-dire que le serveur Web (Nginx dans votre cas) gérera de nombreuses demandes d'images et de ressources statiques. Les demandes qui doivent ê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 serait hébergé sur des machines distinctes (et il y aurait très probablement plusieurs machines dans les deux premiers niveaux, à savoir: 5 serveurs Web envoient des demandes à deux serveurs d'applications qui à leur tour interrogent une seule base de données).
Dans l'ère moderne, nous avons maintenant des applications de toutes formes et tailles. Tous les projets de week-end ou sites de petites entreprises n'ont pas réellement besoin de la puissance de plusieurs machines et fonctionneront très bien sur une seule boîte. Cela a engendré de nouvelles entrées dans la gamme de solutions d'hébergement. Certaines solutions associent le serveur d'applications au serveur Web (Apache httpd + mod_wsgi, Nginx + mod_uwsgi, etc.). Et il n'est pas rare d'héberger la base de données sur la même machine que l'une de ces combinaisons de serveurs Web/d'applications.
Maintenant, dans le cas de Gunicorn, nous avons pris une décision spécifique (copie de Ruby's Unicorn) pour garder les choses distinctes de Nginx tout en s'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 soucier des clients lents. Cela signifie que le modèle de traitement de Gunicorn est d'une simplicité embarrassante.
La séparation permet également à Gunicorn d'être écrit en pur Python ce qui minimise le coût de développement tout en n'affectant pas significativement les performances. Elle permet également aux utilisateurs d'utiliser d'autres proxys (en supposant qu'ils tamponnent correctement).
Quant à 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 traitent la demande. Fondamentalement, Nginx recevra la demande et s'il s'agit d'une demande dynamique (généralement basée sur des modèles d'URL), elle transmettra cette demande à Gunicorn, qui la traitera, puis renverra une réponse à Nginx qui transmettra ensuite la réponse à l'original client.
Donc en terminant, oui. Vous avez besoin à la fois de Nginx et de Gunicorn (ou quelque chose de similaire) pour un bon déploiement Django. Si vous cherchez spécifiquement à héberger Django avec Nginx, alors je le ferais) étudiez Gunicorn, mod_uwsgi et peut-être CherryPy comme candidats pour le côté Django des choses).
J'ai aimé cette explication dans sa simplicité:
Nginx fera face au monde extérieur. Il servira les fichiers multimédias (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 exécutera l'application, alimentera les requêtes du Web et renverra des réponses.
C'est le travail de Gunicorn. Gunicorn créera un socket Unix et servira des réponses à nginx via le protocole wsgi - le socket transmet les données dans les deux sens:
The outside world <-> Nginx <-> The socket <-> Gunicorn
Gunicorn est un gaspillage de ressources. Vous pouvez simplement passer par proxy à Django écouter sur un port au lieu d'exécuter gunicorn en haut Django et encore nginx en plus de tout cela. Dans les benchmarks, j'ai vu une augmentation de vitesse très notable. Nginx peut facilement gérer les demandes directes à Django. Gunicorn n'est rien d'autre qu'un survol (en fait un survol plus lent) au-dessus de la route normale. Il se trouve juste et mange vos ressources et essaie de prétendre alimenter votre site Web.
nginx met en mémoire tampon toutes les demandes et gère les demandes de fichiers statiques par lui-même (si vous l'avez configuré comme ça). Et proxie tout le contenu dynamique vers un autre serveur (gunicorn/Django).
Gunicorn n'a d'autre utilité que de simplement transmettre la demande à l'application. C'est comme une paille que vous pouvez boire directement du verre ou boire de la paille à un rythme limité (ici, la personne qui boit est Django). Et nginx est le serveur qui vous a apporté le verre de jus.
J'ai testé et trouvé ceci - avec gunicorn: 22k req/s sans gunicorn: 34k req/s
Votre site aura besoin de la demande supplémentaire en charge lourde.
Je cherche une réponse trop simplifiée ...
Ai-je besoin à la fois 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, bien sûr, vous avez besoin de Nginx.
Étant donné que vous déployez Django, qui est un framework Web, vous avez besoin de quelque chose pour faire le lien entre le serveur Web (Nginx) et le framework Web (Django). Dans le monde Python, une telle chose est appelée un serveur WSGI (mais pensez-y comme un middleware), dont Gunicorn et uWSGI sont des exemples. Lors du traitement d'une demande, Nginx envoie la demande par procuration à Gunicorn ou uWSGI, qui à son tour appelle Django code et renvoie la réponse.
Ce document et la réponse de Paul vous aidera à mieux l'apprendre.