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. |
ServerRoot
je kořen podstromu pracovních souborů
APACHE pro konfigurační soubory, logy a moduly,DocumentRoot
je kořenový adresář pro všechny soubory
(dokumenty) poskytované klientům (data).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
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 upNový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
<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
ssh -X root@10.0.6.1
mozilla
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.