I virtual host sono una funzionalità presente in quasi tutti i server web di oggi, e anche in Apache, tramite la quale è possibile utilizzare un’unica istanza di un server per più siti.
La conseguenza di questo è una semplificazione dell’amministrazione e un utilizzo più efficiente delle risorse di sistema.
In Apache troviamo due tipologie di virtual host, quelli basati su Ip e quelli basati su Nome.
Virtual Host basati su Ip
Apache permette di utilizzare la combinazione di indirizzo ip e porta che il client utilizza per connettersi a un sito per creare dei virtual host.
Questi vengono definiti utilizzando le sezioni <VirtualHost>. Ogni sezione <VirtualHost> contiene i parametri di configurazione che devono essere applicati quando il server riceve una richiesta per l’ip e la porta specificati nella riga iniziale.
Vediamo ora un esempio in cui vengono configurati due diversi virtual host basati sull’indirizzo ip, il primo per il sito www.prova1.com e il secondo per il sito www.prova2.com.
Prima delle sezioni <VirtualHost> è necessario specificare le porte su cui Apache è in ascolo utilizzando la direttiva Listen.
Listen 8080
Listen 80
La riga iniziale delle sezioni <VirtualHost> specifica l’indirizzo ip e, se è necessario, la porta del virtual host.
<VirtualHost 192.168.1.2:8080>
All’interno della sezione troviamo poi la direttiva ServerName che specifica l’indirizzo del sito web relativo al virtual host e la direttiva DocumentRoot tramite la quale è possibile indicare in quale directory si trova il contenuto di ogni virtual host.
ServerName www.prova2.com
DocumentRoot /usr/local/apache/sites/prova2
Il risultato finale sarà quindi simile al seguente.
Listen 8080
Listen 80
<VirtualHost 192.168.1.1>
ServerName www.prova1.com
DocumentRoot /usr/local/apache/sites/prova1
</VirtualHost>
<VirtualHost 192.168.1.2:8080>
ServerName www.prova2.com
DocumentRoot /usr/local/apache/sites/prova2
</VirtualHost>
I virtual host basati su indirizzo ip sono quindi molto semplici da configurare, lo svantaggio è che è necessario che il server disponga di più indirizzi ip o utilizzare porte non standard.
Virtual Host basati su Nome
Se si ha la necessità di ospitare più siti su un server che dispone di un solo indirizzo ip, la soluzione consiste nell’utilizzare i virtual host basati su nome.
Questo tipo di virtual host utilizza una caratteristica dei browser, questi infatti trasmettono un header Host: quando inviano una richiesta http.
Risulta quindi possibile configurare Apache in modo che venga visualizzato un contenuto diverso a seconda delle informazioni contenute nell’header della richiesta http.
La configurazione dei virtual host basati su nome è simile a quella vista in precedenza.
In questo esempio il sito www.prova1.com e il sito www.prova2.com utilizzano lo stesso indirizzo ip.
Quando Apache riceve una richiesta da un browser, il server confronta il valore dell’header Host: con il nome specificato dalle direttive ServerName e ServerAlias.
NameVirtualHost 192.168.1.1
<VirtualHost 192.168.1.1>
ServerName www.prova1.com
ServerAlias prova.com test.prova.com
DocumentRoot /usr/local/apache/sites/prova1.com
</VirtualHost>
<VirtualHost 192.168.1.1>
ServerName www.prova2.net
DocumentRoot /usr/local/apache/sites/prova2.net
</VirtualHost>
La direttiva NameVirtualHost specifica che un determinato indirizzo Ip viene utilizzato per virtual host basati sul nome.
Utilizzando la direttiva NameVirtualHost * è possibile specificare che tutti gli indirizzi ip vengono utilizzati per virtual host basati sul nome.
Cosa succede se una richiesta non corrisponde a nessuno dei virtual host specificati nel file di configurazione?
In questo caso viene utilizzato il primo virtual host basato sul nome presente nel file di configurazione.