Sysctl Copertina Indice

Articoli


Una rete virtuale su un solo computer!

Premessa

Questo articolo nasce dalla mia esperienza di Web Designer. Attualmente curo pagine che sono ospitate su tre siti:

Sulla mia Linux Box di casa si presentava quindi il problema di simulare l'esistenza di tre hosts; più precisamente bisognava risolvere i problemi seguenti:

  1. Fare in modo che il computer avesse, oltre al suo nome proprio (spark.bronto.it), i nomi (tex|gulch|airo).unica.it;
  2. Il server web (Apache) deve fornire una home page diversa a seconda del nome di host con il quale viene formulata la richiesta;
  3. Alle richieste spark.bronto.it/~bronto, (tex|gulch|airo).unica.it/~bronto il server deve accedere a pagine diverse;
  4. Deve essere possibile ricevere la posta anche quando viene inviata ad indirizzi su (tex|gulch|airo).unica.it.

In altre parole, SI VUOLE CREARE UNA SITUAZIONE IN CUI È POSSIBILE ACCEDERE, VIRTUALMENTE, A DIVERSI SITI INTERNET SUI QUALI DOBBIAMO LAVORARE. Virtualmente perchè in realtà tutto avviene sul nostro computer di casa e vogliamo che il server web ed il mailer daemon si comportino in un certo modo quando vengono invocati. Vedremo punto per punto come risolvere tutti questi problemi. Poichè sulla mia linux box è installata una distribuzione Debian 1.2.0, queste note si riferiranno a quella distribuzione, ma credo non sia difficile adattarle anche ad altre distribuzioni come RedHat, Slackware o Caldera. Il materiale occorrente è dunque una distribuzione Debian 1.2.x con il server Apache installato.

Dare più di un nome al nostro computer
Ovvero: come far venire una crisi d'identità al proprio computer e vivere felici!

Nella directory /etc troviamo il file hosts. Se questo file non è mai stato manipolato dal momento dell'installazione esso conterrà solo una linea con una struttura del tipo:

127.0.0.1       nome.completo.host localhost nome

ad esempio, sul mio PC è

127.0.0.1       spark.bronto.it localhost spark

Il significato di questa linea è semplice: associa ai nomi "spark.bronto.it", "localhost" e "spark" il primo nome della serie (quindi spark.bronto.it) e il numero IP 127.0.0.1 (loopback).

La prima cosa che si potrebbe fare è ribattezzare il computer come "www.bronto.it" per quando si accede alle pagine web, ma siccome sono modesto e so benissimo che oltre casa mia le pagine non le leggerà nessuno, il nome sarà hww (Home Wide Web): aggiungo la linea


127.0.0.1       hww.bronto.it hww 

A questo punto avrete capito che per far riconoscere gli altri nomi alla macchina basterà aggiungere una serie di linee di questo tipo:


127.0.0.1       tex.unica.it  tex
127.0.0.1       a730.unica.it airo.unica.it a730 airo
127.0.0.1       gulch.unica.it gulch

Il primo passo è fatto.

Ricevere la posta diretta ad altri host

Ora sorge un secondo problema: quando la distribuzione viene installata il sendmail viene configurato solo per il nome di host che viene dato in fase di installazione. Per fare in modo che oltre agli indirizzi del tipo utente@spark.bronto.it gestisca anche utente@tex.unica.it (ad esempio) bisogna riconfigurare tutto da capo?

Tranquillizzatevi, la risposta è no. Andiamo a cercare un altro file: /etc/mail/sendmail.cw, che all'installazione è completamente vuoto. Con una forte semplificazione possiamo dire che questo file deve contenere i nomi con i quali sendmail riconosce la nostra macchina (oltre al nome dato in installazione). Quindi per far riconoscere anche al sendmail tutti i nomi che abbiamo appena dato al nostro PC bisogna inserire nel file una serie di entrate, come queste:


tex.unica.it
a730.unica.it
airo.unica.it
gulch.unica.it

Configurare apache per diversi siti virtuali

Risolto anche il problema della posta, bisogna configurare Apache per ospitare le copie dei dati presenti sui diversi server. Cosa fare?

Cominciamo dalla fase più semplice: creiamo le directory che ospiteranno i files relativi ai vari siti virtuali. Sul mio Linux Box la directory che contiene le sottodirectory delle cgi, delle icone, dei documenti etc. (cioè la directory indicata come "ServerRoot" nella configurazione di Apache) è

/usr/local/etc/httpd

La directory che contiene i documenti html è

/usr/local/etc/httpd/htdocs

Ho creato a questo livello una sottodirectory per ogni host (quindi una sottodirectory a730, una gulch, una tex), all'interno della quale riprodurre tutto o una parte della directory "ServerRoot" di ciascun host. Tuttavia è bene notare che la cosa migliore sarebbe creare una sottodirectory virtual direttamente nella ServerRoot, p.e. /usr/local/etc/httpd/virtual e creare lì una sottodirectory per ogni host. In questo modo i documenti degli altri host non sarebbero accessibili utilizzando un URL del tipo

http://hww.bronto.it/a730/htdocs/index.html

Ed ora, finalmente, i dettagli sulla configurazione di Apache: apriamo il file /etc/apache/httpd.conf. Alla fine del file c'è una piccola "maschera" che già suggerisce come fare:

# VirtualHost: Allows the daemon to respond to requests for more than one
# server address, if your server machine is configured to accept IP packets
# for multiple addresses. This can be accomplished with the ifconfig
# alias flag, or through kernel patches like VIF.


# Any httpd.conf or srm.conf directive may go into a VirtualHost command.
# See alto the BindAddress entry.


# <VirtualHost host.foo.com>
# ServerAdmin webmaster@spark.bronto.it
# DocumentRoot /www/docs/host.foo.com
# ServerName host.foo.com
# ErrorLog logs/host.foo.com-error_log
# TransferLog logs/host.foo.com-access_log
# </VirtualHost>

È intuitivo come procedere ora: per i più pigri è sufficiente copiare le linee di esempio e editarle, ma è bene ricordare, come dice il testo commentato, che "qualunque direttiva accettabile in httpd.conf o srm.conf può essere inserita all'interno di un comando VirtualHost". Così per i casi più semplici basta aggiungere qualcosa del genere:

<VirtualHost airo.unica.it>
ServerAdmin webmaster@spark.bronto.it
DocumentRoot /usr/local/etc/httpd/htdocs/a730/htdocs
ScriptAlias /cgi-bin /usr/local/etc/httpd/htdocs/a730/cgi-bin
ServerName airo.unica.it
ErrorLog /var/log/apache/airo.error
TransferLog /var/log/apache/airo.access
</VirtualHost>

Vediamo, uno per uno, il significato di ciascuna direttiva:

Ma si può fare molto di più! Già i più smaliziati si porranno il problema: "Io ho delle pagine personali su più di un host, accessibili agli URL http://try.to.do.it/~muttley e http://why.shoot.it/~muttley. Come faccio a riprodurre la stessa situazione sulla mia Linux Box?"

Per prima cosa, sotto la directory utente pubblica per i documenti html (per default ~/public_html nell'installazione Debian di Apache) bisogna creare due sottodirectory per i due virtual hosts, per esempio ~/public_html/try e ~/public_html/why, ed una "di default", per il server non virtuale, per esempio ~/public_html/main. Dopodichè nella configurazione del server e del virtual host andranno inserite (o modificate) le direttive UserDir.

Un esempio è la configurazione del virtual host tex.unica.it sulla mia linux box:

<VirtualHost tex.unica.it>
ServerAdmin webmaster@spark.bronto.it
DocumentRoot /usr/local/etc/httpd/htdocs/tex/htdocs
UserDir public_html/tex
ScriptAlias /cgi-bin /usr/local/etc/httpd/htdocs/tex/cgi-bin
ServerName tex.unica.it
ErrorLog /var/log/apache/tex.error
TransferLog /var/log/apache/tex.access
</VirtualHost>

Noterete che è presente anche una direttiva ScriptAlias. Quindi quando una CGI verrà richiesta all'host hww.bronto.it, Apache andrà a cercare in /usr/local/etc/httpd/cgi-bin, mentre se verrà richiesta all'host tex.unica.it, Apache andrà a cercare in /usr/local/etc/httpd/htdocs/tex/cgi-bin

Una configurazione ancora più complessa è la seguente:

<VirtualHost gulch.unica.it>
ServerAdmin webmaster@spark.bronto.it
DocumentRoot /usr/local/etc/httpd/htdocs/gulch/htdocs
UserDir public_html/gulch
ScriptAlias /cgi-bin /usr/local/etc/httpd/htdocs/gulch/cgi-bin
Alias /icons/ /usr/local/etc/httpd/htdocs/gulch/icons/
ServerName gulch.unica.it
ErrorLog /var/log/apache/gulch.error
TransferLog /var/log/apache/gulch.access
<Directory /usr/local/etc/httpd/htdocs/gulch/htdocs>
  Options ExecCGI FollowSymLinks
</Directory>
</VirtualHost>

l'intepretazione della quale lascio per esercizio al lettore!-)

Conclusione

Apache si dimostra uno strumento molto potente anche quando se ne conoscono solo alcune potenzialità. Vale la pena di "prenderci la mano" e di studiarlo a fondo. Un libro che promette molto bene a chi vuol fare conoscenza con questo potente free software è "Apache - The definitive guide" edito da O'Reilly & Associates, che ho ordinato proprio oggi. Una piccola recensione sul libro sarà argomento di uno dei miei prossimi articoli.

Note:
1) In realtà le cose sono ben diverse. Al server a730.unica.it, quello vero, è stato dato come alias il nome airo.unica.it, dovendo servire le pagine della locale Sezione dell'A.I.R.O.. Senza la direttiva "ServerName airo.unica.it" le richieste del tipo http://airo.unica.it/documento.html riceverebbero in risposta http://a730.unica.it/documento.html, che sarebbe l'indirizzo visualizzato da Netscape sulla barra "Location:". Per evitare questo, e far quindi in modo che il server risponda sempre come airo.unica.it, si usa la direttiva ServerName. Quanto detto sopra vale solamente per il caso in esame, ovvero di diversi virtual host in un computer stand-alone.

Si ringraziano Davide Rizzo e Stefano Sanna per il loro aiuto alla realizzazione dell'articolo.

di Marco Marongiu


Sysctl Copertina Indice