Concludiamo questa puntata mostrando brevemente come mod_perl ci offra la possibilità di configurare dinamicamente Apache utilizzando il Perl. È infatti possibile scrivere direttamente codice Perl in httpd.conf (o nei vari .htaccess) all'interno dell'apposita sezione <Perl></Perl>. Tutte le direttive e sezioni di httpd.conf sono disponibili e configurabili col vantaggio che è possibile aggiungervi una logica in fase di settaggio.
Come semplice esempio illustriamo una configurazione dinamica che semplifica assai la configurazione di Apache in situazioni di mass virtual hosting:
Esempio 2. Sezione di configurazione <Perl></Perl> all'interno di httpd.conf
<Perl>
#!perl
$User = 'www';
$NameVirtualHost = "192.168.1.3";
my $base_web_dir = "/home/web";
my @domains = qw/oltrelinux.com superpatrizio.org modperl.it/;
foreach my $domain (@domains) {
push(@{$VirtualHost{$NameVirtualHost}},
{
ServerName => "www.$domain",
DocumentRoot => "$base_web_dir/$domain/htdocs",
ErrorLog => "$base_web_dir/$domain/logs/error_log",
CustomLog => "$base_web_dir/$domain/logs/access_log common",
ServerAdmin => "webmaster\@$domain",
ScriptAlias => "/cgi-bin \"$base_web_dir/$domain/cgi-bin\"",
Directory => {
"$base_web_dir/$domain/htdocs" => {
Options => 'Indexes FollowSymLinks',
AllowOverride => 'None',
Order => 'allow,deny',
Allow => 'from all'
},
"$base_web_dir/$domain/cgi-bin" => {
AllowOverride => 'None',
Options => 'None',
Order => 'allow,deny',
Allow => 'from all'
}
}
});
}
use Apache::PerlSections ();
Apache::PerlSections->store("/home/web/PerlServerConfig.pm");
__END__
</Perl>
Subito notiamo come tutto il codice della sezione <Perl> sia nella forma:
<Perl>
#!perl
...
__END__
</Perl>
Questo consente di effettuare un semplice test usando direttamente l'interprete Perl a linea di comando:
%> perl -cx httpd.conf
httpd.conf syntax OK
dove lo switch -c effettua il controllo sintattico del codice e -x indica all'interprete di ignorare tutto il contenuto di httpd.conf prima della linea #!perl.
Le prime due linee impostano le direttive "User" e "NameVirtualHost": in generale nella sezione <Perl> per far riferimento alle corrispondenti direttive di configurazione di Apache e necessario utilizzare variabili globali il cui spelling corrisponda esattamente. Le successive linee utilizzano due variabili locali che serviranno per la configurazione dinamica di tutti i virtual host:
my $base_web_dir = "/home/web";
my @domains = qw/oltrelinux.com superpatrizio.org modperl.it/;
$base_web_dir contiene la directory base dove risiedono le root directory per gli host virtuali. Nell'array @domains inseriamo tutti i domini che Apache servirà come virtual host. Il successivo ciclo foreach configura dinamicamente tutte le principali direttive per i domini definiti in @domains. È opportuno soffermarsi un attimo sulla linea:
push(@{$VirtualHost{$NameVirtualHost}}, ...
Infatti tutte le sezioni racchiuse tra TAG, come <VirtualHost> o <Directory>, vanno mappate in un hash che nel nostro caso è %VirtualHost. Per ogni elemento dell'hash si utilizza come chiave l'argomento della direttiva (l'hostname o l'IP per <VirtualHost>, la directory per <Directory>, la URI per <Location>, ecc.) e come valore un riferimento ad un hash anonimo contenente le relative direttive come coppie chiave/valore:
$VirtualHost{'192.168.1.3'} = {
ServerName => 'dominio.com',
...
};
Nel nostro caso di virtual host name-based abbiamo il problema di avere valori dell'hash %VirtualHost con stessa chiave (l'indirizzo IP) e quindi ogni nuova entry sovrascriverebbe quella precedente. È necessario assegnare come valore di un elemento di %VirtualHost, un riferimento ad un array anonimo i cui elementi siano riferimenti ad un hash relativo ad ogni virtual host che intendiamo configurare. Più facile a vedersi che a dirsi:
$VirtualHost{'192.168.1.3'} = [
{
ServerName => 'dominio-1.com',
...
},
{
ServerName => 'dominio-2.com',
...
}
];
Da notare che in questo esempio la directory definita in $base_web_dir deve esistere così come tutte le directories (e sub-directories) relative ai domini: ma è semplice aggiungere al codice la capacità di creare eventualmente run time la struttura (root_dominio/htdocs, root_dominio/logs, root_dominio/cgi-bin).
Tutto ciò può sembrare complesso ma se pensiamo ad una situazione di webhosting intensivo -ad esempio un centinaio di virtual host- ci accorgiamo che con sole 20 linee di codice Perl sia possibile configurare l'Apache risparmiandoci la fatica di dover scrivere e aggiornare centinaia e centinaia di linee di direttive!
Infine nelle ultime due linee:
use Apache::PerlSections ();
Apache::PerlSections->store("/home/web/serverconfig.pm");
viene caricato il modulo Apache::PerlSections e viene chiamato il metodo store() per eseguire uno snapshot della configurazione contenuta in tutte le sezioni <Perl> di httpd.conf e scriverlo, in sintassi Perl, su file. In genere queste istruzioni non sono necessarie ma costituiscono un valido ed ulteriore strumento di debug. Ricordo infatti che, se durante la compilazione del codice l'interprete Perl incontra un errore, Apache riporterà l'errore nell'error_log ma il server httpd non sarà avviato.
Concludiamo accennando al fatto di come sia possibile documentare la configurazione utilizzando il formato POD (Plain Old Documentation) all'interno della sezione <Perl>
|