WWW je síťová služba typu klient-server založená na třech techonogiích: protokolu HTTP, adresování dokumentů URL a jazyku dokumentů (X)HTML.
HyperText Transfer Protocol (HTTP) je síťový protokol aplikační vrstvy používaný mezi klientem a serverem k předávání dat. Klient posílá na server dotaz a server vrací odpověď. V současné době je nejnovější verzí HTML v1.1 (dnes se ještě používá verze HTML v1.0, starší již ne).
Komunikace v protokolu HTTP v1.x probíhá takto:
klient → server: | [metoda] [url] HTTP/1.x [hlavičky] \n [data dotazu] |
---|---|
server → klient: | HTTP/1.x [návratový kód] [popis kódu] [hlavičky] \n [data odpovědi] |
Metoda | Popis |
---|---|
HTML v1.0 | |
GET |
slouží k získání dokumentu ze serveru |
POST |
slouží k odeslání dat (např. z formuláře) |
HEAD |
podobná metodě GET s tím rozdílem, že server vrací jen hlavičky dokumentu |
HTML v1.1 | |
DELETE |
slouží k odstranění dokumentu na daném URL ze serveru |
PUT |
slouží k uložení předaného dokumentu na dané URL |
TRACE |
zjišťování spojení |
CONNECT |
nastavení způsobu spojení |
OPTIONS |
zjišťování možností spojení |
Hlavičky slouží pro přenos doplňujících informací. Každá hlavička je na samostatné řádce a má tvar [jméno hlavičky]: [hodnota]
.
Host |
udává plné doménové jméno virtuálního serveru |
Accept |
slouží pro uvedení MIME typů rozpoznávaných klientem |
Accept-Charset |
klient rozumí/preferuje zadané znakové sady |
Accept-Encoding |
klient rozumí/preferuje zadané kódování |
Accept-Language |
klient rozumí/preferuje zadané jazyky |
User-Agent |
řetězec identifikující typ klienta |
From |
adresa člověka zodpovědného za tento požadavek (využívá se zvláště při automatickém stahování/zrcadlení dokumentů) |
Referer |
ze které stránky jsme se sem dostali |
If-Modified-Since |
žádost o dokument, jen pokud byl od tohoto data modifikován |
|
Content-Type |
jaký MIME typ/kódování/jazyk je v datech použit |
Content-Length |
délka dat |
Date |
současné datum |
Expires |
do kdy je dokument platný |
Location |
URL, na které se má klient přemístit, aby získal požadovanou odpověď |
Server |
verze a typ serveru |
Retry-After |
za jakou dobu bude dokument přístupný |
Adresování dokumentů v Internetu provádíme pomocí Uniform Resource Locator (URL), kterým lze jednoznačně identifikovat dokument. Tvar URL je:
[schéma]://[uživatel]:[heslo]@[server]:[port]/[umístení]
Pokud označuje umístění
pouze adresář, předá se buď soubor implicitního jména určeného serverem (např. index.html), nebo obsah (výpis) adresáře. Začíná-li cesta ~login, pak se bude procházet html poadresář určeného uživatele ~login/public_html. V odkazech se často používají relativní URL. Taková URL musí být před tvorbou HTTP dotazu převedeny na absolutní.
GET
$ telnet aisa.fi.muni.cz 80 Trying 147.251.48.1... Connected to aisa.fi.muni.cz (147.251.48.1). Escape character is '^]'. GET / HTTP/1.1 Host: www.fi.muni.cz Accept: text/html, text/plain Accept-Language: cs Accept-Charset: iso-8859-2 HTTP/1.1 200 OK Date: Mon, 07 Nov 2005 13:38:33 GMT Server: Apache Content-Location: index.xhtml.cs Vary: negotiate,accept-language,accept-charset TCN: choice Content-language: cs, cs Last-Modified: Mon, 07 Nov 2005 08:17:09 GMT ETag: "1d746b6-2454-436f0d85-iso-8859-2;436d7fc3" Accept-Ranges: bytes Content-Length: 9300 Content-Type: text/html; charset=iso-8859-2 <?xml version="1.0" encoding="iso-8859-2"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <!-- Generovano --> .....
POST
$telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. POST /zpracuj.cgi HTTP/1.0 Content-Length: 20 Nejaka data delky 20. Vsechna delsi se nepocitaji do predanych dat a jsou zahozena. HTTP/1.0 200 OK Date: Mon, 07 Nov 2005 13:50:15 GMT Server: Apache Content-type: text/html <html> .....
Apache společnosti Apache Software Foundation je nejrozšířenějším webovým serverem. Nyní je server Apache již ve verzi 2.0.55 (souběžně se vyvíjí verze 1.3.x, aktuální je 1.3.34).
Ve většině distribucí Linuxu je možno Apache nainstalovat jako balíček. Pokud toužíme si Apache sami zkompilovat, můžeme si stáhnout zdrojové kódy na Apache Software Foundation.
Po instalaci spustíme server příkazem:
/etc/init.d/httpd start
Server se skládá z jádra a modulů, které mohou být buď vkompilovány do Apache (interní moduly) nebo nahrávány dle potřeby při startu serveru (externí moduly). Díky snadnému přidávání modulů a známému rozhraní (celý server je open source) existuje velké množství modulů používajících různé knihovny třetích stran. Seznam známých modulů pro Apache naleznete zde.
Externí moduly se nahrávají direktivami LoadModule
a LoadFile
a po té je nutno takto nahrané moduly aktivovat direktivou Addmodule
(touto direktivou je nutné aktitvovat i interní moduly).
Příklady některých modulů:
mod_so | podpora pro moduly DSO (musí být vkompilován do Apache, jinak nebude možné načítat moduly při startu serveru) |
mod_acces | řízení přístupu na základě doménového jména nebo IP-adresy |
mod_auth | autentizace uživatelů |
mod_auth_ldap | autentizace uživatelů pomocí LDAP |
mod_ssl | umožňující použití SSL a TLS |
mod_czech | konverze mezi různými českými znakovými sadami |
mod_cgi | zajišťuje spouštění CGI skriptů |
mod_userdir | umožňuje prezentovat webové strákny uživatelů z ~/public_html/ |
mod_perl, mod_php | podpora iterpretů jazyků přímo do serveru (nevolá se jako CGI) |
Konfigurační soubory jsou standardně uloženy v adresáři /etc/httpd/conf
, popř. /usr/local/etc/httpd/conf
.
httpd.conf | základní charakteristiky serveru, jeho startu a prostředí, cesty k dalším souborům |
srm.conf | logické chování serveru |
access.conf | řízení přístupu k serveru |
magic | definice chrakteristik souborů a jim odpovídajícím MIME typům, nedoporučuje se upravovat |
mime.types |
U posledních verzí serveru je konfigurace většinou pouze (pomineme-li zvláštní konfigurační soubory) v souboru httpd.conf
.
Konfigurační soubor httpd.conf
je rozdělen do tří částí: globální nastavení, implicitní nastavení a nastavení virtuálních serverů.
ServerType [standalone | initd]
Server můžeme spouštět dvojím způsobem. Buď jako démona (tedy samostatně), pak použijeme volbu standalone
, nebo pomocí initd
s volbou initd
.
ServerRoot <adresar>
Hlavní adresář, ve kterém bude Apache hledat configurační soubory nebo jiné soubory zadané relativně.
PidFile <soubor>
Soubor, kde je uloženo id procesu spuštěného serveru. Může být zadáno absolutně, ale i relativně (vzhledem k ServerRoot
).
KeepAlive [on | off]
Tako funkce umožňuje vytvořit spojení přes které bude vyřízeno více požadavků od klienta. Pokud nepřijde od klienta další požadavek po dobu KeepAliveTimeout
, je spojení uzavřeno.
MaxKeepAliveRequests <pocet>
Maximální počet vyřízených požadavků přes KeepAlive
spojení.
StartServers <pocet>
Kolik se má spustit při startu serveru démonů Apache.
MinSpareServers, MaxSpareServers <pocet>
Minimální (maximální) počet volných (neobsazených) démonů. Tito volní démoni jsou potřební pro náhlý vzrůst požadavků na server.
MaxClients <pocet>
Maximální počet běžících démonů.
Listen [IP adresa:]port
Definuje na které adrese a na kterém portě bude Apache poslouchat. Můžeme zadat pouze port a server bude poslouchat na všech IP adresách na zadaném portu nebo můžeme zadat i IP adresu s portem.
User, Group <uživatel, skupina>
Jméno uživatele a skupiny, pod kterými bude server běžet.
ServerAdmin <email>
Emailová adresa správce serveru.
DocumentRoot <adresar>
Tato direktiva určuje kořenový adresář s dokumenty.
Directory <adresar>
Slouží pro nastavení sdíleného adresáře. Tato direktiva se používá odlišně od předchozích, protože je uzavřena mezi < > (podobně jako tagy v XML, podobně také obsahuje uzavírací tag). Mezi tagy jsou vloženy další direktivy vztahující se k zadanému adresáři. Mezi direktivy vkládané do Directory
patří např. direktiva Options
.
V názvu cesty k adresáři mohou být použity zástupné znaky jako '*' (zastupuje maximálně jeden adresář ve stromové struktuře) nebo '?' (nahrazuje jeden znak)
Direktiva | Parameter | Význam |
---|---|---|
Options |
Indexes |
Povoluje zobrazení obsahu adresáře, pokud neexistuje soubor daný direktivou DirectoryIndex |
Includes |
Povoluje interpretaci SSI skriptů | |
IncludesNoExec |
Povoluje interpretaci SSI skriptů, ale bez spouštění externích programů | |
ExecCGI |
Povoluje spouštění cgi skriptů | |
FollowSymLinks |
Povoluje následování symbolických odkazů | |
SymLinksIfOwnerMatch |
Povoluje následování symbolických odkazů jen v případě, pokud ukazují na soubory (adresáře) se stejným vlastníkem jako odkaz | |
MultiViews |
Povolení předávání dokumentů podle požadavků klienta (viz dále) | |
All |
Nahrazuje všechny parametry (mimo MultiViews ) |
|
None |
Ruší všechny parametry |
Přístup k dokumentům (souborům) v adresáři můžeme zamezit použitím parametrů Order
, Allow
a Deny
. Důležité je nastavení priorit, které se použijí tehdy, když uživatel spadá do seznamu Allow
i Deny
. Vyšší prioritu má později uvedený. Příklad:
Order Allow, Deny Allow from lab.fi.muni.cz Deny from all
AccessFileName <nazev_souboru>
Tato direktiva definuje název souboru, ve kterém bude Apache hledat externí nastavení pro adresář, kde se soubor nachází. Většinou se nazývá .htaccess
, ale můžeme nastavit název jiný nebo i více.
AllowOverride <parametry>
Vkládá se do direktivy Directory
a parametry označují, co se může měnit pomocí externího nastavení. Následující tabulka ukazuje, jaké parametry je možné použít.
Direktiva | Parameter | Direktivy, které parameter povoluje používat v .htaccess |
---|---|---|
AllowOverride |
AuthConfig |
AuthDBMGroupFile , AuthDBMUserFile , AuthGroupFile , AuthName , AuthType , AuthUserFile , Require ,... - autentizační direktivy
|
FileInfo |
AddEncoding , AddLanguage , AddType , DefaultType , ErrorDocument , LanguagePriority ,... - direktivy definující typy souborů
|
|
Indexes |
AddDescription , AddIcon , AddIconByEncoding , AddIconByType , DefaultIcon , DirectoryIndex , FancyIndexing , HeaderName , IndexIgnore , IndexOptions , ReadmeName ,...
|
|
Limit |
Order , Allow , Deny |
|
Options |
Options , XBitHack |
|
All |
Nahrazuje všechny direktivy (tj. můžeme použít cokoli, co se vkládá do direktivy Direcory ) |
|
None |
Zakajzuje se použití souborů .htaccess |
[Script]Alias <URL_cesta> <adresar>
Direktivy jsou součástí modulu mod_alias
. Alias
přiřazuje nějaké fyzické adrese URL. ScriptAlias
je podobný, jen slouží pro adresáře se soubory, které je nutno nejdříve nějak zpracovat.
Při dotazu na server může klient specifikovat, jakou podporuje znakovou sadu a jazyk dokumentů včetně kombinací a priorit možností. Tento údaj může server využít pro výběr vhodného dokumentu (případně pro jeho úpravu).
Apache umožňuje zvolit reprezentaci dokumentů na základě údajů:
Accept | preferovaný typ média (MIME) |
---|---|
Accept-Language | preferovaný typ jazyka |
Accept-Charset | preferovaná znaková sada (možno už v Accept) |
Accept-Encoding | preferované kódování |
Pro výběr vhodného dokumentu může server využít volbu MultiViews
, která se nastavuje pro adresář direktivou Options MultiViews
a soubory v adresáři se liší příponou odpovídající kódu jazyka a znakové sadě (např. index.html.cs.utf-8
).
Zpřístupnění dokumentů ve více znakových sadách by se jistě dalo dělat pomocí MultiViews nebo typových map (viz. předchozí kapitola), ale to by vyžadovalo jeden dokument pro každou znakovou sadu. Proto je lepší vytvořit jednu verzi dokumentu a tu překódovávat dle požadavků klienta. To umožňují např. WWWdia, SaCzech, CSáček, mod_czech a mod_html.
WWWdia detekuje výběr znakové sady podle řetězce ?__CHARSET__ na konci odkazu. To přináší nevýhodu, že umí překódovat jen statické stránky. SaCzech nemá nevýhody předchozího produktu, ale je napsán v Perlu a odezva s použitím překódování je výrazně horší než bez něj. Mod_czech a mod_html jsou (na rozdíl od předchozích produktů) moduly DSO, což zrychluje jejich práci (běží v procesu serveru), ale bohužel vyžadují opatchování zdrojáků serveru a jeho rekompilaci.
CSáček může běžet jako CGI, FastCGI i jako modul DSO a neměl by vyžadovat žádné dodatečné úpravy ve zdrojácích serveru (pro podporu SSL je nutné opatchovat modul mod_ssl).
Virtuální servery slouží pro běh několika webových adres (domén) na jednom serveru. Virtuální servery dělíme na servery rozpoznávané:
IP-adresou - každý virtuální server má vlastní IP adresu. Konfigurace takového virtuálního serveru je následující:
<VirtualHost domenove-jmeno> ServerAdmin webmaster@domenove-jmeno DocumentRoot /www/domenove-jmeno ServerName domenove-jmeno </VirtualHost>
doménovým jménem - pro všechny virtuální servery máme pouze jednu IP adresu. Pro rozlišení, o který virtuální server se jedná, je použita hlavička Host
v HTTP dotazu. Nastavení serveru může vypadat takto:
NameVirtualHost *:80 <VirtualHost *:80> ServerName domenove-jmeno DocumentRoot /www/domain </VirtualHost>
SSL/TLS je síťový protokol mezi transportní a aplikační vrstvou ISO OSI modelu. Zajišťuje šifrovaný přenos dat mezi serverem a klientem. SSL pracuje na bázi asymetrické kryptografie (pro autentizaci a ustanovení sdíleného klíče relace) a symetrické kryptografie (pro přenášení dat v rámci relace).
Pro práci se SSL můžeme použít např. OpenSSL a do Apache přidáme modul mod_ssl.
Nejdříve je nutné vygenerovat pro náš webový server certifikát. Pro náš účel budou stačit testovací certifikáty podepsané samy sebou. To provedeme příkazy
openssl genrsa -out server.key 1024 openssl req -new -x509 -key server.key -out server.crt -days [platnost dnů]
Atribut CN (CommonName) by měl být shodný s plným doménovým jménem našeho HTTPS serveru. Soubor server.crt
obsahuje veřejný certifikát a soubor server.key
soukromý klíč.
Konfiguraci SSL provádíme v httpd.conf
v definici virtuálního serveru, který musí být IP-based. Použijeme tyto direktivy:
SSLCertificateFile | veřejný certifikát serveru |
---|---|
SSLCertificateKeyFile | soukromý klíč serveru |
SSLEngine [On|Off] | povoluje SSL |
SSL nelze použít u name-based virtuálních serverů. Vrstva protokolu SSL je umístěna pod vrstvou protokolu HTTP a je tak vlastně jeho obálkou. Když je vytvořeno SSL spojení (HTTPS), Apache, resp. mod_ssl musí se vzdálenou stranou (klientem) vyjednat parametry SSL spojení. Apache naproti tomu nemůže bez HTTP hlavičky Host
delegovat dotaz na správný webový server (virtuální server), protože to je možné pouze po načtení této hlavičky od klienta. Jenže aby přišla od klienta nějaká data, musí být dokončeno vyjednávání parametrů SSL spojení.
Common Gateway Interface (CGI) slouží pro generování dynamických stránek. Jsou to skripty spouštěné na straně serveru, které genurují HTML, který je předán klientovi. Je potřeba aktivovat modul mod_cgi
a nastavit v httpd.conf
:
AddType application/x-httpd-cgi .cgi <Directory [adresář kde mohou být spouštěny CGI skripty]> Options ExecCGI </Directory>
Pokud chceme používat PHP máme dvě možnosti. Můžeme použít CGI skripty, pak nemusíme nic měnit, nebo modul php4_module
, který načteme při startu, pak ale musíme upravit konfigurační soubor následovně:
LoadModule php4_module modules/libphp4.so AddType application/x-httpd-php .php # pro interpretaci PHP skriptů
Samotné PHP můžeme nastavit v souboru /etc/php.ini
(nebo jinde), ale většinou to nebude potřeba, protože defaultní nastavení by mělo stačit.
Jelikož je HTTP protokol bezstavový, není autentizace přes HTTP protokol (bez použití SSL) jednoduchá. Při každém spojení klienta se srverem je nutné provést autentizaci znovu nebo se musí posílat nějaký příznak, že uživatel je již autentizován.
Naštěstí HTTP protokol nabízí Basic autentizaci pro autentizaci klienta pomocí hlaviček WWW-Authenticate: Basic realm="[jméno realmu]"
a stavového kódu HTTP/1.0 401 Unauthorized
. Pokud klient přijme uvedenou hlavičku a kód, měl by si vyžádat od uživatele autentizaci. Takto to musí probíhat při každém spojení klienta na server (nicméně klient si může login a heslo pamatovat a příště ho poslat již bez účasti uživatele).
Existuje také řada dalších možností autentizace, jako např. autentizace pomocí otevřených cookies, pomocí identifikátoru spojení v cookies, pomocí IP adresy, atd.
Pokud požadujeme autentizovaný přístup do nějakého adresáře, vytvoříme v něm soubor .htaccess
a do něj vložíme následující kód:
AuthType Basic AuthName "Tajný adresář" AuthUserFile <cesta k souboru s uživately a jejich hesly> Require valid-user
Soubor se jmény uživatelů a jejich hesly vytvoříme pomocí příkazu htpasswd
.
Apache je nejpoužívanějším webovým serverem. Mezi další známé patří například IIS od Microsoftu. Jako zástupce plně javovského webového serveru můžeme zmínit Jetty://.
Pokud nám stačí sdílení pouze statických dat a potřebujeme rychlou odezvu, můžeme zvolit kHTTPD, což je modul, který se zakompiluje do jádra.