Lassen Sie den Server nicht leer laufen
Jeder, der PHP studiert hat, weiß, dass die formale Umgebungsbereitstellung von PHP sehr einfach ist. Ändern Sie einfach ein paar Dateien und es wird in Ordnung sein Die Verwendung der FastCgi-Methode ist ebenfalls eine Frage von Minuten. Im Vergleich dazu ist die Bereitstellung von Python in Webanwendungen viel komplizierter, was hauptsächlich auf die große Anzahl von Tools und die unzureichende Unterstützung durch Mainstream-Server zurückzuführen ist. Bevor wir die Bereitstellungsmethode von Python in der Produktionsumgebung verstehen, wollen wir einige Konzepte klären! Sehr wichtig!
CGI:
CGI ist Common Gateway Interface Interface) ist ein Schnittstellenstandard zwischen externen Anwendungen (CGI-Programmen) und Webservern. Es handelt sich um ein Verfahren zur Übertragung von Informationen zwischen CGI-Programmen und Webservern. Die CGI-Spezifikation ermöglicht es Webservern, externe Programme auszuführen und ihre Ausgabe an Webbrowser zu senden. CGI verwandelt den einfachen Satz statischer Hypermedia-Dokumente in ein völlig neues interaktives Medium. Laienhaft ausgedrückt ist CGI wie eine Brücke, die die Webseite und das Ausführungsprogramm auf dem WEB-Server verbindet. Sie leitet die von HTML empfangenen Anweisungen an das Ausführungsprogramm des Servers weiter und gibt dann die Ergebnisse des Ausführungsprogramms des Servers an die HTML-Seite zurück . CGI Die plattformübergreifende Leistung ist hervorragend und auf nahezu jedem Betriebssystem umsetzbar.
Wenn die CGI-Methode auf eine Verbindungsanforderung (Benutzeranforderung) stößt, muss sie zunächst einen CGI-Unterprozess erstellen, einen CGI-Prozess aktivieren, dann die Anforderung verarbeiten und den Unterprozess nach der Verarbeitung beenden. Dies ist das Fork-and-Execute-Muster. Daher verfügt ein Server, der CGI verwendet, über so viele CGI-Unterprozesse wie Verbindungsanforderungen. Das wiederholte Laden von Unterprozessen ist der Hauptgrund für die geringe CGI-Leistung. Wenn die Anzahl der Benutzeranforderungen sehr groß ist, werden große Mengen an Systemressourcen wie Speicher, CPU-Zeit usw. belegt, was zu einer geringen Leistung führt.
CGI-Skript-Workflow:
Der Browser fordert über ein HTML-Formular oder einen Hyperlink eine URL an, die auf eine CGI-Anwendung verweist.
Der Server führt den Server aus, um die Anfrage zu senden und zu empfangen. Die angegebene CGI-Anwendung.
CGI-Anwendungen führen erforderliche Vorgänge aus, normalerweise basierend auf Eingaben des Betrachters.
CGI-Anwendungen formatieren die Ergebnisse in ein Dokument (normalerweise eine HTML-Seite), das Webserver und Browser verstehen können.
Der Webserver gibt die Ergebnisse an den Browser zurück.
Python verfügt über ein CGI-Modul, das native CGI-Programme unterstützen kann
FastCGI:
FastCGI ist ein skalierbares, hoch- Geschwindigkeit Eine Schnittstelle für die Kommunikation zwischen HTTP-Servern und dynamischen Skriptsprachen. Das beliebteste HTTP Alle Server unterstützen FastCGI, einschließlich Apache, Nginx und lighttpd. Gleichzeitig wird FastCGI auch von vielen Skriptsprachen unterstützt, einschließlich Python. FastCGI wurde aus CGI entwickelt und verbessert. Der Hauptnachteil der herkömmlichen CGI-Schnittstellenmethode ist die schlechte Leistung, da der Skriptparser jedes Mal, wenn der HTTP-Server auf ein dynamisches Programm trifft, neu gestartet werden muss, um die Analyse durchzuführen, und die Ergebnisse dann an den HTTP-Server zurückgegeben werden. Dies ist bei hohem gleichzeitigem Zugriff nahezu nicht verfügbar. FastCGI ist wie ein langlebiges CGI. Es kann jederzeit ausgeführt werden, es dauert nicht jedes Mal, es zu forken (dies ist die am meisten kritisierte Fork-and-Execute-Methode von CGI). Modell). CGI ist die sogenannte kurzlebige Anwendung, und FastCGI ist die sogenannte langlebige Anwendung. Danke an FastCGI Das Programm muss nicht ständig neue Prozesse generieren, was den Druck auf den Server erheblich reduzieren und zu einer höheren Anwendungseffizienz führen kann. Seine Geschwindigkeitseffizienz ist mindestens fünfmal höher als bei der CGI-Technologie. Es unterstützt nämlich auch verteiltes Rechnen FastCGI-Programme können auf anderen Hosts als dem Webserver ausgeführt werden und Anfragen von anderen Webservern annehmen.
FastCGI ist eine sprachunabhängige, skalierbare Architektur-CGI-Open-Erweiterung. Ihr Hauptverhalten besteht darin, den CGI-Interpreterprozess im Speicher zu halten und so eine höhere Leistung zu erzielen. Wie wir alle wissen, ist das wiederholte Laden des CGI-Interpreters der Hauptgrund für eine geringe CGI-Leistung. Wenn der CGI-Interpreter im Speicher bleibt und die Planung des FastCGI-Prozessmanagers akzeptiert, kann er gute Leistung, Skalierbarkeit, Failover-Funktionen usw. bieten. Die FastCGI-Schnittstelle verwendet eine C/S-Struktur, die den HTTP-Server und den Skript-Parsing-Server trennen und einen oder mehrere Skript-Parsing-Daemons auf dem Skript-Parsing-Server starten kann. Jedes Mal, wenn der HTTP-Server auf ein dynamisches Programm trifft, kann es zur Ausführung direkt an den FastCGI-Prozess übermittelt und das Ergebnis dann an den Browser zurückgegeben werden. Mit dieser Methode kann der HTTP-Server ausschließlich statische Anforderungen verarbeiten oder die Ergebnisse des dynamischen Skriptservers an den Client zurückgeben, was die Leistung des gesamten Anwendungssystems erheblich verbessert.
FastCGI-Workflow:
Laden Sie den FastCGI-Prozessmanager (PHP-CGI oder PHP-FPM oder spawn-cgi), wenn der Webserver startet
Der FastCGI-Prozessmanager initialisiert sich selbst, startet mehrere CGI-Interpreterprozesse (sichtbar mehrere PHP-CGI) und wartet auf Verbindungen vom Webserver.
Wenn eine Client-Anfrage den Webserver erreicht, wählt der FastCGI-Prozessmanager einen CGI-Interpreter aus und stellt eine Verbindung zu ihm her. Web Der Server sendet CGI-Umgebungsvariablen und Standardeingaben an den FastCGI-Unterprozess php-cgi.
Nachdem der FastCGI-Unterprozess die Verarbeitung abgeschlossen hat, werden die Standardausgabe und Fehlerinformationen über dieselbe Verbindung an das Web zurückgegeben Server. Wenn der untergeordnete FastCGI-Prozess die Verbindung schließt, wird die Anfrage verarbeitet. Der untergeordnete FastCGI-Prozess wartet dann auf Anforderungen des FastCGI-Prozessmanagers (der im Web ausgeführt wird) und verarbeitet diese Server) nächste Verbindung. Im CGI-Modus wird php-cgi hier beendet.
Funktionen von FastCGI:
Brechen Sie die traditionelle Seitenverarbeitungstechnologie auf. Bei der herkömmlichen Seitenverarbeitungstechnologie muss das Programm mit dem Webserver oder der Anwendung kommunizieren Die Server befinden sich auf demselben Server. Diese Geschichte wurde vor N Jahren durch die FastCGI-Technologie gebrochen. Anwendungen der FastCGI-Technologie können auf jedem Server in der Servergruppe und über TCP/IP installiert werden Das Protokoll kommuniziert mit dem Webserver, was sowohl für die Entwicklung großer verteilter Webgruppen als auch für eine effiziente Datenbanksteuerung geeignet ist.
Expliziter Anforderungsmodus. Die CGI-Technologie spielt in FastCGI keine klare Rolle Im Programm wird dem Programm eine klare Rolle zugewiesen (Responder-Rolle, Authentifikator-Rolle, Filter-Rolle).
WSGI:
Python Web Server Gateway Schnittstelle, abgekürzt als WSGI) ist eine einfache und gemeinsame Schnittstelle zwischen einem Webserver und einer Webanwendung oder einem Framework, die für die Python-Sprache definiert ist. Seit der Entwicklung von WSGI sind ähnliche Schnittstellen in vielen anderen Sprachen erschienen. WSGI dient als Low-Level-Schnittstelle zwischen einem Webserver und einer Webanwendung oder einem Anwendungsframework, um die gemeinsame Basis für die Entwicklung portabler Webanwendungen zu verbessern. WSGI basiert auf dem bestehenden CGI-Standard.
WSGI ist in zwei Teile unterteilt: Der eine ist der „Server“ oder das „Gateway“ und der andere ist die „Anwendung“ oder das „Anwendungsframework“. Bei der Verarbeitung einer WSGI-Anfrage stellt der Server der Anwendung einen Umgebungskontext und eine Rückruffunktion (Callback) zur Verfügung Funktion). Wenn die Anwendung die Verarbeitung der Anforderung abgeschlossen hat, wird das Ergebnis über die vorherige Rückruffunktion an den Server zurückgesendet. Sogenanntes WSGI Middleware implementiert beide Seiten der API und vermittelt somit zwischen dem WSGI-Dienst und der WSGI-Anwendung: Aus Sicht des WSGI-Servers spielt die Middleware die Rolle der Anwendung, und aus Sicht der Anwendung spielt die Middleware die Rolle von der Anwendungsserver. Die „Middleware“-Komponente kann folgende Funktionen ausführen:
Nach dem Umschreiben der Umgebungsvariablen wird die Anforderungsnachricht basierend auf der Ziel-URL an verschiedene Anwendungsobjekte weitergeleitet.
Ermöglicht die gleichzeitige Ausführung mehrerer Anwendungen oder Anwendungsframeworks in einem Prozess.
Lastausgleich und Remoting durch Weiterleitung von Anforderungs- und Antwortnachrichten über das Netzwerk.
Führen Sie eine Nachbearbeitung des Inhalts durch, z. B. das Anwenden von XSLT-Stylesheets.
In der Vergangenheit ist die Auswahl eines geeigneten Webanwendungs-Frameworks zu einem Problem geworden, das Python-Anfängern Probleme bereitet. Dies liegt im Allgemeinen daran, dass die Auswahl des Webanwendungs-Frameworks die verfügbaren Möglichkeiten einschränkt Webserverauswahl und umgekehrt. Python-Anwendungen wurden damals normalerweise für CGI, FastCGI, mod_python oder sogar eine benutzerdefinierte API-Schnittstelle für einen bestimmten Webserver entwickelt. Es gibt keine offizielle Implementierung von WSGI. Weil WSGI eher ein Protokoll ist. Solange diese Protokolle befolgt werden, können WSGI-Anwendungen auf jedem Server ausgeführt werden. umgekehrt. WSGI ist der CGI-Wrapper von Python, im Vergleich zu Fastcgi, dem CGI-Wrapper von PHP.
WSGI unterteilt Webkomponenten in drei Kategorien: Webserver, Web-Middleware und Webanwendung. Der grundlegende WSGI-Verarbeitungsmodus ist: WSGI-Server -> (WSGI-Middleware)* ->
uwsgi:
uwsgi-Protokoll ist ein uWSGI-Server-eigenes Protokoll, das zur Definition der Art der übertragenen Informationen (Typ) verwendet wird von Informationen), jedes uwsgi Die ersten 4 Bytes des Pakets sind Beschreibungen des Übertragungsinformationstyps, was im Vergleich zu WSGI zwei verschiedene Dinge darstellt. Es wird gesagt, dass seine Effizienz zehnmal so hoch ist wie die von fcgi. Spezifische Protokollinhalte finden Sie im uwsgi Protokoll (http://uwsgi-docs.readthedocs.org/en/latest/Protocol.html)
Die oben genannten vier können als Protokolle verstanden werden! Protokoll! Protokoll! Durch die Implementierung eines solchen Protokolls können Sie Webdienste implementieren, die mit Webservern und Webanwendungen verbunden sind!
uWSGI:
Das uWSGI-Projekt zielt darauf ab, eine Komplettlösung für die Bereitstellung verteilter Cluster-Netzwerkanwendungen zu entwickeln. uWSGI ist hauptsächlich auf das Web und seine Standarddienste ausgerichtet und wird in vielen verschiedenen Sprachen erfolgreich eingesetzt. Aufgrund der erweiterbaren Architektur von uWSGI kann es unbegrenzt erweitert werden, um mehr Plattformen und Sprachen zu unterstützen. Derzeit können Sie Plugins in C, C++ und Objective-C schreiben. Das „WSGI“ im Projektnamen ist eine Anspielung auf das gleichnamige Python-Projekt. Web Standards dankt WSGI für die Entwicklung des ersten Plugins für das Projekt. uWSGI ist ein Webserver, der das WSGI-Protokoll, uwsgi, http und andere Protokolle implementiert. uWSGI verwendet weder das wsgi-Protokoll noch das FastCGI-Protokoll, sondern erstellt wie oben erwähnt ein eigenes uwsgi-Protokoll.
Die Hauptmerkmale von uWSGI sind wie folgt:
Ultraschnelle Leistung.
Geringe Speichernutzung (gemessen etwa die Hälfte des mod_wsgi von Apache2).
Mehrere App-Verwaltung.
Detaillierte Protokollierungsfunktion (kann zur Analyse der App-Leistung und von Engpässen verwendet werden).
Hochgradig anpassbar (Speichergrößenbeschränkung, Dienstneustart nach einer bestimmten Anzahl von Malen usw.).
Gunicorn:
Ein uWSGi-ähnliches Tool, portiert vom Rails-Bereitstellungstool (Unicorn). Das verwendete Protokoll ist jedoch das zuvor erwähnte WSGI, der offizielle Standard, der in Python2.5 (PEP) definiert ist 333 ), die Wurzeln sind gut und die Bereitstellung ist relativ einfach. Für detaillierte Nutzungs-Tutorials klicken Sie bitte hier (http://gunicorn.org/). Gunicorn verwendet den Prefork-Modus, Gunicorn Der Server ist mit verschiedenen Web-Frameworks kompatibel, erfordert eine sehr einfache Ausführung, einen geringen Ressourcenverbrauch und ist recht schnell. Es zeichnet sich durch eine enge Integration mit Django und eine besonders komfortable Bereitstellung aus. Es gibt auch viele Mängel und es wird nicht unterstützt. Bei HTTP 1.1 ist die Leistung beim gleichzeitigen Zugriff nicht hoch und es gibt eine gewisse Leistungslücke bei uWSGI, Gevent usw.
1. Gunicorn-Design
Gunicorn ist ein Master-Prozess, der einen Webserver mit mehreren Worker-Prozessen erzeugt. Master Der Prozess steuert die Erstellung und den Tod des Arbeitsprozesses. Der Arbeitsprozess muss lediglich die Anfrage annehmen und verarbeiten. Diese Trennung macht das Neuladen von Code sehr bequem und erleichtert das Hinzufügen oder Entfernen von Arbeitsprozessen. Der Autor hat viel Raum für Erweiterungen im Arbeitsprozess gegeben. Er kann verschiedene E/A-Methoden unterstützen, wie z. B. Gevent, Sync-Synchronisationsprozess, ASYC-Asynchronprozess, Eventlet usw. Der Meister folgt Der Arbeitsprozess ist vollständig getrennt, was Gunicorn im Wesentlichen zu einem Dienst macht, der den Prozess steuert.
2. Struktur des Gunicorn-Quellcodes
Starten Sie mit Application.run() zunächst die Konfiguration, lesen Sie aus der Datei, lesen Sie vom Terminal usw., um die Konfiguration abzuschließen. dann fang an Arbiter, Arbiter ist im Wesentlichen der Kern des Master-Prozesses. Er liest und legt zunächst die Konfigurationsklasse fest, initialisiert dann die Signalverarbeitungsfunktion und richtet den Socket ein. Dann geht es los Spawn-Worker-Prozess, Spawn entsprechend der konfigurierten Anzahl von Worker-Prozessen. Dann wechselt es in den Abfragezustand, empfängt das Signal, verarbeitet das Signal und fährt fort. Die Möglichkeit, den Prozess hier zu aktivieren, besteht darin, eine zu erstellen PIPE schreibt über die Signalverarbeitungsfunktion in die Pipe, und dann wacht der Master aus select.select() auf.
Nach dem Spawnen beginnt der Arbeitsprozess mit der Initialisierung, verarbeitet dann das Signal auf die gleiche Weise, beginnt mit der Abfrage, verarbeitet HTTP-Anfragen, ruft die WSGI-Anwendungsseite auf und erhält die Antwort zurückkehren. Dann weiter.
Der Vorteil des Sync-Synchronisierungsprozesses besteht darin, dass jede Anfrage isoliert ist und der Ausfall jeder Anfrage keine Auswirkungen auf andere Anfragen hat, dies führt jedoch zu einem Leistungsengpass.
Tornado:
Tornado ist eine Python Das Entwicklungsframework ist auch ein asynchroner, nicht blockierender HTTP-Server. Da es sich um einen Webserver handelt, werden dynamische Anforderungen direkt über den internen Mechanismus ausgegeben angeforderter dynamischer Inhalt. Wenn Sie es als separaten Server verwenden und es für die Bereitstellung mit anderen Frameworks wie Flask verwenden möchten, müssen Sie das WSGI-Protokoll verwenden, in das Tornado.wsgi.WSGIContainer integriert ist.
wsgiref:
Python wird mit einem WSGI-Server geliefert, der das WSGI-Protokoll implementiert. Der WSGI-Server kann als ein Web verstanden werden, das den WSGI-Spezifikationen entspricht Server, empfängt die Anforderungsanforderung, kapselt eine Reihe von Umgebungsvariablen und ruft das registrierte WSGI gemäß der WSGI-Spezifikation auf. app und gibt schließlich die Antwort an den Client zurück. Es ist Djangos eigener Server.
Alles oben Genannte kann als Umsetzung verstanden werden! erreichen! erreichen! Tools, die das Protokoll implementieren!
Hinweis: mod_wsgi (Apache-Modul) ist eigentlich ein Modul, das das wsgi-Protokoll implementiert. Es wird jetzt fast nicht aufgegeben, daher werde ich nicht mehr sagen es selbst raus.
Wenn Sie also eine Anwendung mit dem Django-Framework entwickeln und diese in einer Produktionsumgebung bereitstellen möchten, können Sie definitiv nicht die mit Django gelieferte verwenden. Sie können den uWSGI-Server verwenden, der das uwsgi verwendet Protokoll, oder Sie können das WSGI-Protokoll Gunicorn oder Tornado verwenden, Sie können auch FastCGI, CGI-Modus Nginx, Lighttpd, Apache Server verwenden. Das Gleiche gilt auch für andere Frameworks! Sobald Sie diese Konzepte verstanden haben, können Sie sie bei der Bereitstellung berücksichtigen und bei der Zuordnung verschiedener Tools „wissen, was sie sind und warum sie sind“.
In den Projekten unserer Gruppe gibt es zwei Frameworks, Django und Tornado, und auch in der Produktionsumgebung werden zwei Bereitstellungsmethoden verwendet. uWSGI und Gunicorn:
Das Django-Projekt wird mit Nginx+uWSGI bereitgestellt, und das Tornado-Projekt wird mit Nginx+Gunicorn bereitgestellt:
Nginx wird für den Lastausgleich und die Weiterleitung statischer Inhalte verwendet. Das Tornado-Projekt verwendet Supervisord zur Verwaltung von Gunicorn und Gunicorn zur Verwaltung von Tornado. Wie wir alle wissen, verwendet Pythons Parallelität aufgrund der Existenz von Pythons GIL den Mehrprozessmodus, sodass unsere Bereitstellungsmethode einen Kern und zwei Prozesse umfasst.
Das Obige ist eine Zusammenfassung der Python-Webbereitstellungsmethoden. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).