WWW, HTTP servery

Miroslav Novák, 139612@fi.muni.cz


Obsah


HTTP

HTTP(HyperText Transfer Protocol) je významnou součástí Internetu. Pracuje na principu klient/server. Mezi jeho nejrozšířenější klientské implementace patří Firefox, Mozilla a Internet explorer. Jeho serverovou implementací je např. Apache, IIS od Microsoftu nebo Roxen. V současné době je nejpoužívanější verzí HTTP 1.1 a HTTP 1.0.


Metody GET a POST

Když webový klient realizuje spojení se serverem, implicitně kontaktuje TCP port serveru 80. Po tomto kontaktu se server nijak neprojevuje; je na klietovi, aby poslal svoje požadavky. Ty mohou být zaslány metodou GET a POST. Metoda GET slouží k získání dokumentu. Metoda POST např. pro zasílání vyplněného formuláře serveru(většinou vstup nějakému skriptu). Kromě těchto příkazů má protokol HTTP 1.1 definované ještě další typy komunikace.

Příklad komunikace metodou GET(HTTP 1.1) programem telnet:


oneill@notas:~> telnet localhost http
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
Host: localhost

HTTP/1.1 200 OK
Date: Sun, 05 Nov 2006 20:45:16 GMT
Server: Apache/2.2.0 (Linux/SUSE)
Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
ETag: "1bb3a-2c-4c23b600"
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html

<html> <body> <h1>It works!</h1> </body></html>
Connection closed by foreign host.

Nejdříve klient sdělí serveru jakou metodou posílá data, jakou chce stránku a určí verzi protokolu. Pak následují hlavičky s požadavky a informacemi o klientovi. Jakmile klient nemá už co říct, pošle prázdný řádek. Server po přijetí prázdného řádku posílá požadovaný obsah, jemuž předchází záhlaví serveru. Záhlaví informuje klienta o serveru, o množství odeslaných dat a jejich typu.

Hlavička, kterou zasílá klient serveru, může obsahovat:
Accept: text/html, image/*, */* - priorita MIME typů, které je klient schopen zpracovat
Accept-Charset: iso-8859-2, utf-8, us-ascii - seznam. znakových sad podporovaných klientem
Accept-Encoding: 8bit, base64 - přenosová kódování podporovaná klientem
Accept-Language: cs, en, * - priorita jazyků pro textové dokumenty
User-Agent: Mozilla/1.1 (X11, Linux) - identifikace typu a verze klienta
From: kas@fi.muni.cz - adresa uživatele
Referer: http://www.linux.cz/ - odkud klient přistupuje na stránky serveru
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT - poslat jen pokud byl dokument od této doby modifikován
Content-Type: image/jpeg - typ dokumentu
Hlavička, kterou zasílá server klientovi, může obsahovat:
Content-Language: cs - jazyk dokumentu
Date: Sat, 29 Oct 1994 19:43:31 GMT - současné datum
Expires: Sat, 29 Oct 1994 19:43:31 GMT - datum vypršení platnosti dokumentu
Last-Modified: Sat, 29 Oct 1994 18:15:24 GMT - datum modifikace dokumentu
MIME-Version: 1.0 - používaná verze standardu MIME
Location: http://www.fi.muni.cz/tech/ - kanonická adresa dokumentu
Pragma: no-cache - řízení vyrovnávací paměti
Server: Apache/2.0.16 - typ serveru
Retry-After: 60 - kdy bude dokument přístupný

Další metody zasílání požadavků na server:

HEAD - podobná metodě GET s tím rozdílem, že server vrací jen hlavičky dokumentu
DELETE - slouží k odstranění dokumentu na daném URL ze serveru
PUT - slouží k uložení dokumentu na dané URL
TRACE - zjišťování spojení
CONNECT - nastavení způsobu spojení
OPTIONS - zjišťování možností spojení

Příklad komunikace metodou POST(HTTP 1.1) programem telnet:


$telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
POST /zpracuj.cgi HTTP/1.0
Content-Length: 20

#tady můžu napsat text o délce 18 znaků - pokud nemám už co říct pošlu prázdný řádek

HTTP/1.0 200 OK
Date: Mon, 07 Nov 2005 13:50:15 GMT
Server: Apache
Content-type: text/html

.....
Metoda POST posílá většinou data nějakému skriptu. V tomto případě zpracuj.cgi. Ten převezme vstup a na výstup pošle hlavičky, prázdný řádek a dokument.


Server Apache

Apache je podobně jako Linux tvořen jádrem a moduly. Ty mohou být zkompilovány buď přímo do jádra(interní moduly) nebo se nahrají pří startu serveru(externí moduly). Zde se budu zabývat konfigurací verze Apache 2.2. Jeho kompletní manuálové stránky se nacházejí na http://httpd.apache.org/docs-2.2/.

Instalace

Balíčky serveru Apache 2.2 najdete s největší pravděpodobností na distribučním disku, které je snadné naistalovat. Pokud se ovšem rozhodnete si Apache zkompilovat, provedete následující kroky:

U SuSe 10.1 spustíme server příkazem: /etc/init.d/httpd start

Apache a moduly

Jak bylo řečeno, Apache má mnoho modulů, které mohou být přidány. Externí moduly se nahrají pomocí direktiv LoadModule a LoadFile a poté se aktivují direktivou Addmodule.(to platí i pro interní moduly)

Podívejte se na kompletná seznam modulů pro Apache.

Konfigurace

Konfigurační soubory jsou uloženy v adresáři /etc/apache2/(nebo /usr/local/etc, /etc/httpd/conf). Hlavní konfigurační soubor httpd.conf obsahuje nastavení základních vlastností serveru. V této verzi jsou do httpd.conf includovány soubory s nastavením. Je to pro větší přehlednost kódu.(bohatě komentováno)

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]
Jakým způsobem bude server spuštěn. Buď jako démon (tedy samostatně), pak použijeme volbu standalone, nebo pomocí initd s volbou initd.

ServerRoot
Hlavní adresář s configuračními soubory.

PidFile
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]
Tato 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
Maximální počet vyřízených požadavků přes KeepAlive spojení.

StartServers
Kolik se spustí démonů Apache při startu Apache.

MinSpareServers, MaxSpareServers
Minimální (maximální) počet volných (neobsazených) démonů.

MaxClients
Maximální počet současně běžících démonů(požadavků na server).

Listen [IP adresa:]port
Definuje na které adrese a kterém portu bude Apache poslouchat. Můžu zadat jen port nebo IP adresu s portem .

User, Group
Jméno uživatele a skupiny, pod kterými bude server běžet.

ServerAdmin
Emailová adresa správce serveru.

DocumentRoot
Jméno kořenového adresáře s dokumenty.(většinou obsahuje úvodní stránku serveru index.html)

Poměrně rozsáhlé nastavení poskytuje direktiva Direktory:

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

Další nastavení Direktory:

ExecCGI
Povoluje spouštění CGI skriptů v tomto adresáři.

FollowSymLinks
Povolí sledování symbolických linků v tomto adresáři.

Indexes
Pokud URL směřuje do adresáře kde není DirectoryIndex (tedy standartně index.html), pak se vypíše seznam souborů v tomto adresáři.

MultiViews
Povolení předávání dokumentů podle požadavků klienta

Order Allow, Deny
Allow from...nějaká doména
Deny from ...třeba all
Pokud bychom chtěli omezit přístup k dokumentům v daném adresáři uživatelům z určité domény.

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


Virtuální servery

Podpora virtuálních serverů je jednou z nejpoužívanějších funkcí Apache. Virtuální servery slouží pro běh několika domén na jednom serveru. Tyto domény rozpoznáváme buď podle různých IP adres na jednom rozhraní nebo podle jmen domén na dané IP adrese.


SSL

SSL(Secure socket layer) šifruje TCP spojení mezi klientem a serverem. Využívá k tomu technik symetrické a asymetrické kryptografie.

Pro práci se SSL můžeme použít např. OpenSSL a do Apache přidáme modul mod_ssl.

Proteže autentizace probíhá na bázi asymetrické kryptografie, musíme poslat klientovi kromě sdíleného klíče i certifikát pravosti tohoto klíče. 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ů]

Soubor server.crt obsahuje veřejný certifikát a soubor server.key soukromý klíč.

Konfiguraci provádíme v httpd.conf. Použijeme tyto direktivy:

SSLCertificateFile veřejný certifikát serveru
SSLCertificateKeyFile soukromý klíč serveru
SSLEngine [On|Off] povoluje SSL

Protože jméno domény virt. serveru identifikujeme v hlavičce, kde už máme šifrování, nelze SSL použít s virt. servery.


CGI

CGI(Common gateway interface) slouží pro vytváření dynamických stránek. Jedná se o skripty, které od HTTP serveru přijmou vstup(proměnné prostředí, data zaslaná metodou POST) a vygenerují výstup, který se má poslat klientovi. Tento výstup obsahuje zase hlavičky a tělo dokumentu.

Abychom mohli spouštět skripty CGI potřebujeme upravit httpd.conf:

LoadModule modules/mod_cgi

Ještě je nutné vybrat adresář ve kterém povolíme spouštění CGI skriptů.

<Directory "[adresář kde mohou být spouštěny CGI skripty]">
Options ExecCGI
</Directory>


Autentizace klienta

Protože HTTP je protokol bezestavový, nemá server jak zjistit, zda klient je již autentizován či ne. Proto protokol HTTP nabízí Basic Authentication pro autentizaci klienta. Jedná se o jednoduchou autentizaci jménem a heslem. Výzva k autentizaci je z prostředkována pomocí hlavičky WWW-Authenticate: Basic realm="[jméno realmu]" a stavového kódu 401, kterou posílá server klientovi. Toto probíhá při každém spojení klienta na server.(klient jméno a heslo cachuje a dále se už uživatele neptá)

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
Require valid-user

Soubor se jmény uživatelů a jejich hesly vytvoříme pomocí příkazu htpasswd.


Podpora Češtiny

Klient může pomocí hlaviček protokolu říci serveru jaký jazyk čí znakovou sadu preferuje:

Accept-Language: cs, en, *
Accept-Charset: iso-8859-2, utf-8, us-ascii
Accept-Encoding: 8bit, base64

A server mu může dle možností vyhovět.

Zpřístupnění dokumentů ve více znakových sadách by se jistě dalo dělat pomocí MultiViews nebo typových map, ale to ovšem vyžaduje jeden dokument pro každou znakovou sadu.


Alternativní HTTP servery

IIS - od Microsoftu
Roxen - OpenSource šířený pod GPL http://www.roxen.com/products/webserver/
webový server jako součást jádra OS Linux. kHTTPD, boa


Zdroje

http://httpd.apache.org/docs/2.2/ - dokumentace k Apache 2.2
http://www.fi.muni.cz/~kas/p090/referaty/ - referaty z minulých let(hlavní zdroj informací)
články na www.root.cz
slidy k předmětu Služby poč. sití slidyp. Jan Kasprzaka z přednášky Služby poč. sití