HTTP je protokol definující přístup ke zdrojům v prostředí WWW. Zdrojem se rozumí webová stránka, obrázek, soubor nebo něco jiného. HTTP je založen na modelu klient-server, kde klientem je obvykle (ale nikoli nutně) webový prohlížeč a serverem webový server.
Struktura komunikace pomocí HTTP (1.0 a vyšší):
Inicializační řádek se skládá ze tří částí: jméno metody, lokální cesta k požadovanému zdroji a verze HTTP:
GET /cesta/soubor.html HTTP/1.0
Odpověď serveru má podobný tvar jako klientův dotaz. Inicializační řádek se nazývá stavový řádek. Opět se skládá ze tří částí: verze HTTP, stavový kód odpovědi a jeho textová podoba. Příklad:
HTTP/1.0 200 OK HTTP/1.0 404 Not FoundStavový kód je trojciferné číslo a podle první cifry můžeme kódy rozdělit do několika skupin:
Protokol HTTP používá několik "metod", z nichž bych zmínil tyto tři:
Protokol HTTP verze 1.0 (rfc1945) nahradil dříve používaný (primitivní) protokol HTTP verze 0.9, který sloužil jen pro získávání HTML dokumentů a jehož jedinou metodou byla metoda GET. Zavedl například hlavičky a další metody.
Tato verze protokolu HTTP definuje 16 různých hlaviček, ovšem žádná z nich není povinná. Příklad:
From: pepa@nejakadomena.com
Verze 1.1 (rfc2068) zavádí oproti 1.0 mnohá rozšíření vyplývající z rozvoje webu. Kromě možností zavádí i povinnosti, a to jak pro stranu klienta tak i serveru. Níže jsem vybral některé z nich:
Každý HTTP/1.1 dotaz musí explicitně stanovit jméno webového serveru, ze kterého požaduje zdroj. To umožňuje implementovat virtuální servery rozlišitelné jménem (a nikoli jen IP adresou).
GET / HTTP/1.1 Host: www1.mojedomena.com
Tato vlastnost umožňuje nabízet daný zdroj v několika verzích. Například daná www stránka může být na serveru uložena v různých jazycích. Server buď může sám "uhádnout" nejlepší verzi daného zdroje, nebo klientovi nabídnout seznam verzí, ať si vybere on.
Mnoho www stránek obsahuje různé dodatečné, např. multimediální informace. Stránka se tak skládá z mnoha komponent a dříve bylo nutné pro stažení každé z nich navázat nové TCP/IP spojení, čímž docházelo ke zbytečnému zpomalování. HTTP/1.1 umožňuje požadovat během jednoho spojení více zdrojů.
Mezi další vylepšení patří například:
GET /manual/ HTTP/1.1 Host: localhost HTTP/1.1 200 OK Date: Mon, 05 Apr 2004 23:00:38 GMT Server: Apache/2.0.40 (Red Hat Linux) Content-Location: index.html.en Vary: negotiate,accept-language,accept-charset TCN: choice Last-Modified: Fri, 09 Aug 2002 17:48:11 GMT ETag: "4ece-2743-26c8cc0" Accept-Ranges: bytes Content-Length: 10051 Connection: close Content-Type: text/html; charset=ISO-8859-2 Content-Language: en <html> ... </html>
Apache je zřejmě nejpoužívanější webový server. Vděčí za to své modulárnosti, široké a celkem srozumitelné konfigurovatelnosti a v neposlední řadě jistě i licenční politice. V současné době je k dispozici ve dvou hlavních verzích:
Apache můžeme jako většinu programů instalovat bud ze zdrojových kódů nebo pomocí nějakého balíčkovacího systému typu RPM. Stručně popíšu první možnost, ta druhá je silně distribučně závislá.
./configure --prefix=/nejakacesta/apache --enable-rewrite --enable-speling=sharedPoznámky:
--prefix
určuje adresář, kam se bude Apache instalovat.--enable-rewrite
říká, že kromě implicitně kompilovaných
modulů se bude navíc kompilovat mod_rewrite.
--enable-speling=shared
říká, že mod_speling
se bude kompilovat jako sdílený objekt (DSO). Takový modul je pak
nutné aktivovat direktivou LoadModule
v httpd.conf
.
Modul sice poběží trošku pomaleji, než kdyby byl staticky
zakompilovaný, ale pro jeho aktivaci/deaktivaci stačí jen změnit
konfiguraci a restartovat Apache -- není nutné Apache znovu překládat.
make; make
install
.
Kromě vlastního webového serveru budeme mít k dispozici také
několik pomůcek pro jeho správu, jako například startovací skript
apachectl
nebo generátor souborů s hesly
htpasswd
.
Konfigurační soubory jsou uloženy v adresáři PREFIX/conf/
,
hlavní konfigurační soubor se jmenuje httpd.conf
.
Obsahuje různé direktivy, podobně jako jsme to viděli u konfiguračního
souboru ProFTPD. Direktivy jsou dobře okomentované, takže většinu
běžných změn lze provést bez studování manuálu. Já popíšu typické
úpravy konfiguračního souboru, které provádíme po nainstalování
Apache. Speciality týkající se spíše výkonu serveru rozebírat
nebudu. Jednodušší direktivy uvedu bez příkladů.
Tip: pro editaci httpd.conf
je výhodné použít editor se
zvýrazněnou syntaxí, jinak se direktivy poněkud rozplývají
v bohatém komentáři.
Při konfiguraci Apache bych doporučil postupovat na několik průchodů:
httpd.conf
a změnit implicitní
nastavení na hodnoty odpovídající našemu serveru.Pro účely výkladu popíšu tyto úkony v odlišném pořadí. Nejprve uvedu některé direktivy, jejichž argumenty asi budete chtít přenastavit, pak uvedu, jak specifikovat přístupová práva k nějakému adresáři a nakonec popíšu rozchození virtuálních serverů, SSL a CGI skriptů.
httpd.conf
ServerRoot
-- určuje kořen adresářového stromu
Apache; většinou bude stejný jako PREFIX zvolený při kompilaci.LoadModule
-- aktivace DSO moduluUser
a Group
-- určuje, pod jakým UID a
GID Apache poběží.ServerAdmin
-- e-mail administrátoraServerName
-- FQDN nebo IP adresa serveruDocumentRoot
-- adresář, ze kterého se berou
dokumenty požadované klientyIfModule
, Listen
,
DirectoryIndex
, ScriptAlias
,
AddDefaultCharset
, AddType
,...
Pomocí konfiguračního souboru pro Apache můžeme omezit přístup mimo jiné k adresářům, souborům nebo jiným místům na našem webu. Dosáhneme toho pomocí následujících direktiv:
Directory
-- pro omezení přístupu k adresářům
(z pohledu souborového systému)Files
-- totéž pro souboryLocation
-- pro omezení přístupu k určitému URL,
které obecně nemá nic společného se systémem souborů, může se
jednat třeba o alias nebo dynamicky generovanou stránku.Order
,
Allow
a Deny
. Příklad:
<Directory /pokus> Order deny, allow Deny from skaredadomena.com Allow from hodni.skaredadomena.com </Directory>Dále lze použít direktivu
AllowOverride
a přístupová
práva pro daný adresář specifikovat v souboru
.htaccess
uloženém v tomto adresáři.
Apache umí vůči klientům vytvářet dojem, že na jedné IP adrese běží
více serverů rozlišitelných jménem nebo že každý server má svoji IP
adresu. Servery běžící na jedné IP adrese nebo pod jedním jménem
můžeme dále rozlišit podle portu, na kterém Apache poslouchá. Všechny
tři přístupy lze kombinovat, navíc lze použít _default_ virtuální
servery, takže můžeme dostat značně komplikovanou strukturu, u které
nemusí být na první pohled vůbec zřejmé, který z virtuálních
serverů vyřeší daný požadavek.
Já uvedu konfiguraci (tj. co přidáme do httpd.conf
) pro
servery rozlišitelné jménem; konfigurace serverů rozlišitelných IP
adresou nebo jinak je podobná, nejlépe je podívat se na příklady
konfigurací z manuálu Apache.
NameVirtualHost * <VirtualHost *> DocumentRoot /www/example1 ServerName www.example1.com </VirtualHost> <VirtualHost *> DocumentRoot /www/example2 ServerName www.example2.org </VirtualHost>
SSL je protokol na úrovni mezi TCP/IP a aplikační vrstvou, který se dokáže postarat o bezpečnou komunikaci mezi klientem a serverem (vzájemná autentifikace, šifrování). Je navržen tak, aby podporoval různé algoritmy šifrování, podpisů a podobně. Pro informace o tom, jak funguje, bych vás raději odkázal na nějaký erudovanější zdroj.
Základem pro spuštění SSL na našem serveru je mít nainstalovaný potřebný software a vytvořený privátní klíč serveru a jemu odpovídající certifikát. (Certifikát je informace (soubor) obsahující příslušný veřejný klíč, jméno, komu patří - tj. kdo má privátní klíč -, a podpis certifikační autority.) Potřebný software:
mod_ssl
pro Apache (je obsažen ve standardně
kompilovaných modulech)
Pokud kompilujeme Apache ze zdrojových kódů, tak jako jeden
z parametrů skriptu configure
bude pravděpodobně
potřeba uvést
--with-ssl=ADRESAR_K_OPENSSL
Privátní klíč a certifikát (opravdový resp. "námi podepsaný") můžeme vytvořit krok za krokem podle návodu na stránkách apache.org:
Dále je potřeba upravit konfigurační soubory pro Apache. Je možné, že
to nebude přímo httpd.conf
, ale nějaký vložený soubor
jako třeba ssl.conf
. Zejména je potřeba správně nastavit
argumenty direktiv SSLCertificateFile
a
SSLCertificateKeyFile
. Pak bych doporučoval vytvořit
virtuální server běžící nad SSL, tj. na portu 443 a obsahující
direktivu SSLEngine on
. Jak přesně se to udělá, bych
nechal jako samostatné cvičení ;-). Apache je pak potřeba spouštet
nikoli jako
apachectl startnýbrž jako
apachectl startsslPřitom budete dotázáni na heslo k privátnímu klíči. Lze zařídit, aby se tento dotaz neobjevoval.
K zamyšlení: Jak docílit toho, aby do daného adresáře byl
povolen pouze přístup pomocí https
a nikoliv pomocí
http
?
K zamyšlení 2: Proč se nedá použít SSL u virtuálních serverů rozlišitelných jménem? Odpověď lze nalézt ve FAQ pro SSL v manuálu Apache.
CGI skript je program, který na svůj výstup generuje webovou stránku. Tento výstup musí na začátku obsahovat hlavičku informující o MIME-typu obsahu:
#!/usr/bin/perl print "Content-type: text/html\n\n"; print "Hello, World.";Z pohledu Apache je hlavní rozdíl CGI skriptu a obyčejné webové stránky v tom, že zatímco webovou stránku pošle přímo klientovi, CGI skript musí nejprve (nechat) interpretovat a klientovi poslat jeho výstup. Jsou dva základní způsoby, jak k tomu Apache přimět:
ScriptAlias
- vytvoříme alias na adresář,
ve kterém všechny bude Apache všechy soubory považovat za CGI skripty.Directory
položku Options +ExecCGI
. Pak
ještě musíme říct, jaké přípony souborů označují CGI skript:
AddHandler cgi-script cgi plObdobného efektu můžeme dosáhnout použitím souboru
.htaccess
.
Často chceme nabízet webové stránky v různých jazykových mutacích a/nebo v různých kódováních. Apache má naštěstí pro tento úkol zabudovanou dobrou podporu, takže si můžeme ukázat jednoduchý příklad, jak to udělat.
Máme stránku pokus.html
a chceme ji nabízet
v němčině a v češtině, přičemž českou verzi navíc
v kódováních ISO-8859-1 a -2.
Německou verzi uložíme do souboru pokus.html.de
a české
mutace do pokus.html.cz.iso-8859-1
a
pokus.html.cz.iso-8859-2
. Dále musíme pro adresář, kde
jsou tyto tři soubory uloženy, v direktivě Directory
nastavit Options MultiViews
. Upozornění: tento adresář
nesmí obsahovat soubor se jménem pokus.html
, jinak
vyjednávání o obsahu nebude fungovat!
Pro Apache ze standardní instalace by to mělo stačit. Ve standardním
httpd.conf
je totiž pomocí direktiv
AddLanguage
a AddCharset
definováno, jakými
příponami se rozlišují jednotlivé jazykové verze a kódování jedné
stránky. Ověřit funkčnost si můžeme tak, že v hlavičce HTTP
dotazu uvedeme příslušnou hodnotu pro Accept-Language
a
Accept-Charset
.
Jinou možnstí, jak nabízet daný zdroj ve více variantách, je vytvořit jeho typovou mapu. Mělo by to přinést zejména menší zatížení serveru. Pro bližší informace odkazuji na manuál Apache.
Při konfiguraci Apache je také vhodné upravit direktivy
LanguagePriority
, AddDefaultCharset
,
případně DefaultLanguage
.
Kromě Apache existují i jiné webové servery. Například: