Une comparaison des serveurs web pour des applications web basées sur Python
Introduction
Dans cet article, nous allons parler de trois choses principales : Python, les serveurs web et, surtout, des petites choses entre les deux.
Blagues mises à part, cet article plutôt long peut sembler décourageant pour certains à la recherche de conseils ou de réponses rapides. Malheureusement, contrairement à la plupart des choses dans le monde de Python, lorsqu'il s'agit de choisir une pile de serveurs de production pour déployer votre application, il n'y a pas une manière évidente -- et de préférence seulement une -- de le faire.
Cependant, cela ne devrait pas vous effrayer. Après avoir terminé cet article, vous aurez une bonne connaissance du fonctionnement des différents serveurs web et de la manière dont ils gèrent la communication avec les applications web basées sur Python. En évaluant vos besoins et exigences, vous serez en mesure de décider quel serveur utiliser.
Interface de passerelle de serveur Web Python v1.0 (WSGI)
Comprendre les enjeux
Aujourd'hui, il existe des serveurs web (ou des modules pour serveurs) en nombre croissant spécifiquement conçus (ou adaptés) pour travailler avec des applications web Python de manière interchangeable. Cependant, cela n'a pas toujours été le cas. Dans les temps anciens, les développeurs n'avaient pas vraiment la possibilité de changer de serveur web à volonté facilement, et chaque changement entraînait un coût en raison des dépendances et des limitations. En décidant d'un framework sur lequel construire, vous vous seriez aussi décidé, pas toujours de manière volontaire ni consciente, sur le(s) serveur(s) que vous pourriez utiliser pour servir l'application. Cela était dû à l'absence d'une spécification d'interface acceptée universellement : un terrain d'entente sur lequel les applications (frameworks) et les serveurs web pourraient s'adapter et communiquer, permettant l'interchangeabilité des composants si nécessaire, avec éventuellement aucun changement de code.
Naissance du Standard
Au début de ce siècle, des efforts ont été faits pour enfin résoudre le problème avec la présentation de la Proposition d'Amélioration Python (PEP) 333 à la communauté.
Dans le PEP (Python Enhancement Proposal) 333:
This document specifies a proposed standard
interface between web servers and Python web
applications or frameworks, to promote web
application portability across a variety of
web servers.
Comme expliqué dans le PEP, cette nouvelle norme était (et est) destinée à permettre la portabilité à travers (et entre) les serveurs [web] et les applications [web] Python. Les fonctionnalités puissantes de la norme et son adoption large par rapport à celles d'avant ouvrent la voie pour aujourd'hui : un monde où de nombreux (peut-être trop) serveurs web disposés à faire le travail pour vous existent.
La comparaison
Dans cette comparaison des serveurs web pour les applications web basées sur Python, nous allons parler de certaines des options disponibles et de ce qui les rend remarquables. L'objectif ici est que le lecteur ait une vision plus claire et d'apporter une aide pour faire correspondre les serveurs aux besoins spécifiques des applications afin de trouver le bon. En raison du grand nombre d'options (de nouvelles apparaissant chaque jour !), nous allons filtrer notre chemin et parler de celles qui sont “spéciales” de diverses manières : popularité, solidité ou faire quelque chose de différent (ou mieux) par rapport aux autres.
Remarque : Je voudrais vous conseiller, lecteur, de vous méfier des références biaisées et trompeuses qui tendent à ne pas refléter les conditions d'un environnement de production réel. Malheureusement, ces [articles] ne signifient pas grand-chose lorsqu'il s'agit de choisir un serveur web pour la production, qui est également très peu susceptible d'être la partie causant le goulot d'étranglement. Il vous est donc conseillé d'évaluer et de comprendre vos propres besoins, puis d'essayer différentes options, en vous abstenant de chiffres spéculatifs pour éviter de réelles catastrophes futures.
Serveurs Web (Ordre Alphabétique)
Serveur WSGI CherryPy
Qu'est-ce que c'est ?
CherryPy est en réalité un cadre web. Pourtant, c'est un cadre totalement autonome – ce qui signifie qu'il peut fonctionner de manière indépendante, y compris dans des scénarios de production sans avoir besoin de logiciels supplémentaires. Cela est rendu possible grâce à son propre serveur web conforme à WSGI et à HTTP/1.1. Le projet CherryPy le décrit comme un « serveur HTTP générique, prêt pour la production, à haute vitesse et utilisant un pool de threads ». Étant donné qu'il s'agit d'un serveur WSGI, il peut également être utilisé pour servir toute autre application Python WSGI, sans être lié au cadre de développement d'application de CherryPy.
Pourquoi devriez-vous envisager de l'utiliser ?
- C'est compact et simple.
- Il peut servir n'importe quelle application web Python fonctionnant sur WSGI.
- Il peut gérer des fichiers statiques et il peut simplement être utilisé pour servir des fichiers et des dossiers seuls.
- C'est en mode de thread pool.
- Il est livré avec un support pour SSL.
- C'est une alternative purement Python facile à adapter et à utiliser, qui est robuste et fiable.
Gunicorn
Qu'est-ce que c'est ?
Gunicorn est un serveur web autonome qui offre pas mal de fonctionnalités d'une manière beaucoup plus facile à utiliser. Il utilise le modèle pré-fork, ce qui signifie qu'un processus master central (Gunicorn) est chargé de gérer les processus de travail initiés (de types différents), qui traitent ensuite les requêtes directement. Et tout cela peut être configuré et adapté pour répondre à vos besoins et à divers scénarios de production.
Pourquoi devriez-vous envisager de l'utiliser ?
- Il prend en charge WSGI et peut être utilisé avec n'importe quelle application et framework Python fonctionnant avec WSGI.
- Il peut également être utilisé comme un remplacement immédiat pour Paster (ex : Pyramid), le serveur de développement de Django, web2py, et d'autres.
- Offre le choix de différents types/configurations de travailleurs et une gestion automatique des processus des travailleurs.
- Prise en charge de HTTP/1.0 et HTTP/1.1 (Keep-Alive) grâce à des travailleurs synchrones et asynchrones.
- Comprend le support SSL
- Extensible avec des hooks.
- C'est transparent et a une architecture claire.
- Prend en charge les versions Python 2.6, 2.7, 3, 3.2, 3.3
Tornade (Serveur HTTP via wsgi.WSGIContainer)
Qu'est-ce que c'est ?
Tornado est un framework de développement d'applications et une bibliothèque de mise en réseau conçue pour gérer des opérations asynchrones, permettant aux serveurs de maintenir de nombreuses connexions ouvertes. Il est également livré avec un serveur WSGI que d'autres applications (et frameworks) WSGI en Python peuvent utiliser pour fonctionner.
Pourquoi devriez-vous envisager de l'utiliser ?
- Si vous construisez sur le framework Tornado ; ou
- Votre application a besoin de fonctionnalités asynchrones.
Bien que dans ces circonstances vous souhaitiez peut-être choisir le serveur WSGI de Tornado pour votre projet, vous pouvez également opter pour Gunicorn avec des workers Tornado [Asynchrone].
Web tordu
Qu'est-ce que c'est ?
Twisted Web est le serveur web qui vient avec la bibliothèque de mise en réseau Twisted. Alors que Twisted lui-même est “un moteur de mise en réseau basé sur des événements”, le serveur Twisted Web fonctionne sur WSGI et est capable d'alimenter d'autres applications web Python.
Pourquoi devriez-vous envisager de l'utiliser ?
- C'est un produit simple à utiliser, stable et mature.
- Il exécutera des applications Python WSGI.
- Il peut agir comme un framework de serveur web Python, vous permettant de le programmer avec le langage pour des besoins de servage HTTP personnalisés.
- Il offre une capacité de prototypage simple et rapide grâce aux
Scripts Python (.rpy)qui sont exécutés sur demande HTTP. - Il est livré avec des capacités de proxy et de reverse-proxy.
- Il prend en charge les hôtes virtuels.
- Cela peut même servir Perl, PHP, etc. via l'API twisted.web.twcgi.
uWSGI
Qu'est-ce que c'est ?
Malgré ses très confuses conventions de nommage, uWSGI est en soi un vaste projet avec de nombreux composants, visant à fournir une pile logicielle complète pour la création de services d'hébergement. L'un de ces composants, le serveur uWSGI, exécute des applications Python WSGI. Il est capable d'utiliser divers protocoles, y compris son propre protocole de transport uwsgi, qui est quasi-identique à SCGI. Afin de répondre à la demande (compréhensible) d'utiliser des serveurs HTTP autonomes devant des serveurs d'applications, les serveurs web NGINX et Cherokee sont modularisés pour prendre en charge le protocole uwsgi de uWSGI, qui est le plus performant, afin d'avoir un contrôle direct sur ses processus.
Pourquoi devriez-vous envisager de l'utiliser ?
- uWSGI est livré avec un adaptateur WSGI et prend entièrement en charge les applications Python fonctionnant sur WSGI.
- Il se connecte à libpython. Il charge le code de l'application au démarrage et agit comme un interpréteur Python. Il analyse les requêtes entrantes et invoque l'appelable Python.
- Il est livré avec un support direct pour le serveur web NGINX populaire (ainsi que Cherokee* et lighttpd).
- C'est écrit en C.
- Ses différents composants peuvent faire beaucoup plus que d'exécuter une application, ce qui peut être utile pour l'expansion.
- Actuellement (à la fin de 2013), il est en développement actif et a des cycles de publication rapides.
- Il dispose de divers moteurs pour exécuter des applications (asynchrones et synchrones).
- Cela peut signifier un empreinte mémoire plus faible pour fonctionner.
Serveur WSGI de Waitress
Qu'est-ce que c'est ?
Waitress est un serveur WSGI pur Python. À première vue, il peut ne pas sembler très différent de nombreux autres ; cependant, sa philosophie de développement le distingue des autres. Son objectif est de faciliter le fardeau de production (et de développement) causé par les serveurs web pour les développeurs d'applications web Python. Waitress y parvient en neutralisant les problèmes causés par les différences de plateforme (ex. Unix vs. Windows), d'interpréteur (CPython vs. PyPy) et de versions de Python (version 2 vs. 3).
Pourquoi devriez-vous envisager de l'utiliser ?
- C'est une solution très épurée et entièrement en Python.
- Il prend en charge HTTP/1.0 et HTTP/1.1 (Keep-Alive).
- Il est prêt à être déployé pour la production avec un large éventail de support de plateforme.
- Contrairement à CherryPy, il est en réalité indépendant du cadre dans sa nature.
- Il fonctionne sur Windows et Unix, ainsi que sur l'interpréteur CPython et PyPy (uniquement Unix).
- Il prend en charge les versions 2 et 3 de Python.
Modules pour serveurs autonomes
mod_python avec un adaptateur WSGI (Apache) (Intégration de Python)
Qu'est-ce que c'est ?
En termes simples, mod_python est un module Apache qui intègre Python directement dans le serveur lui-même. Bien qu'il ne soit pas recommandé pour diverses raisons (le projet est abandonné et obsolète, avec seulement de très récentes intentions de continuer le développement par l'auteur original), il peut être utilisé pour exécuter des applications WSGI sur Apache via des wrappers.
Pourquoi devriez-vous envisager de l'utiliser ?
Vous pourriez vouloir programmer et étendre Apache en utilisant Python pour une raison spécifique.
mod_wsgi (Apache) (Intégration de Python)
Qu'est-ce que c'est ?
En tant que module conforme à WSGI, mod_wsgi vous permet d'exécuter des applications Python WSGI sur le serveur HTTP Apache. Cela se fait de deux manières : la première est similaire à la façon dont mod_python fonctionne, en incorporant le code et en l'exécutant au sein du processus enfant. L'autre méthode offre un mode de fonctionnement basé sur un démon, où l'application WSGI a son propre processus distinct, géré automatiquement par mod_wsgi.
Pourquoi devriez-vous envisager de l'utiliser ?
- Une expérience existante avec Apache peut signifier un environnement de production stable pour vos opérations en ce qui concerne également l'exécution de Python. Cela peut à lui seul sauver la situation, rendant cela intéressant.
- Si vous dépendez d'Apache ou souhaitez bénéficier de ses modules d'extension stables et riches, ce sera la meilleure option.
- Il peut exécuter des applications sous différents utilisateurs système pour une sécurité accrue.
- C'est un logiciel éprouvé et fiable.
- Le Web contient des tonnes d'informations et de questions-réponses liées à cela qui peuvent vous faire gagner beaucoup de temps lorsque vous rencontrez un vrai problème de production.
- Et il est accompagné de toutes les autres fonctionnalités qu'Apache offre.
