Hlavní navigace

Lighttpd: virtuální hosty

Adam Štrauch 5. 9. 2008

Dnes se podíváme na možnosti hostování více webů na jedné IP adrese s lighttpd. Ten má velmi široké možnosti konfigurace a cesta, jak toto provést, není jen jedna, ale popíšeme si čtyři. Také si vysvětlíme podrobněji podmínky, kterými lze efektivně ovlivnit konfiguraci celého web serveru.

Podmínky

Konfigurace lighttpd se točí kolem podmínek. Jak jsme si řekli v minulých dílech, lighttpd se nastavuje ovlivňováním proměnných, a do tohoto procesu můžeme zasáhnout podmínkami. Není proto problém, aby pro každý web platila úplně jiná konfigurace serveru. Podmínky se zapisují v následujícím tvaru:

$HTTP["..."] == "..." {
    ...
}
else $HTTP["..."] == "..." {
    ...
} 

Větev else můžeme vynechat. Proměnné, které lze s něčím porovnávat, se nachází v následující tabulce:

Proměnná Obsahuje
$HTTP[„cookie“] Cookie
$HTTP[„host“] Doména (část url před lomítkem)
$HTTP[„useragent“] Identifikace prohlížeče
$HTTP[„referer“] Odkud návštěvník přišel
$HTTP[„url“] Část url za lomítkem
$HTTP[„querys­tring“] Část url za „?“
$HTTP[„remoteip“] IP adresa návštěvníka
$HTTP[„scheme“] „http“ nebo „https“
$SERVER[„socket“] IP adresa serveru (pro vhosty založené na IP adresách)

Pro porovnávání s naší hodnotou můžeme využít operátory „==“ (rovná se), „!=“ (nerovná se), „=~“ (odpovídá regulárnímu výrazu) a „!~“ (neodpovídá regulárnímu výrazu).

Více podrobností o podmínkách lze nalézt v dokumentaci.

Virtual hosting

Provozování více webových prezentací na jednom serveru je s lighttpd hračka. Je tu ale i nevýhoda, že všechny weby běží pod jedním uživatelem. To znamená, že se hodí spíše pro potřeby jednotlivců než velké skupiny lidí a o mass hostingu nemůže být ani řeč. Ve spojení s FastCGI a podobnými technologiemi tato nevýhoda odpadá.

V článku budu používat pojem „virtual host“, zkráceně „vhost“.

Čtyři možnosti jak rozdělit jednotlivé weby si ukážeme v následujících bodech.

Podmínkový vhost

Tou nejjednodušší a nejflexibilnější cestou je použití podmínek:

$HTTP["host"] == "domena1.cz" {
    # nastavíme document-root
    server.document-root = "/var/www/domena1.cz/"
    # ale můžeme použít i jiná nastavení, třeba:
    dir-listing.activate = "disable"
    accesslog.filename   = "/var/log/lighttpd/domena1_cz.log"
} 

Na rozdíl od níže popsaných způsobů, lze s podmínkovými vhosty provozovat virtual hosty nejen na základě doménových jmen, ale i IP adres.

Simple vhost

Další 3 možnosti včetně této už vyžadují použití modulů. Jednu z nich zajišťuje modul mod_simple_vhost. Ten umí „mapovat“ domény do nějakého adresáře. To znamená, že když máme vytvořený adresář třeba „/var/www/dome­na1.cz“, tak pokud do prohlížeče zadáme „domena1.cz“, objeví se nám web nebo obsah ze zmíněného adresáře. Nastavení se může podobat tomuto:

simple-vhost.server-root         = "/var/www"
simple-vhost.document-root       = ""
#simple-vhost.server-root + $HTTP["host"] + simple-vhost.document-root 

Vytvoření dalšího webu se pak rovná vytvoření buď adresáře ve „/var/www“ nebo symlinku odkudkoli do „/var/www“.

Více podrobností o mod_simple_vhost lze nalézt v dokumentaci.

Enhanced vhost

Pokročilejší formou vytváření virtual hostů zajišťuje modul „mod_evhost“. Ten dovoluje nastavit větší detaily u adresářové struktury. Principem je, že si někde v systému vytvoříme adresář, například „/var/www“ a pomocí dalších proměnných vytvoříme místo, kde budou uloženy webové stránky. To se hodí, pokud například chceme pro každý web oddělit adresář se soubory pro web, pro fotky a třeba i pro logovací soubory. Adresářová struktura pak může vypadat nějak takto:

/var/www/domena1.cz/www/default
/var/www/domena1.cz/www/www
/var/www/domena1.cz/www/
/var/www/domena1.cz/www/
/var/www/domena1.cz/logs
/var/www/domena1.cz/albums 

Jak jsem zmínil, nastavení se provádí pomocí proměnných:

%% => reprezentuje znak %
%0 => doména + tld (domena1.cz)
%1 => tld (cz)
%2 => doména (domena1)
%3 => doména třetího řádu řádu (uzivatel.domena1.cz)
%4 => doména čtvrtého řádu (web1.uzivatel.domena1.cz) 

Více podrobností o mod_evhost lze nalézt v dokumentaci.

Nastavení pak vypadá například takto:

evhost.path-pattern = "/var/log/%0/%3" 

Zadáme-li například do prohlížeče „http://www.do­mena1.cz/“, podle tohoto nastavení se použije adresář „/var/log/dome­na1.cz/www“. Může se ovšem stát, že takový adresář neexistuje. V tom případě se použije pouze „/var/log/dome­na1.cz“.

Mysql vhost

Poslední podobnou možností je použití databáze MySQL k uchovávání dat o vhostech. Jedná se o jednoduché nastavení přístupu a definování SQL dotazu, který vybere potřebná data. O tuto funkcionalitu se stará modul „mod_mysql_vhost“.

Nastavení vypadá takto:

mysql-vhost.db             = "databaze"
mysql-vhost.user           = "jmeno"
mysql-vhost.pass           = "heslo"
mysql-vhost.sock           = "/var/run/mysqld/mysqld.sock" # socket k mysql
mysql-vhost.sql            = "SELECT Doc_Root FROM lighttpd WHERE Host='?';" # příklad sql dotazu 

První tři položky by měly být jasné. Proměnná „mysql-vhost.sock“ obsahuje soubor s unixovým socketem. Další položkou se předává SQL dotaz, kde je znak „?“ nahrazen názvem domény. Dotaz vrátí document-root. Pokud MySQL není na lokálním stroji, lze místo socketu použít „mysql-vhost.hostname“ a „mysql-vhost.port“.

Více podrobností o mod_mysql_vhost lze nalézt v dokumentaci.

Userdir

Určitě každý z vás narazil občas na adresu ve tvaru „http://domena1­.cz/~uzivatel“. Na tyto případy má lighttpd zvláštní modul s názvem „mod_userdir“. Ten umí namapovat požadavky směřující směrem „~uzivatel/neco“ například na „/home/uzivatel/a­dresar/neco“. Nastavení lze udělat i takové, že adresář určený ke zveřejnění není založen na záznamu o uživateli v „/etc/passwd“, ale nachází se třeba ve „/var/www/uzi­vatele“.

Nastavení pro tento modul je dobré kombinovat s podmínkou, která zajistí, že uživatelé nebudou přístupní z jiných domén než těch, které chceme.

$HTTP["host"] == "domena1.cz" {
    userdir.path = "www"
    userdir.include-user = ("root", "user1", "uuser22")
    #následující řádek použijeme, pokud chceme mít data mimo reálné home adresáře
    #userdir.basepath = "/var/www/uzivatele/"
} 

Pokud si nepřejeme, aby některý uživatel měl možnost využívat této vlastnosti web serveru, můžeme použít proměnné „userdir.include-user“ a „userdir.exclude-user“ k filtrování.

Proměnná „userdir.include-user“ obsahuje uživatele, kteří jsou povolení pro tuto službu. Pokud je proměnná prázdná, jsou povolení všichni. V druhém případě je to „userdir.exclude-user“. Ta obsahuje uživatele, kteří jsou zakázaní a pokud neobsahuje žádné, jsou taktéž povolení všichni.

Více podrobností o mod_mysql_vhost lze nalézt v dokumentaci.

Závěr

Lighttpd obsahuje široké možnosti nastavení pro virtual hosty. Všechny moduly lze navzájem kombinovat nebo jejich platnost omezit jen na určité množství domén. V příštím a pravděpodobně posledním článku o lighttpd se podíváme na některé moduly, které se svými funkcemi už nedají sloučit do jednoho tématu, ale přesto jsou svým způsobem užitečné, a ukážeme si, jak generovat konfiguraci skriptem.

Našli jste v článku chybu?

5. 9. 2008 16:28

uživatel si přál zůstat v anonymitě
No a? Ved sa uplne bezne pouziva vyraz webhostitelovanie, nie?
Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Lupa.cz: Slevové šílenství je tu. Kde nakoupit na Black Friday?

Slevové šílenství je tu. Kde nakoupit na Black Friday?

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky