Sullo stesso computer è possibile ospitare diversi siti fra loro indipendenti.
Apache prevede diversi metodi per per farlo:
- User Home (tutte le home vengono visualizzate tramite la direttiva UserDir)
- Istanze multiple di Apache (Più Apache, anche di versioni diverse, installati e in esecuzione sulla stessa macchina)
- VirtualHost Ip-based (Più domini virtuali su IP diversi)
- VirtualHost Name-based (Più domini virtuali sullo stesso IP)
Il metodo più utilizzato per erogare più servizi con Apache è quello di creare dei VirtualHost IP o name based.
Ovvero tramite sullo stesso server è possibile creare virtualmente tanti host quanti sono i servizi (siti) che devono essere erogati.
IP-Based
Ad ogni Host virtuale corrisponde un IP differente. Soluzione comoda ma poco utilizzabile quando si hanno molti domini virtuali da usare, per l'inutile spreco di indirizzi IP.
Name-Based
Apache supporta anche il virtual-hosting basato sul nome del server e non sull'IP, quindi più virtual-host Name based possono puntare allo stesso indirizzo IP. Questo richiede l'utilizzo del protocollo HTTP version 1.1, per cui non funziona con browser molto vecchi.
Il vantaggio rispetto all'IP-based è proprio quello di risparmiare indirizzi IP, in quanto è possibile avere anche migliaia di domini con lo stesso indirizzo.
Il vantaggio del virtual hosting basato su IP è che ogni virtual host corrisponde ad un IP e non ha bisogno di essere identificato con un nome, inoltre viene supportato anche dai vecchi browser che non supportano il protocollo HTTP/1.1.
Lo svantaggio è che per ogni dominio avremo bisogno di un differente IP.
A livello di configurazione bisogna specificare su quali indirizzi e quali porte il server Apache deve rimanere in ascolto.
La direttiva per identificare l'indirizzo IP è BindAddress e la porta Port:
BindAddress *
Rimane in ascolto su tutte le interfacce
Port 80
alla porta 80
Una possibile altrenativa è la direttiva Listen che permette di specificare porta ed indirizzo IP sulla stessa linea di configurazione:
Listen 192.168.208.3:80
Apache binda la porta 80 all'ip 192.168.208.3
oppure
BindAddress 192.168.208.4
Viene bindato l'indirizzo 192.268.208.4
Listen
80
Listen
443 sia alla porta 80 che 443
La direttiva che definisce il VirtualHost nel file di configurazione è VirtualHost
<VirtualHost IP:PORT>
[...]
</VirtualHost>
I primary Object utilizzati per definire le proprietà di un VirtualHost sono:
ServerAdmin La e-mail dell'amministratore del serverweb
ServerName Il canonical name per il virtualhost
DocumentRoot Path dove risiedono file HTML, immagini e contenuti del sito da rendere disponibili
ErrorLog Il log degli errori
CustomLog Il log sui file trasferiti
Esempio:
<VirtualHost 192.168.208.3:80 >
ServerAdmin [email protected]
DocumentRoot /usr/local/apache/htdocs/sick/
ServerName sick-internals
ErrorLog logs/sick-internals-error_log
CustomLog logs/sick-internals common
<Directory "/usr/local/apache/htdocs/sick/">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Ognuna di queste direttive tranne ServerName verrebbe ereditata dalla configurazione principale, ma si preferisce per ovvi motivi (non mischiare i log, avere piu' ServerAdmin etc...) definire nuovi parametri per ogni Virtualhost.
L'alternativa al virtual hosting basato su IP è quello Name-based, cioè con più domini condivisi sullo stesso IP. Apache esaminando l'header "Host:" (es: Host: www.dominio.com) inviato dal client interpreta di conseguenza la richiesta, ed eroga il servizio relativamente all'Host richiesto. Questa procedura è valida solo se il client supporta il protocollo HTTP/1.1.
A livello di configurazione la differenza fra il virtual host IP-based e name-based è SOLO la direttiva
NameVirtualHost che va aggiunta alla conf generale per identificare l'IP utilizzato dai vari virtual host, il resto è identico, compresa la sintassi della direttiva container VirtualHost
e il suo contenuto.
E' possibile avere più IP a cui sono associati più domini virtuali. Per esempio:
Prima Dichiarazione dell'IP per i Virtual Host
NameVirtualHost 192.168.208.2
Inizializzazione del primo Virtual Host
<VitualHost 192.168.208.2>
ServerName www.openskills.info
[...]
</VirtualHost>
Inizializzazione del secondo Virtual Host sullo stesso IP
<VirtualHost 192.168.208.2>
[...]
Seconda Dichiarazione dell'IP per altri Virtual Host
NameVirtualHost 192.168.208.3
Inizializzazione di nuovi VirtualHost sul secondo IP
<VirtualHost 192.168.208.3>
[...]
La direttiva NameVirtualHost "cattura" tutte le richieste per l'IP specificato e tramite il confronto fra l'header Host: e la direttiva ServerName o ServerAlias deduce quale risorsa è stata richiesta, se in nessun caso si ha un matching il server risponde con un errore.
ServerAlias La direttiva server Alias permette come nella direttiva ServerName di settare il nome a cui dovrà rispondere il virtualhost ma con la differenza che si ha la possibilità di utilizzare i wildcard characters * e ? . Per esempio:
<VirtualHost 192.168.208.2>
ServerName www.coresis.com
ServerAlias www.coresis.it
In questo caso questo Virtualhost risponderà sia per www.coresis.com che per www.coresis.it
Un piccolo elenco delle direttive che non avrebbe senso mettere nella configurazione di un virtual host con la relativa spiegazione.
ServerType
Direttiva che determina se Apache è un demone standalone o gestito da inet e richiede per forza di cose di essere inserito nella "global section". I parametri di avvio cambiano a seconda del ServerType.
StartServers, MaxSpareServers, MinSpareServer e MaxRequestsPerChild
Tutte queste direttive controllano tutti i processi di Apache per le singole richieste ma è esclusa qualsiasi tipo di correlazione a singoli virtualhost poiché i vari child sono indifferentemente usati da Apache per gestire richieste a virtual host diversi.
BindAddress, Listen
La configurazione principale richiede un IP e una porta per stabilire a quale indirizzo Apache deve rimanere in ascolto, nella configurazione dei singoli virtualhost il binding dell'indirizzo avviene secondo criteri e direttive diverse.
ServerRoot
Direttiva che definisce il path delle configurazioni o di altre risorse in comune a tutti i virtualhost.
PidFile
File contenente il process ID del main server, poiché il file è settabile solo dal main server e non esiste una correlazione virtual-host/processi, deve essere definita nella global section.
TypesConfig
Indica il nome del file MIME Type, per definizione è settabile solo nella configurazione globale.
NameVirtualHost
Definisce l'IP da relazionare ai virtualhost name-based e quindi non avrebbe senso definirlo nelle configurazione dei singoli virtual host.
La direttiva VirtualHost accetta sia i canonical name che gli indirizzi IP, ma per evitare problemi di sicurezza e di performance è bene utilizzare sempre gli IP.
Anche se è proprio la direttiva VirtualHost a configurare a quale indirizzo IP o nome dovrà rispondere il Virtualhost è consigliato mettere sempre l'IP e la porta a cui deve rispondere, sarà proprio la direttiva ServerName che eviterà al server Apache di lanciare inutili query al DNS per scoprire la corrispondenza IP e nome VirtualHost.
Per facilitare la gestione dei virtual host, per permettere l'aggiunta di nuovi domini virtuali ad amministratori che non dovrebbero avere accesso al file di configurazione generale o per qualsiasi simile necessità, è consigliabile inserire la parte di configurazione riguardante i virtual host su file separati.
Tramite la direttiva Include possibile includere nel file di configurazione principale httpd.conf file contenenti ulteriori direttive.
Aggiunge alla direttiva principale, tutte le direttive scritte nel file indicato
Include conf/vhost.conf
E' possibile anche usare wildcard ed inserire diversi file intere directory:
Include conf/*.conf
Il caso sopra citato è comodo anche per attivare o disabilitare intere parti di configurazione rinominando semplicemente il nome del file, facendo in modo che non concluda con .conf
Ricordarsi che ogni modifica nel file di configurazione principale o nei vari file inclusi tramite la direttiva Include richiede l'avvio del server web per essere resa operativa.
Con la direttiva Listen si possono specificare due opzioni: l'IP e la porta o solo una delle due ma senza aver la possibilità di utilizzare gli hostname, invece la direttiva BindAddress accetta sia gli ip che gli hostname (configurazione sconsigliata) ma senza la possibilità di specificare la porta.
Per specificare la porta occorre affiancare alla direttiva BindAddress o la direttiva Listen o la direttiva Port. Per esempio:
BindAddress 213.198.151.253
Port 80
coincide con:
Listen 213.198.151.253:80
e con:
BindAddress 213.198.151.253
Listen 80
la documentazione ufficiale di Apache raccomanda di usare Listen in quanto le direttive Port e BindAddress sono destinate all'obsolescenza.
Questo comando permette di alzare il numero massimo di file che un applicativo o un utente possono aprire contemporaneamente.
Esistono casi reali in cui questo limite può essere raggiunto. Per esempio su sistemi con un Apache che gestisce una gran quantità di siti, per i quali deve aprire i relativi log indipendenti.
Il parametro va reimpostato ad ogni avvio, alcune distribuzioni prevedono un file di configurazione predefinito per impostare "limits" come questo.
Per visualizzare tutti i parametri
[neo@dido neo]$ ulimit -a
core file size (blocks) 0
data seg size (kbytes) unlimited
file size (blocks) unlimited
max locked memory (kbytes) unlimited
max memory size (kbytes) unlimited
open files 1024
pipe size (512 bytes) 8
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes 2047
virtual memory (kbytes) unlimited
Apache può gestire un'infinità di virtual host, e prevede strumenti per la gestione automatica di un gran numero di domini virtuali, che rende estremamente comoda la vita di grandi provider, registrar e chiunque si ritrova a gestire più di poche decine di domini virtuali su un singolo server.
Fondamentalmente sono utilizzabili 3 diversi metodi, tramite tre moduli.
- mod_rewite
- mod_perl (script perl)
- mod_vhost_alias
MOD_REWRITE
Tramite la direttive gestite dal modulo mod_rewrite è possibile configurare dinamicamente dei virtual host name-based.
Abilitazione del modulo mod_rewrite
RewriteEngine on
Test per l'host header per estrarre il nome del dominio
RewriteCond %{HTTP_HOST} ^www\.(.+)$
Rewrite dell'URL per redirezionare il client alla risorsa richiesta
RewriteRule ^/(.+)$ /home/www/%1/$1 [L]
In questo caso se il client richiede http://www.openskills.info/index.php le rule di rewrite convertiranno la richiesta per accedere alla risorsa che risiederà in /home/www/openskills.info/index.php.
Il vantaggio di utilizzare questo metodo è che non bisogna riavviare Apache per aggiungere un virtualhost ma semplicemente aggiungere la entry nel prorio DNS.
Lo svantaggio, come con tutti i domini virtuali name based, è che può funzionare solo con i browser che utilizzano il protocollo HTTP/1.1 e che ogni dominio deve poter essere risolto con il dns.
MOD_PERL
E' possibile tramite il linguaggio di programmazione perl scrivere un piccolo script da includere nel file httpd.conf fra i tag <perl> .
Esempio:
Apertura del tag perl ed inizializzazione dello script da includere nel file httpd.conf
<Perl>
#!/usr/bin/perl -w
Definizione di alcune variabili
local ($ip,$host,$admin,$vroot,$aliases);
local ($directive,$args);
Apertura e parsing del file di configurazione
open (FILE,"/usr/local/apache/conf/vhost-perl.conf")
while (<FILE>) {
Skippa tutte le linee che iniziano con #
next if /^\s*(#|$) / ;
if (/^d+/) {
($ip,$host,$admin,$vroot,$aliases)=split /\s*,\s*/, $_;
$VirtualHost{ip}= {
ServerName =>$host,
ServerAdmin => $admin,
DocumentRoot => "/home/www/".$vroot,
ErrorLog => "logs/".$host."_error.log",
TransferLog =>"logs/".$host."_access.log"
};
Gestione Alias
$VirtualHost {$ip} {ServerAlias} =$aliases if $aliases;
Gestione della direttiva port
$VirtualHost {$ip} {Port} =$1 if ($ip=~/:(\d+)$/);
Aggiunta di eventuali direttive, specificate nel file di configurazione /usr/local/apache/conf/vhost-perl.conf
} elseif ($ip) {
($directive,$args)=split / /, $_,2;
$VirtualHost {$ip} {$directive}=$args;
}
}
Chiusura del file e dello script
close (file);
_END_
<Perl>
Il passo successivo è quello di creare il file di configurazione /usr/local/apache/conf/vhost-perl.conf secondo la seguente sintassi:
IP(:port), hostname,ServerAdmin,document root, aliases
Direttive Opzionali
Esempio:
213.198.151.253:80, openskills.info, [email protected] /home/www/openskills
MOD_VHOST_ALIAS
La configurazione base per i virtualhost name-based è la seguente:
UseCanonicalName off
VirtualDocumentRoot /home/www/%0
Invece per i virtualhost ip-based:
UseCanonicalName DNS
VirtualDocumentRoot /home/www/%0
Dove %0 è l'hostname dedotto dall'host header inviato dal client nel primo caso e nel secondo è il risultato della query effettuata al DNS.
Inoltre è possibile affiancare altre direttive per completare la configurazione di un virtualhost:
-VirtualDocumentRootIP
E' possibile identificare la document root attraverso l'IP piuttosto che con il nome dell'host.
VirtualDocumentRootIP /home/www/%0
Dove %0 è l'IP dell'host, quindi l'url verrà rimappata in /home/www/213.198.151.253 nel caso di openskills.info.
-VirtualScriptsAlias e VirtualScriptsAliasIP per specificare le directory dove risiedono i CGI:
VirtualDocumentRoot /home/www/%0/html
VirtualScriptsAlias /cgi-bin/ /home/www/%0/cgi-bin
o
VirtualDocumentRootIP /home/www/%0/html
VirtualScriptsAliasIP /cgi-bin/ /home/www/%0/cgi-bin
-ScriptAliasMatch
Direttiva simile a VirtualScriptsAliasIP e VirtualScriptsAlias che permette di definire una singola directory contenente cgi-script per tutti i virtual host:
ScriptAliasMatch /cgi/bin /home/www/.*/cgi-bin/