Je regarde le spécification WSGI et j'essaie de comprendre comment les serveurs comme WSGI s'intègrent bien dans l'image. Je comprends que le but de la spécification WSGI est de séparer les serveurs Web tels que nginx des applications Web, comme si vous écriviez avec Flask . Ce que je ne comprends pas, c’est à quoi sert uWSGI. Pourquoi nginx ne peut-il pas appeler directement mon Flask?) Ne peut pas flask parler directement à WSGI? Pourquoi uWSGI doit-il se placer entre eux?
Les spécifications WSGI comportent deux côtés: le serveur et l'application Web. De quel côté est uWSGI?
Ok, je pense que je comprends cela maintenant.
Pourquoi nginx ne peut-il pas appeler directement mon application Flask?
Parce que nginx
ne supporte pas la spécification WSGI. Techniquement, nginx pourrait implémenter la spécification WSGI
s'il le souhaitait, mais il ne l'a pas fait.
Ceci étant le cas, nous avons besoin d’un serveur Web qui mette en œuvre la spécification, à quoi sert le serveur uWSGI
.
Notez que uWSGI
est un serveur http à part entière qui peut fonctionner et fonctionne bien tout seul. Je l'ai utilisé à plusieurs reprises à ce titre et cela fonctionne très bien. Si vous avez besoin d'un débit très élevé pour le contenu statique, vous avez alors la possibilité de coller nginx
devant votre serveur uWSGI
. Lorsque vous le ferez, ils communiqueront via un protocole de bas niveau appelé uwsgi
.
"Qu'est-ce que quoi?! Une autre chose appelée uwsgi?!" vous demandez. Ouais, c'est déroutant. Lorsque vous faites référence à uWSGI
, vous parlez d'un serveur http. Lorsque vous parlez de uwsgi
(toutes les minuscules), vous parlez d'un protocole binaire que le serveur uWSGI
utilise pour parler à d'autres serveurs comme nginx
. Ils ont pris un mauvais nom sur celui-ci.
Pour ceux qui sont intéressés, j’ai écrit un article de blog avec plus de détails, un peu d’histoire et quelques exemples.
Un serveur Web traditionnel ne comprend pas ou n'a aucun moyen d'exécuter des applications Python. C'est pourquoi le serveur WSGI entre en jeu. D'autre part, Nginx prend en charge le proxy inverse pour gérer les demandes et renvoyer les réponses pour les serveurs Python WSGI.
Ce lien pourrait vous aider: https://www.fullstackpython.com/wsgi-servers.html
NGINX dans ce cas ne fonctionne que comme un proxy inverse, il reçoit les demandes et les envoie au serveur d’applications, ce qui serait UWSGI.
Le serveur UWSGI est chargé de charger votre application Flask à l’aide de l’interface WSGI. Vous pouvez même faire en sorte que UWSGI écoute directement les demandes d’Internet et supprime NGINX si vous le souhaitez, bien qu’il soit principalement utilisé derrière un Procuration.
De la docs :
uWSGI prend en charge plusieurs méthodes d’intégration avec des serveurs Web. Il est également capable de servir les requêtes HTTP par lui-même.
WSGI n'est qu'une spécification d'interface. En termes simples, il vous indique les méthodes à appliquer pour transmettre des demandes et des réponses entre le serveur et l'application. Lorsque vous utilisez des frameworks tels que Flask ou Django, cela est géré par le framework lui-même.
En d’autres termes, WSGI est essentiellement un contrat entre python (Flask, Django, etc.)) et des serveurs Web (UWSGI, Gunicorn, etc.). L’avantage est que vous pouvez changer de serveur Web avec peu de ressources. effort parce que vous savez qu'ils sont conformes à la spécification WSGI, qui est en fait l'un des objectifs, comme indiqué dans PEP-3 .
Python dispose actuellement d’une grande variété de frameworks d’applications Web, tels que Zope, Quixote, Webware, SkunkWeb, PSO et Twisted Web - pour ne citer que quelques-uns [1]. Cette grande variété de choix peut poser problème aux nouveaux Python, car, en règle générale, leur choix d’infrastructure Web limitera leur choix de serveurs Web utilisables, et inversement.