Virtualhost

botond küldte be 2019. 02. 13., sze – 19:39 időpontban

Tartalom

 

Meghatározása, általános jelentése

A Virtual host (Virtuális hoszt vagy virtuális tárhely, röviden: vhost) kifejezés eredetileg arra a gyakorlatra utal, hogy egyetlen webszerveren egyszerre több weboldalt futtatnak (pl. weboldal1.hu, weboldal2.hu, stb). A virtuális tárhelyek lehetnek IP-alapúak, vagy lehetnek név alapúak. Mindez a végfelhasználó szempontjából nem lényeges, hogy az adott webhely fizikailag mely IP-címen és/vagy szerveren érhető el.

A Virtuális hosztingnak az egyik leggyakrabban alkalmazott kivitelezése az osztott tárhelyes webszolgáltatás. Egy osztott webtárhely bérleti díja jóval olcsóbb, mint egy dedikált szerveré, mivel sok ügyfél kiszolgálható egyetlen szerverrel. Az is nagyon gyakori, hogy egyetlen webhelyhez egyszerre több nevet is használnak ugyanazon a gépen, hogy azok jobban tükrözzék a kínált szolgáltatásokat.

 

 

Virtuális hoszt típusai

IP-alapú

Az IP-alapú hosztok esetében minden egyes webhelyhez/hosztnévhez külön IP-cím tartozik amik bármely protokoll által közvetlenül elérhetők, de minden kiszolgált domain névhez dedikált IP cím szükséges. Így ezeknek a webhelyeknek a domain nevük mind külön IP-címre mutatnak ugyanazon a szerveren. Ilyenkor a webszerver több fizikai hálózati interfésszel van felszerelve, vagy több virtuális hálózati csatolóval van konfigurálva ugyanazon a fizikai interfészen. A webszerver nyithat egyszerre több socket-et is külön minden IP-cím figyeléséhez, vagy egyszerre hallgathatja az összes interfészt egyetlen nyitott socket-tel. Utóbbi esetben miután elfogadásra került a TCP kapcsolat, megszerzi az IP-címet amelyről az beérkezett. Akárhogy is, az IP-címet használja annak meghatározására, hogy melyik webhelyet kell kiszolgálnia. Az ügyfél nem vesz részt ebben a folyamatban, ezért nincsenek kompatibilitási problémák, ellentétben a névalapú virtuális tárhelyekkel.

Ennek a megközelítésnek az a hátránya, hogy minden egyes webhely számára külön IP-cím szükséges, ami növeli az adminisztratív terheket (mind a címek hozzárendelése a szerverekhez, mind a címek használatának igazolása az internetes regisztrátoroknál) és felgyorsítja az IPv4-es címek kifogyási folyamatát.

Névalapú

A névalapú virtuális hosztoknál a szerverhez tartozó ugyanazon IP-címen több domain névvel is kapcsolódhatnak weboldalak. Ezeket a neveket az ügyfelek határozzák meg. Ezzel a módszerrel sok IP-cím és a velük járó adminisztratív teher spórolható meg, viszont nehézségek merülnek fel a névalapú virtuális tárhelyek SSL / TLS használata során.

A névalapú virtuális hosztokhoz szükséges technikai előfeltétel egy HTTP / 1.1 támogatást biztosító webböngésző, ami a célállomás nevét a kérésbe foglalja. Ez teszi lehetővé, hogy egy szerveren egyetlen IP-cím mögött működtetett több webhely közül a megfelelő tartalmat szolgálja ki. Ez pontosabban azt jelenti, hogy a kérés HTTP fejlécben kell elküldeni a hosztnevet, amit a HTTP/1.1 szabvány már kötelezően előír.

Például egy kiszolgáló két domainhez kaphat kéréseket: www.pelda.hu és www.pelda.com. Mindkét név ugyanarra az IP-címre van irányítva. A www.pelda.hu lekérésénél a szervernek a /home/felhasznalo1/public_html/ könyvtárból kell kiadni a kért fájlokat, míg a www.pelda.com esetében a szerver a /home/felhasznalo2/public_html/  könyvtárból szolgáltatja a tartalmat. Hasonlóképpen, egy domain névnek több aldomain tartalma is tárolható együtt. Például egy blogszerver a blog1.domain.hu és a blog2.domain.hu webhelyet is tárolhatja.

A névalapú virtuális tárhely nagy problémája, hogy nehéz több SSL / TLS-t használó biztonságos webhelyet kezelni. Mivel az SSL / TLS kézfogás már a hosztnév elküldése előtt megtörténik, így a szerver nem tudja, hogy melyik tanúsítványt használja a kézfogási procedúrában. Lehetőség van arra, hogy egyetlen tanúsítvány több nevet is lefedjen akár a "subjectaltname" mezőben, vagy akár a wildcard-ok által, de ennek a megközelítésnek a gyakorlati alkalmazását korlátozzák az adminisztratív szempontok és a wildcard-ok behelyettesítési szabályai. Erre megoldásként van egy TLS bővítmény, a Server Name Indication (SNI), aminek az a feladata, hogy már az SSL / TLS kézfogási eljárás elején biztosítsa a megfelelő hosztnevet, hogy elkerülhető legyen ez a probélma. Viszont néhány régebbi böngésző kliens, például az XP-ken futó régebbi Internet Explorer-ek, vagy régebbi Androidos verziók nem támogatják ezt.

Továbbá, ha a DNS (Domain Name System) szolgáltatás nem működik megfelelően, akkor egy virtuális tárhelyen futó webhelyhez akkor is nehéz a hozzáférés, ha az IP-cím ismert. Például ha a DNS kiszolgáló működésének hiányában a felhasználó a weboldal IP-címét próbálja közvetlenül lekérni a böngészőjében, pl. http://100.100.100.100/, a webböngésző elküldi hosztnévként az IP-címet a szervernek. És mivel a webszerver a böngésző kérésének HTTP fejlécére támaszkodva állapítja meg, hogy melyik vhost-ot kell lekérnie, a szerver így nem találja meg a megfelelő virtuális tárhelyet és az alapértelmezett weboldallal tér vissza, ami a legtöbb esetben eltér a felhasználó által várt tartalomtól.

Ebben az esetben az a megoldás, hogy a weboldal IP címét és hosztnevét hozzá kell adni a kliens rendszerének hosts fájljához. Ekkor a kívánt weboldal domain néven keresztül történő elérése újra működni fog. Ilyenkor viszont a felhasználónak óvatosan kell eljárnia, mert az IP-címek és hosztnevek közötti igazi összefüggések felülíródnak a helyi gépen történő hosts fájl módosításával. Ezért ez a megoldás nem igazán javasolt egy átlagfelhasználó számára, de például egy rendszergazdának hasznos lehet, miközben javítja a hibás DNS rekordokat.

Kombinált

Az IP-alapú és a névalapú virtuális tárhelyek kombinálhatóak: a szerver több IP-címmel is rendelkezhet, és azok bármelyikén külön szolgáltathat egyszerre több név alapon kapcsolódó webhelyet is. Ez a technika hasznos lehet, ha a szerveren lévő webhely wildcard típusú SSL / TLS-t használ. Például, ha egy üzemeltetőnek két wildcard típusú tanúsítványa is van, az egyik a *.pelda.hu névhez, és a másik a *.pelda.com-hoz, akkor a szerverről egy IP-címről szolgálható ki a valami1.pelda.hu és a valami2.pelda.hu is, viszont szükség lehet egy külön IP-címre a valami3.pelda.com kiszolgálásához.

 

 

Apache webkiszolgáló

Az Apache HTTP szerver volt az egyik első webkiszolgáló, ami támogatta az IP-alapú virtuális tárhelyek kezelését. Az 1.1-es verziójától pedig támogatja mindkét fajtát, azaz az IP-alapú és a névalapú (vhost) virtuális hosztokat egyaránt.

Az Apache virtuális hoszt fájljainak beállításaival szelektálja a szerverre érkező kéréseket a megfelelő weboldalhoz. Ezeknek a fájloknak saját szintaktikájuk van, lássunk néhány példát

IP-alapú virtualhoszt példa

Az alábbi példában a szervernek két IP-címe van (172.20.30.40 és 172.20.30.50), amelyek a www.pelda1.hu és a www.pelda2.hu nevekhez vannak rendelve:

Listen 80

<VirtualHost 172.20.30.40>
    DocumentRoot "/home/felhasznalo1/public_html"
    ServerName www.pelda1.hu

    # További kapcsolók jöhetnek ide
</VirtualHost>

<VirtualHost 172.20.30.50>
    DocumentRoot "/home/felhasznalo2/public_html"
    ServerName www.pelda2.hu

    # További kapcsolók jöhetnek ide
</VirtualHost>

Névalapú virtualhoszt példa

Ebben a példában a kiszolgálónak két hosztneve van (www.pelda1.hu és www.pelda2.hu), amik ugyanahhoz az IP-címhez kapcsolódnak, és szeretnénk, ha a szerver eltérő módon válaszolna a két domain névre érkező kérésekre.

Listen 80
<VirtualHost *:80>
    DocumentRoot "/home/felhasznalo1/public_html"
    ServerName www.pelda1.hu

    # További kapcsolók jöhetnek ide
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/home/felhasznalo2/public_html"
    ServerName www.pelda2.hu

    # További kapcsolók jöhetnek ide
</VirtualHost>

Kombinált virtualhoszt példa

Itt pedig az előző kettő kombinációja: Két IP-alapú virtuális hoszt külön-külön IP-címeken (172.20.30.40 és 172.20.30.50), majd egy harmadik IP-címen (172.20.30.60) pedig két névalapú virtuális hoszt (www.pelda3.hu és www.pelda4.hu):

Listen 80

# IP-alapú virtualhosztok eltérő szerver IP-címeken
<VirtualHost 172.20.30.40>
    DocumentRoot "/home/felhasznalo1/public_html"
    ServerName www.pelda1.hu

    # További kapcsolók jöhetnek ide
</VirtualHost>

<VirtualHost 172.20.30.50>
    DocumentRoot "/home/felhasznalo2/public_html"
    ServerName www.pelda2.hu

    # További kapcsolók jöhetnek ide
</VirtualHost>

# Névalapú virtualhosztok ugyanazon a szerver IP-címen
<VirtualHost 172.20.30.60>
    DocumentRoot "/home/felhasznalo3/public_html"
    ServerName www.pelda3.hu

    # További kapcsolók jöhetnek ide
</VirtualHost>

<VirtualHost 172.20.30.60>
    DocumentRoot "/home/felhasznalo4/public_html"
    ServerName www.pelda4.hu

    # További kapcsolók jöhetnek ide
</VirtualHost>