Zum Inhalt springen

Apache/14 CGI/1 Schnittstelle

Aus Foxwiki

14.1 Die CGI-Schnittstelle

Schon die ursprünglichen Webserver des CERN und der NCSA waren mit CGIFähigkeiten ausgestattet. Die Grundlagen des bis heute gültigen CGI/1.1-Standards können Sie unter hoohoo.ncsa.uiuc.edu/cgi nachlesen; das Dokument stammt von 1995 und bezieht sich auf den damals noch aktuellen NCSA-HTTPd.

Die Definition der CGI-Schnittstelle selbst hat sich seitdem tatsächlich nicht mehr weiterentwickelt. Allerdings gibt es etwa für Perl - die Sprache, in der die meisten CGI-Skripte geschrieben werden - einige Erweiterungen, die insbesondere die Performance steigern. Beispiele dafür sind FastCGI sowie das im nächsten Kapitel behandelte Apache-Modul mod_perl.

Noch ein Hinweis zur Terminologie: Normalerweise ist in Dokumentationen von CGI-Skripten die Rede; manchmal werden sie aber auch als CGI-Programme bezeichnet. Formal besteht ein kleiner Unterschied zwischen diesen Begriffen: Ein CGI-Programm ist ein Binary Executable, das beispielsweise in C geschrieben wurde, während ein Skript in einer interpretierten Sprache wie Perl, Python oder gar einer Shell-Skriptsprache verfasst wird. Da es inzwischen virtuelle Maschinen für Binärprogramme und Just-in-time-Compiler für Skriptsprachen gibt, wird dieser Unterschied immer unerheblicher. Deshalb werden die beiden Begriffe hier synonym verwendet.

Bevor Sie CGI-Einstellungen in Ihrem Apache-Webserver vornehmen und CGISkripte schreiben, soll Ihnen eine kurze Beschreibung der Schnittstelle an dieser Stelle ein wenig Hintergrundwissen bieten. CGI-Programmierung ist einfacher umzusetzen, wenn Sie nachvollziehen können, auf welche Weise der Server mit einem externen Programm Daten austauscht. Ein grundlegendes Schema der CGI-Kommunikation finden Sie in Abbildung 14.1.

HTML-Formular

(statisches Persönliche Info Dokument) Name: Alter: Abschicken Konfigurationsanalyse: Shebang-Zeile: Zeitlicher Ablauf

Perl-Interpreter Variablen aus

Hallo Karl! Du bist also 35 Jahre alt! Ausgabe des CGI-Skripts inkl. von diesem generierten Header

Client Server CGI-Skript

Abbildung 14.1 Schematischer Ablauf der Abarbeitung eines CGI-Skripts

Die CGI-Schnittstelle 14.1

Prinzipiell werden bei der Abarbeitung eines CGI-Skripts immer dieselben Schritte ausgeführt:

1. Wenn der Client eine bestimmte URL anfordert, überprüft Apache anhand des Verzeichnisses beziehungsweise der Dateiendung, ob es sich um die URL eines CGI-Programms handelt. Im in Abbildung 14.1 gezeigten Beispiel bemerkt der Server es an der Endung .pl. 2. Falls tatsächlich ein CGI-Skript angefordert wurde, startet der Webserver zunächst einen neuen Prozess (besonders dieser Schritt ist für das Performance-Problem von CGI-Skripten auf stark beanspruchten Webservern verantwortlich). 3. Der neu erzeugte Prozess wird dazu verwendet, das CGI-Programm auszuführen. Falls es sich um ein binäres Programm handelt, wird es einfach gestartet. Ist es dagegen ein Skript, das in einer Interpretersprache geschrieben wurde (im in Abbildung 14.1 gezeigten Beispiel handelt es sich um Perl), dann muss auch noch der entsprechende Interpreter geladen werden - ein weiterer Performance-Engpass ist die Folge. 4. Das gestartete CGI-Programm kann Formulardaten entgegennehmen, die mit der HTTP-Anfrage versendet wurden (siehe Kapitel 2, Funktionsweise von Webservern): bei einer GET-Anfrage aus dem Query-String, der als URLAnhang hinter dem ? folgt; bei POST aus dem Anfrage-Body, der dem Programm über die Standardeingabe (stdin) bereitgestellt wird. Im Beispiel ist es eine GET-Anfrage mit den an die URL angehängten CGI-Parametern user=Karl und age=35. 5. Daneben kann das CGI-Skript zahlreiche Informationen über den Client, den Server und die HTTP-Anfrage aus Umgebungsvariablen auslesen, die der Webserver exportiert. 6. Das Skript kann nun beliebige Arbeitsschritte durchführen. In der Regel wird aus den Eingabedaten, aus unveränderlichen Vorlagetexten und gegebenenfalls aus weiteren Quellen wie etwa Datenbanken dynamisch ein HTML-Dokument erstellt. Es gibt allerdings auch CGI-Skripte, die Bilder oder - mithilfe geeigneter Zusatzmodule - sogar PDF-Dokumente und Flash-Filme erzeugen. Im Beispiel ist es ein HTML-Dokument, von dem nur die Zeile mit dem dynamischen Inhalt gezeigt wird. 7. Alles, was das Skript auf die Standardausgabe (stdout) schreibt, wird an den Webserver zurückgegeben, der es unverändert als HTTP-Antwort an den Client schickt. Sie müssen deshalb darauf achten, die nötigen HTTP-Header (mindestens Content-Type) selbst zu generieren; bei CGI-Skripten erledigt Apache das nicht automatisch für Sie.

14.1.1 FastCGI Aufgrund der Problematik, dass CGI für jede Anfrage einen neuen Prozess starten muss, wurde die Variante FastCGI entwickelt. Bei dieser gibt es einen einzelnen Prozess, der alle Anfragen für CGI-Skripte ausführt; dies verbessert die CGI-Performance erheblich.

Bis einschließlich Version 2.2 gehört die FastCGI-Unterstützung nicht zum Lieferumfang von Apache; Sie müssen ein Drittanbieter-Modul herunterladen und installieren. Die bekannteste und empfehlenswerteste Implementierung für Apache 2 ist mod_fcgid. Informationen und Downloads finden Sie unter https://fastcgi.coremail.cn. Eine Binärversion für Windows gibt es bei ApacheLounge (https:// www.apachelounge.com), einer Website, die sich auf den Apache-Betrieb unter Windows spezialisiert hat.

Bei Apache 2.3-beta wird das Hilfsprogramm fcgistarter mitgeliefert. Es ermöglicht den separaten Start eines FastCGI-Programms oder -Skripts. Die Syntax ist sehr einfach:

fcgistarter -c Befehl -p Port [-i Interface] -N Instanzenzahl

Die Parameter bedeuten Folgendes:

  • -c Befehl gibt den Pfad des auszuführenden Skripts oder Programms an.
  • -p Port gibt den TCP-Port an, auf dem fcgistarter lauschen soll.
  • -i Interface ist optional und gibt die IP-Adresse einer bestimmten Netzwerkschnittstelle an, auf der fcgistarter Verbindungen entgegennehmen soll.

Wenn Sie den Parameter weglassen, wird auf allen verfügbaren Schnittstellen gelauscht.

  • -N Instanzenanzahl gibt an, wie viele Instanzen des Skripts oder Programms

ausgeführt werden sollen. Sie können sich dabei an der maximalen Anzahl von Worker-Prozessen beziehungsweise -Threads orientieren.

Das folgende Beispiel startet 20 Instanzen des Perl-Skripts test.pl als FastCGISkript auf Port 4000 und wechselt durch das angehängte & in den Hintergrund:

  1. fcgistarter -c /usr/local/scripts/test.pl -p 4000 -N 20 &

Die Verbindung zu Apache wird über das Proxy-Modul mod_proxy_fcgi (siehe auch Kapitel 13, Proxy- und Cache-Funktionen) hergestellt. Das folgende Beispiel stellt das soeben gestartete Skript über den Pfad /test-cgi bereit:

ProxyPass /test-cgi/ fcgi://localhost:4000/

Dazu müssen die beiden Module mod_proxy und mod_proxy_fcgi aktiviert sein.

Apache für CGI-Skripte konfigurieren 14.2