Protokol HTTP, webový server Apache atd.

Jiří Cvachovec, xcvachov at fi.muni.cz


Obsah


Protokol HTTP

Úvod

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 Found
Stavový 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:

Obsah

HTTP 1.0

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

Obsah

HTTP 1.1

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:

Hostname Identification

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

Content Negotiation (vyjednávání o obsahu)

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.

Persistent Connections (trvalá spojení)

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:

Obsah

Příklad komunikace

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>

Obsah


Webový server Apache

Úvodem

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:

Moduly pro verzi 1.3 nejsou beze změn použitelné pro verzi 2.0 (nestačí rekompilace). Změny v konfiguračních direktivách však nejsou nijak zásadní a mnou popsaná konfigurace pro verzi 2.0 by měla být s drobnými úpravami použitelná i pro verzi 1.3.

Obsah

Instalace

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

  1. Stáhneme si zdrojové kódy (např. z www.apache.org) a rozbalíme je do pomocného adresáře.
  2. V něm spustíme konfigurační skript s příslušnými parametry. Příklad:
    ./configure --prefix=/nejakacesta/apache --enable-rewrite --enable-speling=shared
    
    Pozná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 LoadModulehttpd.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.
  3. Pak už Apache přeložíme a nainstalujeme příkazy 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.

Obsah

Konfigurace

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ů:

  1. Projít celý soubor httpd.conf a změnit implicitní nastavení na hodnoty odpovídající našemu serveru.
  2. Rozchodit podporu požadovaných subsytémů (SSL, PHP atd.).
  3. V dokumentovém stromě vytvořit příslušné podadresáře, nastavit jejich práva a naplnit je daty.
  4. ...

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

Direktivy httpd.conf

Další užitečné direktivy: IfModule, Listen, DirectoryIndex, ScriptAlias, AddDefaultCharset, AddType,...

Přístupová práva

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:

Vlastní přístupová práva pak nastavíme direktivami 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.

Obsah

Virtuální servery

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>

Obsah

SSL

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:

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 start
nýbrž jako
apachectl startssl
Př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.

Obsah

CGI skripty

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:

Obsah

Vyjednávání o obsahu

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

Obsah


Jiné WWW servery

Kromě Apache existují i jiné webové servery. Například:

Obsah


Odkazy

Obsah