|
|
Zeile 10: |
Zeile 10: |
|
| |
|
| = TMP = | | = TMP = |
| '''FastCGI''' ist ein binäres [[Netzwerkprotokoll]] für die Anbindung eines [[Anwendungsserver]]s an einen [[Webserver]]. FastCGI ist vergleichbar mit dem [[Common Gateway Interface]] (CGI), wurde jedoch entwickelt, um dessen [[Rechenleistung|Performance]]-Probleme zu umgehen.
| |
|
| |
| == Unterschied zum CGI ==
| |
| Beim Aufruf einer auf CGI basierenden [[Webseite]] wird vom Webserver ein [[Prozess (Informatik)|Prozess]] des CGI-Programms gestartet und am Ende des [[Client-Server-Modell#Definitionen|Requests]] wieder beendet. Weil CGI-Programme häufig in einer [[Skriptsprache]] wie [[Perl (Programmiersprache)|Perl]] geschrieben sind, bedeutet das, dass pro [[Seitenabruf]] der oft recht umfangreiche [[Interpreter]] geladen werden muss, was einen großen [[Overhead (EDV)|Overhead]] bedeutet (das Laden des Interpreters dauert bei einfachen CGI-Programmen länger als die eigentliche Programmausführung). Zudem braucht jeder Request einen eigenen Interpreter, das heißt, bei mehreren parallelen Requests befinden sich entsprechend mehrere Kopien des Interpreters im [[Arbeitsspeicher]] des Servers.
| |
|
| |
| CGI ist zwar durch seine Einfachheit, Unabhängigkeit von der Programmiersprache und weitreichende Unterstützung durch praktisch alle Webserver sehr weit verbreitet, jedoch führt der erwähnte Overhead zu einer hohen [[Verzögerung (Telekommunikation)|Latenzzeit]] und bei stark ausgelasteten Servern schnell zu einer Überlastung.
| |
|
| |
| Im Unterschied dazu wird bei FastCGI das auszuführende Programm (inklusive Interpreter, falls nötig) nur einmal geladen und steht dann für mehrere Requests zur Verfügung – egal ob vom selben [[Client]] oder von unterschiedlichen Clients. Die Kommunikation mit dem Webserver erfolgt dabei nicht durch [[Umgebungsvariable]]n und [[Standard-Datenströme|Standardein-/-ausgabe]], sondern über [[Unix Domain Socket]]s oder [[Transmission Control Protocol|TCP]]-[[Netzwerkverbindung]]en, das heißt, das Programm kann sogar auf einem anderen Rechner laufen.
| |
|
| |
| Programmiertechnisch lässt sich der Unterschied zu CGI-Programmen daran festmachen, dass ein FastCGI-Programm eine zentrale [[Schleife (Programmierung)|Schleife]] hat, die Requests entgegennimmt und durchaus so lange laufen kann wie der Webserver:
| |
|
| |
| <syntaxhighlight lang="perl">
| |
| use FCGI;
| |
| $var = 'foo';
| |
| while (FCGI::accept () >= 0) {
| |
| ... http-Request bearbeiten ...
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| Während des Durchlaufens dieser Schleife bleiben Variablen im [[Arbeitsspeicher|Speicher]] erhalten, was einerseits weitere Optimierungsmöglichkeiten gegenüber CGI-Programmen ermöglicht, andererseits eine sorgfältigere Programmierung erfordert, um [[Speicherleck]]s (''memory leaks'') zu vermeiden.
| |
|
| |
| == Funktionsweise ==
| |
| Die Kommunikation mit dem Webserver erfolgt paketorientiert und [[Nachrichtenverbindung|verbindungs]]<nowiki />los.
| |
|
| |
| Ein [[Datenpaket]] enthält im [[Header]]:
| |
| * die FastCGI-Protokollversion
| |
| * den Nachrichtentyp; entspricht weitgehend den aus CGI bekannten Datenquellen – ein Paket kann unter anderem transportieren:
| |
| ** die CGI-[[Umgebungsvariable]]n
| |
| ** den Inhalt der [[Standard-Datenströme|Standardeingabe]] (für [[Hypertext Transfer Protocol #HTTP POST|POST]]) oder
| |
| ** den Inhalt der Standardausgabe (für die Ausgabe an den [[Client]])
| |
| * eine Request-ID und
| |
| * die Länge der folgenden Daten.
| |
|
| |
| Mehrere Clients können gleichzeitig bedient werden, da sie sich anhand der Request-ID unterscheiden lassen; darum ist im Unterschied zu CGI nur eine [[Prozess (Informatik)|Programminstanz]] nötig, um viele Clients zu bedienen.
| |
|
| |
| == Weblinks == | | == Weblinks == |
| # https://de.wikipedia.org/wiki/FastCGI | | # https://de.wikipedia.org/wiki/FastCGI |