WWW server

Pavel Frolík, xfrolik@fi.muni.cz


Obsah


HTTP protokol

zpět
HTTP (Hypertext Transfer Protocol) protokol definuje, jak formátovat a přenášet zprávy na WWW (World Wide Web) a jak mají reagovat na různé příkazy webové servery a prohlížeče. Přenášet lze nejenom textové soubory, ale i obrázky, zvukové či video soubory. Prohlížeč (Galeon, Konqueror, Mozilla aj.) je HTTP klient, který posílá požadavky na WWW server. Na něm běží HTTP démon, program čekající standardně na portu 80 na HTTP požadavky a řešící je, když přijdou. Např. napíšeme-li v prohlížeči nějakou URL adresu (Uniform Resource Locator), prohlížeč vytvoří HTTP požadavek a pošle jej na patřičnou IP adresu dle URL. HTTP démon přijme požadavek, zpracuje jej a vrátí příslušný soubor. HTTP protokol je bezstavový protokol, tzn. že každý požadavek na novou webovou stránku je zpracován bez znalosti předchozího požadavku. Protože však uchování si stavu je velmi užitečné, bylo vyvinuto několik technik, které přidávají stavovost na WWW, např. NSAPI, ISAPI, cookies atd. Poslední verzí HTTP je HTTP 1.1 (RFC 2068, RFC 2616), používá se i verze HTTP 1.0 (RFC 1945). Níže uvádím kratkou ukázku komunikace přes HTTP protokol:
$ telnet www.fi.muni.cz 80
Trying 147.251.48.1...
Connected to www.fi.muni.cz.
Escape character is '^]'.
GET / HTTP/1.0

Zde je místo pro uvedení hlaviček, např. Accept pro uvedení akceptovaného MIME typu, Accept-Charset, Accept-Language, Accept-Encoding pro uvedení znakové sady, jazyku a kódování, kterým klient rozumí. Ukončují se prázdným řádkem.

HTTP/1.1 200 OK
Date: Mon, 21 Oct 2002 19:24:40 GMT
Server: Apache/1.3.26 (Unix) mod_ssl/2.8.10 OpenSSL/0.9.6e
Content-Location: index.cgi
Vary: negotiate,accept-charset
TCN: choice
Connection: close
Content-Type: text/html; charset=ISO-8859-2

<!-- begin include -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
...

Spolu s dokumentem obdržíme i hlavičky odpovědi jako např. Server identifikující programové vybavení serveru a hlavičky těla jako např. Content-Type určující formát posílaných dat.
Ve výše uvedeném příkladě byla použita metoda GET, z dalších metod uvádím jen POST, HEAD, PUT aj.

Vlastnosti WWW serveru Apache

zpět
Projekt Apache (A PAtCHy server) je open-source HTTP server podporující většinu verzí Unixu, OS/2, NetWare 5.x, Windows NT/9x aj., podporuje HTTP 1.1, je velmi dobře konfigurovatelný a rozšiřitelný díky modulům, stále se vyvíjí, implementuje mnohé mechanismy, např. DBM databáze pro autentizaci, nekonečný počet direktiv Aliases, Redirectives, vytvoření vlastnich souborů či CGI skriptů, které vrátí server při chybovém požadavku a mnoho dalšího (více viz dokumentace Apache).

Od dubna 1996 patří Apache mezi nejoblíbenější servery, podle výzkumu Netcraft Web Server Survey používá 63% webových stránek Apache. Zbytek si rozdělují Microsoft IIS, iPlanet a Zeus.

Instalace a konfigurace Apache

Na stránkách the Apache Software Foundation si lze stáhnout nejnovější verzi Apache 1.3.27 (souběžně se vyvíjí řada 2.x, aktuálně je to 2.0.43). Po rozbalení zdrojových souborů zbývá program nainstalovat. Instalace je však velmi jednoduchá.
$ ./configure --prefix=PREFIX
$ make
$ make install
$ PREFIX/bin/apachectl start

Apache je nainstalován do adresáře určeného řetězcem PREFIX (standardně /usr/local/apache). Výpisem
$ ./configure --help
zjístíme, jaké lze použít přepínače. Upozorňuji hlavně na volby
$ ./configure --prefix=/path/to/apache \
		--enable-module=NAME \
		--enable-shared=NAME

Hlavním konfiguračním souborem je PREFIX/etc/httpd.conf. Obsahuje direktivy rozdělené do třech základních oddílů:

  1. direktivy, které řídí činnost serveru jako celku (globální prostředí)
  2. direktivy, které definují parametry hlavního nebo implicitního serveru, které odpovídají na požadavky, které nejsou zpracovávány virtuálním hostitelem. Tyto direktivy obsahují také výchozí hodnoty nastavení všech virtuálních hostitelů
  3. nastavení virtuálních hostitelů, kteří umoňují odesílat webové požadavky na různé adresy IP nebo názvy hostitelů a jejich zpracování stejným procesem serveru Apache

Níže uvádím jen některé direktivy, které mně přijdou důležité:

ad 1)
ServerType - server je buď spuštěn samostatně (standalone) nebo přes inetd démona (inetd)
ServerRoot - počátek adresářového stromu, ve kterém jsou uloženy konfigurační a chybové soubory a soubory protokolů serveru
Timeout - počet sekund do vypršení času
KeepAlive - určuje, zda povolíte nebo zakážete trvalá spojení (více než jeden požadavek na jedno spojení)
MaxKeepAliveRequests - maximální počet povolených požadavků při trvalém spojení (0 značí nekonečno)
MaxRequestsPerChild - počet požadavků, které může každé vlákno zpracovat než zanikne
ThreadsPerChild - počet souběžných vláken (tj., požadavků), které server umožní
Listen - definuje na které adrese a portu server naslouchá
BindAddress - pomocí této volby můžete podporovat virtuální hostitele. Tato direktiva se používá proto, aby sdělila serveru, na které adrese IP má naslouchat
LoadModule - zavede modul, který byl vytvořen jako DSO

ad 2)
Port - port, na kterém samostatný (standalone) server naslouchá
ServerAdmin - adresa, kam by měly být e-mailem zasílány informace o problémech se serverem
ServerName - platný název DNS našeho hostitele
DocumentRoot - adresář, ve kterém jsou uloženy dokumenty, soubory lze však uložit i jinam a poté se na ně odkazovat pomocí Aliases
Directory - pro nastavení vlastností zpřístupněného adresáře
DirectoryIndex - název souboru nebo souborů, které se mají defaultně použít
AddType - umožňuje opravu MIME typů bez skutečného upravování nebo stanovení určitých typů pro určité soubory (např. AddType application/x-httpd-php .php)
Location - povolení zobrazení stavu serveru na URL http://název_serveru/server-status je <Location /server-status>, povolení zpráv o konfiguraci vzdáleného serveru na URL http://název_serveru/server-info je <Location /server-info>

ad 3)
Definice virtuálních hostitelů se provádí mezi direktivy <VirtualHost> a </VirtualHost> Direktivy uvedené v oddílu 2 platí i pro virtuální hostitele, mohou se však objevit i zde a přenastavit původní hodnoty. Pokud chceme používat virtuální hostitele pomocí jejich názvů, musíme pro ně nadefinovat alespoň jednu adresu IP (a číslo portu) např.
NameVirtualHost 192.164.100.5        // IP adresu lze v tomto případě nahradit "*"
<VirtualHost 192.168.1.11>
         ServerAdmin admin@web1.cz
         DocumentRoot /doc/web1
         ServerName www.web1.muj.cz
</VirtualHost>
<VirtualHost 192.168.1.11>
         ServerAdmin admin@web2.cz
         DocumentRoot /doc/web2
         ServerName www.web2.muj.cz
</VirtualHost>
Výše uvedené virtuální servery jsou rozlišeny na základě jména, mohou tak sdílet stejnou IP adresu, virtuální servery lze rozlišit i na základě IP adresy. Server může mít i více jmen, např. uvedu-li direktivu
<ServerAlias> muj.cz *.muj.cz
v definici prvního virtuálního hostitele, bude každý požadavek na doménu muj.cz obsloužen tímto virtuálním serverem. Samozřejmě musí být také správně nakonfigurován DNS server, aby mapoval tato jména na nějakou IP adresu spojenou s naším serverem.

Moduly

zpět
Už jsem zde zmínil pojem moduly. Apache má dva druhy modulů, moduly zakompilované v sobě a moduly, které se spouští při startu (DSO - Dynamic Shared Object), zda to dovolíme, závisí na konfiguračním souboru (viz direktiva <LoadModule>). O tom, jestli modul bude spuštěn při startu Apache dynamicky, můžeme rozhodnout už při instalaci volbou:
--enable=shared=NAME       // jméno modulu
Pozor, abychom mohli využít výhod DSO mechanismu, je třeba mít staticky zakompilován modul mod_so. Existují speciální parametry, které "usnadní" vypisování jednotlivých modulů
/configure --prefix=/path/to/apache \
	   --enable-module=most \       //zpřístupňuje většinu modulů
           --enable-shared=max          //kompiluje je jako dynamické
Výhody DSO: Nevýhody DSO:

SSL vrstva

zpět
SSL (Secure Sockets Layer) je vrstva využívající protokol HTTPS, SSL bylo vyvinuto společností Nestcape pro přenos privátních dat přes Internet. Klient se serverem si vymění informace o verzi SSL a parametrech šifrování. Klient získá veřejný klíč serveru, obě strany vytvoří session key (symetrický), kterým je nadále komunikace šifrována. Pro začlenění SSL do Apache slouží modul mod_ssl.
Aby Apache podporoval SSL je nutné nainstalovat speciální verzi Apache, která má již v sobě podporu SSL zakompilovanou nebo využít sesterských projektů mod_SSL (verze 2.8.11-1.3.27) a OpenSSL (verze 0.9.6g).
Instalace je velmi dobře popsána v instalačním souboru v adresáři mod_SSL, zde uvádím jen stručný výtah:

$ cd openssl-0.9.6g
$ sh config
$ make
$ cd ../mod_ssl-2.8.11-1.3.27
$ ./configure --with-apache=../apache_1.3.27 --with-ssl=../openssl-0.9.6g --prefix=/path/to/apache
$ cd apache_1.3.27
$ make
$ make certificate
$ make install

Toto vytvoří sám sebou podepsaný certifikát, což z hlediska důvěrnosti není moc dobré. Lepší je vygenerovat si vlastní klíč a žádost o certifikát a tu poslat certifikační autoritě. Získaný certifikát pak implementovat do Apache.


$ openssl genrsa -des3 -out mujserver.key 2048
$ openssl req -new -key mujserver.key -out mujserver.csr

Pak by se Apache zkompiloval následovně:

...
$ cd ../mod_ssl-2.8.11-1.3.27
$ ./configure --with-apache=../apache_1.3.27 \
   --with-ssl=../openssl-0.9.6g \
   --with-crt=/cesta/k/mujserver.crt \
   --with-key=/cesta/k/mujserver.key \
   --prefix=/path/to/apache
...

Konfigurace SSL se provádí také v httpd.conf, následuje výpis nějakých důležitých direktiv:
Port - port vyhražený pro SSL je 443
SSLCertificateFile - určuje cestu k veřejnému certifikátu serveru
SSLCertificateKeyFile - určuje cestu k tajnému klíči serveru
SSLEngine on - povoluje SSL

Apache se pak spuští příkazem:

$ PREFIX/bin/apachectl startssl

CGI skripty

zpět
CGI (Common Gateway Interface) umožňuje spouštět na serveru programy, jejichž výstup je předán klientovi. Vše se opět nastavuje přes konfigurační soubor httpd.conf.
ScriptAlias - toto řídí, které adresáře obsahují skripty serveru, např.
 ScriptAlias /cgi-bin/  "/var/web/cgi-scripts/"
V adresáři /var/web/cgi-scripts/ budou uloženy naše CGI skripty, v prohlížeči se na ně budeme odkazovat jako http://servername/cgi-bin/skript.cgi
<Directory "/var/web/cgi-scripts">
 Options +ExecCGI          // povolí spouštět CGI skripty v daném adresáři, nemají-li mít uživatelé přístup do hlavního adresáře s CGI
 skripty, ale mají-li mít možnost spouštět vlastní skripty, uvede se tato volba v jejich domovských adresářích.
</Directory>
Jiná možnost k výše uvedenému je použít volby
 AllowOverride Options
a v adresáři, u kterého je tato volba, se bude hledat soubor .htaccess, v něm muže být uvedeno
 Options +ExecCGI          // zařídí spouštění skriptů z tohoto adresáře

AddHandler cgi-script .cgi      // na soubory s příponou CGI bude nahlíženo jako na CGI skripty

Kernelový httpd

zpět
kHTTPD je http démon zakompilovaný jako modul do linuxové jádra.
kHTTPD je určen pro statické stránky a obrázky, dynamické stránky (Java servlet, PHP či CGI skript) umí přesměrovat na jiný webový server (např. Apache).
Jeho podstatnou výhodou je, že dokáže zpracovat více žádostí za sekundu než třeba Apache (viz srovnání výkonu). Je možné provozovat kHTTPD i Apache najednou, každý však musí poslouchat na jiném portu (u Apache volba Listen, u kHTTPD editace souboru config.h). Poté následuje
$ make
$ insmod khttpd.o
$ echo 1 > /proc/net/khttpd/start
Odebrání modulu:
$ echo 1 > /proc/net/khttpd/stop
$ rmmod khttpd
Zdrojové soubory jsou např. k dostání na adrese http://www.fenrus.demon.nl/