Configurazione degli host virtuali

Potete utilizzare il Tool di configurazione di Apache per configurare gli host virtuali, ossia potete attivare differenti server Web con differenti indirizzi IP, diversi nomi di host, in diverse posizioni all'interno del vostro sistema. Per esempio, potete attivare un sito Web per http://www.your_domain.com e anche per http://www.your_second_domain.com sulla stessa macchina utilizzando l'host virtuale. Questa opzione corrisponde alla direttiva <VirtualHost> per l'host virtuale di default e gli host virtuali basati su IP. Corrisponde inoltre alla direttiva <NameVirtualHost> per un host virtuale basato sul nome.

Le direttive di Apache configurate per uno specifico host virtuale valgono solo all'host virtuale in oggetto. Se una direttiva viene configurata a livello generale utilizzando il pulsante Modifica impostazioni predefinite, e non è definita nelle impostazioni dell'host virtuale, vengono utilizzati i parametri di default. Per esempio, potete definire un Indirizzo e-mail del webmaster nella scheda Principale e poi non definirne più per ogni host virtuale.

Il Tool di configurazione di Apache include un host virtuale .
Host virtuali
L'indirizzo http://www.apache.org/docs/vhosts/ e la documentazione di Apache offrono maggiori informazioni sugli host virtuali.
Aggiungere e modificare un host virtuale
Per aggiungere un host virtuale, fate clic sulla scheda Host virtuali e poi sul pulsante Aggiungi. Potete inoltre modificare un host virtuale selezionandolo nell'elenco e facendo clic sul pulsante Modifica.

Opzioni di carattere generale

Le impostazioni delle Opzioni generali si applicano solo all'host virtuale che state configurando. Impostate il nome dell'host virtuale nell'area Nome dell'host virtuale. Questo nome viene poi utilizzato dal Tool di configurazione di Apache per distinguere i differenti host virtuali.

Impostate poi il valore della Directory documento Root in modo che punti alla directory che contiene il documento root (per esempio index.html) dell'host virtuale. Questa opzione corrisponde alla direttiva DocumentRoot con la direttiva VirtualHost. Prima della versione 7.0 di Red Hat Linux, Apache utilizzava /home/httpd/html come DocumentRoot. In Red Hat Linux 7.3, invece, il DocumentRoot di default è /var/www/html.

L'Indirizzo e-mail del webmaster corrisponde alla direttiva ServerAdmin nella sezione VirtualHost. Questo indirizzo di posta elettronica viene poi visualizzato nel pié di pagina delle pagine di errore se scegliete di mostrare un pié di pagina con un indirizzo e-mail nelle pagine di errore.

Nella sezione Informazioni sull'host selezionate Host virtuale di default, Virtual host basato su IP o Host virtuale basato sul nome.

Host virtuale di default

Se selezionate Host virtuale di default, compare la figura seguente. Dovete solo configurare un host virtuale di default. La configurazione di default dell'host virtuale viene utilizzata quando l'indirizzo IP richiesto non è esplicitamente elencato in un'altra sezione dell'host virtuale. Se non c'è nessun host virtuale definito, viene utilizzata la configurazione di default del server principale. Figura 13-9. Host virtuale di default

Host virtuale basato sull'IP

Se selezionate Virtual host basato su IP, compare la direttiva della figura seguente per configurare la direttiva <VirtualHost> basata sull'indirizzo IP del server. Specificate questo indirizzo IP nel campo Indirizzo IP.Per specificare più indirizzi IP, separate ogni indirizzo IP con uno spazio. Per specificare una porta, utilizzate la sintassi Indirizzo IP:Porta. Utilizzate :* per configurare tutte le porte per uno specifico indirizzo IP. Specificate il nome dell'host per l'host virtuale nel campo Nome del server. igura Virtual host basato sull'IP

Host virtuale basato sul nome
Se selezionate Host virtuale basato sul nome, compare la finestra mostrata nella figura seguente che vi consente di configurare la direttiva NameVirtualHost basandovi sul nome del server. Specificate l'indirizzo IP nel campo Indirizzo IP. Per specificare più di un indirizzo IP, separate ogni indirizzo IP con uno spazio. Per specificare una porta, utilizzate la sintassi
Indirizzo IP:Porta. Usate :* per configurare tutte le porte per uno specifico indirizzo IP. Specificate il nome dell'host per l'host virtuale nel campo Nome del server. Nella sezione Alias, fate clic sul pulsante Aggiungi per aggiungere un alias al vostro nome dell'host. Aggiungendo qui un alias aggiungete una voce ServerAlias nella direttiva NameVirtualHost Directive.

Host virtuale basato sul nome

SSL

Nota Bene
Non potete utilizzare un host virtuale basato sul nome con il protocollo SSL, perché il browser accetta il certificato del server Web prima che questo identifichi l'host virtuale basato sul nome appropriato. Se volete utilizzare gli host virtuali basati su nome, tenete presente che funzioneranno solo con un protocollo di tipo non-secure.

Se un server Apache non è stato configurato per il supporto SSL, le comunicazioni tra il server Apache e i client non sono cifrate. Tutto ciò potrebbe andare bene per siti Web senza informazioni personali o confidenziali. Per esempio, un sito Web Open Source che distribuisce software Open Source e documentazione non ha bisogno di comunicazoni sicure. Invece, un sito Web per l'e-commerce, che richiede autenticazioni tramite carta di credito, dovrebbe utilizzare il supporto SSL per Apache e cifrare le comunicazioni. Abilitando quindi il supporto SSL per Apache, introduciamo il modulo mod_ssl. Per abilitarlo attraverso il Tool di configurazione di Apache dovete permettere l'accesso attraverso la porta 443 nella scheda Principale contenuta nella sezione Indirizzi disponibili. Quindi selezionate il nome dell'host virtuale nella scheda Host virtuali e fate clic sul pulsante Modifica, poi selezionate SSL dal menu a sinistra e abilitate l'opzione Abilita il supporto SSL come mostrato nella figura seguente. La sezione Configurazione SSL è preconfigurata con dei certificati digitali d'esempio. I certificati digitali forniscono l'autenticazione per il vostro server Web ai client che la richiedono. Dovrete impostare il vostro certificato digitale. Non utilizzate i certificati digitali d'esempio forniti da Red Hat Linux per il vostro sito Web. 

Supporto SSL

Opzioni aggiuntive per l'host virtuale

Le opzioni Configurazione del sito, Variabili d'ambiente e Directory per gli host virtuali sono le stesse direttive che avete configurato quando avete fatto clic sul pulsante Modifica impostazioni predefinite, tranne che per le opzioni da configurare qui per ogni singolo host virtuale.


VirtualHost
La direttiva <VirtualHost> si comporta allo stesso modo di un tag HTML, individuando l'inizio e la fine di un blocco di direttive relative alla configurazione di un singolo Host.
Di seguito è riportato un esempio sintetizzato della direttiva VirtualHost

<VirtualHost host[:port]>
...
DocumentRoot path
ServerName host
...
<\VirtualHost>
 

Vediamo come creare nuovi Host secondari all'interno del WebServer, mediante un esempio funzionale.
La prima operazione da effettuare consiste nel associare un determinato nome DNS ad l'indirizzo o intervalli d'indirizzi IP configurati sul nostro PC. Nel eventualità che il vostro Server funzioni anche da client, potrete utilizzare a vostro favore tutti gli indirizzi IP compresi tra 127.0.0.0 a 127.255.255.255, mentre se il vostro Server fa parte di una Lan, per poter rendere disponibili i vari Host sull'intera rete client, mediante l'impiego di più indirizzi IP, dovrete utilizzare l'indirizzo configurato di default per la vostra scheda di rete. Nel caso lo crediate opportuno, potrete modificare il numero IP dalla proprietà di Rete, come anche configurare in quale intervallo gli IP debbano considerarsi propri della vostra macchina, (ricordate che l'impostazione arbitraria degli IP è valida solo all'interno di una rete locale, e non anche in Internet).
Nel nostro esempio ci baseremo esclusivamente sull'IP 127.0.0.1, in quanto viene identificato di default all'IP primario della nostra scheda di rete.
Fatta questa piccola premessa siamo finalmente pronti a creare il nostro primo Host Virtuale basato sul nome, ammettendo di aver scelto come DNS il nome virtualhost.lan non ci resta che modificare il file hosts, esso non è altro che un semplice DataBase per la gestione dei DNS, in modo da informare tutta la rete a quale IP debba corrispondere un determinato DNS.
La posizione su disco del file hosts varia a seconda dell'OS impiegato, in Windows98 dovrebbe trovarsi in C:\Windows\HOSTs, mentre in Win2000 lo si trova in C:\WINNT\system32\drivers\etc\hosts.
Una volta individuato tale file non ci resta che aprirlo con un editor di solo testo, e modificarlo con l'aggiunta della seguente stringa:

127.0.0.1 virtualhost.lan # Host secondario

Ricordate di lasciare almeno uno spazio o punto di tabulazione, tra l'indirizzo IP e il nome DNS, e tra il nome DNS e l'eventuale commento/promemoria.
Una volta modificato il file hosts, non ci resta che salvarlo per poi passare alla creazione delle directory che ospiteranno i nuovi siti, al fine di mantenere un criterio d'ordinamento è opportuno creare una cartella nella quale ospitare tutti gli Host secondari, che chiameremo www/, al suo interno andremo a creare la cartella per il nostro primo Host d'esempio chiamandola appunto sito1/, in essa andremo in fine creeremo due distinte cartelle una la chiameremo web/, la quale accoglierà tutti i documenti Web da visualizzare attraverso il browser mediante il nuovo DNS, e l'altra la chiameremo logs/, nella quale conserveremo tutti i log relativi al nuovo Host.
Vediamo un esempio di struttura:

C:\www\
|
|____sito1\
|    |
|    |____web\
|    |    |____\index.html
|    | 
|    |____logs\
|         |____\access.log
|         |____\error.log
|
|____sito2\
|    |
|    |____web\
|    |    |____\index.html
|    | 
|    |____logs\
|         |____\access.log
|         |____\error.log
|

Una volta create le cartelle non dobbiamo far altro che aggiungere le seguenti direttive al nostro file config:
P.S. Se non funzionasse, provare a mettere
DocumentRoot "C:/www/sito1/web"
ServerName www.nomesito.com
ServerAdmin admin@nomesito.com

NameVirtualHost 127.0.0.1

<VirtualHost virtualhost.lan>
    DocumentRoot C:/www/sito1/web
    ServerName virtualhost.lan
    ServerAdmin admin@virtualhost.lan
    ReadmeName README
    HeaderName HEADER
        <Directory "C:\www\sito1\web">
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                ORDER allow,deny
                Allow FROM all
        </Directory>
    ScriptAlias /cgi-bin/ "C:/www/sito1/news/cgi-bin/"
        <Directory "C:/www/sito1/news/cgi-bin">
                AllowOverride None
                Options All
        </Directory>
    ErrorLog C:/www/sito1/logs/error.log
    CustomLog C:/www/sito1/logs/access.log common
</VirtualHost>

Ovviamente potrete aggiungere o eliminare tutte le direttive che volete a vostro criterio e piacere. 
Una volta modificato e salvato il file di config, non ci resta che riavviare il WebServer Apache, e richiamare attraverso il browser Web il nuovo DNS http://virtualhost.lan per visualizzare i documenti del nuovo Host.
Nel caso in cui utilizziate IE come browser Web, può capitare nel richiamare il nouvo DNS che vi venga chiesto di connettervi ad Internet, è opportuno pertanto ovviare a tale inconveniente, modificando le proprietà del browser in modo da non richiedere mai la connessione. 
A questo punto dovreste essere in grado di configurare e gestire un infinità di host.

Nel caso in cui abbiate registrato un indirizzo IP fisso riconosciuto nella rete Internet come identificativo del vostro computer, (ad esempio, nel caso in cui utiliziate una connessione ADSL), potrete scegliere di settare un vostro Host secondario sull'IP anziché sul DNS, oppure di settare differenti Host sfruttando più numeri di porta.
Vediamo due esempi:

<VirtualHost xxx.xxx.xxx.xxx>
    DocumentRoot C:/www/sito2/web
    ServerName xxx.xxx.xxx.xxx
    ServerAdmin admin@xxx.xxx.xxx.xxx
    ReadmeName README
    HeaderName HEADER
        <Directory "C:\www\sito2\web">
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                ORDER allow,deny
                Allow FROM all
        </Directory>
    ScriptAlias /cgi-bin/ "C:/www/sito2/news/cgi-bin/"
        <Directory "C:/www/sito2/news/cgi-bin">
                AllowOverride None
                Options All
        </Directory>
    ErrorLog C:/www/sito2/logs/error.log
    CustomLog C:/www/sito2/logs/access.log common
</VirtualHost>

<VirtualHost xxx.xxx.xxx.xxx:128>
    DocumentRoot C:/www/sito3/web
    ServerName xxx.xxx.xxx.xxx:128
    ReadmeName README
    HeaderName HEADER
        <Directory "C:\www\sito3\web">
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                ORDER allow,deny
                Allow FROM all
        </Directory>
    ScriptAlias /cgi-bin/ "C:/www/sito3/news/cgi-bin/"
        <Directory "C:/www/sito3/news/cgi-bin">
                AllowOverride None
                Options All
        </Directory>
    ErrorLog C:/www/sito3/logs/error.log
    CustomLog C:/www/sito3/logs/access.log common
</VirtualHost>


Cosa sono i Virtual Host in apache

Il modo più semplice per spiegare cosa sono i virtual host per un web server è quello di fare un esempio pratico.
Solitamente se vogliamo mettere su nu web server ci serve un pc in cui far girare il software necessario, in questo caso Apache, e una connessione ad internet.
Per semplificare il discorso diciamo che il nostro ISP (interner service provider) ci assegna un indirizzo IP statico.
Installo il mio bel web server sul pc e gli dico di rimanere in ascolto sulla porta 80.
Possiamo testare la funzionalita del web server accedendovi in locale con qualsiasi browser digitando l' URL : "http://localhost" oppure "http://127.0.0.1".
Dall'esterno invece un utente dovrebbe essere in grado di accedere al contenuto web digitando: "http://94.32.76.22" dove 94.32.76.22 è l'indirizzo che ci ha assegnato l'ISP.
Fin qui tutto bene solo che io vorrei che l'utente del mio sito non dovesse ricordare il mio IP ma il nome del mio sito...ad esempio "mio.sito.net", quindi registro il dominio che mi piace, usando una delle tante società che offrono questo servizio, e a questo punto il nome del mio sito viene inserito nei server DNS, i quali si occuperanno di mettere in relazione il nome scelto con il mio IP.
A questo punto ho realizzato il mio sito web e tutti vi potranno accedere digitando:
"http://mio.sito.net".
Ma se noi volessimo avere 2 siti distinti dal nome utilizzando l'unico IP statico a disposizione?
Ecco che per risolvere questo problema ci vengono in soccorso i virtual host.
Quello che desidero è che : mio1.sito.net e mio2.sito.net corrispondano a due siti web distinti, cioè ogni volta che l'utente nel suo browser digita l'una o l'altra stringa, il web server, grazie ad una corretta configurazione degli host virtuali, fornisce all'utente dei contenuti differenti.

 

Configurazione web server Apache: virtual host

Sommario

Introduzione

Un sistema di server web Apache supporta più siti web.
Nel file di configurazione di Apache, oltre al nome "principale" si possono definire molteplici host virtuali (a volte chiamati "vhost") usando la direttiva <VirtualHost>. A seconda del nome utilizzato per accedere a server web, Apache risponde adeguatamente, per esempio io potrei cercare di accedere al sito mio1.sito.com e allo stesso modo al mio2.sito.com, entrambi gestiti dal web server ma riconosciuti come differenti dall'esterno.
Se si desidera disporre di un unico sistema di supportare più siti web, è necessario configurare opportunamente Apache.
Ci sono due diversi tipi di host virtuale supportata da Apache.
Proprio come più persone possono condividere un unico numero di telefono, siti web multipli possono condividere lo stesso indirizzo IP.
Tuttavia, tutti gli indirizzi IP condivisi da più host virtuali devono essere dichiarati con una direttiva NameVirtualHost.
Nella più semplice delle configurazioni di Apache, non ci sono host virtuali. Invece, tutte le direttive nel file di configurazione si applicano universalmente per il funzionamento del server.
L'ambiente definito dalle direttive al di fuori di qualsiasi <VirtualHost> contenitori è a volte chiamato il server predefinito, per esso vi è alcun nome ufficiale.
Ma che cosa succede se si aggiunge un contenitore <VirtualHost> a tale configurazione? Come sono dette direttive al di fuori del contenitore interpretato, e qual è il loro effetto sull'host virtuale?
La risposta non è semplice: in sostanza, l'effetto è specifico per ogni configurazione direttiva. Alcuni vengono ereditati dagli host virtuali, altri no. Comunque ogni direttiva è sufficientemente documentata.
Ci sono due forme primarie di host virtuali:

Impostare dei virtual host basati sul nome

Problema
Se abbiamo a disposizione solo un indirizzo ip ma abbiamo la necessità di usare più web server

Soluzione
Usare la direttiva NameVirtualHost * insieme con <VirtualHost>:
ServerName 127.0.0.1
NameVirtualHost *

<VirtualHost *>
ServerName sito1.net
DocumentRoot "C:/Apache/Sites/sito1"
</VirtualHost>

<VirtualHost *>
ServerName sito2.net
DocumentRoot "C:/Apache/Sites/sito2"
</VirtualHost>
Spiegazione
Con il sempre minor numero di ip a disposizione l'hosting virtuale basato sul nome è il metodo più comune per eseguire più siti web sulla stesso server Apache.
"*" nel codice precedente significa che il web server deve funzionare su tutti gli indirizzi, ovvero su tutte le interfacce di rete presenti sulla computer. Per una macchina con un unico indirizzo, ciò significa che il server sarà in ascolto sia su questo indirizzo sia sull'indirizzo di loopback, conosciuto meglio come localhost. Quindi, se avete accessoi al server del sistema fisico, è possibile visualizzare il sito web digitanto ad esempio "127.0.0.1".
L'argomento per la direttiva <VirtualHost> è lo stesso di quello della direttiva NameVirtualHost. Mettere un particolare hostname qui permette di ignorare l'host virtuale sul server di avvio, e causare degli imprevedibili indirizzamenti.
Le richieste per le quali non vi è un host virtuale di cui andrà al primo host virtuale elencati nel file di configurazione. Nel caso del precedente
esempio, i nomi host che non sono esplicitamente menzionati in uno degli host virtuali sarà servita dalla TheSmiths.name host virtuale.
E 'particolarmente istruttivo provare ad eseguire "httpd-S" e osservare la configurazione host virtuale di Apache. Il comando httpd-S infatti restituisce la configurazione degli host virtuali, indicando anche i valori predefiniti.
Utilizzando la direttiva ServerAlias più nomi possono essere usati per riferirsi ad un determinato virtual host. Ad esempio:
 NomeServer sito1.net 
Server www.sito1.net sito1.net

E 'importante capire che aggiungere degli host virtuali al file di configurazione non è sufficiente ad aggiornare il server DNS. Infatti se un utente digitasse nel proprio browser la nuova stringa descritta nella direttiva apache non gli comparirebbe nessun sito, dato che a quella stringa non è associato ancora l'ip del vostro server.
È necessario quindi aggiungere un altro record nel server DNS in modo che i nuovi nomi siano legati l'indirizzo IP del server di sistema che ospita Apache.
Per ulteriori informazioni su come configurare il server DNS, consultare la documentazione per il software DNS , o chiedere al provider di servizi Internet dove avete registrato il vostro dominio.

Impostazione di un virtual host come sito predefinito

Problema
Vogliamo che tutte le richieste, che non soddisfano i criteri di nessun altro virtual host, vengano dirette verso un host  virtuale predefinito, possibilmente mostrante un messaggio d'errore "sito non trovato".

Soluzione
aggiungere la seguente sezione <VirtualHost> prima di tutti gli altri:
<VirtualHost *>
ServerName default
DocumentRoot /www/htdocs
ErrorDocument 404 /lista_siti.html
</VirtualHost>

Spiegazione
Questa soluzione è usata in un contesto name-based virtual hosts, per cui si è dato per scontato che vi siano anche altre sezioni in cui sono definiti dei virtual host con la notazione <VirtualHost *>.
E' stato usato il nome "default" per maggior chiarezza, ma avremmo potuto chiamarlo in qualsiasi altro modo.
Impostando come documento di errore "404" un elenco dei siti disponibili sul server si è data una risposta migliore che una semplice pagina d'errore, che non avrebbe aiutato di certo l'utente.
sarebbe meglio esplicitare sempre tutti i validi ServerNames o ServerAliases, cosi che nessuno vada a finire nel sito di default.
Se qualcuno accedesse al web server direttamente tramite indirizzo IP, o se questo fosse impostato correttamente in un virtual host, sarebbe meglio dare un informazione utile all'utente.

Impostazione di virtual host basati su indirizzo ip

Problema
Abbiamo più indirizzi a disposizione e vogliamo che ad ogniuno corrisponda un sito web diverso.

Soluzione
Creare una sezione virtual host per ogni indirizzo IP:
ServerName 127.0.0.1

<VirtualHost 10.0.0.1>
ServerName sito1.net
DocumentRoot "C:/Apache/Sites/sito1"
</VirtualHost>

<VirtualHost 10.0.0.2>
ServerName sito2.net
DocumentRoot "C:/Apache/Sites/sito2"
</VirtualHost>

Spiegazione
I virtual host definiti qui sopra catturano tutte le richieste per gli indirizzi specificati, che poi vengono smistate e dirette ai  rispettivi web server presenti nelle due diverse directory.
Il ServerName specificato è usato come virtual host primario, ma non è usato per lo smistamento delle richieste verso l'host corretto.

Impostazione di sito di default per virtual host basati su indirizzo ip

Problema
Abbiamo bisogno di creare un sito di default dove indirizzare tutte le richieste che arrivano al web server che non soddisfano nessuno degli indirizzi elencati tra gli host virtuali.

Soluzione
Usare la parola chiave "_default_" per indicare il default host:
<VirtualHost _default_>
DocumentRoot /www/htdocs
</VirtualHost>

Spiegazione
La parola chiave _default_  crea un host virtuale che cattura tutet le richieste per qualsiasi combinazioni indirizzo:porta  che non compaiono tra quelli presenti nella configurazione di apache.
La parola chiave _default_  può essere usata insieme ad una particolare porta, come ad esempio:
<VirtualHost _default_:443>

Usando questa sintassi si indicano tutti i virtual host che usano la porta 443 ma che non sono elencati nei virtual host.

Usare contemporaneamente virtual host basati su indirizzo ip e basati su nomi

Problema
Abbiamo più indirizzi IP a disposizione e su ogniuno vogliamo che ci sia più di un sito web.

Soluzione
Usare una direttiva NameVirtualHost per ogni IP e procedere come se avessimo un solo indirizzo IP:

ServerName 127.0.0.1
NameVirtualHost 10.0.0.1
NameVirtualHost 10.0.0.2

<VirtualHost 10.0.0.1>
ServerName sito1.net
DocumentRoot "C:/Apache/Sites/sito1"
</VirtualHost>

<VirtualHost 10.0.0.1>
ServerName sito2.net
DocumentRoot "C:/Apache/Sites/sito2"
</VirtualHost>

<VirtualHost 10.0.0.2>
ServerName sito3.net
DocumentRoot "C:/Apache/Sites/sito3"
</VirtualHost>

<VirtualHost 10.0.0.2>
ServerName sito4.net
DocumentRoot "C:/Apache/Sites/sito4"
</VirtualHost>


Spiegazione
Specificando l'indirizzo ip piuttosto che usando il "*" facciamo in modo che il server ascolti su un particolare indirizzo. qindi prima dichiariamo l'IP come nome(NameVirtualHost) e poi proseguiamo con la sua descrizione (<VirtualHost>).

Mass Virtual Hosting con l'estensione mod_vhost_alias

Problema
Vogliamo molti virtual host, tutti con la stessa configurazione.

Soluzione
Usare le variabili VirtualDocumentRoot e VirtualScriptAlias forniti dal modulo "mod_vhost_alias":
VirtualDocumentRoot /www/vhosts/%-1/%-2.1/%-2/htdocs
VirtualScriptAlias /www/vhosts/%-1/%-2.1/%-2/cgi-bin

Spiegazione
Questa soluzione utilizza le direttive fornite dal modulo mod_vhost_alias , che di default non dovrebbe essere attivo, quindi prima di usare queste variabili è bene attivarlo.
Queste direttive mappano le richieste su delle directory costruite usando la stessa parte dell'hostname presente nella richiesta. Ogni variabile rappresenta una parte del nome dell'host, cosi chè a un differente nome del sito corrisponde una differente directory.
In questo particolare esempio una richiesta per il sito www.example.com è indirizzata verso una directory /www/vhosts/com/e/example/htdocs, o verso /www/vhosts/com/e/example/cgi-bin (per le richieste di tipo CGI). tutte le variabili disponibili sono mostrate nella Tabella 1.

Tabella 1 - Variabili mod_vhost_alias
Variabile Significato
%% inserisce un %
%p inserisce una particolare porta nel virtual host
%M.N inserisce una parte del  nome

M e N possono avere un valore numerico intero positivo o negativo, che ha il seguente significato:

Tabella 2 - Significato dei valori delle variabili
Valore Significato
0 L'intero nome
1 La prima parte del nome
-1 L'ultima parte del nome
2 La seconda parte del nome
-2 La penultima parte del nome
2+ Dalla seconda parte in poi del nome
-2+ Dalla penultima parte in poi

Quando il valore è messo come prima parte dell'argomento, cioè nella parte M di %M.N, questo si riferisce alle parti dell'hostname divise dai punti. Quando invece è messa come secondo argomento allora si riferisce alle lettere di quella singola parte. Per esempio, se come nome del sito abbiamo www.example.com, il significato delle variabili sarà:

Tabella 3 - Esempi.
Variabile Significato
%0 www.example.com
%1 www
%2 example
%3 com
%-1 com
%-2 example
%-3 www
%-2.1 e
%-2.2 x
%-2.3+ ample


Quindi in relazione al numero di vhost, verranno create un uguale numero di cartelle ordinate alfabeticamente, grazie al nome del dominio.

Mass Virtual Hosting usando le funzioni di Rewrite

Problema
Sebbene ci sia un modulo (mod_vhost_alias) che serve proprio a gestire un vasto numero di virtual host, questo è un po limitato, dato che fa in modo che tutti i vhost siano configurati alla stessa maniera. Noi invece vogliamo gestire molti vhost ma configurati dinamicamente evitando d'usare il modulo mod_vhost_alias.

Soluzione
Usare le direttive fornite dal modulo mod_rewrite per mappare le richieste in base al nome su delle specifiche cartelle:
RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.com$
RewriteRule ^(.*)$ /home/%2$1

Spiegazione
Il modulo mod_vhost_alias è molto utile, ma non consente una gestione dinamica dei singoli vhost, e ci preclude la possibilità di utilizzare altri moduli , come ad esempio mod_userdir, mod_rewrite, and mod_alias, che appartengono sempre alla categoria URL-mapping modules, il che è mlto restrittivo.
Usando il modulo mod_rewrite si ha una efficienza minore, ma una flessibilità maggiore.
Per esempio, alcuni vhost potrebbero essere gestiti in maniera tradizionale mentre altri gestiti con le funzioni di riscrittura (rewrite).
Nella soluzione precedente per esempio indirizza le richieste con hostname www.something.com (o senza il www) verso la cartella /home/something.

Per maggiori informazioni
http://httpd.apache.org/docs/vhosts/
http://httpd.apache.org/docs/mod/mod_rewrite.html

SSL e vhost basati sui nomi

Problema
Vogliamo avere più siti web SSL sullo stesso server.

Soluzione
Nelle più comuni implementazioni dell' SSL, siamo limitati ad un solo sito SSL per indirizzo e numero di porta. Così, per ciascun sito avremo bisogno di un indirizzo IP o sullo stesso IP usare due porte differenti:
Listen 443
Listen 444
<VirtualHost 10.0.1.2:443>
ServerName secure1.example.com
DocumentRoot /www/vhosts/secure1
SSLEngine On
SSLCertificateFile /www/conf/ssl/secure1.crt
SSLCertificateKeyFile /www/conf/ssl/secure1.key
</VirtualHost>

<VirtualHost 10.0.1.3:443>
ServerName secure2.example.com
DocumentRoot /www/vhosts/secure2
SSLEngineOn
SSLCertificateFile /www/conf/ssl/secure2.crt
SSLCertificateKeyFile /www/conf/ssl/secure2.key
</VirtualHost>

<VirtualHost 10.0.1.3:444>
ServerName secure3.example.com
DocumentRoot /www/vhosts/secure3
SSLEngineOn
SSLCertificateFile /www/conf/ssl/secure3.crt
SSLCertificateKeyFile /www/conf/ssl/secure3.key
</VirtualHost>

Spiegazione
La limitazione che impone la restrizione ad avere un singolo host SSL per ogni IP non è imposta da Apache ma è implicita nel modo di funzionare dell'SSL.
Quando un browser si connette al server, la prima cosa che fa è negoziare con esso per una connessione sicura. durante questo processo, il server manda un certificato al client, che serve per la successiva criptazione dello scambio di dati. Affinchè questo accada questa parte della transazione può essere basata solo sull'indirizzo IP del client che si è connesso, solo in seguito quest'ultimo farà la richiesta per una particolare risorsa sul web server.
Quando il server riceve l' "header field" dell'host, il certificato è gia stato mandato..quindi è troppo tardi.

E' possibile avere più server SSL in ascolto su porte diverse dalla 443, se la porta è esplicitamente richiesta nell' URL. questo potrebbe consentire l'aggiramento del problema, ma costringerebbe l'utente finale a scrivere la porta corretta  durante la navigazione.

Logging per ogni Virtual Host

Problema
Vogliamo che ogni host virtuale abbia il suo file di log.

Soluzione
Specificare Errorlog e CustomLog all'interno della dichiarazione dell'host virtuale:
<VirtualHost *>
ServerName mio1.sito.net
DocumentRoot /home/sito/mio1/htdocs
ErrorLog /home/sito/mio1/logs/error_log
CustomLog /home/sito/mio1/logs/access_log combined
</VirtualHost>

Spiegazione
Le direttive per il log possono essere richiamate sia nella configurazione generale del sito che all'interno della dichiarazione dell'host virtuale <VirtualHost>. Quando stanno dentro queste ultime i log relativi a quello specifico vhost  saranno registrati dentro i file impostati.

Considerando la configurazione del server, bisogna considerare il numero massimo di connessioni previste, infatti
se abbiamo 100 virtual host e ogniuno col suo file di log (sia accessi che errori) questo implica che stiamo usando 200 canali aperti, se la quota sul server è di 256 questo vuol dire che rimangono solo 56 che si occuperanno del resto. In pratica ci rimangono solo 56 connessioni che possono essere gestite contemporaneamente dal server.

Nella soluzione proposta i log vanno a finire su dei file che stanno su alcune cartelle, ed è bene assicurarsi che si abbiano i corretti permessi di scrittura su di esse.

Divisione di un Log file

Problema
Dato l'elevato numero di vhost, vogliamo che ci sia un unico file di log, ma tale da poterlo dividere in seguito.

Soluzione
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost
CustomLog logs/vhost_log vhost
Quindi dopo la rotazione del file:
split-logfile < logs/vhost_log

Spiegazione
La direttiva LogFormat in questa soluzione crea un logfile che è simile ad un comune file di log ma con l'informazione in più del nome del vhost che lo ha originato. La funzione split-logfile divide il file di log a seconda dei vari host virtuali.

Host virtuali basati su porte

Problema
Vogliamo un diverso contenuto per le connessioni HTTP su porte differenti.

Soluzione
Impostiamo esplicitamente il numero della porta nella dichiarazione <VirtualHost>:
Listen 8080

<VirtualHost 10.0.1.2:8080>
DocumentRoot /www/vhosts/port8080
</VirtualHost>

Listen 9090

<VirtualHost 10.0.1.2:9090>
DocumentRoot /www/vhosts/port9090
<VirtualHost>

Spiegazione
Il virtual hosting Port-based è molto simile agli altri tipi di tecniche mostrate in precedenza e ci potrebbero essere una serie di situazioni in cui questa modalità di virtualizzare potrebbe essere utile.
Se infatti avessimo un solo indirizzo IP e nessuna possibilità di aggiungere dei domini nei server DNS, o se il nostro ISP bloccasse il traffico in ingresso sulla porta 80, ecco che potrebbe essere utile avere uno o più web server su delle porte alternative
Gli utenti del sito in questione dovrebbero però aggiungere il numero della porta al normale hostname, riprendendo l'esempio precedente dovrebbero scrivere:
http://server.example.com:9090/

Mostrare lo stesso contenuto su diversi indirizzi

Problema
Vogliamo che lo stesso contenuto compaia su due dei notri indirizzi a disposizione.

Soluzione
Impostiamo esplicitamente i due IP nella dichiarazione <VirtualHost>:
NameVirtualHost 192.168.1.1
NameVirtualHost 172.20.30.40

<VirtualHost 192.168.1.1 172.20.30.40>
DocumentRoot /www/vhosts/server
ServerName server.example.com
ServerAlias server
</VirtualHost>
Spiegazione
In questo caso accedendo al web server direttamente con gli indirizzi IP si viene indirizzati allo stesso sito. Naturalmente questo ha senso se ci sono anche altri indirizzi che sono riservati ad altri contenuti, perchè se si volesse  impostare lo stesso sito per tutti gli indirizzi si fa prima ad usare l'asterisco (*) che significa "tutti"

 

Domini virtuali di Apache
Con il nome "domini virtuali", o Virtual Hosts, si identificano tutti gli Hosts che vengono configurati in un server Web in aggiunta all'Host originario. In pratica, con i "domini virtuali" avremo la possibilità di far operare separatamente più server in una stessa macchina, ognuno con un proprio dominio ("www.primo_server.ext", "www.secondo_server.ext"..).
Esistono due tipologie di Virtual Hosts: quelli che fanno capo a differenti indirizzi IP (IP Based Virtual hosts) e, quelli che vengono distinti sulla base del nome (host-based o non IP virtual hosts). In entrambi i casi, abbiamo la possibilità di far convivere più siti internet, ognuno con il proprio "www.dominio.ext", su una stessa macchina. Per chi fa "Hosting", cioè coloro che per mestiere vendono porzioni di spazio Web destinate ad ospitare siti internet, la possibilità di creare Virtual Hosts rappresenta un indubbio vantaggio sia a livello operativo che economico.
Se disponiamo di più indirizzi IP possiamo configurare dei "domini virtuali" IP Based. Dal punto di vista di Apache, questo tipo di configurazione può essere operata in due modi: utilizzare un unico processo http che faccia capo a tutti i domini, oppure, dedicarne uno per ognuno di essi; se disponiamo di una macchina abbastanza potente in termini di risorse, la seconda opzione è certamente preferibile, tutto dipende dal numero di domini che desideriamo siano presenti nel nostro computer Server.
Se scegliamo di concedere ad ogni dominio un proprio httpd, dovremo modificare il file http.conf intervenendo sull'istruzione Listen ("ascolta"); ad essa vanno passati come parametri un indirizzo IP (o un nome di dominio) e il numero della porta che ogni httpd utilizzerà per mettersi in "ascolto" pronto a soddisfare le richieste provenienti dai client. Un esempio potrebbe essere questo:
Listen 111.111.1.1:80
Listen 111.111.1.2:81
oppure
Listen www.nome_dominio.ext:80
Listen www.altro_nome_dominio.ext:81
Come avrete avuto modo di notare, ad ogni dominio viene dedicata una porta diversa.
Se invece vogliamo configurare un solo httpd per tutti i "domini virtuali", dovremo indicare in httpd.conf per ogni dominio un container simile a questo:
<VirtualHost www.nome_dominio.ext>
ServerAdmin email@nome_dominio.ext
DocumentRoot /PATH/nome_cartella
ServerName www.nome_dominio.ext
ErrorLog /PATH/error.log
CustomLog /PATH/nome_access_log
</VirtualHost>
Niente di particolarmente complesso, dall'esempio si comprende facilmente che per costruire il container sono necessari:
1. La direttiva VirtualHost seguita dal nome del "dominio virtuale" che intendiamo porre in essere.
2. L'indirizzo e-mail dell'Admin.
3. Il percorso completo verso la DocumentRoot del nuovo dominio.
4. Il nome del server (ServerName).
5. Il percorso in cui si trovano i file di "log" di Error
6. Il percorso in cui si trovano i "log" sul traffico delle risorse.
Nel caso dei domini host-based, basati sul nome, il discorso è altrettanto semplice. Nel file httpd.conf dovremo indicare innanzitutto l'indirizzo IP come parametro all'istruzione NameVirtualHost, dopo di che costruiremo un container in cui dovremo indicare l'IP e il nome del ServerName:
NameVirtualHost 111.111.1.1
<VirtualHost 111.111.1.1>
ServerName www.nome_server.ext
DocumentRoot /PATH/nome_cartella
</VirtualHost>
<VirtualHost 111.111.1.1>
ServerName www.nome_server.ext
DocumentRoot /PATH/nome_cartella
</VirtualHost>


Creazione di VirtualHost
Per Mac OS X 10.2 e 10.3

Creazione di VirtualHost

La creazione dei VirtualHost dà la possibilità di organizzare al meglio la nostra cartella Sites, della nostra Home.
Una semplicissima procedura permette di avere diversi dominii locali, così facendo possiamo evitare di scrivere ogni volta http://127.0.0.1/nomeuser/˜Url del sito locale
Procediamo per gradi:

  1. Aprite NetInfo Manager nella cartella Applications/Utilities/NetInfo Manager (Applicazioni/Utility/NetInfo Manager)
  2. Prima di tutto cliccate sul lucchetto inserite la vostra password di amministrazione
  3. Abilitate l'utente root. Cliccando sul pannello Security/Enable root User (Sicurezza/Abilita utente root)
  4. Cliccate su machines e avrete una lista, tra queste anche localhost
  5. Selezionate localhost e duplicatelo, vi chiederà se siete sicuri, voi dategli pure la conferma
  6. Ora cliccate su localhost copy nel box sotto avrete tre voci, a noi interessa la seconda, ovvero name.
  7. Nel box sotto cliccate localhost copy e dategli un nome, per esempio tutorial.intranet (Attenzione non ci devono essere spazi, e inoltre non usate il suffisso .local)
  8. Ora dovreste avere una machines con un nome che per comodità chiamerò tutorial.intranet
  9. Salvate facendo mela S, e quittate NetInfo Manager
  10. Ora aprite un buon editor di testo, vi consiglio BBedit, e con questo fate open hidden, selezionate questo percorso /private/etc/httpd/httpd.conf
  11. Adesso cercate NameVirtualHost *
  12. troverete alla riga 1054 riga più riga meno # NameVirtualHost * o # NameVirtualHost *:80 a questa riga togliete il cancelletto (#) e se volete per comodità anche :80, se lo togliete, toglietelo anche nei passi successivi.
    Attenzione Vi sarà chiesto di slucchettare il documento perchè l'owner di questo documento è root.
  13. Ora subito sotto avrete
    # <VirtualHost *:80>
    # ServerAdmin webmaster@dummy-host.example.com
    # DocumentRoot /www/docs/dummy-host.example.com
    # ServerName dummy-host.example.com
    # ErrorLog logs/dummy-host.example.com-error_log
    # CustomLog logs/dummy-host.example.com-access_log common
    # </VirtualHost>
  14. copiate tutte e sette le righe poi deselezionate e subito sotto #</VirtualHost> scrivete per vostra pura comodità # VirtualHost vostro nome e poi un paio di volte a capo
  15. Sotto la riga che avete scritto incollate quello che avete copiato prima
  16. Ora decommentate queste righe, ovvero togliete il cancelletto (#):
    <VirtualHost *:80>
    # ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/dummy-host.example.com
    ServerName dummy-host.example.com
    # ErrorLog logs/dummy-host.example.com-error_log
    # CustomLog logs/dummy-host.example.com-access_log common
    </VirtualHost>
  17. Ora al posto di DocumentRoot /www/docs/dummy-host.example.com mettete la url della vostra Sites, DocumentRoot /Users/VostroUser/Sites
  18. poi al posto di ServerName dummy-host.example.com mettete il nome della machine appena creata in NetInfo Manager, quindi rimanendo attinenti all'esempio sopra metterò ServerName tutorial.intranet
  19. Bene ora salvate e chiudete il documento, vi sarà chiesta la password inseritela pure
  20. Ora nel pannello Sharing (Condivisione) di System Preferences selezionate Personal Web Sharing
  21. Aprite il vostro browser preferito e scrivete la vostra url, nel caso dell'esempio, tutorial.intranet, vedrete servita la index della Cartella Sites