FastCGI ist ein Binärprotokoll zur Kommunikation zwischen interaktiven Programmen und einem Webserver . Es ist eine Weiterentwicklung des früheren Common Gateway Interface (CGI). Das Hauptziel von FastCGI ist die Reduzierung des Kommunikationsaufwands zwischen Webserver und CGI-Programmen, wodurch ein Server mehr Webseitenanfragen pro Zeiteinheit verarbeiten kann.
Geschichte
Common Gateway Interface (CGI) ist eine Schnittstellenspezifikation, die es externen Anwendungen ermöglicht, mit Webservern zu interagieren. CGI-Anwendungen laufen in separaten Prozessen , die zu Beginn jeder Anfrage erstellt und am Ende wieder beendet werden. Dieses Modell „ein neuer Prozess pro Anfrage“ vereinfacht zwar die Implementierung von CGI-Programmen erheblich, schränkt aber Effizienz und Skalierbarkeit ein. Bei hoher Last wird der Overhead des Betriebssystems für die Prozesserstellung und -beendigung signifikant. Zudem beschränkt das CGI-Prozessmodell Methoden zur Ressourcennutzung, wie z. B. die Wiederverwendung von Datenbankverbindungen oder In-Memory-Caching.
Um die Skalierbarkeitsprobleme von CGI zu beheben, entwickelte Open Market FastCGI und führte es Mitte der 1990er Jahre erstmals in seinem Webserver-Produkt ein. Open Market entwickelte FastCGI ursprünglich unter anderem als Antwort auf die proprietären, prozessintegrierten Anwendungsprogrammierschnittstellen (APIs) von Netscape ( Netscape Server Application Programming Interface (NSAPI)) zur Entwicklung von Webanwendungen.
FastCGI wurde zwar ursprünglich von Open Market entwickelt, später aber von mehreren anderen Webserver-Herstellern implementiert. Sein Ansatz konkurrierte jedoch mit anderen Methoden zur Beschleunigung und Vereinfachung der Server-Subprogramm-Kommunikation. Apache HTTP Server- Module wie mod_perl und mod_php erschienen etwa zur gleichen Zeit und gewannen schnell an Popularität. Auch im Jahr 2020 waren all diese verschiedenen Methoden, einschließlich CGI, weiterhin weit verbreitet.
Details zur Implementierung
Anstatt für jede Anfrage einen neuen Prozess zu erstellen, verwendet FastCGI persistente Prozesse, um eine Reihe von Anfragen zu bearbeiten. Diese Prozesse gehören dem FastCGI-Server, nicht dem Webserver. [ 1 ]
Um eine eingehende Anfrage zu bearbeiten, sendet der Webserver Umgebungsvariableninformationen und die Seitenanfrage über einen Unix-Domain-Socket , eine Named Pipe oder eine TCP- Verbindung an einen FastCGI-Prozess. Die Antworten werden vom Prozess über dieselbe Verbindung an den Webserver zurückgesendet, der sie dann an den Endbenutzer weiterleitet . Die Verbindung kann nach dem Senden einer Antwort geschlossen werden, die Prozesse des Webservers und des FastCGI-Dienstes bleiben jedoch bestehen. [ 2 ]
Jeder einzelne FastCGI-Prozess kann während seiner Laufzeit zahlreiche Anfragen bearbeiten, wodurch der Aufwand für die Erstellung und Beendigung von Prozessen pro Anfrage entfällt. Die gleichzeitige Verarbeitung mehrerer Anfragen kann auf verschiedene Arten erfolgen: durch die Verwendung einer Verbindung mit internem Multiplexing (d. h. mehrere Anfragen über eine Verbindung), durch die Verwendung mehrerer Verbindungen oder durch eine Kombination dieser Methoden. Es können mehrere FastCGI-Server konfiguriert werden, was die Stabilität und Skalierbarkeit erhöht.
Website-Administratoren und Programmierer erkennen in der Trennung von Webanwendungen und Webserver in FastCGI viele Vorteile gegenüber eingebetteten Interpretern ( wie mod_perl oder mod_php ). Diese Trennung ermöglicht den unabhängigen Neustart von Server- und Anwendungsprozessen – ein wichtiger Aspekt für stark frequentierte Websites. Zudem erlaubt sie die Implementierung anwendungsspezifischer Sicherheitsrichtlinien des Hosting-Anbieters, was für ISPs und Webhosting-Unternehmen eine wichtige Anforderung darstellt. [ 3 ] Unterschiedliche Arten eingehender Anfragen können an spezifische FastCGI-Server verteilt werden, die für die effiziente Bearbeitung dieser Anfragentypen ausgelegt sind.
Webserver, die FastCGI implementieren
- Hinweis: Sofern nicht anders angegeben, ist der Vollständigkeitsgrad der FastCGI-Implementierung unbekannt.
- Apache HTTP Server (teilweise)
- Implementiert durch mod_fcgid . Dieses Modul war ursprünglich ein Drittanbietermodul, wurde aber 2009 unter der Leitung von Chris Darroch als Unterprojekt des Apache-Servers an die Apache Software Foundation (ASF) übertragen. [ 4 ] Es unterstützt ausschließlich Unix-Domain-Sockets, keine TCP-Sockets. [ 5 ]
- Es wird auch das Drittanbietermodul mod_fastcgi verwendet. Dieses Modul ließ sich eine Zeit lang unter Apache 2.4.x nicht mehr korrekt kompilieren [ 6 ] , dieses Problem wurde jedoch durch einen Fork des Originalprojekts behoben [ 7 ] .
- Das Multiplexen von Anfragen über eine einzige Verbindung ist gemäß dem Apache 1.x-Design nicht zulässig [ 8 ] , daher wird dies nicht unterstützt.
- In Apache 2.4 wurde mod_proxy_fcgi hinzugefügt, das TCP FastCGI-Server unterstützt.
- Caddy [ 9 ]
- Cherokee [ 10 ]
- Hiawatha [ 11 ]
- Loadbalancing FastCGI-Unterstützung
- Unterstützt chroot-basierte FastCGI-Server
- Steg [ 12 ]
- Kerio WebSTAR
- Lighttpd [ 13 ]
- LiteSpeed Webserver
- Microsoft IIS [ 14 ]
- Nginx [ 15 ]
- NaviServer
- Oracle iPlanet Webserver
- OpenBSD 's httpd(8) [ 16 ]
- Open Market Webserver
- Resin- Web- und Anwendungsserver
- Roxen- Webserver
- ShimmerCat- Webserver [ 17 ]
- Zeus Webserver
Sprachbindungen für die API
FastCGI kann in jeder Sprache implementiert werden, die Netzwerk-Sockets unterstützt . Da „FastCGI ein Protokoll und keine Implementierung ist“, ist es nicht an eine bestimmte Sprache gebunden. Anwendungsprogrammierschnittstellen (APIs) existieren für: [ 18 ]
- Ada [ 19 ]
- Delphi , Lazarus Free Pascal [ 20 ]
- C , C++
- Hühnerprogramm
- Common Lisp [ 21 ]
- D
- Eiffel [ 22 ]
- Erlang
- GnuCOBOL
- Gehen
- Guile -Schema
- Haskell
- VSI BASIC für OpenVMS
- Java [ 23 ] [ 12 ]
- Lua
- node.js [ 24 ]
- OCaml
- Perl [ 25 ]
- PHP (über php-fpm, [ 26 ] oder HipHop für PHP [ 27 ] )
- Python
- Rubin
- Rost [ 28 ]
- Kleiner Eiffelturm
- Smalltalk : FasTalk und Dolphin Smalltalk
- Tcl
- Vala (über C-Bindungen)
- Xojo (ehemals Realbasic, REAL Studio) [ 29 ]
Neuere Frameworks wie Ruby on Rails , Catalyst , Django , Kepler und Plack ermöglichen die Verwendung entweder mit den eingebetteten Interpretern ( z. B. mod_ruby , mod_perl , mod_python oder mod_lua) oder mit FastCGI.
Referenzen
- ^ „FastCGI-Spezifikation“ . Open Market, Inc. 1996. Archiviert vom Original am 19. Januar 2016.
- ^ „FastCGI: Eine leistungsstarke Webserver-Schnittstelle“ . Open Market, Inc. 1996. Archiviert vom Original am 1. Oktober 2010.
- ^ Heinlein, Paul (1. November 1998). „FastCGI: Persistente Anwendungen für Ihren Webserver“ . Linux Journal . Abgerufen am 4. Oktober 2010 .
- ^ FastCGI Apache-Modul mod_fcgid
- ^ Debian-Bug #450748: Bitte Unterstützung für TCP/IP-FastCGI-Server hinzufügen
- ^ Probleme mit Apache 2.4 und PHP-FPM
- ^ libapache-mod-fastcgi auf Github
- ^ „FastCGI – Der vergessene Schatz/ Abschnitt 2.3“ . Archiviert vom Original am 08.02.2010 . Abgerufen am 21.02.2006 .
- ^ Der FastCGI-Transport – reverse_proxy (Caddyfile-Direktive) – Caddy-Dokumentation
- ^ FastCGI für Cherokee
- ^ „FastCGI-Anleitung für Hiawatha“ . Archiviert vom Original am 11.10.2018 . Abgerufen am 27.07.2010 .
- ^ a b „FastCGI-Unterstützung in Jetty“ . Archiviert vom Original am 24.03.2020 . Abgerufen am 23.03.2017 .
- ^ FastCGI für Lighttpd
- ^ „FastCGI-Erweiterung für IIS 6.0 – RTM“ . FastCGI für IIS . Microsoft. 28.02.2008 . Abgerufen am 29.02.2008 .
- ^ „FastCGI Nginx module ngx_http_fastcgi_module“ . nginx.org . NGINX, Inc. Abgerufen am 20. Juni 2021 .
- ^ Erster Commit von httpd(8) für OpenBSD
- ^ „Technisches Datenblatt“ . Archiviert vom Original am 21.01.2018 . Abgerufen am 19.09.2016 .
- ^ Anwendungsbibliotheken, Entwicklungskits
- ^ „Matreshka“ . Archiviert vom Original am 20.01.2018 . Abgerufen am 06.10.2011 .
- ^ ExtPascal
- ^ Wie man FastCGI von Common Lisp aus verwendet
- ^ Goanna Eiffel
- ^ jFastCGI, ein Java-Servlet, das das FastCGI-Protokoll implementiert.
- ^ node-fastcgi npm-Paket
- ^ Es gibt mehrere FastCGI-Module für Perl: FCGI (ein kompiliertes Modul, geschrieben in C), FCGI::Async (für asynchrone FastCGI-Anwendungen), AnyEvent::FCGI (für AnyEvent -basierte Anwendungen), FCGI::EV (für EV -basierte Anwendungen), CGI::Fast (eine Perl- CGI -ähnliche Schnittstelle für FastCGI), FCGI::Client (eine FastCGI-Clientbibliothek) und Net::FastCGI (Konstanten und Funktionen zum Erstellen und Parsen von FastCGI-Nachrichten).
- ^ "PHP: FastCGI Process Manager (FPM) - Handbuch" .
- ^ Schnelleres CGI mit HHVM
- ^ Es gibt mehrere Rust-Crates: Eine Listener-Implementierung ist fastcgi , und fastcgi-client ist eine Client-Implementierung.
- ^ REAL Studio Web Edition erstellt Webanwendungen, die über FastCGI aufgerufen werden. Archiviert am 08.02.2011 im Internet Archive.
Externe Links
- „FastCGI.com-Archiv“ . Abgerufen am 1. Mai 2022 .— Abspaltung/Spiegelung der offline gegangenen FastCGI-Website
- Mark R. Brown (29. April 1996). „FastCGI-Spezifikation“ . Dokumentversion 1.0. Open Market, Inc. Abgerufen am 1. Mai 2022 .
- "FastCGI" . Archiviert vom Original am 20.03.2016.— Alte FastCGI-Homepage, wie sie beim Arbeiten aussah
- Implementierungen
- „mod_fcgid – FastCGI-Schnittstellenmodul für Apache 2 – Das Apache HTTP Server Projekt“ . Version 2.3.9. Apache Software Foundation. 8. Oktober 2013. Abgerufen am 1. Mai 2022 .— Implementierung für Apache httpd
- „FastCGI <fastCgi>“ . Dokumentation zum Internet Information Server . Microsoft. 06.04.2022. Archiviert vom Original am 27.01.2022 . Abgerufen am 01.05.2022 .— Implementierung für Microsoft IIS
- "Proxy FastCGI Scheme Apache Module" . ZenProjects. 09.10.2017 . Abgerufen am 01.05.2022 .— Experimentelle Implementierung für Apache 2.x mod_proxy