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