FastCGI vysoce výkonné rozhraní WWW serveru
FastCGI je rychlé, otevřené a bezpečné rozhraní WWW serveru, které řeší problémy klasického CGI.
CGI
Jse o standardní rozhraní pro aplikace na WWW, které bylo poprvé implementováno u NCSA serveru. CGI má mnoho výhod:
- Jednoduchost.
- Svobodná volba programovacího jazyka.
- Oddělenost procesu.Aplikace běží jako samostatný proces, chyba v aplikaci nemůže způsobit pád serveru. Z aplikace nelze vniknout do chráněných oblastí serveru.
- Jde o otevřený standard. CGI jsou implementovány v každém WWW serveru.
- Nezávislost na architektuře serveru. CGI není svázáno s architekturou serveru (vícevláknová, jednovláknová architektura).
CGI má ale i své nevýhody:
- Výkonnost je nízká, neboť se pro každý požadavek server zakládá nový proces, který se po vyřízení požadavku ukončí.
- Omezená funkčnost. CGI pouze odpovídá na požadavky tak, že aplikace generuje odpověď (obvykle HTML soubor), která je posílána jako odpověď klientovi. CGI nemůže spolupracovat s částmi serveru jako je protokolování nebo autentizace.
API serveru
API je snahou prodecentů WWW serverů o řešení nevýhod CGI v rámci vlastního serveru. Mezi významné patří NSAPI od firmy Netscape a ISAPI od firmy Microsoft. Také free server Apache má své API.
API začleňuje aplikaci přímo do jádra serveru.
Aplikace realizované pomocí API serveru jsou výrazně rychlejší než CGI, aplikace běží v procesu vlastního serveru, tento proces je trvale spuštěn, neukončuje se a nezakládá jako CGI proces.
Aplikace realizovaná pomocí API nabízí rozmanitější funkce, nejen vytváření odpovědí na požadavky.
API však i nevýhody:
- Složitost vytváření.
- Určenost jazyka. Aplikace musí být psané v programovacím jazyce, který je určen výrobcem (obvykle C/C++).
- Proces aplikace není oddělený. Chyba aplikace může způsobit havárii celého serveru.
- Závislost na výrobci. API různých serverů jsou různá.
- Svázanost s architekturou serveru. Aplikace musí respektovat architekturu serveru. Pokud server podporuje multi-thready, musí aplikace být thread-save. Pokud se změní architektura serveru, změní se obvykle i API a aplikace je potřeba přepsat.
FastCGI
Fast CGI kombinuje výhody CGI a API serveru. Stejně jako CGI běží i FastCGI jako oddělený proces. Výhody:
- Výkonnost FastCGI proces je trvalý, je použitý opakovaně pro jednotlivé požadavky.
- Jednoduchost při přechodu z CGI Přechod je zjednodušen existencí FastCGI aplikační knihovny. Aplikace vytvořená s FastCGI knihovnou může běžet i jako obyčejné CGI (zpětná kompatibilita).
- Libovolně volitelný jazyk.
- Oddělenost procesu.
- Otevřený produkt FastCGI podporují různé servery - Apache, NCSA, komerční server od Misrosoftu a Nestcape.
- Nezávislost na architektuře serveru.
- Podpora pro distribuované zpracování. FastCGI umožňuje běh aplikací na vzdálených systémech, aplikace nemusí běžet přímo na počítači WWW serveru.
FastCGI rozhraní
FastCGI rozhraní je velice podobné rozhraní CGI. Má dvě odlišnosti:
- FastCGI proces je trvalý, po obsloužení jednoho požadavku se neukončuje, ale čeká na další požadavek.
- Místo proměnných prostředí a meziprocesorové komunikace, používá FastCGI jedno full-duplexní spojení pro všechnu komunikaci (chyby, standard. vstup, výstup, proměnné prostředí). To umožňuje běh FastCGI aplikací na fyzicky jiném počítači než běží WWW server. Ke komunikaci FastCGI aplikace a WWW serveru je použito TCP spojení.
Postup obsloužení požadavku jednovláknové FastCGI aplikace.
- WWW server vytvoří proces FastCGI aplikace. Proces je možné vytvořit při startu serveru nebo na požadavek.
- Proces FastCGI inicializuje aplikaci a čeká na požadavek od WWW serveru.
- Když přijde na WWW server požadavek od klienta, WWW server otevře spojení k FastCGI procesu. Server pošle tímto spojením informace CGI proměnných a standardního vstupu.
- FastCGI proces pošle stejným spojením standardní výstup a chyby.
- Požadavek je kompletní, když FastCGI proces uzavře spojení. Proces FastCGI pak čeká na další požadavek.
FastCGI aplikace může běžet lokálně (na stejném počítači jako WWW server) nebo vzdáleně. Pro lokální aplikace používá server ke komunikaci s FastCGI aplikací plně-duplexní meziprocesovou komunikaci (pipe). Pro vzdálené aplikace používá server TCP spojení.
Vzdálené FastCGI
Vzdálený běh aplikace má své výhody.
WWW server běží na vnější síti, zatímco FastCGI aplikace může běžet na vnitřní síti, chráněná firewallem před neoprávněnou manipulací. Pomocí vhodné konfigurace firewallu a auditování je možné celkem bezpečně a rychle poskytovat data z interních aplikací do vnější sítě.
V případě CGI a API serveru musí aplikace běžet na stejném počítači jako WWW server.
Při použití FastCGI mohou být různé aplikace umístěny na různých uzlech.
Otázky bezpečnosti a FastCGI
FastCGI aplikace může akceptovat pouze spojení z WWW serveru, který má danou IP adresu. Budoucí verze protokolu bude obsahovat podporu pro autentizaci WWW serverů i podporu pro spojení pomocí bezpečných protokolů jako je např. SSL nebo PCT.
FastCGI protokol
FastCGI protokol je protokol používaný ke spojení mezi WWW serverem a FastCGI aplikací. Většina tvůrců aplikací používá aplikační knihovnu FastCGI a nepotřebuje detailně znát vlastní protokol.
FastCGI protokol používá ke komunikaci jednoduchý paket. Tvar paketu je stejný v obou směrech.
- Pole verze protokolu specifikuje použitou verzi protokolu FastCGI.
- Pole typ specifikuje typ věty.
- FCGI_PARAMS - používá se pro posílání dvojic jméno/hodnota (CGI proměnné prostředí) z WWW serveru do aplikace.
- FCGI_STDIN - používá se pro zaslání standardního vstupu z WWW serveru do aplikace.
- FCGI_DATA - používá se pro zasílání filtrovaných dat (viz dále).
- FCGI_STDOUT - používá se pro zaslání standardního výstupu z aplikace WWW serveru.
- FCGI_STDERR - používá se pro zaslání standardního chybového výstupu z aplikace WWW serveru.
- FCGI_END_REQUEST - Ukončuje požadavek (tento typ věty může poslat server i aplikace).
- Pole ID požadavku jednoznačně identifikuje dílčí požadavek. Jednoznačná identifikace umožňuje posílat jedním spojením více požadavků.
- Pole délka dat specifikuje počet bytů dat.
Funkce FastCGI
Základní nedostatek CGI je omezená funkčnost. CGI programy pracují pouze jako generátory odpovědí na požadavek. FastCGI má rozšířenou funkčnost, podporuje tři skupiny akcí:
- Generuje odpověď na požadavek - základní funkce (Responder role).
- Funguje jako filter (Filter role).
- Může provádět autorizaci (Authorizer role).
V dalších verzích budou přidány další funkce.
Generátor odpovědi na požadavek
FastCGI vytváří odpověď na požadavek, stejně jako běžné CGI programy. Když přijde na WWW server požadavek, FastCGI program vytvoří odpověď a tato odpověď je vrácena klintovi. Odpovědí bývá nejčastěji HTML stránka.
Filter
FastCGI pracuje jako filter tj. může zpracovat požadovaný soubor před tím než jej odešle klientovi.
Předpokládejme, že je server nakonfigurován tak, aby všechny soubory s příponou .sgml před odesláním zpracoval pomocí FastCGI aplikace. V případě, že klient požaduje URL /dokument.sgml, ověří server oprávněnost přístupu, přeloží URL podle mapování a poté spustí FastCGI filter aplikaci, která má na vstupu soubor požadovaný v URL. Výstup z FastCGI (HTML soubor) je odeslán klientovi.
Výkonnost filter aplikace se zvýší pomocí kešování výsledků FastCGI filtru (server v požadavku poskytuje čas modifikace souboru, aplikace tedy může tento čas využít a v případě změny souboru na serveru obsah cache zrušit).
Filter aplikace jsou užitečné pro:
- Konverzi formátu za běhu
- Dynamické dokumenty (obsahující data z SQL databáze, nebo dynamicky vkládané inzeráty).
- Použití standardních předloh: záhlaví, pata a pozadí stránky.
Autorizace
FastCGI aplikace může kontrolovat oprávněnost požadavků.
FastCGI aplikaci jsou předány všechny informace z požadavku. Pokud autorizační aplikace ověří oprávněnost a vrátí výsledek "200 OK", pokračuje WWW server v obsluhování požadavku. Pokud aplikace vrátí jiný výsledek, je tento výsledek poslán klientovi a požadavek je ukončen.Odpověď aplikace může být libovolná platná HTTP odpověď včetně "Access Denied" nebo "Redirect".
Autorizace je užitečná pro:
- Kontrolu přístupu na jméno a heslo, které jsou uloženy v externí databázi.
- Komplexní řízení přístupu, jako je např. přístup podle hodin dne.
- Použití autentizačního kalkulátoru.
- Dynamické přesměrování, kdy jsou jednotliví uživatelé směrováni na různé stránky.
FastCGI aplikační knihovna
Open Market vytvořil aplikační knihovnu FastCGI, která implementuje FascCGI protokol. Vývojář tedy nemusí znát detaily protokolu FastCGI. Implementace FastCGI pomocí této knihovny je snadná.
Aplikační knihovna nahrazuje standardní I/O rutiny jazyka C, jako jsou printf() a gets(). Knihovna převádí odkazy na standardní vstup a výstup a na standardní chybový výstup do protokolu FastCGI.
Toto řešení má několik výhod:
- Vývojář se nemusí učit nové API pro vatváření FastCGI aplikací.
- Existující CGI programy, mohou být převedeny s minimálními opravami na FastCGI.
- FastCGI interprety pro Perl, Tcl a další interpretové jazyky mohou být použity bez modifikace interpretu vlastního.
Tvorba FastCGI scriptů
FastCGI script v jazyce Perl
Při spuštění aplikace napsané v jazyce Perl provede interpret Perlu nejprve syntaktickou kontrolu celého scriptu, teprve potom spustí vlastní script.
U FastCGI scriptů je potřeba tyto úvodní kroky provádět pouze jednou tak, aby vlastní odpověď scriptu na požadavek klienta byla co nejrychlejší.
První řádek perlovského scriptu je typický, udává cestu k interpretu jazyka Perl, který má v sobě rozšíření pro FastCGI.
Poté je potřeba Perlu sdělit, aby použil rozšíření FastCGI. Proto se do scriptu vkládá následující rádka. Vkládá se co možná nejblíže k začátku scriptu.
use FCGI;
Script je rozdělen do následujících dvou částí:
- Inicializační část, která je spuštěna pouze jednou.
- Obsluha vlastního požadavku. Tato část je provedena při každém volání FastCGI scriptu.
Část obsluhující vlastní požadavek má obvykle tento tvar:
while (FCGI::accept >= 0) {
# body of response loop
}
Volání accept
vrací hodnotu 0 pokaždé, když klient volá FastCGI script. V ostatních případech volání accept
vrací hodnotu -1.
Příklad FastCGI aplikace v jazyce Perl:
#!fcgi-savvy-perl
use FCGI; # importuje knihovnu; nutný řádek
# Inicializační část
$cnt = 0;
# smyčka pro obsluhu požadavku
while (FCGI::accept >= 0) {
print "Content-type: text/html\r\n\r\n";
print "<head>\n<title>FastCGI Demo Page (perl)</title>\n</head>\n";
print "<h1>FastCGI Demo Page (perl)</h1>\n";
print "This is coming from a FastCGI server.\n<BR>\n";
print "Running on <EM>$ENV{SERVER_NAME}</EM> to <EM>$ENV{REMOTE_HOST}</EM>\n<BR>\n";
$cnt++;
print "This is connection number $cnt\n";
}
FastCGI aplikace v jazyce C
#include
void main(void)
{
int count = 0;
while(FCGI_Accept() >= 0) {
printf("Content-type: text/html\r\n");
printf("\r\n");
printf("Hello world!<br>\r\n");
printf("Request number %d.", count++);
}
exit(0);
}
Aplikace vrací klientovi HTML odpověď "Hello world". Uchovává si navíc počet přístupů k aplikaci a tento počet zobrazuje.
Soubor fcgi_stdio.h nahrazuje standardní I/O knihovnu jazyka C FastCGI knihovnou. Rutina FCGI_Accept() přijímá nový požadavek od WWW serveru.
Převod exitujícího CGI programu
Aplikační knihovna je navržena tak, aby převod exitujícího CGI na FastCGI byl co nejjednodušší. Mnoho aplikací je možno převést na fastCGI přidáním smyčky, která obsahuje celý původní hlavní program a následným přeložením s aplikační knihovnou FastCGI. FastCGI aplikace má následující strukturu:
Initializace aplikace;
while(FCGI_Accept() >= 0) {
zpracování požadavku;
}
Programy vytvořené s aplikační knihovnou mohou pracovat jako FastCGI i jako běžné CGI aplikace, podle způsobu volání. Knihovna zjistí prostředí volání a automaticky použije FastCGI nebo standardní I/O rutiny.
Aplikace psané v jazyce Perl nebo jiných scriptových jazycích jsou převoditelné pomocí interpretu jazyka spojeného s aplikační knihovnou. Jsou dostupné interprety Perlu pro různé platformy Unixu. Interprety mají zpětnou kompatibilitu, je možné je použít jak pro FastCGI aplikace, tak pro běžné aplikace.
Konfigurace serveru
FastCGI aplikace jsou konfigurovány v konfiguračních souborech serveru. Konfigurace má dvě části:
- Definování aplikační třídy.
Pro lokální aplikace specifikuje aplikační třída detaily spuštění FastCGI aplikace jako jsou:
- Cesta k programu
- Parametry a proměnné prostředí předávané do procesu při startu
- Počet spuštěných procesů
Pro aplikace běžící na odděleném počítači specifikuje třída uzel a TCP port, kde aplikace běží. WWW server předpokládá, že je na vzdáleném uzlu aplikace spuštěna. Pokud přijde na WWW server požadavek a server není schopen se spojit na daném TCP portu s aplikací, zapíše chybu do log souboru a vrátí klientovi stránku s chybou.
- Mapování aplikační třídy na funkci (roli) aplikace.
Pro funkci generování odpovědí je potřeba konfigurovat část URL, podle které bude požadavek obsluhován FastCGI aplikací.
Pro filter je potřebné definovat příponu souboru, podle které server pozná, že požadavek bude obsloužen FastCGI aplikací.
Pro autorizacim je třeba definovat autorizační aplikaci stejným způsobem jako v jiných metodách přístupu (jméno uzly, uživatel/heslo, atd.).
Další informace
Další informace o protokolu FastCGI a poslední informace o standardizaci a podpoře ze strany serverů najdete na: http://www.openmarket.com/fastcgi/