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: CGI má ale i své nevýhody:

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:

FastCGI

Fast CGI kombinuje výhody CGI a API serveru. Stejně jako CGI běží i FastCGI jako oddělený proces. Výhody:

FastCGI rozhraní

FastCGI rozhraní je velice podobné rozhraní CGI. Má dvě odlišnosti:
  1. FastCGI proces je trvalý, po obsloužení jednoho požadavku se neukončuje, ale čeká na další požadavek.
  2. 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.

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.

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í: 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:

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:

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:

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í: Čá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:
  1. Definování aplikační třídy.
    Pro lokální aplikace specifikuje aplikační třída detaily spuštění FastCGI aplikace jako jsou: 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.
  2. 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/