Ein Vergleich von Webservern für auf Python basierende Webanwendungen
Einführung
In diesem Artikel werden wir über drei Hauptthemen sprechen: Python, Webserver und vor allem über die Kleinigkeiten dazwischen.
Spaß beiseite, dieser ziemlich lange Artikel könnte für einige, die nach einer schnellen Anleitung oder Antworten suchen, ernst erscheinen. Leider gibt es im Gegensatz zu den meisten Dingen in der Welt von Python, wenn es darum geht, einen Produktionsserver-Stack auszuwählen, um Ihre Anwendung bereitzustellen, nicht den einen – und vorzugsweise nur einen – offensichtlichen Weg, dies zu tun.
Dies sollte Sie jedoch nicht abschrecken. Nach dem Lesen dieses Artikels werden Sie ein gutes Wissen darüber haben, wie verschiedene Webserver funktionieren und die Aufgabe übernehmen, mit Python-basierten Webanwendungen zu kommunizieren. Nachdem Sie Ihre Bedürfnisse und Anforderungen bewertet haben, werden Sie in der Lage sein zu entscheiden, welchen Server Sie verwenden möchten.
Python Web Server Gateway Interface v1.0 (WSGI)
Die Probleme verstehen
Heute gibt es immer mehr Webserver (oder Module für Server), die speziell dafür entwickelt (oder angepasst) wurden, um mit Python-Webanwendungen austauschbar zu arbeiten. Allerdings war das nicht immer der Fall. In alten Zeiten hatten Entwickler nicht wirklich die Möglichkeit, Webserver nach Belieben einfach zu wechseln, und jeder Wechsel war mit Kosten aufgrund von Abhängigkeiten und Einschränkungen verbunden. Bei der Entscheidung für ein Framework, auf dem man aufbauen wollte, hat man auch entschieden, nicht immer freiwillig oder bewusst, welche Server man nutzen konnte, um die Anwendung bereitzustellen. Dies lag an der mangelnden Existenz einer allgemein akzeptierten Schnittstellenspezifikation: einem gemeinsamen Nenner, den sowohl Anwendungen (Frameworks) als auch Webserver annehmen und nutzen würden, um zu kommunizieren und so die Austauschbarkeit von Komponenten bei Bedarf möglicherweise ohne Codeänderung zu ermöglichen.
Geburt des Standards
Zu Beginn dieses Jahrhunderts wurden Anstrengungen unternommen, um das Problem endlich mit der Präsentation des Python Enhancement Proposal (PEP) 333 der Community zu lösen.
Aus dem 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.
Wie im PEP erklärt, sollte dieser neue Standard die Portabilität zwischen (und innerhalb) von [Web]-Servern und [Python-Web] Anwendungen ermöglichen. Die leistungsstarken Funktionen des Standards und seine breite Akzeptanz im Vergleich zu früheren Standards ebnen den Weg für die heutige Welt: eine Welt, in der viele (vielleicht zu viele) Web-Server existieren, die bereit sind, die Arbeit für Sie zu erledigen.
Der Vergleich
In diesem Vergleich von Webservern für auf Python basierende Webanwendungen werden wir über einige der verfügbaren Optionen sprechen und was sie herausstechen lässt. Das Ziel ist es, dem Leser eine klarere Vision zu vermitteln und Hilfe zu bieten, um die Server mit den spezifischen Bedürfnissen der Anwendungen abzugleichen, um den einen zu finden. Aufgrund der Vielzahl von Optionen (die täglich mehr werden!) werden wir uns durchfiltern und über diejenigen sprechen, die in verschiedener Hinsicht „besonders“ sind: Popularität, Solidität oder etwas anders (oder besser) im Vergleich zu den anderen machen.
Hinweis: Ich möchte Ihnen, dem Leser, ans Herz legen, vorsichtig mit voreingenommenen und irreführenden Benchmarks zu sein, die in der Regel nicht die Bedingungen einer echten Produktionsumgebung widerspiegeln. Leider bedeuten diese [Artikel] nicht viel, wenn es darum geht, einen Webserver für die Produktion auszuwählen, was auch sehr unwahrscheinlich der Teil ist, der den Engpass verursacht. Daher wird empfohlen, Ihre eigenen Bedürfnisse zu messen und zu verstehen und dann verschiedene Optionen auszuprobieren, wobei spekulative Zahlen vermieden werden sollten, um echte zukünftige Katastrophenszenarien zu verhindern.
Webserver (Alphabetische Reihenfolge)
CherryPy WSGI-Server
Was ist das?
CherryPy ist tatsächlich ein Web-Framework. Es ist jedoch ein vollständig eigenständiges – was bedeutet, dass es eigenständig betrieben werden kann, auch in Produktionsszenarien, ohne zusätzliche Software. Dies wird durch seinen eigenen WSGI- und HTTP/1.1-konformen Webserver erreicht. Das CherryPy-Projekt beschreibt es als einen „ein hochgeschwindigkeitstauglicher, produktionsbereiter, thread-pulsierter, generischer HTTP-Server“. Da es sich um einen WSGI-Server handelt, kann es auch verwendet werden, um jede andere WSGI-Python-Anwendung zu bedienen, ohne an das Anwendungsentwicklungs-Framework von CherryPy gebunden zu sein.
Warum sollten Sie in Erwägung ziehen, es zu verwenden?
- Es ist kompakt und einfach.
- Es kann für alle Python-Webanwendungen, die auf WSGI laufen, verwendet werden.
- Es kann statische Dateien verarbeiten und kann einfach verwendet werden, um Dateien und Ordner allein bereitzustellen.
- Es ist thread-pool-basiert.
- Es wird mit Unterstützung für SSL geliefert.
- Es ist eine leicht anpassbare, einfach zu verwendende rein-Python-Alternative, die robust und zuverlässig ist.
Gunicorn
Was ist das?
Gunicorn ist ein eigenständiger Webserver, der eine Vielzahl von Funktionen auf eine deutlich einfach zu bedienende Weise bietet. Er verwendet das Pre-Fork-Modell – das bedeutet, dass ein zentraler Master-Prozess (Gunicorn) mit der Verwaltung der initiierten Arbeitsprozesse (unterschiedlicher Art) betraut ist, die dann die Anfragen direkt bearbeiten. Und all dies kann konfiguriert und angepasst werden, um Ihren Bedürfnissen und verschiedenen Produktionsszenarien gerecht zu werden.
Warum sollten Sie in Erwägung ziehen, es zu verwenden?
- Es unterstützt WSGI und kann mit jeder WSGI-fähigen Python-Anwendung und -Framework verwendet werden.
- Es kann auch als Ersatz für Paster (z. B. Pyramid), Djangos Entwicklungsserver, web2py und andere verwendet werden.
- Bietet die Auswahl verschiedener Arbeiterarten/-konfigurationen und eine automatische Verwaltung der Arbeiterprozesse.
- HTTP/1.0 und HTTP/1.1 (Keep-Alive) Unterstützung durch synchrone und asynchrone Worker.
- Kommt mit SSL-Unterstützung
- Erweiterbar mit Hooks.
- Es ist transparent und hat eine klare Architektur.
- Unterstützt Python-Versionen 2.6, 2.7, 3, 3.2, 3.3
Tornado (HTTP-Server über wsgi.WSGIContainer)
Was ist das?
Tornado ist ein Anwendungsentwicklungsrahmen und eine Netzwerkbibliothek, die für die Handhabung asynchroner Operationen entwickelt wurde, sodass Server viele offene Verbindungen aufrechterhalten können. Es wird auch mit einem WSGI-Server geliefert, den andere WSGI-Python-Anwendungen (und -Rahmen) verwenden können, um zu laufen.
Warum sollten Sie in Erwägung ziehen, es zu verwenden?
- Wenn Sie auf dem Tornado-Framework aufbauen; oder
- Ihre Anwendung benötigt asynchrone Funktionalität.
Obwohl Sie unter diesen Umständen möglicherweise Tornados WSGI-Server für Ihr Projekt wählen möchten, können Sie auch entscheiden, Gunicorn mit Tornado [asynchronen] Arbeitern zu verwenden.
Verdrehte Web
Was ist das?
Twisted Web ist der Webserver, der mit der Twisted-Netzwerkbibliothek geliefert wird. Während Twisted selbst “eine ereignisgesteuerte Netzwerk-Engine” ist, läuft der Twisted Web-Server auf WSGI und ist in der Lage, andere Python-Webanwendungen zu betreiben.
Warum sollten Sie in Erwägung ziehen, es zu verwenden?
- Es ist ein einfach zu bedienendes, stabiles und ausgereiftes Produkt.
- Es wird WSGI-Python-Anwendungen ausführen.
- Es kann wie ein Python-Webserver-Framework fungieren, das es Ihnen ermöglicht, es mit der Sprache für benutzerdefinierte HTTP-Dienste zu programmieren.
- Es bietet eine einfache und schnelle Prototyping-Möglichkeit durch
Python-Skripte (.rpy), die bei HTTP-Anfragen ausgeführt werden. - Es kommt mit Proxy- und Reverse-Proxy-Funktionen.
- Es unterstützt virtuelle Hosts.
- Es kann sogar Perl, PHP usw. über die twisted.web.twcgi API bedienen.
uWSGI
Was ist das?
Trotz ihrer sehr verwirrenden Namenskonventionen ist uWSGI selbst ein umfangreiches Projekt mit vielen Komponenten, das darauf abzielt, einen vollständigen [Software]Stack für den Aufbau von Hosting-Diensten bereitzustellen. Eine dieser Komponenten, der uWSGI-Server, führt Python WSGI-Anwendungen aus. Er ist in der Lage, verschiedene Protokolle zu verwenden, einschließlich seines eigenen uwsgi-Drahtprotokolls, das quasi identisch mit SCGI ist. Um der (verständlichen) Nachfrage gerecht zu werden, eigenständige HTTP-Server vor Anwendungsservern zu verwenden, werden die NGINX- und Cherokee-Webserver modularisiert, um uWSGI’s (best performendes) uwsgi-Protokoll zu unterstützen, um direkte Kontrolle über seine Prozesse zu haben.
Warum sollten Sie in Erwägung ziehen, es zu verwenden?
- uWSGI wird mit einem WSGI-Adapter geliefert und unterstützt vollständig Python-Anwendungen, die auf WSGI ausgeführt werden.
- Es verbindet sich mit libpython. Es lädt den Anwendungscode beim Start und fungiert wie ein Python-Interpreter. Es analysiert die eingehenden Anfragen und ruft die Python-Funktion auf.
- Es kommt mit direkter Unterstützung für den beliebten NGINX-Webserver (neben Cherokee* und lighttpd).
- Es ist in C geschrieben.
- Die verschiedenen Komponenten können viel mehr als nur eine Anwendung auszuführen, was für eine Erweiterung nützlich sein könnte.
- Derzeit (Stand Ende 2013) wird es aktiv weiterentwickelt und hat schnelle Veröffentlichungsgesetze.
- Es hat verschiedene Engines zum Ausführen von Anwendungen (asynchron und synchron).
- Es kann eine geringere Speichernutzung zum Ausführen bedeuten.
Waitress WSGI-Server
Was ist das?
Waitress ist ein reiner Python WSGI-Server. Auf den ersten Blick könnte es nicht viel anders erscheinen als viele andere; jedoch hebt sich seine Entwicklungspolitik von den anderen ab. Sein Ziel ist es, die Produktions- (und Entwicklungs-) Belastungen zu erleichtern, die durch Webserver für Entwickler von Python-Webanwendungen verursacht werden. Waitress erreicht dies, indem es Probleme neutralisiert, die durch Unterschiede in der Plattform (z. B. Unix vs. Windows), dem Interpreter (CPython vs. PyPy) und den Python-Versionen (Version 2 vs. 3) entstehen.
Warum sollten Sie in Erwägung ziehen, es zu verwenden?
- Es ist eine sehr schlanke, reine Python-Lösung.
- Es unterstützt HTTP/1.0 und HTTP/1.1 (Keep-Alive).
- Es kommt bereit zur Bereitstellung für die Produktion mit einer breiten Palette von Plattformunterstützung.
- Im Gegensatz zu CherryPy ist es tatsächlich von seiner Natur her framework-unabhängig.
- Es läuft auf Windows und Unix sowie auf dem CPython-Interpreter und PyPy (nur Unix).
- Es unterstützt die Python-Versionen 2 und 3.
Module für Stand-Alone-Server
mod_python mit einem WSGI-Adapter (Apache) (Python einbetten)
Was ist das?
Einfach gesagt, ist mod_python ein Apache-Modul, das Python innerhalb des Servers selbst einbettet. Obwohl aus verschiedenen Gründen nicht empfohlen (das Projekt ist tot und veraltet, mit nur sehr aktuellen Bestrebungen, die Entwicklung vom ursprünglichen Autor fortzusetzen), kann es verwendet werden, um WSGI-Anwendungen über Wrapper auf Apache auszuführen.
Warum sollten Sie in Erwägung ziehen, es zu verwenden?
Vielleicht möchten Sie Apache aus einem bestimmten Grund mit Python programmieren und erweitern.
mod_wsgi (Apache) (Python einbetten)
Was ist das?
Als ein WSGI-konformes Modul ermöglicht mod_wsgi das Ausführen von Python WSGI-Anwendungen auf dem Apache HTTP Server. Dies wird auf zwei Arten erreicht: Die erste ähnelt der Funktionsweise von mod_python, indem der Code eingebettet und innerhalb des Kindprozesses ausgeführt wird. Die andere Methode bietet einen daemon-basierten Betriebsmodus, bei dem die WSGI-Anwendung ihren eigenen Prozess hat, der automatisch von mod_wsgi verwaltet wird.
Warum sollten Sie in Erwägung ziehen, es zu verwenden?
- Vorhandene Erfahrungen mit Apache können eine stabile Produktionsumgebung für Ihre Operationen bedeuten, wenn es darum geht, auch Python auszuführen. Allein das kann den Tag retten und macht es lohnenswert.
- Wenn Sie von Apache abhängig sind oder die stabilen und umfangreichen Erweiterungsmodules nutzen möchten, wird dies der richtige Weg sein.
- Es kann Anwendungen unter verschiedenen Systembenutzern für zusätzliche Sicherheit ausführen.
- Es ist eine erprobte und zuverlässige Software.
- Das World Wide Web enthält Unmengen von Informationen und Fragen & Antworten dazu, die Ihnen viel Zeit sparen können, wenn Sie ein echtes Produktionsproblem begegnen.
- Und es kommt mit all den anderen Funktionen, die Apache bietet.
