Hlavní navigace

Lighttpd: virtuální hosty

Adam Štrauch

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.

Doba čtení: 5 minut

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.

MIF18_Michálek

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?