WWW, HTTP servery

Martin Holoubek, xholoub@fi.muni.cz


Obsah


WWW (World Wide Web)

WWW je založena na třech základních technologiích: HTTP, URL a HTML. Přenos souborů je zprostředkován protokolem HTTP (HyperText Transfer Protocol). Každý soubor je jednoznačně identifikován adresou URL (Uniform Resource Locator) a standardní dokumenty jsou vytvořeny značkovacím jazykem HTML (HyperText Markup Language). V případě, že by jste potřebovali více informací o protokolech HTTP než zde zmiňuji, pak je naleznete například na www.w3.org/Protocols.

Protokol HTTP

HTTP je malý rychlý protokol, který obsahuje jen několik příkazů neboli metod. Je protokolem aplikační vrstvy, to znamená, že vlastní přenos dat zajišťují nižší vrstvy. HTTP protokol je založen na modelu dotaz - odpověď. Vyskytuje se ve verzích HTTP/0.9, HTTP/1.0 a HTTP/1.1.

Webový server je obvykle spuštěn na portu 80 (nechráněná komunikace) nebo na portu 443 (komunikace nad vrstvou SSL). Pokud si chceme vyzkoušet práci s protokolem HTTP/x.y pak nám k tomu postačí např. telnet (spojený na příslušný port).

Formát požadavku a odpovědi

Každý dotaz obsahuje dotazový řádek, hlavičky následované prázdným řádkem a tělo dotazu (může být a většinou je prázdné). Tedy:

metoda cesta_k_dokumentu HTTP/x.y
hlavičky
prázdná řádka
text zprávy

Odpovědi jsou zasílané se stavovým řádkem, hlavičkami, prázdným řádkem a tělem odpovědi. Tedy:

HTTP/x.y stav_kód stav_text
hlavičky
prázdná řádka
obsah odpovědi

Například:

$ telnet aisa.fi.muni.cz 80
Trying 147.251.48.1...
Connected to www.fi.muni.cz (147.251.48.1).
Escape character is '^]'.
GET /~xholoub/PB029/index.htm HTTP/1.0
Accept: text/html
Accept-Language: cz
Accept-Charset: ISO-8859-2
 
HTTP/1.1 200 OK
Date: Tue, 13 Apr 2004 11:37:46 GMT
Server: Apache/1.3.29 (Unix) mod_ssl/2.8.16 OpenSSL/0.9.7d
Content-Location: index.htm
Vary: negotiate,accept-charset
TCN: choice
Last-Modified: Mon, 25 Nov 2002 12:16:56 GMT
Accept-Ranges: bytes
Content-Length: 1360
Connection: close
Content-Type: text/html; charset=iso-8859-2
Expires: Tue, 13 Apr 2004 11:37:46 GMT
 
<?xml version="1.0" encoding="iso-8859-2"?>
  <!DOCTYPE html
          ... celý text dokumentu ...
  </body>
</html>
Connection closed by foreign host.

Pozn.: je potřeba dát si pozor na odlišnosti různých verzí HTTP. Například, že HTTP/0.9 neobsahuje hlavičky nebo že požadavky v HTTP/1.1 musí mít definovanou délku v hlavičce Message-length.

Metody, hlavičky a stavové kódy HTTP

Hlavičky protokolu HTTP vycházejí ze standardu MIME. Mají následující syntax:

název hlavičky: hodnota[;parametr=hodnota]

Na pořadí hlaviček ve zprávě nezáleží. Každá hlavička musí začínat na novém řádku. Parametry v hlavičce jsou nepovinné. Příklad některých hlaviček je vidět ve výše uvedeném příkladu HTTP spojení.

Metoda je druh služby, kterou klient od serveru požaduje, píše se velkými písmeny. Server nemusí všechny metody podporovat. V případě nepodporované metody hlásí chybovou hlášku. Přehled metod:

GET Načte URL zdroje ze serveru.
HEAD Podobně jako metoda GET, ale nevrací zdroj, ale metainformace o zdroji.
POST Odeslání dat z klienta na server a předání procesu, který je zpracuje.
PUT Odeslání a uložení dat z klienta na server pod specifikovaným URL.
DELETE Požadavek klienta na odstranění požadovaného zdroje ze serveru.
OPTIONS Dotaz na možnosti komunikace spojené s uvedeným URL.
TRACE Metoda použitá k testování serveru. Má klientovi vrátit kladnou odpověď bez dat.

Stavový kód je číselná a textová informace zahrnutá v odpovědi, která klientovy sdělí, jak byl jeho požadavek zpracován. Přehled kategorií a významných stavových kódů:

1xx - informační kódy
100 Continue Klient může pokračovat v zasílání požadavku
101 Switching Protocols Server mění protokol používaný pri komunikaci
2xx - vyřízení požadavku
200 OK Požadavek byl zpracován
201 Created Výsledkem požadavku je vytvořený objekt
202 Accepted Požadavek přijat, ale dosud nezpracován
204 No content Požadavek zpracován, ale výsledkem nejsou žádná data
3xx - přesměrování
300 Multiple Choices Objekt dostupný ve více formátech
301 Moved Permanently Objekt trvale přemístěn na jinou adresu
302 Moved Temporarily Objekt dočasně přemístěn na jinou adresu
304 Not Modified Objekt nebyl změněn
4xx - chyba na straně klienta
400 Bad Request Chybný požadavek
404 Not Found Soubor nebyl nalezen
405 Method Not Allowed Metoda není povolena
406 Not Acceptable Nepřijatelné
408 Request Timeout Klient nedokončil požadavek ve stanoveném čase
410 Gone Požadovný objekt je odstraněn
415 Unsupported Media Type Data požadavku jsou v nepodporovaném formátu
5xx - chyba na straně serveru
500 Internal Server Error Vnitřní chyba serveru
501 Not Implemented Metoda není implementována
502 Bad Gateway Server - gateway obdržel špatnou odpověď od následujícího serveru
503 Service Unvailable Server je nedostupný
505 HTTP Version Not Supported Nepodporovaná veze protokolu HTTP

URL

URL (Uniform Resource Locator) je adresa, která jednoznačně určuje zdroje. Zdrojem může být například soubor (text, video, archiv, ...) nebo adresář. Schéma adresy URL je:

protokol://uživatel:heslo@hostitel:port/cesta

protokol Využitý protokol. Nejčastější protokoly jsou:
   - ftp - standardní FTP protokol
   - gopher - předchůdce WWW
   - http - standardní HTTP protokol
   - https - HTTP protokol se šifrováním v zabezpečné vrstvě SSL
   - mailto - e-mailová adresa
   - news - zprávy Usenet news
uživatel Jméno uživatele, nutné pouze v případě autorizovaného přístupu.
heslo Heslo uživatele, nutné pouze v případě autorizovaného přístupu.
hostitel IP adresa nebo platné doménové jméno.
port Číslo portu (HTTP standartně používá port číslo 80).
cesta Kompletní cesta k požadovanému souboru či adresáři.

HTML

HTML je zkratkou pro HypeText Markup Language - hypertextový značkovací jazyk. Což je první a zatím stále nejrozšířenější jazyk pro tvorbu webových stránek. Obsahem i rozsahem přesahuje tento referát. Bližší info viz stránky Worl Wide Web Consirium www.w3.org.


Apache

Podnětem k vytvoření Apache byl odchod vývojáře Roba McCoola z National Center for Supercomputing Applications, jež vytvořila do té doby velmi úspěšný webový server NCSA. V únoru roku 1995 vzniká skupina vývojářů Apache Group. Ta odstartovala vývoj nového volně šiřitelného serveru (modifikace původního NCSA). K němu byly postupně přidávány záplaty (patches), které zvyšovaly stabilitu a funkčnost serveru. Ty byly také podnětem pro nový název serveru Apache - od anglického a patche = záplata. První verze Apache spatřila světlo světa 18. března 1995 a nesla označení 0.2.

Architektura Apache by se dala rozdělit na čtyři vrstvy:
  1. Nejnižší vrsta je tvořena operačním systémem. Apache je schopen běžet na téměř jakkémkoli OS.
  2. Jádro Apche spolu s modulem http_core. Zajišťují základní funkcionalitu serveru.
  3. Vrstva modulů. Moduly rozšiřující funkcionalitu Apache o další možnosti.
  4. Některé moduly třetí vrstvy mohou využívat moduly dalších výrobců. Například mod_ssl využívá OpenSSL, mod_perl využívá Perl, atd.

Moduly

Apache je distribuován s modulem jádra a řadou dalších. Výsledná funkcionalita serveru je dána moduly, které jsou v okamžiku spuštění dostupné. Moduly mohou být pevně vestavěny do serveru Apache a nebo mohou být dynamicky přidávány jako externí soubory. Modulů je velké množství (jejich úplný výčet naleznete v dokumentaci), například:

mod_cgi používání skriptů CGI
mod_acces nastavení přístupu na základě DN jména nebo IP-adresy
mod_auth autorizace uživatelů pomocí textových souborů
mod_status zobrazení statistiky Apache
mod_info zobrazení konfigurace Apache
mod_ldap modul vytvoří spojení s LDAP a výsledek uloží do vyrovnávací paměti
mod_auth_ldap autorizace uživatelů pomocí LDAP
mod_charset_lite konfigurace znakové sady
mod_so podpora pro moduly DSO
mod_ssl modul umožňující použití SSL a TLS
mod_mime nastavení MIME typu souboru podle přípony souboru
mod_mime_magic nastavení MIME typu souboru na základě obsahu souboru
mod_negotiation vyhodnocení obsahu dokumentu na základě nastavení prohlížeče
mod_include použití serverem vkládaných vsuvek (SSI)
...  

Instalace

Apache nabízí dva způsoby instalace:

Binární instalace je přímo učena pro konkrétní operační systém a distribuci. Na jednotlivých systémech se od sebe může značně lišit. Proto se jí zde nebudeme dále zabývat. Pokud se rozhodnete pro tento druh instalace, pak si přečtěte přiloženou dokumentaci. Soubory s binární instalací jsou dostupné na www.apache.org/dist/httpd/binaries nebo je lze získat v rámci distribuce operačního systému.

Soubory pro instalaci ze zdojových kódů jsou dostupné k vonému stažení na www.apache.org/dist/httpd. Po rozbalení postupuje klasickým způsobem

$ ./configure
$ make
$ make install


Skript configure má velké množství parametrů. Zmínil bych zde alespoň ty nejdůležitější.
--enable-MODUL[=shared] Přeložení a vložní modulu MODUL. Má-li bý modul dynamický, pak vlastnost =shared.
--disable-MODUL Odstranění modulu, který by mohl být jinak přeložen a vložen.
--enable-modules=seznam_modulů Přeložení a vložení více modulů. Jejich seznam se ohraničí uvozovkami a jako oddělovač se použije mezera.
--enable-mods-shared=seznam_modulů To stejné, ale moduly jsou dynamické.


Konfigurace

Kofigurace Apache patří, alespoň podle mého názoru, do kategorie těch lehčích. Používají se pro ni tyto základní konfigurační soubory:

httpd.conf hlavní konfigurační soubor
srm.conf správa adresářů a dokumentů, vystavovaných na serveru
access.conf konfigurace přístupových práv
mime.type konfigurace typu MIME; nastavení vazby přípona versus aplikace
magic data pro modul mod_mime_magic
.htaccess lokální konfigurační soubor

V současnosti je konfigurace, kvůli větší přehlednosti a lepší správě, z větší části shrnuta do jediného souboru httpd.conf. S instalací jednotlivých modulů se Vám může stát, že bude muset pro správný běh serveru konfigurovat i nějaký jiný "nestandardní" konfigurační soubor (např. ssl.conf pro modul mod_ssl).

Soubor .htaccess má oproti ostatním konfiguračním souborům jednu "malou" výhodu. Načítá se při každém novém požadavku a proto při jakékoliv jeho změně nemusíme Apache restartovat, jako v případě ostatních souborů, které se načítají již při startu webového serveru.

Správu konfiguračních souborů můžeme dělat buď klasicky "ručně" textovou editací nebo pomocí aplikací, které umožňují správu Apache z grafického prostředí. Ty můžeme najít například na adrese gui.apache.org.

Struktura konfiguračních souborů je jednoduchá. Obsah tvoří direktivy, nastavující konkrétní vlastnost. Direktiva může být buď jednoduchá nebo může vymezovat sekci dalších direktiv. Na podmíněné provádění lze využít podmíněných direktiv <IfModule jméno_modulu> a <IfDefine jméno_sekce>. Před jméno_modulu či jméno_sekce může vložit znak !, který způsobí negaci. Příklady některých direktiv v httpd.conf

ServerRoot kořenový adresář Apache
ServerName jméno serveru (DNS jméno nebo IP-adresa)
ServerAdmin email správce serveru
DocumentRoot kořenový adresář s dokumenty
ErrorLog umístění logovacího souboru
AccessFileName jméno souboru, který obsahuje externí nastavaní
Timeout počet sekund do vypršení času
Listen adresa a port, na kterém server naslouchá
MaxClients maximální počet "dětských" procesů (klientů)
User UID, pod kterým budou spouštěny dětské procesy
Group GID, pod kterým budou spouštěny dětské procesy
...  

Virtuální servery

Pod tímto pojmem se rozumí více webových serverů, které běží na jednom stroji. Rozlišovat je od sebe můžeme buď IP-adresou nebo doménovým jménem. Tuto vlastnost využívají hlavně provozovatelé webových serverů, kteří chtějí poskytovat webový prostor uživatelům s vlastními doménami. Starší verze Apache neumožňovaly více hostitelů na jedné IP-adrese. Každý virtuální hostitel musel mít svou vlastní IP-adresu. Toto se změnilo až s příchodem protokolu HTTP/1.1, který obsahuje metodu, jak může server zjistit své jméno, pod kterým je adresován. Nastavení virtuálního hostitele se provádí v konfiguračním souboru httpd.conf.

Virtuální hostitelé podle jména

Umožňují více virtuálních hostitelů na jedné IP-adrese. V DNS struktuře musí mít virtuální hostitel záznamy, odkazující na požadovanou (stejnou) IP-adresu. V httpd.conf změníme nastavení direktiv NameVirtualHost (na požadovanou IP-adresu) a <VirtualHost> (zde se nastavují přesně jednotliví virtuální hostitelé). Například:

NameVirtualHost 10.0.0.1

<VirtualHost 10.0.0.1>
   ServerAdmin adminmail@mujprvniweb.cz
   DocumentRoot /var/www/html/server1
   ServerName www.mujprvniweb.cz
   ErrorLog /usr/local/apache/logs/error_server1_log
   CustomLog /usr/local/apache/logs/access_server1_log
</VirtualHost>

<VirtualHost 10.0.0.1>
   ServerAdmin adminmail@mujdruhyweb.cz
   DocumentRoot /var/www/html/server2
   ServerName www.mujdruhyweb.cz
   ErrorLog /usr/local/apache/logs/error_server2_log
   CustomLog /usr/local/apache/logs/access_server2_log
</VirtualHost>

Virtuální hostitelé podle IP-adresy

V tomto případě bude virtuální hostitel rozlišován na základě IP-adresy. V DNS struktuře tentokrát mají virtuální hostitelé záznamy odkazující na rozdílné IP-adresy. Pak existují dva způsoby jak rozlišovat virtuální hostitele podle IP-adres:

Tentokrát budeme v konfiguračním souboru httpd.conf editovat pouze direktivu <VirtualHost>. A to například takto:

<VirtualHost mujprvniweb.cz>
   ServerAdmin adminmail@mujprvniweb.cz
   DocumentRoot /var/www/html/server1
   ServerName mujprvniweb.cz
   ErrorLog /usr/local/apache/logs/error_server1_log
   CustomLog /usr/local/apache/logs/access_server1_log
</VirtualHost>

<VirtualHost mujdruhyweb.cz>
   ServerAdmin adminmail@mujdruhyweb.cz
   DocumentRoot /var/www/html/server2
   ServerName mujdruhyweb.cz
   ErrorLog /usr/local/apache/logs/error_server2_log
   CustomLog /usr/local/apache/logs/access_server2_log
</VirtualHost>

CGI skripty

CGI (Common Gateway Interface) skripty jsou programy, které se spouští na straně serveru. Jejich výstup je poté předáván klientovi. Pro možnost spouštění CGI musíme mít na serveru nahrán příslušný modul (mod_cgi) a správně nakonfigurovaný httpd.conf. Zajímat nás budou hlavně direktivy:

AddType application/x-httpd-cgi .cgi

<Directory cesta_k_cgi_skriptům>
   Options ExecCGI
</Directory>

Pokud chceme na Apachi používat PHP skripty, pak musíme korektně nainstalovat PHP. Stáhnout si ho můžeme např. z www.php.net. Instalace probíhá opět velmi jednoduše, jen nesmíme zapomenout dát skriptu ./configure volbu --with-apxs2=cesta, aby PHP vytvořilo modul pro Apache 2.x. Poté doplníme konfigurační soubor httpd.conf o direktivy:

LoadModule php4_module modules/libphp4.so
AddType application/x-httpd-php .php

Nakonec zkopírujeme php.ini-dist do adresáře /usr/local/lib (nebo do jiného, který jsme zvolili při konfiguraci volbou --with-config-file-path) pod názvem php.ini.

SSL

Abychom v Apachi mohli používat SSL, potřebujeme nějakou kryptovací knihovnu (nejlépe OpenSSL) a samozřejme modul mod_ssl. Když máme toto vše řádně nainstalováno, můžeme upravit httpd.conf popř. ssl.conf. Mezi hlavní direktivy spojené s SSL patří:

Port port pro SSL (standardně 443)
SSLCertificateFile cesta k veřejnému certifikátu serveru
SSLCertificateKeyFile cesta k tajnému klíči serveru
SSLEngine volba on povoluje SSL

Popis jak si vygenerovat příslušné klíče nalezneme např. zde. Apache pak spouštíme příkazem apachectl startssl.

Vyhodnocování obsahu

Apache umožňuje zvolit nejvhodnější reprezentaci dokumentu na základě údajů, které předává spolu s požadavkem klient (v hlavičkách). Jedná se o tyto údaje:

Apache ovládá dvě metody vyhodnocování obsahu:

MultiViews je vlastnost adresáře, která se nastavuje prostřednictvím direktivy Options u daného adresáře. Např.:

<Directory "/var/www/html/server1">
   Options Indexes FollowSymLinks MultiViews
</Directory>

Soubory v adresáři se pak liší přidáním další přípony, která odpovídá kódu jazyka a nebo znakové sadě. Např.:

index.html.de index.html.en index.html.cs.iso8859-2 index.html.cs.win-1250

Aby se při zadání adresy URL vašeho adresáře automaticky zobrazil jeden z těchto úvodních souborů, je nastavena direktiva DirectoryIndex se jménem tohoto souboru.

DirectoryIndex index

Typová mapa je dokument, který je asociován s handlerem type-map. Tento dokument má buď klasickou příponu .html nebo .html.var. Obsahuje jednotlivé varianty, které obsahují požadované parametry. Těmi jsou:

URI URI souboru s konkrétní variantou
Content-Encoding Typ kódování
Content-Length Délka souboru
Content-Type Typ MIME souboru
Content-Language Kód jazyka

Opět musíme nastavit direktivu DirectoryIndex a navíc ještě AddHandler. Např.:

AddHandler type-map var
DirectoryIndex index.html index.html.var

Soubory budou mít opět tvar se specifikujícími příponami. Např.:

index.html.de index.html.en index.html.cs.iso8859-2 index.html.cs.win-1250

Dále ovšem v tomto adresáři musíme vytvořit dokument typovou mapu index.html.var. Jeho obsah může například vypadat takto:

URI: index.html.de
Content-language: de
Content-type: text/html

URI: index.html.en
Content-language: en
Content-type: text/html

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

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

MultiViews se využíval hlavně u Apache 1.x, zatímco typová mapa se preferuje u Apache 2.x. Preferovat lze i více než jeden jazyk, pak pomocí dalšího parametru qs=x stanovíme kvalitu zdroje (kde x je číslo od 0.000 do 1.000). Např.:

Content-language: cs; qs=1.0, uk; qs=0.5


Ostatní webové servery

Apache je bezpečný, kvalitní a velmi populární webový server. Úspěšnost Apache dokumentují grafy a tabulky na stránkách www.netcraft.co.uk/Survey. Například je na výše uvedeném zdroji publikováno, že podíl hlavních webových serverů v březnu 2004 vypadá následovně: Apache 67,21%, Microsoft 20,88%, SunONE 3,51% a Zeus 1,60%. Pokud by jste se přesto rozhodli použít nějaký jiný webový server, pak bych doporučil navštívit adresu www.netcraft.co.uk/Survey/servers.html, kde naleznete odkazy na oficiální stránky jiných webových serverů.

Mezi využívané open-source webové servery, které jsou šířené pod GPL licencí patří například Roxen. Konfigurace i administrace se provádí pomocí internetových prohlížečů. Je nezávislý na platformě. Obsahuje v sobě již zabudované MySQL a umožňuje spouštět programy v řadě programovacích jazycích (PHP, Perl, Java, ...).

Odlišnou cenovou politiku má webový server Zeus, který je komerční. Příliš jsem se toho o něm na jeho oficiálních stránkách nedozvěděl, snad jen, že by měl být velmi bezpečný, spolehlivý a rychlý. Ale kdo by také o svém produktu tvrdil něco jiného. :-)


Odkazy

The Apache Software Foundation
PHP
Worl Wide Web Consortium
Comanche grafický nástroj pro správu Apache
Webalizer nástroj pro správu logovacích souborů
články na Rootu jako např.Malý průvodce konfigurací Apache a s ním související články