Superrychlé dynamické stránky FastCGI

Obsah internetových stránek prodělal od začátku 90. let rychlý vývoj. Po období statických stránek s malým množstv...


Obsah internetových stránek prodělal od začátku 90. let rychlý vývoj. Po období
statických stránek s malým množstvím grafiky se pomalu začínají prosazovat
multimédia a hlavně dynamické stránky. S jejich pomocí můžete uspokojit touhu
dnešních uživatelů po aktuálních informacích nebo on-line nakupování. To
všechno současní surfaři vyžadují, jediné, co ale nechtějí, je čekat. Pro co
nejrychlejší chod můžete udělat velice mnoho připojit server rychlou linkou,
optimalizovat grafiku nebo obsah. Hodně lidí ale zapomíná na vlastní proces
dynamického generování stránek. Ten je často svěřen pomalým interpretovaným
jazykům, skriptům nebo neoptimalizovaným programům. Výrazně urychlit a přitom
zachovat již jednou napsané zdrojové kódy umožňuje systém s názvem FastCGI.
Jedná se o vylepšení původního mechanismu CGI (Common Gateway Interface), který
zůstává i v současnosti tou nejpoužívanější a zároveň velice rychlou variantou.
Jejími hlavními konkurenty v generování dynamických stránek jsou skriptovací
jazyky (PHP, ASP, atd.), přímé propojení pomocí API (Application Program
Interface) webového serveru nebo použití aplikačních serverů (SilverStream,
HAHT, ColdFusion atd.). Skriptovací jazyky se mohou pochlubit svojí
jednoduchostí, velice rychlým vývojem a širokou bází znalostí. Bohužel jsou
často pomalé a nejsou platformně nezávislé (i když se již například objevují
portace PHP na Windows a ASP na UNIX). Úplně jiné jsou aplikace vyvinuté pomocí
API. Ty jsou velice rychlé, ale relativně složité. Používají stejný adresní
prostor a s webovým serverem komunikují pomocí daného rozhraní, které často
není příliš dobře dokumentované. Výsledná aplikace musí být tedy velmi
stabilní, případná chyba totiž může způsobit ukončení chodu celého webového
serveru. Toto řešení je také velice závislé na platformě a zejména na použitém
serveru. Co se týká aplikačních serverů, ty jsou v současné době velice v
kurzu. Většina velkých výrobců softwaru má nějaký aplikační server připraven a
snaží se s ním prosadit na trhu. Bohužel často naráží na nezájem zákazníků
řešení je totiž příliš mladé, nejsou velké znalosti s jeho používáním, je drahé
a platformě závislé (více o aplikačních serverech jste si mohli přečíst v CW
číslo 42/99). Zůstává nám tedy staré dobré CGI, které sice také není bez chyby,
ale pomocí FastCGI ho můžeme vylepšit do velice zajímavé podoby.
FastCGI versus CGI
CGI je již docela staré a relativně pomalé rozhraní, které neumožňuje uchovávat
perzistentní data a není škálovatelné. Na druhou stranu se jedná o jednoduchý,
lehce pochopitelný otevřený standard, nezávislý na použitém programovací jazyku
a platformě. Protože běží jako separátní proces, nemůže nijak narušit funkčnost
vlastního webového serveru. FastCGI je založen právě na těchto silných
stránkách a pokouší se vyřešit slabosti.
Hlavním problémem k řešení je zde rychlost CGI programy jsou pro každý dotaz
pouštěny znovu. Právě spuštění programu trvá často dlouhou dobu (to platí jak
pro malé programy v C, tak i pro obrovské perlové skripty). Další časově
náročnou a přitom velice častou operací je navazování spojení s databází,
jinými počítači nebo parsování velkých textových souborů. Všechny tyto problémy
řeší rozhraní FastCGI. Kromě výrazného zvýšení rychlosti má rozhraní FastCGI i
další výhody. Vlastní http protokol je bezstavový (stateless), ale Fast
CGI programy již nějakou historii mít mohou. Můžeme tak cachovat jednotlivé
odpovědi na dotazy, předpočítat si některé mezivýsledky, případně udržovat
informace od uživatele.
FastCGI je když...
Řešení, které nabízí FastCGI, je velice elegantní a jednoduché.
Program využívající rozhraní FastCGI běží jako separátní proces. Na rozdíl od
normálního CGI programu zůstává ale po vyřízení klientského požadavku v paměti
a je připraven odpovědět dalšímu klientovi. Běží jakoby v nekonečné smyčce. S
webovým serverem je propojen pomocí speciálního protokolu, který předává
informace od uživatele a přebírá výsledky programu. Standardní vstup, výstup a
chybový výstup je přesměrován tímto protokolem, pro normálního programátora tak
vlastně nedochází k žádným změnám. Celou aplikaci může snadno odladit jako CGI
program a pak lehce převést na FastCGI.
Komunikaci zajišťuje efektivní a lehký protokol, který v hlavičce specifikuje
typ přenášených dat a jejich délku. Kromě již zmiňovaného vstupu, výstupu a
chybového kanálu se jedná o předávané parametry (CGI environment variables),
data (používaná při filtraci) a o paket ukončující dané spojení.
Použití
FastCGI je navržen tak, aby šlo pro komunikaci mezi webovým serverem a
aplikacemi použít i TCP/IP protokol. To velice rozšiřuje možnosti použití.
Můžete tak velice lehce rozkládat výkon mezi více počítačů a zvýšit zabezpečení
vašeho Webu. Toho docílíte velice jednoduše jediným do Internetu přímo
připojeným počítačem bude webový server, zatímco vaše citlivé aplikace poběží
na vnitřních uzlech. Nejenomže tak ulehčíte webovému serveru, ale zvýšíte tím i
ochranu vaší sítě (přístup k citlivým datům bude umožněn pouze počítačům z
vnitřní sítě). To je ale spíše vedlejší efekt použití FastCGI, jeho hlavním
úkolem je plnit zejména jednu z následujících rolí: odpovídače, filtru a roli
autorizační.
Responder (odpovídač) nejčastější použití. Program funguje stejně jako jeho CGI
ekvivalent. Hlavní výhodou je v tomto případě výrazné zvýšení rychlosti,
možnost cachování. Výhodné je to například ve spojení s generováním dat z
databáze pomalé připojování k databázi je pak realizováno pouze na počátku.
Filtrační role aplikace funguje jako filtr. Stránky mohou být před předáním
uživateli upravovány (nastavení barevných preferencí, fontů, češtiny, dodání
standardních hlaviček dokumentům, implementace vložených příkazů apod.).
Autorizační role aplikace rozhoduje o umožnění přístupu jednotlivým uživatelům.
Pokud aplikace pošle jako odpověď "200 OK", pokládá webový server uživatele za
autorizovaného a žádaný dokument mu vydá. Jedná se tedy o ideální mechanismus
pro kontrolu přístupu pouze pro dané uživatele s využitím externí databáze.
Vlastní tvorba
V současné době existují implementace FastCGI v jazyce C, C++, Perl, Python,
Java a TCL. Pokud programujete v jiném, máte bohužel zatím smůlu. Oproti
programování CGI aplikací dochází pouze k malé změně. Struktura programu je asi
následující:
1. Inicializace například spojení s databází, příprava mezivýpočtů.
2. Vlastní nekonečný odpovědní cyklus uvnitř tohoto cyklu jsou zpracovávány
jednotlivé požadavky; tedy to, co bylo původně v CGI programu.
Prakticky může v jazyce C výsledný program vypadat například takto:
#include <fcgi_stdio.h>
void main(void)
{
int count = 0;
while(FCGI_Accept() >= 0) {
printf("Content-type: text/htmlrnrn ");
printf("Hello world!<br>rn");
printf("Request number %d.", count++);
}
exit(0);
}
V uvedeném velice jednoduchém příkladě vidíte všechny změny. Pokud uvedete
#include <fcgi_stdio.h>, budou funkce printf a podobné přesměrovány pomocí
protokolu FastCGI do webového serveru. Další nutnou změnou je cyklus
while(FCGI_Accept() >= 0) {}, ve kterém odpovídáte na klientské požadavky. Je
tedy vidět, že případný převod programů určený jako CGI aplikace do FastCGI je
velice jednoduchý. Podobně, jako je tomu u jazyka C, postupujte i ostatních
jazyků.
Dostupné implementace
Pro vývoj FastCGI aplikací je v prvé řadě potřeba knihovny pro vámi zvolený
jazyk. Pro většinu podporovaných jazyků existuje tzv. development kit. Ten si
můžete nahrát buď přímo z adresy www.fastcgi.com, nebo na některém z
odkazovaných serverů. Pomocí tohoto kitu budete moci začít psát svoje první
aplikace. Například pro jazyk C existuje varianta, kdy aplikace FastCGI
spouštíte jako normální CGI aplikace. Tím sice nedosáhnete onoho požadovaného
zrychlení, ale můžete si celou aplikaci vyzkoušet a přitom nemusíte nikterak
upravovat váš webový server.
Pro většinu podporovaných serverů to není složitá operace, je spíše časově
náročná. V současné době jsou podporovány všechny nejdůležitější webové
servery. V první řadě je to server Apache pro něj existuje implementace, která
je samozřejmě zdarma. Podporuje roli autorizační a roli odpovídače. Má v sobě
zabudovaný proces manager (ten umožňuje startování jednotlivých FastCGI
aplikací) a podporuje i připojování k FastCGI programům po síti. Jeho
konfigurace sice není úplně triviální, ale poskytuje vám za to dostatečné pole
působnosti pro opravdové vyladění celého systému. Dalšími podporovanými servery
jsou Zeus a PI3Web. Nesmíme samozřejmě zapomenout na servery firem Microsoft a
Netscape. Pro ty existuje díky firmě Fast Engines komerční implementace (cena
je 3 500 dolarů za procesor, možné jsou množstevní limity a případná technická
podpora).
Potřebuji ho opravdu?
FastCGI se zdá jako velice zajímavá varianta, která může zvýšit výkonnost
webového serveru s relativně malými náklady. Umožňuje zvýšit výkon již jednou
vytvořených a odladěných CGI programů bez větších problémů. Může také pomoci
při distribuování výkonu mezi více počítačů. Na druhou stranu jeho implementace
je zbytečná pro málo zatížené webové servery s malým množstvím aktivních CGI
programů. Někdy může být dokonce nebezpečná, je třeba si uvědomit, že program
běží jakoby v nekonečné smyčce. Pokud tedy každým průchodem spotřebovává
některé systémové prostředky, jako je zejména paměť, může dojít k nečekaným
komplikacím (tomu můžete zabránit preventivním ukončováním aplikace například
po 20 průchodech). Důležité ale je, že něco podobného existuje. Vývojáři tak
mají zase o možnost navíc, a myslím, že se vyplatí o ní uvažovat.
Důležité odkazy:
http://www.fastcgi.com centrála pro vývojáře
http://www.fastengines.com implementace pro Microsoft a Netscape servery
9 3347 / als









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.