WWW, HTTP servery
Pavol Babinčák, xbabinc zavináč fi bodka muni bodka cz
Obsah
Protokol HTTP
HTTP (Hypertext transfer
protocol) - jednoduchý protokol, pôvodne určený na
prenos HTML (hyper text markup language) súborov na webe. Dnes
používaný na
prenos akýchkoľvek súborov vrátane binárnych.Vlastnosti protokolu:
- aplikačný protokol architektúry TCP/IP
- postavený nad TCP, môže však fungovať nad
akýmkoľvek spolahlivým protokolom
- štandardný TCP port 80, možné je použiť aj iný
- typ komunikácie: klient - server
- typu dotaz - odpoveď, väčšina komunikácie je
inicializovaná klientom
- bezstavový protokol; neposkytuje žiadny mechanizmus na
uchovanie stavu HTTP komunikácie
Existuje viac verzií protokolu:
- HTTP/0.9
- prvá verzia
- používaný od roku 1990, dnes sa už
nepoužíva
- dotaz: iba metóda GET, bez dodatočných (meta)
informácií
- odpoveď: požadovaný dokument, takisto bez
dodatočných informácií
- po prenesení odpovede sa spojenie ukončí
- HTTP/1.0
- mnoho rozšírení od
predchádzajúcej verzie; spätne kompatibilný
- dotaz:
- pridané metódy POST a HEAD
- voliteľné ďalšie
hlavičky v upravenom formáte MIME (napr. k dotazu: Date,
Authorization, From, If-Modified-Since, Referer, User-Agent; k telu
dotazu: Content-Encoding, Content-Length)
- volitelné telo dotazu (entity body)
- odpoveď: pridaná hlavička:
- informácia o stave (status) odpovedi
- voliteľné ďalšie hlavičky v
upravenom formáte MIME [5] (napr. k odpovedi: Date, Location,
WWW-Authenticate; k telu odpovedi: Content-Encoding, Content-Length)
- voliteľné telo odpovedi (entity body)
- HTTP/1.1
- definovaný v RFC 2616 z roku 1999, dnes
najčastejšie používaný
- dopĺňa možnosti HTTP/1.0 (hierarchické proxy,
kešovanie, trvalé spojenia, virtuálne servery),
spätne kompatibilný
- dotaz: pridané metódy OPTIONS, PUT, DELETE,
TRACE, CONNECT (ktoré sú zriedka používané)
- takmer dvojnásobný počet hlavičiek oproti HTTP/1.0
Metódy pre získavanie dát zo servera
Aj keď HTTP/1.x definuje viacero metód, najčastejšie sa používajú tieto dve:
- GET - slúži na získanie dát
identifikovaných pomocou URI
- POST - slúži na poslanie väčšieho množstva
informácií; tie nachádzajú sa v tele dotazu
Príklad GET metódy
Kladná odpoveď na dotaz GET metódou:
(pripojenie na server fadmin.fi.muni.cz, port 80)
GET / HTTP/1.0
HTTP/1.1 200 OK
Date: Sun, 03 Apr 2005 19:11:27
GMT
Server: Apache
Connection: close
Content-Type: text/html;
charset=ISO-8859-2
<!-- zobrazujeme nahradni
stranku FI -->
<?xml version="1.0"?>
...
Príklad zápornej odpovedi na GET dotaz:
(pripojenie na server fadmin.fi.muni.cz, port 80)
GET /neexistujuca HTTP/1.0
HTTP/1.1 404 Not Found
Date: Sun, 03 Apr 2005 19:14:41 GMT
Server: Apache
Connection: close
Content-Type: text/html; charset=ISO-8859-2
<?xml version="1.0"?>
...
Problém kódovania jazyka
HTTP hlavičky vs. HTML http-equiv
HTTP sa používa najčastejšie na prenos HTML (hypertext markup language)
stránok. Pre zobrazenie správnej kódovej stránky dokumentu je potrebné
predať klientovi kódovanie tohto súboru. HTTP definuje hlavičku Content-Type
na určenie kódovania a MIME typu súboru. V prípade že je HTML súbor
uložený lokálne, nieje možné zistiť kódovanie z hlavičky HTTP, preto v
HTML existuje značka meta, ktorá nahradzuje HTTP hlavičky. Príklad
tejto hlavičky: <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
Apache
Apache je jedným z
najpoužívanejších web serverov od roku 1996. Podľa netcaft.com je používaný na
vyše 70% serveroch. Je to open-source projekt Apache Software Foundation.
Momentálne je posledná verzia 2.0.53.
Moduly
Webserver sa skladá zo
samotného jadra http_core a modulov. Tie môžu byť
prilinkované do
Apache pri kompilácii, alebo stáť samostatne. Potom sa
načítavajú pri
štarte serveru. Okrem štandardných modulov
existuje mnoho ďalších modulov,
zoznam je na modules.apache.org.
Niektoré moduly:
- mod_cgi - stará sa o spúšťanie CGI skriptov
- mod_cgid - démon pre spúšťanie CGI skriptov,
podobný mod_cgi; vhodnejší pre
multivláknový server
- mod_auth - užívateľská autentizácia
- mod_ssl - zabezpečuje komunikáciu cez SSL
- mod_mime_magic - zisťuje typ súboru, pre MIME
- mod_negotiation - vyberie dokument, ktorý najlepšie
sadne (match) pre klientský prehliadač
- mod_php - podpora PHP vo forme modulu (nie ako CGI)
Kompilácia a inštalácia
-
K Apache sú na stránke Apache Software Foundationk
dispozícii zdrojové kódy. Po stiahnutí je ich vhodné rozbaliť. Apache
sa skompiluje a nainštaluje do adresára PREFIX vykonaním príkazov
$ ./configure --prefix=PREFIX
$ make
$ make install
Pre typickú inštaláciu je PREFIX "/usr/local/apache2". Server sa spúšťa pomocou:
$ PREFIX/bin/apachectl start
- Tiež je možné nainštalovať apache z balíčkov
obľúbenej distribúcie. Napríklad Debian:
$ apt-get install apache2
apache2-common apache2-mpm-worker apache2-utils libapr0 openssl ssl-cert
Potom sa server spustí pomocou:
$ /etc/init.d/apache2 start
Konfigurácia
Apache sa konfiguruje editáciou textových súborov. Tie sú veľmi dobre komentované. Je v nich možné použiť:
- Komentáre - začínajú #, všetko nasledujúce je ignorované.
Príklad:
#Toto je komentár - Sekcie:
- podmienené, príklad:
<ifModule modul>...</ifModule> alebo <ifDefine prepínač>...</ifDefine>
- údávajúce objekt, ktorého vlastnosti nastavujú, príklad
<Directory "cesta k adresáru"]>...</Directory>
- Direktívy - pomocou nich
sa nastavujú jednotlivé parametre servera. Sú závislé na kontexte,
niekde sa niektoré nedajú použiť. Zaujímavé direktívy:
- Listen adresa:port - určuje
kde má server počúvať; vhodné nastaviť okrem portu
80 aj 443 pre HTTPS
- User užívateľ - užívateľ a skupina, pod ktorými má
server bežať
- Group skupina - podobne ako User ale pre skupinu
- DocumentRoot adresár - koreňový adresár webserveru, pri prístupe s prehliadača akoby doménové meno alebo IP adresa.
- DirectoryIndex súbor1 ... - v
prípade že
zadané URL smeruje na adresár, budú sa v tomto
adresári hladať tu vymenované
súbory a prvý nájdený sa pošle
klientovi
Po inštalácii Apache zo zdrojových kódov sa konfiguračný súbor nachádza
v /etc/httpd/conf/httpd.conf. Pre prehladnosť je vhodné rozdeliť tento
súbor do viacerých súborov (napr. pre virtuálne servery). V Debiane sa
konfiguračné súbory nachádzaju v adresári
/etc/apache2/. Niektoré súbory z tohto adresára:
- README - popis obsahu adresára (neslúži na
konfiguráciu, samozrejme)
- apache.conf - hlavný konfiguračný súbor
- conf.d/ - súbory v tomto adresári sú
vložené do konfigurácie
- mods-available/ - v tomto
adresári sa nachádzajú konfiguračné
súbory pre moduly (pre načítanie
modulov - prípona .load a pre konfiguráciu -
prípona .conf)
- mods-enabled/ - do tohto
adresára sa umiestňujú odkazy z mods-available. Je
potrebné pridať tam
aj .load a pripadne .conf. Dajú sa tiež použiť shell skripty
a2enmod a
a2dismod.
- sites-available a
sites-enabled - adresáre pre konfiguráciu
virtuálnych webov, podobne
ako predchádzajúce. Dajú sa použiť nástroje
a2ensite a a2dissite.
CGI skripty
CGI (Common Gateway Interface) je technológia umožňujúca
spúšťať
programy (resp. spustiteľné súbory - shell skripty a
pod.) na strane
serveru a výstup posielať klientskému web browseru. CGI
je štandard pre prenos dát medzi CGI programom a
klientským prehliadačom.
Pre používanie CGI v Apache je treba do konfigurácie
pridať načítavanie modulu mod_cgi, resp. mod_cgid. Pre Apache zo zdrojových kódov je to editácia httpd.conf
LoadModule cgi_module modules/mod_cgi.so #načítanie modulu
AddModule
mod_cgi.c
#aktivácia
AddHandler
cgi-script
.cgi
#pridanie akcie pre súbory s príponou cgi
ScriptAlias /cgi-bin/ "/var/www/cgi-bin" #alias, použitie prvej cesty v adrese má za následok použitie druhej - reálnej
Ešte treba povoliť spúštanie CGI v adresári:
<Directory "/var/www/cgi-bin">
Options ExecCGI
</Directory>
Sprístupnenie jedného dokumentu vo viacerých jazykoch
Protokol HTTP dáva klientovi možnosť špecifikovať niektoré
vlastnosti dokumentu, ktorý požaduje. Server potom môže poslať
dokument, ktorý najlepšie vyhovuje klientovým požiadavkám. Klient tieto
požiadavky posiela v hlavičkách (ktoré vie Apache spracovať):
- Accept - preferovaný typ média
- Accept-Language - preferovaný jazyk
- Accept-Charset - preferovaná znaková sada
- Accept-Encoding - preferované kódovanie
Pre výber vhodného dokumentu sú v Apache 2 implementácie:
Nevýhoda môže byť v tom, že pre
každé kódovanie musíme vytvoriť samostatný súbor. Existujú tiež moduly
do Apache, ktoré sa o toto starajú automaticky. Niektoré: mod_czech,
mod_html, CSáček.
Virtuálne servery
Na jednom počítači je možné umiestniť viac virtuálnych serverov.
Virtuálny server má vlastnú doménovú adresu (príp. IP adresu), takže
vyzerá ako samostatný server. Virtuálne servery sa dajú riešiť dvoma
spôsobmi:
- na báze IP adries Každý virtuálny server má svoju vlastnú IP adresu. Môže to
byť problém pri obmedzenom počte IP adries. Vhodné ale napríklad pre SSL. Konfigurácia v Apache:
<VirtualHost virtual.lab.muni.cz>
DocumentRoot /var/www/virtual.lab.muni.cz
ServerName virtual.lab.muni.cz
ServerAdmin admin@virtual.lab.muni.cz
</VirtualHost>
- na báze mena (name based)
počítača - novšie riešenie, využíva vlastnosti HTTP/1.1. Všetky
virtuálne servery majú rovnakú IP adresu, ale líšia sa názvom počítača
(môže byť CNAME v DNS). Konfigurácia v Apache:
NameVirtualHost 10.0.0.5 #IP adresa rozhrania, na ktorom bezi virtuálny server na báze mena
#príklad virtuálneho serveru
<VirtualHost 10.0.0.5>
DocumentRoot /var/www/virtual.lab.muni.cz
ServerName virtual.lab.muni.cz
ServerAdmin admin@virtual.lab.muni.cz
</VirtualHost>
SSL
SSL (Secure Socket Layer) je protokol medzi aplikačnou a transportnou
vrstvou. Zabezpečuje autentizáciu serveru, prípadne i klienta,
integritu, šifrovanie prenášaných dát. SSL používa asymetrickú
kryptografiu pri autentizácii a symetrickú kryptografiu pre šifrovanie
prenášaných dát v relácii. Server, prípadne aj klient, má jeden pár
(súkromný, verejný) kľúč. Tie sa použijú pri ustanovení spojenia a
dohode šifrovacieho symetrického kľúča.
Pretože vrstva SSL je umiestnená pod vrstvou HTTP, nieje ju možné
použiť pri virtuálnych serveroch na báze mena. Je to preto, že pri
týchto serveroch sa informácia o pripojení na konkrétny virtuálny
server prenáša až v HTTP hlavičke, ktorá však má byť obalená SSL
vrstvou.
Inštalácia SSL do Apache
- stiahnuť a rozbaliť OpenSSL z www.openssl.org, momentálne je aktuálna verzia 0.9.7.
$ ./config
$ make all
$ make install
- stiahnuť zdojové kódy Mod_SSL napríklad z ftp.modssl.org/source/. Prípadne je možné stiahnuť zdrojáky Apache s Mod_SSL. Toto treba preložiť s cestami k Apache a OpenSSL:
$./configure --with-apache=... --with-ssl=... --prefix=cesta_ku_zdrojakom_apache
$cd cesta_ku_zdrojakom_apache
$make all install
alebo
$ cd cesta_ku_zdrojakom_apache
$ ./configure --enable-mods-shared=ssl --with-ssl=cesta_k_openssl
v prípade že je OpenSSL súčasťou Apache.
- vygenerovať certifikáty serveru (stačia podpísané samým sebou) :
$ openssl genrsa -out náš_server.key 1024
$ openssl req -new -x509 -key nas_server.key -out náš_server.crt -days platnosť_v_dňoch
Atribút CN (CommonName) by mal byť zhodný s plným doménovým menom nášho
HTTPS serveru. Súbor náš_server.crt obsahuje verejný certifikát a súbor
náš_server.key obsahuje súkromný kľúč
- Konfigurácia
SSL sa robí v httpd.conf, prípadne ssl.conf a obsahuje definíciu
virtuálneho serveru, ktorý bude podporovať HTTPS. Netreba zabudnúť na
správny port: 443.
- Direktívy pre konfiguráciu SSL:
- SSLCertificateFile # verejný certifikát serveru
- SSLCertificateKeyFile # súkromný kľúč serveru
- SSLEngine
On
# povolenie SSL enginu
Autentizácia
Pretože je HTTP protokol bestavový, je problém riešiť informácie o
aktuálnom sedení. Na uchovanie týchto informácií sa dajú využiť
vlastnosti HTTP:
- cookies - autentizovaný užívateľ je po autentizácii identifikovaný informáciou uloženou v špeciálnej hlavičke HTTP protokolu.
- Basic autentizácia - server pošle klientovi v HTTP stavový kód 401 a
hlavičku WWW-Authenticate: Basic realm="meno realmu".
Pri prvom prístupe klientov prehliadač zobrazí výzvu na zadanie
prihlasovacieho mena a hesla. Toto je zakódované pomocou Base64 a
uchované v pamäti prehliadača. Vždy keď sa má poslať dotaz na realm,
ktorý je uložený v pamäti, pripojí sa aj hlavička Authorization: Basic base64_zakódovaný_reťazec.
Odkazy