WWW server

Michal Merta, xmerta@fi.muni.cz


Obsah


Co je to www server?

WWW server je služba zajišťující zpřístupnění internetových stránek pro nelokální uživatele. Dále se zabývá např. řízením a bezpečností komerčních transakcí a streamování videa či zvuku. Samozřejmě existuje více druhů www serverů, ale mezi ty nejrozšířenější patří právě Apache, o kterém dneska budu mluvit.

Apache

Slovo Apache vzniklo ze spojení A PAtCHy server. Původně byl Apache postaven na programu NCSA httpd a spoustech patchů. Jaké jsou vůbec přednosti Apache? Především je zdarma a open source, je schopen zpracovávat nejnovější protokoly, je vysoce konfigurovatelný, modulární (v tomto smyslu to znamená možnost použití modulů, které lze do Apache zakompilovat později), je možno psát vlastní moduly s použitím Apache API, stále se vyvíjí. Další jeho obrovskou výhodou je to, že existuje pro různé platformy. (unix,windows).

Kompilace Apache

Po stáhnutí apache na
http://www.apache.org/dist/httpd můžeme začít kompilovat. Samozřejmě Apache lze nainstalovat pomocí rpm balíčků ve vaši oblíbené distribuci.
Kompilace začíná typicky příkazem configure s možností využít parametry.
Nejdůležitější je parametr prefix, kam bude apache nainstalován (defaultně /usr/local/apache), dále je možno použít volbu --enable-module=most, abychom později nemuseli přidávat všechny základní moduly. (tento přepínač nainstaluje apache s těmi nejnutnějšími a nejpotřebnějšími moduly).Pokud chceme pouze některé moduly, můžeme použít volbu --enable-module=jmeno_modulu. O modulech se dozvíte více na http://modules.apache.org
		root$ ./configure --prefix=CESTA --enable-module=most --enable-shared=max
	        root$ make
	        root$ make install
		root$ CESTA/bin/apachectl start
		
Pokud budeme v budoucnu chtít připojit k apachi nějaký modul použijeme následující kroky.
		root$ ./configure --prefix=CESTA --add-module=cesta_k_module --enable-shared=modul
Samozřejmě musíme posléze apachi o novém modulu říct direktivou LoadModule, ale o tom dále.

Konfigurace Apache

Jak už jsem se zmínil, Apache je vysoce konfigurovatelný. Nejdůležitější soubory se nacházejí v adresáři CESTA/etc.
Najdeme tam tyto:
		httpd.conf
		access.conf
		srm.conf

		httpd.conf - tento hlavní konfigurační soubor je poměrně slušně dokumentován

		ServerType - standalone - server je spouštěn samostatně
		ServerRoot - cesta ke konfiguračním souborům
		ServerName - jméno serveru
		ServerAdmin - root@server
		DocumentRoot - cesta ke kořenovému adresáři s dokumenty
		ErrorLog - logs/error_log --cesta, kde se mají ukládat chybové hlášky Apache
		LogLevel - nastavení priority logů (stejně jako u syslogu)
		AccessFileName - jméno souboru, který se má v každém adresáři hledat kvůli povolení přístupu (typicky .htaccess)
		Timeout - timeout
		MaxClients - maximální počet klientů
		Listen - adresa a port
		AddModule - aktivace načtených modulů,příp. zakompilovaných v apachi
		LoadModule - načtení modulů dynamických (např. LoadModule proxy_module modules/ApacheModuleProxy.dll)
Další neméně důležitá věc je definování adresářů a jejich "práv".
		Directory - označuje určitou skupinu, pro kterou budou platit nějaké pravidla (Options)
		Options může nabývat hodnot:
		None - žádné zvláštní práva a omezení
		All - povoluje se vše kromě MultiViews - výchozí volba
		ExecCGI - povoleno spouštění cgi skriptů
		FollowSymLinks - server se bude odkazovat na symbolické linky v tomto adresáři
		Indexes - pokud server nenajde soubor definovaný v DirectoryIndex 
			  (většinou index.html, index.htm, index.php), je povolen výpis daného adresáře
Další jsou: Includes, IncludesNOEXEC, MultiViews,SymLinksIfOwnerMatch

Příklad nastavení adresáře /usr/local/httpd/htdocs
		
		<Directory /usr/local/httpd/htdocs>
		Options Indexes FollowSymLinks
		</Directory>
Tyto volby povolují pouze odkazovat na symbolické odkazy a vypsat adresář při nenalezení DirectoryIndex. Např. uživatel z tohoto adresáře nemá právo spustit cgi skript.
Další příklad:
		<Directory "/home/*/public_html">
		      Options FollowSymLinks ExecCGI Includes
		</Directory>

Virtuální server

Velkou výhodou Apache je, že podporuje tkzv. virtuální servery,tzn. na jednom stroji může běžet více serverů. Rozlišujeme dva základní typy virtuálních serverů:
1) Rozlišování podle IP adresy - stejné jméno, navenek různá IP adresa
2) Rozlišování podle jména - stejná IP adresa, různá jména

Příklad serveru rozlišujícího podle jména - IP adresa zůstáva stejná
			       
		NameVirtualHost 111.22.33.44
		
		<VirtualHost 111.22.33.44>
		 	ServerName www.domain.tld
			DocumentRoot /www/domain
			</VirtualHost>
			<VirtualHost 111.22.33.44>
		        ServerName www.otherdomain.tld
		        DocumentRoot /www/otherdomain
		</VirtualHost>
Jeden virtuální server může být identifikován více IP adresami.
Např.
		<VirtualHost 192.168.1.2 204.255.176.199>
	  		DocumentRoot /www/docs/host.foo.com
		   	ServerName host.foo.com
		   	ServerAlias host
		</VirtualHost>

CGI skripty

K tomu, aby na našem Apachi šly spouštět cgi skripty, je potřeba udělat následující úpravy v souboru httpd.conf
		LoadModule cgi_module modules/mod_cgi.so
		AddModule mod_cgi.c  
		AddHandler cgi-script .cgi
		ScriptAlias /cgi-bin/ "/var/www/cgi-bin"
Prvním příkazem jsme nahráli modul pro cgi, druhým tento modul aktivovali, třetím příkazem řekli Apachi, že přípony cgi má považovat za cgi skript a poslední příkaz zaručí, že pokud budeme volat http://server/cgi-bin bude nás to odkazovat na absolutní adresu daného stroje /var/www/cgi-bin Samozřejmě nesmíme zapomenout na přidání volby spouštět cgi skripty v daném adresáři. Toto provedeme takhle:
		<Directory "/var/www/cgi-bin">
			Options ExecCGI
		</Directory>
Podobná situace by nastala, pokud bychom chtěli například nakonfigurovat php na našem serveru.

SSL

		ftp://ftp.modssl.org/source/mod_ssl-2.8.12-1.3.23.tar.gz
		ftp://ftp.openssl.org/source/openssl-0.9.6g.tar.gz
K čemu je vlastně SSL?
SSL slouží k bezpečnému přenosu dat, toto spojení je šifrované. SSL používá dva klíča, tkzv. veřejný a šifrovaný. K tomu, abychom na našem Apachi mohli používat SSL potřebujeme openssl.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html Instalace je poměrně jednoduchá
		root$ ./config
		root$ make
		root$ make test
		root$ make install
Tato posloupnost příkazů nainstaluje OpenSSL do standardního adresáře /usr/local/ssl
Pokud chceme OpenSSL nainstalovat někam jinam, slouží nám k tomu již známé přepínače.
		root$ ./config --prefix=/usr/local --openssldir=/usr/local/openssl
--prefix=DIR říká, že OpenSSL se nainstaluje do adresářů DIR/bin, DIR/lib, DIR/include/openssl.
Konfigurační soubory, které OpenSSL používá budou uloženy v DIR/ssl, pokud nepoužijeme parametr --openssldir, jako je uvedeno v předchozím příkladě.
Další možnosti konfigurace u configu jsou:
		no-threads
		threads 
		no-shared 
		shared  
		no-asm 
		386
		no-<cipher>
Pokud máme zkompilovaný OpenSSL, můžeme se pustit do konfigurace mod_ssl.
		
		$ cd mod_ssl-2.8.12-1.3.22
		$ ./configure --with-apache=../apache_1.3.x --with-ssl=../openssl-0.9.x --prefix=/path/to/apache
		$ cd apache_1.3.x 
		$ make           
		$ make certificate
		$ make install   

Parametry pro aktivování SSL
		port - pro SSL je vyhrazen port 443
		SSLEngine on - aktivuje ssl engine
		SSLCertificateFile - cesta k veřejnému klíči
		SSLCertificateKeyFile - cesta k tajnému klíči

mod_czech

Mod_czech je český kodovací modul pro web-server Apache. Narodní znakové sady - problém který doprovází počítače již od počátku. Problém se zvětšil s příchodem počítačových sítí, každá se s českými znaky vypořádá po svém. Modul mod_czech umožňuje interní překódování dokumentu již na www-serveru bez nutnosti volání CGI programů, jako tomu bývalo dříve. Tato CGI metoda ovšem výrazně zatěžovala výkonnost serveru. Modul se pokusí automaticky detekovat klienta a posílá mu dokumenty automaticky ve správné kódové stránce. Neznámému klientovi se posílá dokument v US-ASCII s možností explicitně si kódování změnit. Modul je schopen překódovat standardní dokumenty (html,txt,..), CGI programy, SSI (Server Side Include) dokumenty. Uživatel má možnost sám určit typ kódování pomocí postfixu. Např. http://jmeno.serveru.cz/cesta/ke/strance/stranka.html.CISO8859-2. K dispozici jsou tyto znakové sady:
		US-ASCII 
		ISO-8859-1 
		UTF-8 (Unicode UTF-8) 
		ISO-8859-2 
		windows-1250 
		x-mac-ce (Macintosh CE) 
		CP852 (PC Latin-2) 
		x-kam-cs (Kód Kamenických) 
		CSN_369103 (KOI8CS)
K tomu, aby nám fungoval mod_czech je potřeba překompilovat apache s direktivou
		
		--activate-module=src/modules/czech/libczech.a --disable-shared=czech

Kernelový http

Kernelový httpd je HTTP server, je používán jako modul pro linuxové jádro. Abychom mohli khttpd zkompilovat, musíme mít povolenou volbu Kernel httpd acceleration, což lze udělat ve vlastnostech sítě. K čemu vlastně khttpd, když máme Apache? khttpd je určen pro statické stránky, v případě dotazu na dynamické stránky umí dotaz přenést na Apache nebo nějaký jiný webserver. Je používán kvůli své rychlosti.

Protokol HTTP

Klient komunikuje se serverem systému WWW protokolem HyperText Transfer Protocol (http). Protokol http je obecným aplikačním protokolem. Jeho použití není vázáno jen na přenos dokumentu, ale lze jej použít také pro přenos libovolných binárních dat a pro obecnou komunikaci mezi klienty a aplikačními bránami (proxy servery). První verze protokolu vznikla při vývoji systému WWW ve středisku CERN. Pro přenos hypertextových dokumentů byl požadován jednoduchý protokol, bez složitého spojování, autorizace a signalizace. Původní protokol klientovi umožňoval pouze navázat spojení se serverem, zaslat požadavek ve tvaru GET , prečíst odpověď a uzavřít spojení. Server pouze přijal požadavek, zpracoval jej a odeslal požadovaný dokument nebo zprávu o chybě.
Brzy se ukázalo, že natolik jednoduchý protokol nestačí. Klient nebyl schopen rozeznat atributy zaslaného dokumentu jinak, nez z přípony jména dokumentů. To původně nevadilo, protože byl omezen počet zpřístupněných dokumentů a vesměs se jednalo o textové nebo hypertextové dokumenty. Po zavedení odkazů na obrázky, zvuky, videosekvence a jiné typy médií se ukázalo nepružné odvozovat typ dokumentů na straně klienta podle přípony jména dokumentu na straně serveru. Dalším problémem byla neznalost velikosti dokumentu, klient musel číst data, která mu posílal server, tak dlouho, dokud server neukončil spojení. Uživatel při přenosu nevědel, jak velký bude přenášený dokument a nemohl se podle toho zařídit. Rovněž neexistoval způsob, jak zjistit čas poslední modifikace dokumentu a klient proto musel přenáset každý dokument vždy znovu.
První vylepšení na sebe nenechalo dlouho čekat, a protože jsou při přenosu zpráv v rámci Internetu používány textové hlavičky, bylo logickým krokem doplnění hlaviček do požadavku klienta i odpovědi serveru. Textové hlavičky ve tvaru "Jméno: hodnota" umožňují neomezený budoucí vývoj protokolu doplňováním dalších hlaviček. Základní sada hlaviček popisuje typ a atributy dokumentu a vychází ze standardu MIME (Multipurpose Internet Mail Extensions, RFC1521). Ostatní hlavičky slouží pro přenos pomocných informací a předávání parametrů mezi klientem a serverem.
Zavedení hlaviček do požadavku a odpovědí přineslo problém rozlišení požadavku původní verze protokolu od verze s hlavičkami. Protože při komunikaci klienta se serverem mohou nastat všechny čtyři kombinace (starý klient/starý server, starý klient/nový server, atd.), bylo třeba rozlišit, zda se jedná o požadavek původního nebo nového protokolu, a zda se jedná o odpověď původního nebo nového protokolu. Rozlišení bylo dosaženo doplněním verze protokolu za jménem požadovaného dokumentu. Pokud dostane takovýto požadavek starý server, označení protokolu za jménem dokumentu bude buď ignorovat, nebo ho bude chápat jako součást jména dokumentu a odpoví chybou. Odpověd novým protokolem je odlišena tím, že musí obsahovat na prvním řádku výsledek ve tvaru "verze_protokolu kód_odpovědi". Protože staré servery předávaly pouze hypertextové dokumenty, které by neměly obsahovat takovýto tvar prvního řádku, je toto rozlišení postačující. Tento způsob rozlišení starého a nového protokolu zároveň dovoluje rozlišení novějsích verzí protokolu.

Jak pracuje HTTP protokol?

HTTP protokol verze 1.0 vychází z modelu dotaz-odpověd. Klient pošle požadavek na server, server klientovi odpoví a komunikace se uzavírá. Požaduje-li opakovaně klient stejná data od serveru, navazuje se nové spojení a server opět posílá data. Případné uchování některých informací o komunikaci mezi klientem a serverem (např. o tom, která data již dříve klient obdržel) je ponecháno zcela na klientovi. Protokol si informace o již provedených spojeních neudržuje, je to protokol bezstavový.
Většina HTTP komunikace je iniciována klientem a sestáva z požadavku na nějaký server. Tento jednoduchý příklad můze být realizován jedním spojením mezi klientem a serverem.
Předpokládejme, že klient chce získat od serveru se jménem server soubor. Klient tedy vyšle dotaz začinající dotazovým řádkem:
		GET /cesta/soubor  HTTP/1.1
Server mu jako odpověd pošle požadovaný soubor nebo chybové hlášení. Za povšimnutí stojí to, že v dotazu klienta není specifikována adresa ani jméno serveru. IP adresu totiž využívává protokol transportní tj. IP protokol. HTTP protokol jen po již navázaném spojení vysílá dotaz na konkrétní soubor.

V předchozích verzích protokolu bylo pro každé URL navazováno zvláštní TCP spojení. V případě obrázků vložených v html stránce navazoval klient v krátkém časovém rozmezí několik spojení na stejný originální server. To zvyšovalo zátěž serveru a vytížení linek v Internetu.

Verze HTTP 1.1 zavádí možnost trvalého spojení. V rámci tohoto spojení pak klient posíla všechny své požadavky na server a server mu po tomto spojení posílá své odpovědi. Je definován mechanismus ukončení spojení. Ve verzi HTTP 1.1 je trvalé spojení chápáno jako implicitní pro všechny HTTP spojení. Není-li tedy řečeno jinak, může klient předpokládat, že server udržuje trvalé spojení a naopak. Spojení zůstává otevřeno do té doby, dokud klient nebo server spojení neukončí. Spojení se ukončuje vysláním hlavičky Connection: close, požadavek obsahující tuto hlavičku je poslední na daném spojení. Je-li signalizováno ukončení spojení od serveru, nesmí již klient poslat po spojení další požadavek. Všechny zprávy posílané v trvalém spojení musí mít definovanou délku v hlavičce Message-length.
Příklady:
 
		GET /index.html HTTP/1.0
                Accept: text/html
                Accept: image/gif
                User-Agent: mozilla
                Form: alena@info.pvt.net
                * prázdný řádek *

		HTTP/1.0 200 OK
                Server: Netscape-Enterprise/2.0a
                Date: Thu, 06 Mar 1997 16:23:43 GMT
                Accept-ranges: bytes
                Last-modified: Fri, 22 Dec 1995 17:41:00 GMT
                Content-length: 1032
                Content-type: text/html

                <HEAD>
                <TITLE> Obrazky ze sveta  </TITLE>
                </HEAD>
                    
		<BODY>
		...

Seznam HTTP hlaviček je na
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html