Hlavní navigace

Lighttpd: virtuální hosty

5. 9. 2008
Doba čtení: 5 minut

Sdílet

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.

CS24_early

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.

Byl pro vás článek přínosný?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.