Il termine host virtuale si riferisce alla capacità di Apache di servire diversi URI (universal resource identifiers) dalla stessa macchina fisica. Questo significa che, diversi domini, come www.example.com e www.example.net, vengono eseguiti da un solo server Web su una macchina fisica.
Generalmente si utilizzano host virtuali per risparmiare sui costi amministrativi (la manutenzione è limitata a un solo server Web) e di hardware (ogni dominio non richiede un server dedicato). Gli host virtuali possono essere basati sul nome, sull'IP o sulla porta.
Gli host virtuali possono essere configurati con YaST (vedi Host predefinito) o modificando manualmente la sezione Host Virtuale di httpd.conf (vedere la Sezione 46.3.2, «Configurazione manuale di Apache»).
Come predefinito, Apache in SUSE Linux viene preparato per un file di configurazione per host virtuale in /etc/apache2/vhosts.d/. Un modello di base per un host virtuale è fornito nella directory (vhost.template). La configurazione dell'host virtuale può anche essere aggiunta altrove, ad esempio in un file che è inserito nella configurazione.
![]() | Importante |
|---|---|
È molto utile controllare l'impostazione dell'host virtuale con il comando httpd2 -S. Questo comando emette le impostazioni dell'host virtuale come vengono comprese da Apache ed è in grado di assistere l'utente nell'ottenere i risultati desiderati. Se si utilizza Apache con flag come -DSSL, si devono utilizzare gli stessi flag durante il test, ad esempio httpd2 -S -DSSL. | |
Con gli host virtuali basati sul nome, viene servito più di un sito web per indirizzo IP. Apache utilizza il campo host nell'intestazione HTTP inviato dal client per connettere la richiesta a una voce ServerName corrispondente di una delle dichiarazioni dell'host virtuale. Se non si trova nessunServerNamecorrispondente, il primoVirtualHost specificato viene utilizzato come predefinito.
NameVirtualHost avvia la sezioneHost virtuale in una configurazione Apache.
NameVirtualHost dice al server Web Apache su quale indirizzo IP e, a scelta, quale porta ascoltare per le richieste da parte di client contenenti il nome di dominio nell'intestazione HTTP.
Il primo argomento può essere un nome di dominio completo, ma si consiglia di utilizzare l'indirizzo IP. Il secondo argomento è la porta ed è facoltativo. Come impostazione predefinita, viene utilizzata la porta 80 che è configurata tramite la direttivaAscolto (Selezione dispositivo di rete).
Il carattere jolly * può essere utilizzato sia per l'indirizzo IP, sia per il numero della porta per ricevere le richieste su tutte le interfacce. Gli indirizzi IPv6 devono essere racchiusi tra parentesi quadre.
Il blocco <VirtualHost></VirtualHost> contiene le informazioni da applicare a un particolare dominio. Quando Apache riceve una richiesta da un client per un VirtualHost definito, utilizza le direttive allegate a questa sezione. È possibile utilizzare qualsiasi direttiva Apache consentita nel contesto VirtualHost. Il tag di apertura VirtualHost, nella configurazione di un host virtuale basato sul nome, prende i seguenti argomenti:
Indirizzo IP (o nome di dominio completo) precedentemente dichiarato con la direttiva NameVirtualHost.
Il numero di porta facoltativo precedentemente dichiarato con la direttiva NameVirtualHost.
Il carattere jolly * è ammesso anche come sostituto dell'indirizzo IP. Questa sintassi è valida solo in combinazione con l'utilizzo del carattere jolly in NameVirtualHost * . Quando si utilizzano gli indirizzi IPv6, l'indirizzo deve essere racchiuso tra parentesi quadre.
Esempio 46.9. DirettiveVirtualHost basate sul nome
<VirtualHost 192.168.0.20>
ServerName www.example.com
DocumentRoot /srv/www/htdocs/example.com
ServerAdmin webmaster@example.com
ErrorLog /var/log/apache2/www.example.com-error_log
CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>
<VirtualHost 192.168.1.100:80>
ServerName www.example.net
DocumentRoot /srv/www/htdocs/example.net
ServerAdmin webmaster@example.net
ErrorLog /var/log/apache2/www.example.net-error_log
CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost>
<VirtualHost [2002:c0a8:164::]>
# 2002:c0a8:164:: è l''indirizzo IPv6 equivalente a 192.168.1.100
ServerName www.example.org
DocumentRoot /srv/www/htdocs/example.org
ServerAdmin webmaster@example.org
ErrorLog /var/log/apache2/www.example.org-error_log
CustomLog /var/log/apache2/www.example.org-access_log common
</VirtualHost>
In questo esempio, i domini www.example.com e www.example.net sono ospitati sulla macchina con l'indirizzo IP 192.168.1.100. Il primoVirtualHost è predefinito per tutte le richieste in entrata al server Web.
Le direttive ErrorLog (descritta inSezione 46.3.2.3.4, «ErrorLog file | "|command"
») e CustomLog (vedere http://httpd.apache.org/docs-2.0/mod/mod_log_config.html#customlog) non devono contenere il nome di dominio. Qui utilizzare un nome a scelta.
Questa configurazione alternativa di host virtuali richiede la configurazione di più IP su una macchina. Un'istanza di Apache supporta l'hosting di diversi domini, a ognuno dei quali viene assegnato un IP diverso.
![]() | Indirizzi IP e host virtuali basati su IP |
|---|---|
Il server fisico deve avere un unico indirizzo IP per ciascuno degli host virtuali basati su IP. Se la macchina non dispone di più schede di rete, possono essere utilizzate interfacce di rete virutali (IP aliasing). | |
Affinché Apache possa supportare l'hosting di più IP, la macchina fisica deve accettare richieste da più IP. Questo stato di fatto si chiama hosting multi-IP. Inoltre, l'IP aliasing deve essere attivato nel kernel. Questa è un'impostazione predefinita in SUSE Linux.
Una volta configurato il kernel per l'IP aliasing, pssono essere utilizzati i comandi ifconfig e route per configurare altri IP sull'host. Questi comandi devono essere eseguiti come utente root.
Nell'esempio seguente si presume che l'host abbia già l'IP 192.168.0.10 assegnato per il dispositivo di rete eth0. Digitare il comando ifconfig per visualizzare l'IP dell'host. Con i seguenti comandi possono essere aggiunti ulteriori indirizzi IP:
ip addr add 192.168.0.20/24 dev eth0
ip addr add 192.168.0.30/24 dev eth0
Tutti questi indirizzi IP sono assegnati allo stesso dispositivo di rete fisico (eth0).
Una volta configurato l'IP aliasing sul sistema (oppure l'host è stato dotato di più schede di rete), Apache può essere configurato. Per ogni server virtuale è necessario un blocco VirtualHost separato.
L'esempio seguente mostra Apache in esecuzione su una macchina con l'IP 192.168.1.10, che ospita due domini sugli IP aggiuntivi 192.168.0.20 e 192.168.0.30. Quest esempio specifico funziona solo su una rete privata, poiché gli IP che vanno da 192.168.0.0 a 192.168.0.255 non vengono instradati sulla rete Internet pubblica.
Esempio 46.10. Direttive VirtualHost basati su IP
<VirtualHost 192.168.0.20>
ServerName www.example.com
DocumentRoot /srv/www/htdocs/example.com
ServerAdmin webmaster@example.com
ErrorLog /var/log/apache2/www.example.com-error_log
CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>
<VirtualHost 192.168.0.30>
ServerName www.example.net
DocumentRoot /srv/www/htdocs/example.net
ServerAdmin tux@example.net
ErrorLog /var/log/apache2/www.example.net-error_log
CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost>
In questo esempio, le direttive VirtualHost sono specificate solo per le interfacce, anziché con 192.168.0.10. Quando una direttiva Listen (descritta in Selezione dispositivo di rete) viene configurata anche per l'indirizzo 192.168.0.10, deve essere creato un host vituale basato su IP per rispondere alle richieste HTTP effettuate a quella interfaccia oppure vengono applicate le direttive trovate nella sezione Main Server del file /etc/apache2/httpd.conf (vedere la Sezione 46.3.2.3, «Direttive di Apache in /etc/apache2/httpd.conf: Server principale
»).