WWW, HTTP

Martin Kudlej, xkudlej@aurora.fi.muni.cz


Obsah


Protokol HTTP

Protokol HTTP(HyperText Transfer Protokol) je sieťovy protokol. V schéme ISO OSI sa nachádza na aplikačnej vrstve. Pracuje nad protokolom tcp. Je založený na schéme klient-server, kde klient zasiela požiadavku a server vráti klientovi odpoveď. V súčastnej dobe sa používa verzia 1.1. Ďalšou používanou verziou je 1.0.

Zakladné metódy:

GET Slúži prevažne na získanie dokumentu zo serveru. Parametre sa predávajú cez adresu požiadavky
POST Slúži na zaslanie dát na server(napr. formulár)
HEAD Slúži na získanie hlavičiek dokumentu
Od verzie 1.1:
DELETE Slúži na odstránenie dokumentu na danom URL zo serveru
PUT Slúži na uloženie dokumentu na danom URL
TRACE Slúži na zisťovanie spojenia
CONNECT Slúži na nastavenie sposobu spojenia
OPTIONS Slúži na zisťovanie možnosti spojenia

Schéma požiadavky:

metoda cesta verzia_protokolu
hlavicky
prazdny_riadok
data

Schéma odpovede:

verzia_protokolu stav_kod stav_text 
hlavicky 
prazdny_riadok
data_odpovede

Hlavičky zasielané klientom(1.0):

Oznamujú, že klient rozumie/preferuje tieto MIME typy, znakové sady alebo jazyky.
Accept: text/html, text/plain, */* Slúži na uvedenie MIME typov, ktoré klient dokáže spracovať. /etc/mime.types
Accept-Charset: iso-8859-2
Accept-Encoding: text/html, text/plain
Accept-Language: en, cz

User-Agent: Telnet/1.0 X11 Retezec identifikující typ klienta.
From: niekto@fi.muni.cz Adresa človeka zodpovedného za túto požiadavku.
Referer: http://localhost/ Z akej stránky sme prišli
If-Modified-Since: Tue, 11 Apr 2006 19:40:00 GMT Pošli dokument iba ak bol modifikovaný od udaného času.

Hlavičky posielané serverom(1.0):

Content-Type:, Content-Encoding:, Content-Language: Aký MIME typ/znaková sada/jazyk je v dátach použitá.
Content-Length: Dĺžka dát.
Date: Tue, 11 Apr 2006 19:49:07 GMT Teraz.
Expires: Sat, 29 Oct 1994 19:43:31 GMT Vypršanie platnosti dokumentu.
Last-Modified: Sat, 29 Oct 1994 19:43:31 GMT Kedy bol dokument naposledy zmenený
MIME-Version: 1.0 Verzia MIME procesoru.
Location: http://localhost/pokus/ URL, na ktoré sa má klient premiestniť, aby získal požadovanú odpoveď.
Pragma: no-cache Stránka se neukladá do vyrovnávacej pamate prehliadača/proxy.
Server: Apache/1.3.34 (Debian) mod_python/2.7.10 Python/2.3.4 Verzia a typ serveru.
Retry-After: 60 Za akú dobu bude dokument prístupný.

Najjednoduchšia komunikácia:

[kybela||| ~]telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
GET /
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
...
</HTML>
Connection closed by foreign host.

Komunikácia pomocou HTTP 1.0:

[kybela||| ~]telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
GET / HTTP/1.0
Accept: text/html, text/plain
User-Agent: Telnet/1.0 X11

HTTP/1.1 200 OK
Date: Tue, 11 Apr 2006 19:49:07 GMT
Server: Apache/1.3.34 (Debian) mod_python/2.7.10 Python/2.3.4
Last-Modified: Thu, 22 Dec 2005 17:58:13 GMT
ETag: "2a804e-148a-43aae935"
Accept-Ranges: bytes
Content-Length: 5258
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
...
Connection closed by foreign host.


Apache

Linux is like a wigwam. No windows, no gates, apache inside!

Open source HTTP server. V súčastnej dobe dostupný vo verzii 1.3, 2.0 a 2.2. Budem sa zaoberať 1.3, pretože je to zatiaľ používanejšia verzia oproti 2.*.

Inštalácia:

Inštalujeme buď z balíčka v distribúcii alebo zo zdrojových kódov.

Konfigurácia:

Je uložená v adresári /etc/apache. hlavným konfiguračným súborom je httpd.conf. Pre vačšiu prehľadnosť je niektorá konfigurácia oddelená do súborov pomocou direktív Include, TypesConfig, atd. Konfiguračný súbor httpd.conf je rozdelený do troch častí: globálne nastavenia, implicitné nastavenia a nastavenia virtuálnych serverov.

Moduly

Konfigurácia je cez Include vyvedená do modules.conf. Server je zložený z modulov. Tie možu byť vkompilované alebo externé(nahrávané podľa potreby pri štarte). Zoznam vkompilovaných(interných) modulov získame spustením s parametrom "-l" ako listing. Dva povinne vkompilované moduly sú http_core.c(jadro) a mod_so.c(modul na nahravanie modulov). Aktivácia mod_so.c umožní použitie dvoch direktív LoadFile a LoadModule. direktívou ClearModuleList odstránime všetky moduly. Typicky sa používa pred konfiguráciou nahratia modulov. Zoznam modulov.

Globálne nastavenia:

ServerType [standalone | inetd]
Server možeme spúštať dvoma sposobmi. Buď ako démon(standalone), alebo pomocou inetd s volbou inetd.
ServerRoot: <adresar> 
Hlavný adresár, v ktorom bude Apache hľadať configuračné súbory alebo iné súbory zadané relatívne.
PidFile: <soubor> 
Súbor, kde je uložený id procesu spusteného serveru. Može byť zadaný absolútne, ale i relatívne (vzhľadom k ServerRoot).
KeepAlive: [on | off]
Táto funkcia umožňuje vytvoriť spojenie, cez ktoré bude vbavených viac požiadaviek od klienta. Ak nepríde od klienta dalšia požiadavka po dobu KeepAliveTimeout, je spojenie uzavreté.
MaxKeepAliveRequests: <pocet> 
Maximální počet vybavených požiadaviek cez KeepAlive spojenie.
StartServers: <pocet> 
Koľko sa má spustiť pri štarte serverov démona Apache.
MinSpareServers, MaxSpareServers: <pocet> 
Minimálny (maximálny) počet voľných (neobsazených) démonov. Týto voľní démoni sú potrební pre náhle zvýšenie počtu požiadaviek na server.
MaxClients: <pocet> 
Maximálny počet bežiacich démonov.
Listen: [IP adresa:]port 
Definuje, na ktorej adrese a na ktorom porte bude Apache počúvať. Možeme zadat iba port a server bude počúvať na všetkých IP adresách na zadanom porte.
User, Group <uzivatel, skupina> 
Meno užívateľa a skupiny, pod ktorými bude server bežať.

Implicitné nastavenia:

ServerAdmin <email> 
Emailová adresa správcu servera.
DocumentRoot <adresar>
Táto direktíva určuje koreňový adresár s dokumentami.
Directory <adresar> 
Slúži na nastavenie sdielaného adresára. Táto direktíva sa používa inak ako predchádzajúca, protože je uzavretá medzi < > (podobne ako v XML). Medzi tagy sú vložené dalšie nastavenia. napr. direktíva Options. V názve cesty k adresáru možu byť použité zástupné znaky. napr. *, ?

Options

Indexes
Povoluje zobrazenie obsahu adresáru, pokiaľ neexistuje súbor daný direktívou DirectoryIndex
Includes
Povoľuje interpretáciu SSI skriptu
IncludesNoExec
Povoľuje interpretáciu SSI skriptu, ale bez spúšťania externých programov
ExecCGI
Povoľuje spúštenie cgi skriptov
FollowSymLinks
Povoľuje prechádzanie symbolických odkazov
SymLinksIfOwnerMatch
Povoľuje prechádzanie symbolických odkazov iba v prípade, ak ukazujú na súbory(adresáre) s rovnakým vlastníkom ako odkaz
MultiViews
Povoľuje predávánie dokumentu podľa požiadavky klienta.
All
Nahradzuje všetky parametre (mimo MultiViews)
None
Ruší všetky parametre Prístup k dokumentom(súborom) v adresári možeme obmedziť použitím parametrov Order: Allow a Deny. Doležité je nastavenie priorít. Vyššiu prioritu má parameter uvedený neskor. napr.: Order Allow, Deny Allow from lab.fi.muni.cz Deny from all
AccessFileName <nazov_suboru> 
Táto direktíva definuje názov súboru, v kterom bude Apache hladať externé nastavenie pre adresár, kde se súbor nachádza. Vačšinou je to .htaccess.
AllowOverride <parametry> 
Parametre označujú, čo sa može meniť pomocou externého nastavenia. Je možné použiť:
AuthConfig AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require,... - autentizačné direktívy
FileInfo AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority,... - direktívy definujúce typy súborov
Indexes AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName,...
Limit Order, Allow, Deny
Options Options, XBitHack
All Nahradzuje všetky direktívy
None Zakazuje použitie súboru .htaccess
[Script]Alias <URL_cesta> <adresar>
Direktívy sú súčasťou modulu mod_alias. Alias priradzuje nejakej fyzickej adrese URL. ScriptAlias je podobný, iba slúži pre adresáre so súborami, ktoré je potrebné najskor spracovať.

Virtuálne servre

Virtuálne servre slúžia pre beh viac adries(domén) na jednom serveri. Delíme ich na rozpoznávané adresou IP a doménovým menom. Pri rozpoznávaných IP-adresou - má každý virtuálny server vlastnú IP adresu. Konfigurácia servera:
<VirtualHost domenove-meno>
	ServerAdmin webadmin@domenove-meno
	DocumentRoot /www/domenove-meno
	ServerName domenove-meno
</VirtualHost>
Pri rozpoznávaných doménovým menom - pre všetky virtuálne servre máme iba jednu IP adresu. Pre odlíšenie je použitá hlavička Host v HTTP požiadavke. Konfigurácia servera:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName domenove-meno
DocumentRoot /www/domain
</VirtualHost>

Autentizácia:

HTTP protokol má Basic autentizáciu pre autentizáciu klienta pomocou hlavičiek WWW-Authenticate: Basic realm="[meno realmu]" a stavového kódu HTTP/1.0 401 Unauthorized. Ak klientovi príde uvedená hlavička a kód, mal by si požiadať od uživateľa autentizáciu. Takto to musí prebiehať pri každom spojení klienta na server. Klient si vačšinou tieto údaje po zadaní pamatá. Existujú aj ďalšie formy autentizácie. V Apache je táto autentizácia nastavená typicky v súboroch .htaccess.
AuthType Basic
AuthName "Adresar"
AuthUserFile <cesta k suboru s uzivatelmi a heslami>
Require valid-user
Subor s menami užívateľov a ich heslami vytvoríme pomocou príkazu htpasswd.

Jazykové nastavenia:

Klient može cez hlavicky protokolu HTTP špecifikovať podporované znakové sady. Server može vybrať(vygenerovať) dokument v preferovanom kódovaní klienta. Výber sa prevedie pomocou:
Accept
Accept-Language
Accept-Charset
Accept-Encoding

Konfigurácia:

Nastavíme v httpd.conf pomocou Options MultiViews pre daný adresár.
Ďalej mozeme nastaviť type-map, ktorý identifikuje, kde sú umiestnené definície príslušných dokumentov v konkrétnych jazykoch.
AddHandler type-map var
DirectoryIndex index.html index.html.var 
Napr. index.html.var
URI: index.html.en
Content-language: en
Content-type: text/html

URI: index.html.cs.win-1250
Content-language: cs
Content-type: text/html;charset=WIN-1250

URI: index.html.cs.iso8859-2
Content-language: cs
Content-type: text/html;charset=ISO-8859-2

Samozrejme musíme vytvoriť príslušné súbory vo zvolenom kódovaní.
Poslednou možnosťou je dynamické generovanie pomocou WWWDia, CSacek, Mod_czech.

CGI:

CGI(Common Gateway Interface) umožňuje spúšťať skripty na strane serveru a výsledok posielať spať.
LoadModule modules/mod_cgi
Vhodné je dať alias na adresár cgi-bin.
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin"
A samozrejme povoliť spustenie skriptu v tomto adresári.
<Directory "/usr/local/apache/cgi-bin">
	Options ExecCGI
</Directory>

SSL

SSL/TLS je sieťový protokol zaisťujúci šifrovaný prenos dát medzi serverom a klientom. SSL využíva princípy asymetrickej kryptografie pre inicializáciu relácie a symetrickej kryptografie pre prenášenie dát počas relácie. V Apache pre toto slúži modul mod_ssl. Najskor musíme vygenerovať certifikát pre server príkazmi:
openssl genrsa -out server.key 1024
openssl req -new -x509 -key server.key -out server.crt -days [platnost - pocet dni]
Atribut CN(CommonName) by mal byť zhodný s doménovým menom našeho servera. Súbor server.crt obsahuje verejný certifikát a súbor server.key súkromý kľúč. Konfigurujeme v httpd.conf v definicii virtuálneho servera, ktorý musí byť IP-based.
SSLCertificateFile	verejný certifikát serveru
SSLCertificateKeyFile	súkromý kľúč serveru
SSLEngine [On|Off]	povoľuje SSL


Alternatívne servre

Ak nám stačí zdielať iba statické dáta, možeme použiť kHTTPD, čo je modul do jadra. Ďalšou možnou pomerne rýchlou alternatívou je napr. boa


Zdroje