WWW, HTTP servery

Ladislav Chodil, xchodil@fi.muni.cz


Obsah


WWW (World Wide Web)

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.

Protokol HTTP

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]

Metody

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

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].

Hlavičky zasílané klientem

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

Hlavičky zasílané serverem

Content-Type
Content-Encoding
Content-Language
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ů

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

Příklad komunikace

Příklad metody 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  -->
.....
		

Příklad metody 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

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).

Instalace

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

Moduly

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_sopodpora 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_authautentizace uživatelů
mod_auth_ldapautentizace uživatelů pomocí LDAP
mod_sslumožňující použití SSL a TLS
mod_czechkonverze mezi různými českými znakovými sadami
mod_cgizajišťuje spouštění CGI skriptů
mod_userdirumožňuje prezentovat webové strákny uživatelů z ~/public_html/
mod_perl, mod_phppodpora iterpretů jazyků přímo do serveru (nevolá se jako CGI)

Konfigurace

Konfigurační soubory jsou standardně uloženy v adresáři /etc/httpd/conf, popř. /usr/local/etc/httpd/conf.

httpd.confzákladní charakteristiky serveru, jeho startu a prostředí, cesty k dalším souborům
srm.conflogické chování serveru
access.confřízení přístupu k serveru
magicdefinice 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ů.

Globální nastavení

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.

Implicitní nastavení

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.

Zpřístupnění dokumentu ve více jazycích

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

Acceptpreferovaný typ média (MIME)
Accept-Languagepreferovaný typ jazyka
Accept-Charsetpreferovaná znaková sada (možno už v Accept)
Accept-Encodingpreferované 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).

Čeština

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

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

SSL vrstva

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:

SSLCertificateFileveřejný certifikát serveru
SSLCertificateKeyFilesoukromý 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í.

CGI

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.

Autentizace

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.


Alternativní HTTP servery

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.


Odkazy