WWW, HTTP servery

Michal Srb, 365419@mail.muni.cz

Obsah

HTTP protokol

HTTP (HyperText Transfer Protocol) je protokol aplikačnej vrstvy. Pôvodne bol navrhnutý na prenos hypertextových dokumentov, neskôr pribudla možnosť prenášať aj iný obsah. Štandardne používa port 80 a TCP. Jedná sa o bezstavový protokol, čiže každá požiadavka od klienta musí obsahovať všetky potrebné informácie. Spojenie vždy iniciuje klient.

Verzie HTTP protokolu


HTTP 0.9 - prvá verzia z roku 1991. Definovala iba metódu GET a prenos hypertextových dokumentov.
HTTP 1.0 - z roku 1996, definovaná v RFC 1945. Boli pridané metódy HEAD a POST.
HTTP 1.1 - zatial posledná verzia z roku 1997, RFC 2616. Rozširuje protokol o nové metódy - PUT, DELETE, OPTIONS, TRACE, CONNECT. Ďalej zavádza podporu cache a keep-alive.

Stavové kódy


1xx - informačné
2xx - úspech
3xx - presmerovanie
4xx - chyba klienta
5xx - chyba servera

Príklad komunikácie

požiadavka od klienta:

GET / HTTP/1.1
Host: localhost

odpoveď servera:

HTTP/1.1 200 OK
Date: Sat, 12 Nov 2011 17:49:47 GMT
Server: Apache/2.2.21 (Fedora)
Last-Modified: Sat, 12 Nov 2011 17:49:20 GMT
ETag: "82b07-61-4b18d41d9ffd4"
Accept-Ranges: bytes
Content-Length: 97
Connection: close
Content-Type: text/html; charset=UTF-8

<html>
	<head>
		<title>Test Page</title>
	</head>
	<body>
		This is test page.
	</body>
</html>


Apache HTTP Server

V súčasnosti najpoužívanejší HTTP server. Základná funkcionalita je ľahko rozšíritelná pomocou modulov. V súčasnosti je vo verzii 2.2. Je to open source - Apache License. Domovská stránka projektu je httpd.apache.org

Inštalácia (Fedora):

# yum install httpd

Konfigurácia



Hlavný konfiguračný súbor
/etc/httpd/conf/httpd.conf

Niektoré dôležité konfiguračné volby:

ServerName           
meno serveru (napr.: www.example.com)
DocumentRoot	    
miesto, kde sa budú hľadať požadované www stránky (napr.: "/var/www/html")
KeepAlive	    
povoliť/nepovoliť perzistentné spojenia
MaxKeepAliveRequests 
maximálne množstvo požiadavkov na perzistentné spojenie

Moduly

Moduly rozširujú základnú funkcionalitu webového servera. Všetky dostupné moduly sa nachádzajú v adresári /etc/httpd/modules. Konfigurácia sa nachádza v /etc/httpd/conf.d/meno_modulu.conf.

Príklady modulov:
mod_python - poskytuje python interpreter
mod_perl - perl interpreter
mod_ssl - SSL

Virtuálne servery

Apache umožňuje prevádzkovať viacero domén súčasne. Slúžia na to takzvané virtuálne servery. HTTP všetky servery môžu bežať na rovnakom porte (typicky 80). Ktorý virtuálny server má obslúžiť HTTP požiadavku sa zistí podľa "Host: www.hostname.net" v hlavičke.

SSL (Secure Sockets Layer)

SSL je medzivrstva medzi transportnou a aplikačnou vrstvou. Zabezpečuje šifrovanú komunikáciu medzi klientom a serverom. Využíva sa asymetrická kryptografia.

mod_ssl

Tento modul poskytuje SSL/TLS pre Apache server. HTTPS typicky beží na porte 443, čiže je bez problémov možné prevádzkovať web zabezpecený SSL a jeho nezabezpečenú variantu.

konfigurácia (Fedora):
/etc/httpd/conf.d/ssl.conf

SSLEngine On                            # zapína SSL
SSLCertificateFile certifikat.crt       # certifikát servera
SSLCertificateKeyFile sukromny_kluc.key # privátny kľúč

SSL a virtuálne servery

Apache zvláda prevádzkovať viacero domén na jednom servery, jednej IP, a jednom porte. Pri použítí SSL však nastáva jeden problém. Klient po úvodnom TCP handshaku iniciuje ešte SSL handshake. Toto sa logicky deje ešte pred poslaním HTTP požiadavky, ktorá obsahuje aj potrebnú "Host:" hlavičku. SLL handshake vyžaduje, aby server poslal svoj certifikát klientovi, lenže v danej chvíli ešte server nevie s ktorým virtuálnym serverom chce klient komunikovať a preto ani nevie, ktorý certifikát má vlastne poslať.

Existuje niekoľko možných riešení tejto situácie:
1. poslať certifikát najnavštevovanejšej domény, tj. prvý certifikát uvedený v konfigurácii. Naivné riešenie, kedy teoreticky väčšina návštevníkov nezaznamená žiadny problém a všetko bude v pohode. Nevýhoda je, že návštevníci iných domén dostanú zlý certifikát a pravdepodobne upozornenie WWW prehliadača, že certifikát je pre danú doménu neplatný.
2. prevádzkovať každú doménu na inom porte. Nepohodlné pre užívateľov.
3. prideliť každému virtuálnemu serveru svoju vlastnú verejnú IP adresu. Toto môže byť problém, lebo IPv4 adries je nedostatok a IPv6 zatiaľ nie je dosť rozšírené.
4. SNI (Server Name Indication) - rozšírenie SSL/TLS. Klient špecifikuje doménu v prvom kroku handshaku (ClientHello). Toto rozšírenie musí byť podporované na strane klienta aj na strane serveru.
5. jeden certifikát pre viacero domén (subjectAltName). Problém je, že domény môžu vlastniť rôzni majitelia. Je potrebné nájsť CA, ktorá taký certifikát podpíše. Ak je potrebné hostovať nejakú novú doménu, ktorá vyžaduje HTTPS, je potrebné znovu vydať certifikát rozšírený o nové doménové meno.

CGI (Common Gateway Interface)

Jedná sa o protokol na prepojenie externých aplikácii s webovým serverom. Toto umožňuje delegovať požiadavok klienta na externú aplikáciu, typicky skript, ktorý vygeneruje stránku, ktorá sa vráti klientovi ako HTTP odpoveď. Kedysi to bol jediný spôsob ako generovať dynamické stránky.

Basic access authentication

Tento spôsob autentizácie je priamo súčasťou HTTP protokolu. Jeho výhodou je, že ho podporuje drtivá väčšina prehliadačov. Nevýhodou je, že meno a heslo sa prenáša nešifrovane a server nemá možnosť nariadiť klientovi odhlásenie.

Cookies

Dáta, ktoré pošle server klientovi a ten ich pri ďalšej návšteve toho istého serveru serveru pošle naspäť. Typicky sa používajú na rozlíšenie návštevníkov, udržanie obsahu nákupného košíka a pod.

Alternatívne HTTP servery

lighttpd
nginx

Literatura