Große, dynamische Webseiten kommen kaum ohne ein Framework zur Verarbeitung von Anfragen aus. Aber je umfangreicher das eingesetzte Framework, umso länger dauert es bei Interpreter-Sprachen (z.B. PHP, Perl, etc.), bis alle Module interpretiert und geladen sind und die eigentliche Verarbeitung der Anfrage beginnen kann.
FastCGI
Eine Möglichkeit zur Optimierung bietet hier FastCGI, ein Standard zur Einbindung von externer Software in Webserver. Ähnlich wie bei normalem CGI wird ein externes Programm gestartet, welches alle Informationen übergeben bekommt. Wie auch bei CGI wird die Ausgabe einfach auf die Standard-Ausgabe geschrieben.
Der Unterschied ist jedoch, dass das aufgerufene, externe Programm selbst als Daemon läuft. Der Austausch der Daten findet über TCP (oder UNIX Domain Sockets) statt. Dadurch können die Programme sogar auf einem externen Server arbeiten.
FastCGI im Einsatz
Für viele Sprachen stehen Module zur Verfügung, die das FastCGI Protokoll implementieren und sich um die Kommunikation zwischen CGI-Prozess und Webserver kümmern, zum Beispiel CGI::Fast für Perl, FastCGI Process Manager für PHP, FCGIInterface für Java und viele mehr….
Auch viele Webserver unterstützten FastCGI: Apache, lighttpd, Microsofts IIS und ebenfalls viele mehr…
Unter Apache lässt sich FastCGI sehr einfach durch das Modul fgcid einsetzten. Die Konfiguration ist – wenn der Prozess auf der gleichen Maschine läuft – ebenfalls sehr einfach. Es muss nur ein Handler hinzugefügt werden, der ausführbare Skripte mit einer bestimmten Endung mit dem fcgid assoziert, zum Beispiel für Perl und php:
AddHandler fcgid-script .fcgi .fphp
Der Prozess wird vom Apache2 Webserver gestartet, wenn er zum ersten Mal benötigt wird.
Der Codeoverhead, der erzeugt wird ist ebenfalls sehr gering:
use CGI::Fast;
while(my $fcgi = CGI::Fast->new()){
# Normal Website Code
}
Erste Tests
Auf einer Webseite, die ich im Rahmen eines Projekts erstellt haben und welches Moose, ein umfangreiches Framework zur Objekt-Orientierten Programmierung in Perl, nutzt, konnte ich die Laufzeit signifikant verbessern:
Bei der ersten Auslieferung benötigt die Webseite ca. 3 Sekunden, was dem Laden der Module und Erstellen der Klassen geschuldet ist. Weitere Auslieferungen benötigten nur ca. 0.5 Sekunden. Die Ergebnisse lassen sich reproduzieren und durch Tests auch ohne Webserver nachvollziehen.
Fazit
Dank FastCGI lassen sich Webseiten mit großem Framework sehr einfach optimieren. Beim Programmieren muss man jedoch sehr gut beim Verwenden von globalen Variablen und auf Speicherlecks aufpassen.