La tecnica del Virtual Hosting permette ad un unico server web di "ospitare" più siti (e/o applicazioni) web, i quali condivideranno, secondo opportune politiche di gestione, le risorse di elaborazione del server stesso.
Consolidare più servizi su un'unica macchina è una pratica comunemente adottata poiché permette di ottimizzare l'utilizzo delle risorse hardware disponibili. Senza il virtual hosting, si renderebbe necessario attivare una nuova macchina server per ogni nuovo sito o applicazione web, con un conseguente aumento dei costi ed un possibile sottoutilizzo delle risorse hardware.
Tuttavia, il virtual hosting non va confuso con altre tecniche di virtualizzazione o partizionamento delle risorse (ad esempio container, macchine virtuali, etc). A differenza di queste ultime, che virtualizzano un ambiente completo, il virtual hosting si limita a far convivere servizi associati ad host diversi sulla stessa macchina. Nel caso specifico del web, il virtual hosting è implementato dal server web, che verrà opportunamente configurato per distinguere le richieste provenienti dall'esterno e smistarle al sito / applicazione web corretto/a.
Il server web Apache supporta il virtual hosting sin dalla prima versione, e questa caratteristica ha fortemente contribuito alla sua diffusione.
Funzionamento
Per comprendere i meccanismi alla base del funzionamento del virtual hosting, basta ricordare come avviene una richiesta HTTP.
In primo luogo, il browser effettua prima una richiesta ad un server DNS per risolvere il nome di dominio del sito da visualizzare. Questa operazione permette di ottenere l'indirizzo IP associato al nome di dominio richiesto, ovvero l'indirizzo IP del server web.
Quindi, il browser procede aprendo una connessione TCP all'indirizzo IP appena ottenuto utilizzando la porta associata al protocollo utilizzato (80 per HTTP, 443 per HTTPS) o specificata nella URL.
Gli ingredienti necessari sono quindi tre: nome di dominio, indirizzo IP e porta TCP. Utilizzando uno (o una combinazione) di essi è possibile far sì che lo stesso server risponda alle richieste effettuate a siti diversi.
Ad esempio, è possibile configurare i record DNS dei siti www.sito1.com e www.sito2.com affinché puntino entrambi allo stesso indirizzo IP (e quindi allo stesso server).
Oppure, anche se tecnicamente più complesso, è possibile assegnare più indirizzi IP alla stessa macchina, anche sulla stessa interfaccia. Riferendoci all'esempio di prima, se gli indirizzi IP associati a due nomi di dominio diversi sono entrambi assegnati alla stessa macchina, essa riceverà le richieste inviate ad entrambi i siti.
Infine, in casi particolari è possibile usare porte TCP non standard, che andranno quindi specificate nell'URL della richiesta (ad esempio, http://www.mioserver.com:8090). Quest'ultima tecnica è poco utilizzata in produzione poiché l'utilizzo di porte non standard può complicare l'accesso al sito in alcuni scenari (ad esempio con l'utilizzo di proxy) ed in generale è poco user friendly (l'utente dovrà infatti digitare non soltanto il nome di dominio ma anche la porta TCP da utilizzare). Rimane comunque una tecnica utile in ambienti di sviluppo e/o testing, dove sarebbe antieconomico dover registrare un nome di dominio per ogni spazio di test.
La prima modalità descritta è detta virtual hosting "name based", in quanto si basa sul nome di dominio del sito web per distinguere le richieste. Analogamente, la seconda modalità è detta "IP based" poiché utilizza l'indirizzo IP di destinazione per effettuare la distinzione. Come si intuisce, l'ultima è detta "port based".
Nelle lezioni successive mostreremo come configurare Apache per implementare le varie modalità di virtual hosting qui descritte.