Cvičení v 8. týdnu

Správa HTTP serveru


HTTP server
HTTP server je program obsluhující požadavky klientů (WWW prohlížečů) protokolem HTTP. V současné době existuje celá řada serverů, které jsou určeny pro různé operační systémy. Asi nejznámějším serverem je server APACHE, který je současně nejpoužívanějším WWW serverem na Internetu. Server APACHE lze provozovat jak pod operačním systémem Linux, tak i Microsoft Windows, Solaris od Sun Microsystems a mnoha dalších platformách. Mezi další používané servery patří Stronghold, IIS, ABYSS, ControlWeb, ATPhttpd, AWKhttpd, dhttpd, fhttpd, ghttpd, phttpd, publicfile.

APACHE web server
Protože jsou tato cvičení zaměřena na Linux, budeme se dále zabývat webovským serverem Apache, resp. jeho variantou pro OS Linux.

Apache je modulární webovský server, což znamená, že jednotlivé logické funkční celky jsou zkompilovány odděleně jako moduly (podobně jako jádro Linuxu). Některé moduly mohou být linkovány přímo ve spustitelném souboru, ale většina se načítá až za běhu. Způsob vytvoření/získání modulů je analogický jádru OS - jednak je definován aplikační interface modulu pro programátory a jednak jsou již hotové moduly dostupné na Internetu.

Příprava
Pro účely cvičení budeme používat virtuální stroje FedoraCore4 (/opt/bin/FC4.sh). Na těchto strojích není nainstalován web server. Instalaci proveďte příkazem:
yum install httpd
Virtuální stroj neobsahuje prohlížeč. Nainstalujte mozillu příkazem:
yum install mozilla
Při zobrazování obsahu vašeho web-serveru prohlížečem nepoužívejte PROXY. Vypněte si v prohlížeči HTTP proxy již teď.

Startování serveru
V prostředí Linuxu je server APACHE reprezentován programem httpd a moduly. Tento program je spouštěn ze startovacího scriptu (/etc/rc.d/init.d/httpd) jako démon, který běží stále. Všechny parametry příkazové řádky, či jiná nastavení již obsahuje příslušný script /etc/rc.d/init.d/httpd (viz 2. cvičení), takže server spouštíme a zastavujeme příkazy

# service httpd start
# service httpd stop

Úkol 1:Odstartujte server s implicitní konfigurací a ověřte jeho funkčnost pomocí prohlížeče.

Úkol 2:V adresáři /var/www/html vytvořte soubor index.html s vaším vlastním HTML kódem a ověřte, že prohlížeč zobrazí vaši stránku.

Aby server obsluhoval požadavky klientů rychleji (paralelně), vzniká během života serveru několik podprocesů httpd. Pokud je nutné serveru poslat signál, stačí ho poslat pouze rodičovskému procesu (pid je specifikován v pid-souboru). Server akceptuje zejména tyto signály: TERM, HUP a USR1.
Signál TERM Tento signál se používá k okamžitému zastavení serveru. Rodičovský proces se pokusí ukončit (případně zabít) všechny své potomky a poté ukončí i sám sebe.
Signál HUP Instruuje rodičovský proces serveru, že se mají ukončit všichni potomci, ale rodičovský proces má pokračovat v činnosti. Po opětovném načtení konfiguračních souborů a znovu otevření logovacích souborů je opět spuštěna nová množina potomků.
Signál USR1 Tento signál způsobí ohleduplnější restart serveru. Rodičovský proces instruuje své potomky, aby dokončili obsluhu právě prováděného požadavku a ukončili se. Rodičovský proces poté provádí restart stejně jako v případě signálu HUP.
Server pro svou práci používá dva hlavní adresáře, ke kterým pak vztahuje relativní cesty:

Některé příkazové přepínače programu httpd:
-d serverroot nastavuje hodnotu proměnné ServerRoot, tzn. umístění souborů instalace serveru
-f config specifikuje konfigurační soubor, který se použije př startu serveru
-C directive specifikuje direktivu, která se má provést před zpracováním hlavního konfiguračnho souboru
-c directive stejné jako přepínač -C s tím rozdílem, že direktiva se má zpracovat až po zpracování konf. souboru
-l vypíše seznam všech modulů zakompilovaných do serveru
-t testuje syntaxi konfiguračního souboru. Zároveň testuje přítomnost všech adresářů, na které odkazují direktivy DocumentRoot

Úkol 3: Zjistěte, zda se startuje httpd démon v učebně 310 automaticky, kde je to nastaveno, a nalezněte jeho konfigurační soubory.

Konfigurační soubory
Jako mnoho jiných subsystémů v UNIXu je i APACHE konfigurovatelný přes konfigurační soubory. Tyto soubory (jsou tři) obsahují konfigurační direktivy, které jsou zpracovávány během startu serveru. Cesty k souborům v následujícím výčtu jsou relativní ke kořenovému adresáři APACHE ServerRoot, tipicky /etc/httpd.

conf/httpd.conf
Je to hlavní konfigurační soubor obsahující direktivy, které přímo řídí činnost serveru. (Název serveru, počet paralelně běžících procesů, odkazy na ostatní konf. a logovací soubory, parametry spojení, seznam modulů, ...). Je možné použít explicitně jiný konfigurační soubor parametrem httpd -f soubor.

conf/*.conf
Konfigurační soubory s direktivami pro různé moduly serveru.

Server poskytuje klientům nejen obsah vlastního dokumentu, ale také metainformace o tomto dokumentu - tedy zejména typ dokumentu, použité kódování, apod. Metainformace odvozuje buď od přípony souboru (viz soubor mime.types, nebo podle obsahu (testuje obvykle několik prvních bajtů) - magic numbers (viz soubor conf/magic).

Ukládání záznamů - logovací soubory
Protože se jedná o server, který poskytuje informace do Internetu (potenciálně nebezpečného prostředí), je vhodné (ne-li přímo nutné) ukládat informace o činnosti serveru, přístupech a poskytnutých dokumentech. Pro tento účel server vytváří několik logovacích souborů, které je možné použít jednak ke správě serveru, případně k odhalení pokusů o neoprávněné průniky. Server umí ukládat logované informace zvlášť pro každý virtuální server, zvlášť chyby, přístupy i datové přenosy, zvlášť pro vybranné domény.

Při startu vytváří rodičovský proces serveru soubor, ve kterém je uložen jeho pid. Tak je možné později server korektně ukončit či restartovat. Jméno toho souboru je defaultně logs/httpd.pid, přičemž opět je možné jméno změnit direktivou PidFile.

Konfigurační soubory - popis
Zde je uveden stručný popis konfiguračních souborů.
Konfigurační soubory obsahují jednu direktivu (specifikuje určité nastavení) na jednom řádku. Je-li posledním znakem na řádce '\', pokračuje na další řádce stejně jako v céčku. Direktivy nejsou case-sensitive, ale argumenty těchto direktiv jsou case sensitive často. Komentáře jsou uvozeny znakem '#' a nesmí být na řádce za direktivou! Kontrolu syntaxe konfig. souborů je možné provádět pomocí parametru -t. Seznam direktiv je možné najít na stránce serveru Apache.

.htaccess soubory
Konfigurační soubory, které definují chování serveru jsou umístěny na centrálním místě a tedy správa mnoha různých adresářů je z tohoto pohledu obtížná. Apache umožňuje pro různé adresáře definovat konfigurační soubor .htaccess, který obsahuje direktivy pro daný adresář. Nemusí se tedy umísťovat do centrálního konfiguračního souboru. Tím si může např. každý uživatel ve svém domovském public_html upravit metainformace o souborech, definovat vlastní CGI scripty, práva přístupu apod., aniž by měl práva zápisu do globálního conf/httpd.conf.

Virtuální servery
Tato technika umožňuje provozovat na jednom fyzickém počítači více webovských serverů, odlišených svým doménovým jménem. V současné době se používají dvě techniky tvoření virtuálních serverů. Jedná se o virtuální servery na bázi IP adres a na bázi jmen. V obou technikách se k odlišení serverů používají různá doménová jména (např. www.domain.com a sale.domain.com), která jsou pomocí DNS serveru přeložena na IP adresy téhož počítače. Hlavní rozdíl je v tom, zda se používá jen jedna nebo více IP adres pro jeden počítač (fyzický server).

Virtuální servery na bázi IP adres
Virtuální servery založené na IP adresách rozlišují virtuální servery nejen podle jména, ale i podle IP adresy. To znamená, že daný fyzický počítač musí mít více síťových interface (nebo IP-alias), což ale v současné době není příliš doporučováno z důvodu nedostatku volných veřejných IP adres. Server httpd pak jednotlivé dotazy rozliší jednoduše podle cílové IP adresy, na kterou bylo spojení navázáno. Z pohledu httpd démona existují dva základní způsoby konfigurace takového serveru. Buď pomocí více samostatných httpd démonů anebo pomocí jediného démona obsluhujícího všechny virtuální servery na všech jejich IP adresách.

Vícero démonů
V tomto případě je potřeba vytvořit více nezávislých konfiguračních souborů conf/httpd.conf a každému spuštěnému daemonovi předáme jiný konfigurační soubor. V každém konfiguráku se pak použije direktiva Listen pro příslušnou IP adresu. Např.:
Pro virtuální server A: Listen 147.32.81.1:80
Pro virtuální server B: Listen 192.168.1.1:80
Na počítači pak poběží několik procesů (resp. několik skupin procesů) APACHE serverů, kteří o sobě navzájem nevědí, a každý (každá skupina) poslouchá na jiné IP adrese téhož počítače. Můžete je naprosto nezávisle ovládat (spouštět/zastavovat) a konfigurovat.

Jediný démon
V případě použití jediného démona běží jen jeden démon (resp. jediná skupina procesů), který poslouchá současně na všech přidělených IP adresách a podle nich odvozuje, který DocumentRoot použít. Z hlediska konfigurace serveru je situace je o něco komplikovanější, ale procesy nezabírají zbytečně mnoho paměti. Pro nastavení se použije direktiva VirtualHost v konfiguračním souboru serveru. Např.:

    <VirtualHost www.domain.com>
    ServerAdmin webmaster@mail.domain.com
    DocumentRoot /www/main
    ServerName www.domain.com
    ErrorLog /www/main/logs/error_log
    TransferLog /www/main/logs/access_log
    </VirtualHost>

    <VirtualHost sale.domain.com>
    ServerAdmin webmaster@mail.domain.org
    DocumentRoot /www/sale
    ServerName sale.domain.com
    ErrorLog /www/sale/logs/error_log
    TransferLog /www/sale/logs/access_log
    </VirtualHost>
Experiment I
Nyní se pokusíme vytvořit dva virtuální servery. Jeden bude obsluhovat požadavky na původní IP adresu vašeho počítače (tj. 10.0.6.1), druhý bude obsluhovat požadavky na adresu 10.0.6.2.

Nejprve je potřeba přidělit počítači další IP adresu, protože počítače mají přidělenu pouze jedinou. Na počítači, kde má běžet http server s virtuálními servery vytvoříme IP alias:

# ifconfig eth0:1 10.0.6.2 netmask 255.255.255.0 up
Novým IP adresám přiřadíme doménová jména. Protože nemáme přístup k DNS serveru, použijeme lokální soubor /etc/hosts a doplníme specifikaci nového jména a IP adresy. Můžete použít jména např. ve tvaru first.cz a second.cz
Http server bude nakonfigurován zhruba takto (podrobnější konfigurace je ponechána na vás, použijte existující konfigurační soubor httpd.conf):
    <VirtualHost 10.0.6.1>
    DocumentRoot /home/httpd/html/first
    ServerName first.cz
	...	
    </VirtualHost>

    <VirtualHost 10.0.6.2>
    DocumentRoot /home/httpd/html/second
    ServerName second.cz
	...
    </VirtualHost>
Spustíte-li prohlížeč na stejném počítači jako server, mělo by vše probíhat bez problémů. Prohlížeč nejprve nainstalujeme prikazem:
yum install mozilla
a pak pozavirejte vsechna okna prohlizecu na vasi plose, prihlaste se do pocitace FC4 prikazem: ssh -X root@10.0.6.1
a spoustte prihlizec prikazem:
mozilla
Do prohlizece muzete napsat adresu http://10.0.6.1 nebo http://10.0.6.2. Aby fungovala jmena first.cz a second.cz musite vlozit prislusny zaznam do /etc/hosts.

Virtuální servery na bázi jmen
Novější metoda vytváření virtuálních serverů bez nutnosti mít na jednom počítači více síťových rozhraní (nutnost mít více záznamů v DNS zůstává) však vyžaduje spolupráci s HTTP protokolem a klienty. Protokol HTTP od verze 1.1 a rozšíření protokolu HTTP/1.0 umožňují, aby server z dotazu poznal, na jaký virtuální server má být přistupováno. Mezi výhody tohoto typu virtuálních serverů patří prakticky neomezený počet virtuálních serverů, jediná IP adresa, jednoduchá konfigurace a žádný dodatečný HW a SW.

Konfigurace je podobná virtuálním serverům na bázi IP adres, pouze přibývá nová direktiva NameVirtualHost, která určuje společnou IP adresu, která bude použita pro přístup na virtuální servery. Př.:

    NameVirtualHost 10.0.6.1

    <VirtualHost 10.0.6.1>
    ServerName funny.server.com
    DocumentRoot /www/funny
    </VirtualHost>

    <VirtualHost 10.0.6.1>
    ServerName serious.server.com
    DocumentRoot /www/serious
    </VirtualHost>

Direktiva NameVirtualHost může obsahovat buď společnou IP adresu, na které budou virtuální servery pracovat, nebo * pro "zachycení" všech IP adres počítače - pak jsou všechny virtuální servery přístupné přes libovolnou adresu tohoto počítače. Toto je možné použít např. v případech, kdy má server dva síťové interface do dvou různých sítí (funguje zároveň jako router nebo firewall), nebo když je IP adresa serveru přidělovávna dynamicky.

Další záležitostí je otázka více jmen pro jeden server. Tvořit pro každé jméno další virtuální server se stejným obsahem je neefektivní, a proto existuje direktiva ServerAlias, která umožňuje "dodefinovat" další jména, pro která má být daná sekce (tedy virtuální server) použita.

Experiment II - bodovaný (2 body)
V tomto experimentu budeme vytvářet virtuální servery na bázi jmen. V tomto případě již tedy nemusíme vytvářet IP aliasy, nicméně budeme potřebovat nastavit /etc/hosts tak, aby byla nova jmena prelozitelna na IP adresu dotycneho stroje (10.0.6.1), tentokrát se však všechna doménová jména virtuálních serverů překládají na tutéž IP adresu. Postup je podobný jako v případě prvního experimentu. Modifikujte patřičně soubor /etc/hosts, příkaz ifconfig tentokrát nebudete potřebovat.
Příklad konfigurace serveru ukazuje následující úryvek z conf/httpd.conf:

    NameVirtualHost 10.0.6.1
	
    <VirtualHost 10.0.6.1>
    DocumentRoot /home/httpd/html/a
    ServerName a.server.com
	...	
    </VirtualHost>

    <VirtualHost 10.0.6.1>
    DocumentRoot /home/httpd/html/b
    ServerName b.server.com
	...
    </VirtualHost>

CGI skripty
CGI (Common Gateway Interface) je způsob, jak získávat dynamická data z externích programů běžících na serveru. Tyto programy jsou často označovány jako CGI programy nebo CGI skripty. CGI je nejednodušší a velmi rozšířený způsob jak umísťovat dynamický obsah na web. Vedle toho způsobu dále existují i další podobné mechanismy (ASP, PHP, Java-servlet).

Uvědomte si, že každé použití CGI skriptu znamená spuštění nějakého programu na žádost anonymního klienta, přičemž klient dokonce určuje spouštěný program! Umožníte-li spustit nevhodný program, riskujete závažné narušení bezpečnosti celého UNIXu, proto je vhodné umísťovat veškeré CGI skripty do přesně definovaných míst. Adresáře s CGI skrypty je možné definovat direktivou ScriptAlias. Veškeré soubory, které jsou umístěny v tomto adresáři jsou automaticky považovány za skripty.

    ScriptAlias /cgi-bin/ /www/cgi-bin/
Tímto způsobem se vyhradí speciální adresář, který obsahuje jen skripty. Je to vhodné hlavně z bezpečnostních důvodů. Je však možné definovat i jiné adresáře, ve kterých mohou být umístěny skripty. Toto explicitní povolení se provádí pomocí:
    <Directory /www/some_www_docs_dir>
    	Options +ExecCGI
    </Directory>
Protože však v daném adresáři může být umístěno více souborů (tedy nejen skripty), je nutné specifikovat, které soubory (podle přípony) je nutné brát jako skripty. K tomu slouží directiva Addhandler.
    AddHandler cgi-script .cgi .pl

Vytvořní jednoduchého cgi skriptu
Úplně nejjednodušší cgi skript je obyčejný skript shellu OS. Např.:

    #!/bin/sh
    echo "Content-type: text/plain"
    echo
    echo "Hello, World."
Skript generuje data na standardní výstup a tato jsou posílána klientovi. Proto je nutné dodržet určitý formát těchto dat. V příkladu je vidět, že nejprve je odeslána hlavička obsahující metadata - informace o typu a struktuře následujících dat, což je důležité pro klienta, aby správně zacházel s následujícími daty. Hlavička a vlastní data jsou odděleny vždy prázdnou řádkou.

Nic však nebrání tomu, aby CGI skripty byly perlovské skripty, "pravé" (binární) programy, databázový frontend, apod.

Úloha: Vytvořte jednoduchý CGI skript, který z daného počítače zjistí připojené souborové systémy, jejich kapacitu a zaplnění. Informace přehledně zobrazí.

HTTP proxy
APACHE http server může bez problémů současně fungovat jako HTTP proxy - tedy vlastně aplikační gateway (brána) pro protokol HTTP. Krom toho, že zprostředkovává dotazy, zároveň odstíní IP adresu klienta a předávané dokumenty udržuje v paměti cache pro opakované použití. Typicky se používá při připojení lokální sítě pomalejší linkou na Internet, na firewallech nebo u ISP.
Proxy funkce se aktivuje vložením modulu mod_proxy (standardně již vložen) a uvedením direktivy ProxyRequests On v hlavním konfiguračním souboru conf/httpd.conf. Přístupová práva lze řídit direktivou

<Directory proxy:*>
   ...
</Directory>
podobně jako pro kterýkoliv zveřejňovaný adresář. Parametry ukládání do cache lze ovlivnit direktivami CacheRoot, CacheSize, CacheMaxExpire, NoCache domain, ...

Úloha: Aktivujte HTTP-proxy, vyzkoušejte z klienta na jiném počítači. Kde se nastavuje proxy na straně klienta?

Konfigurace pomocí grafických nástrojů
Základní funkce HTTP serveru APACHE lze interaktivně nakonfigurovat také pomocí různých grafických konfiguračních nástrojů, mezi které patří např. system-config-httpd. Grafické nástroje použijte v případě, kdy potřebujete nakonfigurovat jen velice jednoduchý server, v komplikovanějších situacích měňte přímo konfigurační soubor. Další velkou nevýhodou je, že grafické nástroje často neumí zpětně načíst konfigurační soubor. To znamená, že jakmile v konfiguračním souboru provedete sebemenší změnu ručně (např. proto, že něco grafický konfigurátor neumí), musíte od toho okamžiku již vše konfigurovat ručně, jinak se vám ručně udělaná změna přepíše.

Úloha: Projděte aktuální konfiguraci pomocí nainstalovaného grafického konfigurátoru. Změňte některý attribut, a ověřte, zda a jak se změna promítla do konfiguračního souboru.