Le service web

Le service que nous allons voir maintenant n'est pas indispensable au fonctionnement des réseaux, mais il est aujourd'hui le fondement même d'Internet : le web. Nous allons voir dans ce chapitre comment mettre en place un serveur web et le configurer.

Principe du web
Le fonctionnement du web s'appuie sur le protocole applicatif HTTP. Comme les autres protocoles que nous avons étudiés, HTTP a un mode de fonctionnement bien spécifique. Ce qui nous intéresse aujourd'hui, c'est surtout de savoir utiliser la navigation, mais pas de la comprendre en détail, du moins pas pour l'instant.

Le protocole HTTP
Plutôt que d'essayer de comprendre en détail le protocole HTTP, nous allons voir ce qu'il permet de faire. Vous savez qu'une page web est composée de balises HTML. Le principe du protocole HTTP est de transporter ces pages HTML, et potentiellement quelques informations supplémentaires. Le serveur web met donc à disposition les pages web qu'il héberge, et le protocole HTTP les transporte sur le réseau pour les amener au client.
Nous allons donc mettre en œuvre un serveur web qui permettra de mettre à disposition des internautes nos pages web !

Les différents serveurs web
Il existe de nombreux serveurs web sur le marché. Le plus connu est Apache et il est utilisé par une majorité de sites sur Internet. Voici l'utilisation des différents serveurs à travers le monde :

Serveurs web / HTTP les plus utilisés (source: W3techs.com)

Toutefois, si l'on regarde plus précisément les évolutions des serveurs, on se rend compte que la tendance n'est pas à la progression pour Apache :

Graph représentant l'utilisation des serveurs web (source: netcraft)

Le serveur nginx a notamment vécu une très belle progression, car il offre des performances souvent meilleures qu'Apache.
Cependant, pour notre mise en place, nous allons opter pour Apache qui reste le serveur numéro un. Vous pourrez si vous le souhaitez essayer un autre serveur, comme nginx, mais la configuration est souvent très différente d'un serveur à l'autre.

Mise en place et configuration

Installation et configuration d'Apache

Installation d'Apache

1. Sous Ubuntu/Debian, téléchargez le serveur HTTP Apache depuis le site ci-dessus et décompressez-le :

$ gzip -d httpd-NN.tar.gz
$ tar xvf httpd-NN.tar

2. De la même façon, téléchargez et décompressez les sources de PHP :

$ tar -xzf php-NN.tar.gz

'NN' devra être remplacé par la version spécifique à utiliser.

3. Compilez et installez Apache. Consultez la documentation sur l'installation d'Apache pour plus de détails quant à la compilation de ce logiciel.

$ cd httpd-2_x_NN
$ ./configure --enable-so
$ make
$ make install

4. Maintenant que vous avez Apache 2.x.NN de disponible sous /usr/local/apache2, configurez-le avec le support pour le chargement de modules, ainsi que le MPM prefork standard. Pour tester votre installation, utilisez la procédure normale pour démarrer le serveur Apache, i.e. :

$ /usr/local/apache2/bin/apachectl start

et arrêtez-le pour continuer dans la configuration de PHP :

$ /usr/local/apache2/bin/apachectl stop

5. Maintenant, configurez et compilez PHP. Ce sera à ce moment-là où vous pourrez personnaliser PHP avec les diverses options disponibles, comme la liste des extensions à activer. Dans notre exemple, nous effectuerons une configuration simple, avec Apache 2 et le support MySQL.

Si vous avez construis Apache depuis les sources, tel que décrit ci-dessus, l'exemple suivant devrait être correct concernant les chemins vers les apxs, mais si vous avez installé Apache d'une autre façon, vous devrez prendre en compte vos spécificités et ajustez les chemins apxs en conséquent. Notez que suivants les distributions, vous pourriez être amené à renommer apxs en apxs2.

$ cd ../php-NN
$ ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql
$ make
$ make install

Si vous décidez de modifier les options de configuration après l'installation, vous devrez exécuter de nouveau les étapes "configure", "make" et "make install". Vous n'aurez alors qu'à redémarrer Apache pour que le nouveau module prenne effet. Une re-compilation d'Apache n'est pas nécessaire. Notez que, sauf indications contraires, l'étape "make install" installera également PEAR, mais aussi divers outils PHP comme phpsize, PHP CLI et bien plus encore.

6. Setup your php.ini

$ cp php.ini-development /usr/local/lib/php.ini

Vous devez éditer le fichier .ini pour définir les options PHP. Si vous préférez placer ce fichier dans un autre répertoire, utilisez l'option --with-config-file-path=/some/path à l'étape 5.
Si vous choisissez le fichier php.ini-production, assurez-vous de lire la liste des modifications correspondante car il peut affecter considérablement la façon dont PHP fonctionnera.

7. Éditez le fichier httpd.conf pour charger le module PHP. Le chemin spécifié à droite de la chaîne LoadModule, doit correspondre au chemin système du module PHP. L'étape "make install" ci-dessus devrait avoir réalisé cette opération à votre place, mais une simple vérification permettra de s'en assurer.

Pour PHP 8:

$ LoadModule php_module modules/libphp.so

Pour PHP 7:

$ LoadModule php7_module modules/libphp5.so

8. Dites à Apache d'analyser certaines extensions comme étant des scripts PHP. Par exemple, laissez Apache passer à PHP les fichiers dont l'extension est .php. Au lieu d'utiliser seulement la directive AddType d'Apache, nous souhaitons éviter tout risque potentiellement dangereux, lors d'un téléchargement de de la création de fichier comme exploit.php.jpg, d'exécution PHP. En utilisant cette exemple, vous pouvez avoir n'importe quelle extension d'analyser par PHP. Nous avons ajouté .php pour l'exemple.

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

9. Utilisez la procédure normale pour démarrer le serveur Apache, i.e. :

/usr/local/apache2/bin/apachectl start

Ou

service httpd restart

Si vous avez suivi les étapes précédentes, vous avez maintenant un serveur web Apache2 fonctionnel avec le support PHP comme module SAPI. Bien-sûr, il y a une multitude d'autres options de configuration de disponibles avec Apache et PHP. Pour plus d'informations, entrez la commande ./configure --help dans l'arbre source correspondant.

Vous pourrez, par la suite, installer un serveur de bases de données mysql si vous le souhaitez. Il faudra alors aussi installer les modules nécessaires pour que PHP5 et mysql puissent dialoguer ensemble.

Notre serveur étant installé, nous allons vérifier qu'il est bien en écoute :

# netstat -antp | grep apache2
tcp6       0      0 :::80                   :::*                    LISTEN      381/apache2

Le service est bien en écoute, nous pouvons tester pour voir ce qui est présenté. Pour cela, nous allons simplement faire pointer notre navigateur sur l'adresse IP de notre machine virtuelle :

Page d'Apache par défaut

Nous voyons bien la page par défaut du serveur Apache, ça marche !
Nous allons maintenant regarder comment configurer notre serveur pour pouvoir afficher nos propres sites web.

Configuration d'Apache2
Comme habituellement sous Unix, les fichiers de configuration se trouvent dans le répertoire /etc. Pour Apache2, ils sont dans le répertoire apache2.
Regardons le contenu de ce répertoire :

# cd /etc/apache2
# ls -la
total 76
drwxr-xr-x  7 root root  4096 Aug 30  2012 .
drwxr-xr-x 88 root root  4096 Mar 19 23:19 ..
-rw-r--r--  1 root root  7994 Jan  1  2011 apache2.conf
drwxr-xr-x  2 root root  4096 Mar 16  2011 conf.d
-rw-r--r--  1 root root  1169 Jan  1  2011 envvars
-rw-r--r--  1 root root     0 Mar 16  2011 httpd.conf
-rw-r--r--  1 root root 31063 Jan  1  2011 magic
drwxr-xr-x  2 root root  4096 Mar 16  2011 mods-available
drwxr-xr-x  2 root root  4096 Mar 16  2011 mods-enabled
-rw-r--r--  1 root root   750 Jan  1  2011 ports.conf
drwxr-xr-x  2 root root  4096 Sep 26 15:09 sites-available
drwxr-xr-x  2 root root  4096 Sep  4  2012 sites-enabled

Nous voyons ici différents fichiers et répertoires plus ou moins importants. Nous allons les parcourir.

Tout d'abord, il faut savoir qu'avant Apache2 il y avait Apache et qu'à peu près toutes les informations de configuration étaient dans un seul et unique fichier, httpd.conf.
Cela posait quelques problèmes, car ce fichier devenait un peu un fourre-tout dans lequel il était difficile de savoir où certaines informations étaient situées et s'il n'y avait pas des informations redondantes.

Pour Apache2, ce fichier de configuration a été séparé en plusieurs parties.
Le point de départ est le fichier apache2.conf.

Ce fichier contient un certain nombre de directives importantes, ainsi que les inclusions (Includes) des autres fichiers de configuration.
Cependant, il n'y a pas de directives qui nous intéressent dans ce fichier. Si vous souhaitez vous spécialiser dans l'utilisation d'Apache et comprendre chacun des directives, la documentation officielle vous tend les bras.

Par contre, les includes en fin de fichier nous donnent une idée des parties de la configuration qui sont en dehors de apache2.conf, et qui vont pouvoir nous intéresser :

# Include module configuration:
Include mods-enabled/*.load
Include mods-enabled/*.conf

# Include all the user configurations:
Include httpd.conf

# Include ports listing
Include ports.conf

#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
# If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
Include conf.d/

# Include the virtual host configurations:
Include sites-enabled/

Nous voyons d'abord l'inclusion de modules.
En effet, Apache est un service modulaire. Cela veut dire que l'on peut lui ajouter des modules qui viennent lui ajouter des fonctionnalités particulières.
Par exemple, Apache peut jouer le rôle de proxy. Pour cela, il faut lui ajouter le module mod_proxy.

On peut ainsi ajouter toutes sortes de fonctionnalités à Apache.

Nous avons deux lignes includes pour les modules :

# Include module configuration:
Include mods-enabled/*.load
Include mods-enabled/*.conf

Ceci nous indique qu'Apache va prendre en compte les fichiers .load et .conf situés dans le répertoire mods-enabled (qui est lui-même dans /etc/apache2, puisque c'est notre répertoire de travail).

Allons donc voir ce qui est contenu dans le répertoire mods-enabled :

# ls -la
total 2
drwxr-xr-x 2 root root 1024 21 mars  19:26 .
drwxr-xr-x 7 root root 1024 21 mars  19:24 ..
lrwxrwxrwx 1 root root   28 21 mars  19:24 alias.conf -> ../mods-available/alias.conf
lrwxrwxrwx 1 root root   28 21 mars  19:24 alias.load -> ../mods-available/alias.load
lrwxrwxrwx 1 root root   33 21 mars  19:24 auth_basic.load -> ../mods-available/auth_basic.load
lrwxrwxrwx 1 root root   33 21 mars  19:24 authn_file.load -> ../mods-available/authn_file.load
lrwxrwxrwx 1 root root   36 21 mars  19:24 authz_default.load -> ../mods-available/authz_default.load
lrwxrwxrwx 1 root root   38 21 mars  19:24 authz_groupfile.load -> ../mods-available/authz_groupfile.load
lrwxrwxrwx 1 root root   33 21 mars  19:24 authz_host.load -> ../mods-available/authz_host.load
lrwxrwxrwx 1 root root   33 21 mars  19:24 authz_user.load -> ../mods-available/authz_user.load
lrwxrwxrwx 1 root root   32 21 mars  19:24 autoindex.conf -> ../mods-available/autoindex.conf
lrwxrwxrwx 1 root root   32 21 mars  19:24 autoindex.load -> ../mods-available/autoindex.load
lrwxrwxrwx 1 root root   26 21 mars  19:26 cgi.load -> ../mods-available/cgi.load
lrwxrwxrwx 1 root root   30 21 mars  19:24 deflate.conf -> ../mods-available/deflate.conf
lrwxrwxrwx 1 root root   30 21 mars  19:24 deflate.load -> ../mods-available/deflate.load
lrwxrwxrwx 1 root root   26 21 mars  19:24 dir.conf -> ../mods-available/dir.conf
lrwxrwxrwx 1 root root   26 21 mars  19:24 dir.load -> ../mods-available/dir.load
lrwxrwxrwx 1 root root   26 21 mars  19:24 env.load -> ../mods-available/env.load
lrwxrwxrwx 1 root root   27 21 mars  19:24 mime.conf -> ../mods-available/mime.conf
lrwxrwxrwx 1 root root   27 21 mars  19:24 mime.load -> ../mods-available/mime.load
lrwxrwxrwx 1 root root   34 21 mars  19:24 negotiation.conf -> ../mods-available/negotiation.conf
lrwxrwxrwx 1 root root   34 21 mars  19:24 negotiation.load -> ../mods-available/negotiation.load
lrwxrwxrwx 1 root root   27 21 mars  19:26 php5.conf -> ../mods-available/php5.conf
lrwxrwxrwx 1 root root   27 21 mars  19:26 php5.load -> ../mods-available/php5.load
lrwxrwxrwx 1 root root   33 21 mars  19:24 reqtimeout.conf -> ../mods-available/reqtimeout.conf
lrwxrwxrwx 1 root root   33 21 mars  19:24 reqtimeout.load -> ../mods-available/reqtimeout.load
lrwxrwxrwx 1 root root   31 21 mars  19:24 setenvif.conf -> ../mods-available/setenvif.conf
lrwxrwxrwx 1 root root   31 21 mars  19:24 setenvif.load -> ../mods-available/setenvif.load
lrwxrwxrwx 1 root root   29 21 mars  19:24 status.conf -> ../mods-available/status.conf
lrwxrwxrwx 1 root root   29 21 mars  19:24 status.load -> ../mods-available/status.load

Les plus avertis d'entre vous auront remarqué que tous ces fichiers ne sont que des liens vers d'autres fichiers qui sont situés dans ../mods-available/.

Pour les utilisateurs habitués de Windows, les liens sous Unix sont comme les raccourcis sous Windows.

En fait, le répertoire mods-enabled ne contient que des liens. Ces liens pointent vers les vrais fichiers qui sont contenus dans mods-available.

Nous venons de découvrir le fonctionnement modulaire d'Apache2.

  • Tous les modules sont installés dans mods-available.
  • On crée des liens vers ces fichiers dans mods-enabled.
  • Seul le répertoire mods-enabled est lu par la configuration d'Apache.

Ce mode de fonctionnement nous permettra très facilement de désactiver ou d'activer un module pour Apache2. Il suffira de créer un lien vers le module ou au contraire de l'effacer.

Vous pouvez faire cela à la main, ou utiliser la commande a2enmod.

Donc, pour installer un module, vous avez deux choix :

  • l'installer avec la commande apt-get install nom_module ;
  • récupérer les fichiers .conf et .load et les mettre dans le répertoire mods-available, puis créer des liens vers ces fichiers dans mods-enabled.

Vous savez donc maintenant installer, désactiver ou activer un module.

Nous allons passer à la suite des includes de notre fichier apache2.conf.

Include httpd.conf

Là, il s'agit simplement de conserver ce qui pouvait exister historiquement, mais ce fichier est vide par défaut.

Include ports.conf

Ce fichier va indiquer sur quel port notre serveur doit écouter. Par défaut, il s'agit du port 80, mais cela peut être modifié si vous le souhaitez (mais vous ne voudriez pas outrepasser une norme, n'est-ce pas ?)

Il y a ensuite quelques informations sur le format des logs du service et le répertoire conf.d qui peut comprendre des attributs de configuration particuliers, mais cela ne nous intéresse pas ici.

Et enfin une dernière partie très importante qui concerne les virtualhosts :

# Include the virtual host configurations:
Include sites-enabled/

Le virtualhost est une notion très importante dans Apache2. C'est ce qui nous permet de faire tourner plusieurs sites sur le même serveur Apache2. Vous pouvez avoir un serveur web qui présente plusieurs sites web, comme www.lalitte.com et www.mailforkids.net qui sont deux sites différents, mais hébergés sur le même serveur Apache2.

Nous allons donc regarder ce qui est contenu dans le répertoire sites-enabled.

# ls -la sites-enabled/
total 2
drwxr-xr-x 2 root root 4096  4 sept.  2012 .
drwxr-xr-x 7 root root 4096 22 mars  15:50 ..
lrwxrwxrwx 1 root root   26 16 mars   2011 000-default -> ../sites-available/default

Un seul fichier ici ! Enfin, un lien plus exactement, mais nous connaissons le principe maintenant, qui est le même que pour les modules avec un répertoire sites-available qui contient les fichiers et le répertoire sites-enabled qui contient les liens vers les fichiers dans sites-available.
Ce fichier est le fichier de configuration par défaut de nos virtualhosts. C'est lui qui sera utilisé par défaut pour toute requête web arrivant à notre serveur.
Regardons son contenu :

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        
        DocumentRoot /var/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride all 
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride all 
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

Nous n'avons besoin de comprendre que quelques éléments pour l'instant.

<VirtualHost *:80>

Ceci indique le début d'une directive de configuration Apache et notamment le début d'un virtualhost qui sera en écoute sur le port 80.

DocumentRoot /var/www/

Le DocumentRoot est très important. C'est ce qui va indiquer au serveur Apache2 où vont se situer les pages de notre site web. Dans notre cas, comme dans la majorité des cas, la racine de notre site web se situera dans /var/www/.
D'ailleurs, nous pouvons aller voir le contenu de ce répertoire :

# ls -la /var/www/
total 2
drwxr-xr-x  6 root root     4096 15 oct.  18:47 .
drwxr-xr-x 14 root root     4096 16 mars   2011 ..
-rw-r--r--  1 root root      517 16 mars   2011 index.html

Il ne contient qu'un fichier index.html. Allons voir son contenu :

# cat /var/www/index.html
<html>
    <body>
        <h1>It works!</h1>
        <p>This is the default web page for this server.</p>
        <p>The web server software is running but no content has been added, yet.</p>
    </body>
</html>

Cela correspond bien à ce que nous avons vu tout à l'heure sur la page web !
Nous pouvons essayer de faire une modification et de voir le résultat. Éditez le fichier index.html et mettez-y ce que vous voulez !

Utilisation des virtualhosts
Nous allons essayer de présenter deux sites différents sur notre serveur.

Mais comment Apache saura différencier ces deux sites et saura lequel présenter lors d'une requête sur le port 80 ?

En fait, il y a plusieurs façons de faire des virtualhosts, mais nous allons nous baser sur la plus répandue en utilisant des noms de domaine différents pour nos sites.

Nous allons créer les sites toto.com et tutu.com.
Ainsi, quand une requête arrivera, Apache2 pourra savoir si la demande est pour toto.com ou tutu.com.

Configuration du DNS
Dans la vraie vie, vous devez acheter un domaine pour qu'il devienne accessible sur Internet.
Dans notre cas, je ne vais pas vous faire dépenser de l'argent pour un exemple. Nous allons plutôt utiliser une petite astuce qui pourra vous être utile pour beaucoup d'autres choses.

Nous allons utiliser une fonctionnalité qui permet de court-circuiter le fonctionnement normal du DNS grâce au fichier hosts.

Le fichier hosts est un fichier présent sur tous les systèmes, qui permet d'indiquer des associations entre nom de machine et adresse IP qui seront prioritaires par rapport au DNS.

Par exemple, si j'écris:
192.168.0.1 www.google.fr

La prochaine fois que j'essaierai d'aller vers www.google.fr, ma machine pensera que le serveur de Google se trouve à l'adresse 192.168.0.1 et enverra la requête à cette adresse.

Nous allons donc modifier notre fichier hosts pour y ajouter des associations pour www.toto.com et www.tutu.com.

  • Sous Unix, le fichier hosts se trouve dans /etc.
  • Sous Windows, il se trouve dans C:\Windows\System32\drivers\etc\.

Donc sur notre Debian, nous allons éditer le fichier hosts et ajouter deux lignes en haut du fichier :
192.168.0.1 www.toto.com
192.168.0.1 www.tutu.com

Désormais, dès lors que notre machine voudra accéder à un de ces deux sites, elle accédera à... elle-même.

Configuration des virtualhosts.
Comme on l'a vu précédemment, les virtualhosts se configurent dans sites-available/.
Nous allons donc créer deux nouveaux fichiers pour nos deux virtualhosts. Pour cela, nous allons simplement copier le fichier default, et modifier le contenu des fichiers copiés.

# cd /etc/apache2/sites-available/
# cp default www.toto.com
# cp default www.tutu.com

Ensuite, nous allons simplement modifier trois choses et ajouter :

  • une directive ServerName pour indiquer le nom de notre virtualhost ;
  • le DocumentRoot qui précise où se situent nos pages ;
  • et enfin la balise Directory pour y indiquer notre nouveau chemin.
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName www.toto.com
        
        DocumentRoot /var/www/toto.com/
        <Directory />
                Options FollowSymLinks
                AllowOverride all 
        </Directory>
        <Directory /var/www/toto.com/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride all 
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

Nous faisons de même pour tutu.com.
Il nous reste encore à activer ces virtualhosts dans sites-enabled/.

# cd /etc/apache2/sites-enabled/
# ln -s ../sites-available/www.toto.com .
# ln -s ../sites-available/www.tutu.com .

Le . indique le répertoire courant. Donc ici, nous allons créer un lien dans le répertoire courant qui pointera vers le fichier toto.com. Notre lien s'appellera donc sites-enabled/toto.com.

Nos virtualhosts sont prêts, il ne nous reste plus qu'à créer les répertoires et pages de nos sites :

# mkdir /var/www/toto.com/
# touch /var/www/toto.com/index.html
# echo "

Bienvenus sur toto.com !

" > /var/www/toto.com/index.html # mkdir /var/www/tutu.com/ # touch /var/www/tutu.com/index.html # echo "

Bienvenus sur tutu.com !

" > /var/www/tutu.com/index.html

Nos virtualhosts sont maintenant effectifs.

Nous avons donc réussi à présenter deux sites différents sur un seul et même serveur Apache2.

Nous allons maintenant voir deux cas différents de configuration qui permettent de placer les pages de vos sites en dehors de /var/www/.

Un répertoire venu d'ailleurs
Imaginons que vous avez mis en place votre propre serveur web et que vous avez réalisé une page web présentant votre famille sur le nom de domaine que vous avez acheté www.mafamille.com. Votre petite sœur vient vous voir et aimerait bien mettre en place un site pour elle pour présenter ses hobbies.
Maintenant que vous savez faire des virtualhosts, vous pourriez tout à fait créer le nom de domaine petitesoeur.mafamille.com et faire un virtualhost pour ce site. Cependant, vous trouvez plus intéressant de faire un site du type www.mafamille.com/masoeur.
Ainsi, vous pourriez faire pareil pour tous les membres de la famille.

Cependant, si vous faites comme cela, vous devrez donner accès au répertoire /var/www/ à votre sœur, ce qui ne vous emballe pas trop si elle y fait des bêtises.

Il existe une solution simple. Vous pouvez tout à fait laisser un accès complet à un répertoire pour votre sœur, et faire un raccourci de ce répertoire dans /var/www/.

Essayez par exemple de créer une page web dans /home/user/ :

# touch /home/user/index.html
# echo "

La jolie page de ma sœur !

" > /home/user/index.html

Vous pouvez alors créer un lien de ce répertoire dans /var/www :

# cd /var/www/
# ln -s /home/user/ masoeur
# ls -la
total 2
drwxr-xr-x  6 root root     4096 15 oct.  18:47 .
drwxr-xr-x 14 root root     4096 16 mars   2011 ..
-rw-r--r--  1 root root      117 25 sept. 17:16 index.tutu
lrwxrwxrwx  1 root root       28 11 avril  2012 masoeur -> /home/user/
drwxr-xr-x  1 root root     4096 25 sept. 17:16 toto.com
drwxr-xr-x  1 root root     4096 25 sept. 17:16 tutu.com

Désormais, si vous allez sur le site www.mafamille.com/masoeur/ vous allez tomber sur la page de votre petite sœur ! Et ceci, sans qu'elle mette à mal toutes les pages que vous avez mis du temps à créer.

Votre site a prospéré et vous hébergez maintenant une bonne dizaine de virtualhosts, pour votre voisin, votre école, votre club de bridge, etc.
Vous avez même créé une page qui donne des statistiques sur l'utilisation générale de votre serveur Apache2 : le nombre de pages lues, le nombre de sites, etc.
Vous aimeriez maintenant que cette page puisse être accessible sur chacun des différents virtualhosts que vous possédez.

Une façon de faire serait de dupliquer la page sur chacun des virtualhosts, mais ce serait lourd et devrait être répété à chaque nouveau site créé. Il y a cependant une solution simple, grâce aux alias.

Un alias permet de faire correspondre une partie de l'URL à un chemin particulier dans l'arborescence.

Par exemple, je peux dire que si j'indique dans mon URL messtats/, qui n'est pas un répertoire dans /var/www/, le navigateur sera redirigé vers le répertoire /home/messtats/.
Ainsi, www.toto.com/messtats/ ou www.tutu.com/messtats/ pointeront vers la même page.

Les alias peuvent se configurer grâce au module alias.

Nous allons tester cela en modifiant le fichier /etc/apache2/mods-available/alias.conf pour ajouter une ligneAlias /test/ /home/user/:

<IfModule alias_module>
#
# Aliases: Add here as many aliases as you need (with no limit). The format is 
# Alias fakename realname
#
# Note that if you include a trailing / on fakename then the server will
# require it to be present in the URL.  So "/icons" isn't aliased in this
# example, only "/icons/".  If the fakename is slash-terminated, then the 
# realname must also be slash terminated, and if the fakename omits the 
# trailing slash, the realname must also omit it.
#
# We include the /icons/ alias for FancyIndexed directory listings.  If
# you do not use FancyIndexing, you may comment this out.
#
Alias /icons/ "/usr/share/apache2/icons/"
Alias /test/ /home/user/

<Directory "/usr/share/apache2/icons">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

</IfModule>

Relancez Apache2 et mettez-vous sur l'URL www.toto.com/test/.

Si tout se passe bien, vous allez vous retrouver sur la page de votre petite sœur !
Et de même pour www.tutu.com/test/ ou 192.168.01/test/.

Nous avons pu ainsi créer une page, ou un répertoire, accessible depuis n'importe lequel de nos virtualhosts.

Références

"Apprenez le fonctionnement des réseaux TCP/IP" de Eric Lalitte - Collection OpenClassrooms
apache.org - Compilation et installation
php.net - Apache 2.x sur les systèmes Unix