„FastCGI“ – Versionsunterschied
[ungesichtete Version] | [gesichtete Version] |
PL |
Wikilink Latenzzeit korrigiert; weitere Wikilinks aktualisiert; formale Kleinigkeiten |
||
(45 dazwischenliegende Versionen von 33 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
⚫ | |||
{{Infobox_Software| |
|||
Name=FastCGI |
|||
|Screenshot= |
|||
|Hersteller = Fast CGI Team |
|||
|Beschreibung=CGI Software |
|||
|AktuelleVersion= 2.4.2; |
|||
|AktuelleVersionFreigabeDatum= [[23. November]] [[2003]] |
|||
|Betriebssystem= [[Microsoft Windows|Windows]], [[Linux]], [[Mac OS X]] |
|||
|Lizenz= [[GNU General Public License]] |
|||
|Kategorie= [[Common Gateway Interface]] |
|||
|Deutsch= nein |
|||
|Website= [http://www.fastcgi.com www.fastcgi.com] |
|||
}} |
|||
⚫ | |||
⚫ | |||
⚫ | 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. |
|||
⚫ | |||
⚫ | Beim Aufruf einer auf CGI basierenden Webseite wird vom Webserver ein Prozess des CGI-Programms gestartet und am Ende des [[ |
||
Im Unterschied dazu wird bei FastCGI das auszuführende Programm ( |
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- |
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; |
use FCGI; |
||
$var = 'foo'; |
$var = 'foo'; |
||
while (FCGI::accept () >= 0) { |
while (FCGI::accept () >= 0) { |
||
... http-Request bearbeiten ... |
... http-Request bearbeiten ... |
||
} |
|||
</syntaxhighlight> |
|||
Während des Durchlaufens dieser Schleife bleiben Variablen im Speicher erhalten, was einerseits weitere Optimierungsmöglichkeiten gegenüber CGI- |
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 == |
== Funktionsweise == |
||
Die Kommunikation mit dem Webserver erfolgt paketorientiert und [[Nachrichtenverbindung|verbindungs]]<nowiki />los. |
|||
Die Kommunikation mit dem Webserver erfolgt paketorientiert und [[Nachrichtenverbindung|verbindungslos]]. Ein [[Datenpaket]] enthält im [[Header]] die FastCGI-Protokollversion, den Nachrichtentyp, eine Request-ID und die Länge der folgenden Daten. Der Nachrichtentyp entspricht dabei weitgehend den aus CGI bekannten Datenquellen – ein Paket kann u. a. die CGI-Umgebungsvariablen, den Inhalt der Standardeingabe (für POST) oder der Standardausgabe (für die Ausgabe an den Client) transportieren. Mehrere Clients können gleichzeitig bedient werden, da sie sich anhand der Request-ID unterscheiden lassen; darum ist im Unterschied zu CGI nur eine Programminstanz nötig, um viele Clients bedienen zu können. |
|||
Ein [[Datenpaket]] enthält im [[Header]]: |
|||
== Heutige Bedeutung == |
|||
* die FastCGI-Protokollversion |
|||
FastCGI hat trotz deutlicher Vorteile nie annähernd die Bedeutung von CGI zur Erzeugung dynamischer Webseiten gewonnen, vor allem weil sich gleichzeitig einfacher zu handhabende Lösungen etabliert haben, wie [[PHP]], [[Active Server Pages]] oder [[JavaServer Pages]]. Diese sind als Modul im Webserver eingebunden und vermeiden dadurch ebenfalls, dass bei jedem Aufruf ein Interpreter geladen werden muss; zudem kann deren Performance durch automatische [[Kompilierung]] und [[Caching]] des Programmcodes gesteigert werden, so dass sie in ähnliche Geschwindigkeitsbereiche kommen wie externe FastCGI-Programme. |
|||
* 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. |
|||
Diese Interpretersprachen haben gegenüber CGI/FastCGI den Vorteil, dass man den Programmcode direkt in die [[HTML-Seite]]n einbinden kann; dies ist bequemer und vermeidet Probleme mit falsch gesetzten [[Zugriffsrecht]]en für ausführbare Dateien. Zudem stehen fertige Funktionen zur Verfügung, mit denen z.B. auf URL-Parameter oder [[Sitzung (Informatik)|Session]]-Daten zugegriffen werden kann, während ein CGI- oder FastCGI-Programm diese Funktionen selber implementieren bzw. über eine passende [[Programmbibliothek]] einbinden muss. |
|||
CGI und FastCGI bieten jedoch den Vorteil, die [[Programmiersprache]] selbst wählen zu können (was für hardware- oder systemnahe Anwendungen wichtig sein kann); außerdem kann man bei einem externen Programm dessen [[Dateiberechtigung]]en beliebig restriktiv einstellen, es unter einem anderen Benutzer-Account und/oder auf einem anderen Rechner laufen lassen (Letzteres nur bei FastCGI); ein Webserver-Modul einer Interpreter-Sprache läuft dagegen immer auf dem Webserver mit dessen Berechtigungen. |
|||
Aus diesen Gründen wird FastCGI mit kompilierten Programmen selten eingesetzt, weil andere Lösungen einfacher zu handhaben sind bei vergleichbarer Performance. Es ist jedoch recht verbreitet, den Interpreter einer Skriptsprache als FastCGI-Programm zu betreiben, weil man dadurch wenig Overhead hat (der Interpreter muss nur einmal geladen werden, nicht bei jedem Request) und trotzdem die Berechtigungen des Interpreters viel genauer einstellen kann als beim Betrieb als Webserver-Modul. Daher wird dies von Providern oft genutzt, beispielsweise für PHP. |
|||
== Weblinks == |
== Weblinks == |
||
* [ |
* [https://fastcgi-archives.github.io/FastCGI_Specification.html FastCGI-Spezifikation] (englisch) |
||
* [http://cryp.to/publications/fastcgi/ FastCGI – The Forgotten Treasure], eine gute Einführung |
|||
* [http://devzone.zend.com/article/2564-FastCGI-Launch- FastCGI von Microsoft und Zend für IIS 6 und IIS7 und PHP] |
|||
<!-- |
|||
* [http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html mod_fastcgi – FastCGI module for Apache 1.x] |
|||
* [http://www.iis.net/default.aspx?tabid=1000051 Microsoft FastCGI] |
|||
--> |
|||
* [http://mproxyfcgi.sourceforge.net mod_proxy_fcgi – Apache 2.0 Proxy Scheme module for Fast CGI protocol] |
|||
{{Navigationsleiste Webserver-Schnittstellen}} |
|||
⚫ | |||
⚫ | |||
[[en:FastCGI]] |
|||
[[Kategorie:Netzwerkprotokoll auf Anwendungsschicht]] |
|||
[[es:FastCGI]] |
|||
[[fr:FastCGI]] |
|||
[[ja:FastCGI]] |
|||
[[ru:FastCGI]] |
|||
[[pl:FastCGI]] |
Aktuelle Version vom 13. Dezember 2023, 14:58 Uhr
FastCGI ist ein binäres Netzwerkprotokoll für die Anbindung eines Anwendungsservers an einen Webserver. FastCGI ist vergleichbar mit dem Common Gateway Interface (CGI), wurde jedoch entwickelt, um dessen Performance-Probleme zu umgehen.
Unterschied zum CGI
[Bearbeiten | Quelltext bearbeiten]Beim Aufruf einer auf CGI basierenden Webseite wird vom Webserver ein Prozess des CGI-Programms gestartet und am Ende des Requests wieder beendet. Weil CGI-Programme häufig in einer Skriptsprache wie Perl geschrieben sind, bedeutet das, dass pro Seitenabruf der oft recht umfangreiche Interpreter geladen werden muss, was einen großen 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 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 Umgebungsvariablen und Standardein-/-ausgabe, sondern über Unix Domain Sockets oder TCP-Netzwerkverbindungen, 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 hat, die Requests entgegennimmt und durchaus so lange laufen kann wie der Webserver:
use FCGI;
$var = 'foo';
while (FCGI::accept () >= 0) {
... http-Request bearbeiten ...
}
Während des Durchlaufens dieser Schleife bleiben Variablen im Speicher erhalten, was einerseits weitere Optimierungsmöglichkeiten gegenüber CGI-Programmen ermöglicht, andererseits eine sorgfältigere Programmierung erfordert, um Speicherlecks (memory leaks) zu vermeiden.
Funktionsweise
[Bearbeiten | Quelltext bearbeiten]Die Kommunikation mit dem Webserver erfolgt paketorientiert und verbindungslos.
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-Umgebungsvariablen
- den Inhalt der Standardeingabe (für 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 Programminstanz nötig, um viele Clients zu bedienen.
Weblinks
[Bearbeiten | Quelltext bearbeiten]- FastCGI-Spezifikation (englisch)