Utilisation du module proxy d'Apache

par Djalil Chafaï, dchafai@mail.dotcom.fr
Toulouse, juillet 98.


Je présente ici très brièvement le module proxy du serveur ouèbe Apache.

Tout le monde connait le serveur ouèbe Apache, mais bien moins nombreux sont ceux qui connaissent son module proxy. Ce module transforme votre indien d'Amérique en un petit proxy HTTP 1.0 gérant un cache ouèbe. Ce module est apparu dès la version 1.1 d'Apache, cependant, la stabilité n'est venue qu'avec la version 1.2.

Ce module permet par exemple de fournir un accés ouèbe à tout un réseau local sans faire d'IP-masquerading. Il suffit que les clients ouèbe sur les machines du réseau local délèguent leur requettes HTTP au proxy et que ce dernier ait un accés à l'Internet, par modem par exemple.

Déléguer ses requettes siginifie qu'au lieu de contacter le serveur ouèbe du site ouèbe www.site.ouebe et de faire un GET /index.html, il suffit au client ouèbe de contacter le serveur proxy.votre.domaine et de faire un GET http://www.site.ouebe/index.html le proxy se chargeant du reste. Bien entendu, on peut faire en sorte que le proxy écoute sur un port TCP différent du 80, tout dépend de la configuration que l'on souhaite mettre en place.

La position privilégiée d'agent auquel on délègue les requettes ouèbe permet au proxy de mettre en place et de tenir à jour un cache disque qui profite alors à tous les navigateurs qui utilisent le proxy. C'est là son principal avantage. De plus, comme tout proxy-cache qui se respecte, notre proxy peut lui-même déléguer les requètes non résolues par son cache disque à un autre proxy-cache. Celui du fournisseur d'accès à l'Internet (F.A.I.) via notre liaison PPP est tout indiqué. On parle alors de proxy-cache père dont notre proxy-cache est le fils. C'est le système bien classique de hiérarchie de caches.

Voici un petit schéma explicatif :


 -----------------I-N-T-E-R-N-E-T------------------
                         |
                      F. A. I.   
                         |
                         | PPP
                         |
                       Proxy
                         |
            -----R-E-S-E-A-U---L-O-C-A-L------
              |              |             |
           Client 1       Client 2      Client 3

Certes les performances ne seront pas mirobolantes et les paramétrages sont quelque peu rudimentaires (ça n'est pas Squid quand même...) mais c'est amplement suffisant pour un petit réseau local.

Assez parlé de théorie, passons maintenant à la configuration elle même. Je présente ici une version simplifiée de la configuration que j'utilise chez moi.

Je fais tourner un Apache (1.3) sur sakapuss.linux.only, ma machine Linux personnelle, reliée à l'Internet par modem (PPP) de façon intermitante. Elle fait office de serveur de documentation et de centre d'essai pour les modifications que j'apporte au ouèbe du CULTe (via IP-aliasing pour m'amuser avec le multihosting mais c'est une autre histoire...).

sakapuss fait aussi office de serveur DNS pour mon réseau local fantaisiste linux.only. Les noms www.linux.only et proxy.linux.only ne sont que des CNAME du DNS pointant vers sakapuss.linux.only.

L'activation du module proxy d'Apache a été très simple, voici un extrait du fichier http.conf


# Module proxy - Apache 1.1, 1.2 recommandé 

# Chargement du module proxy - mettez le bon répertoire !
LoadModule proxy_module /usr/lib/apache/1.3/libproxy.so

# Activation du proxy
ProxyRequests on

# Les proxy peres 
ProxyRemote http://www.mygale.org/ http://www.mygale.org/
ProxyRemote * http://proxy.hol.fr:80

# Racourcis avec gestion des redirections
# ProxyPass        /mirror/cict http://www.cict.fr
# ProxyPassReverse /mirror/cict http://www.cict.fr

# Requettes interdites
# ProxyBlock www.interdits.com

# Taille du tampon réseau - Apache 1.3 seulement
# ProxyReceiveBufferSize 2048

# Pas de proxy pour le reseau local
NoProxy         .linux.only 192.168.0.0/24

# Completion des noms d'hotes non qualifiés
ProxyDomain     .linux.only

# Localisation du cache - doit etre +w pour le serveur
CacheRoot /var/cache/apache

# Taille du cache en Ko
CacheSize 50000

# Periodicite en heures de la purge
CacheGcInterval 4

# Temps de vie en heures des objets du cache
CacheMaxExpire 240

# Facteur multiplicatif pour le temps de vie
CacheLastModifiedFactor 1

# Temps de vie en heures des objets sans durée de vie explicite
CacheDefaultExpire 240

# Niveaux d'arborescence du cache 
CacheDirLevels 5

# Longeur des nom des répertoires du cache
CacheDirLength 2

# Pas de cache pour le réseau local
NoCache linux.only 

Je vous renvoie à la documentation du module proxy d'Apache pour les détails concernant chaque option. Je signale tout de même que le répertoire du cache, ici /var/cache/apache, doit exister et doit être au moins en +w pour le serveur ouèbe. Par exemple si le serveur tourne en www-data, il est conseillé de faire (en tant qu'utilisateur root)


 chgrp www-data /var/cache/apache
 chmod g=rwxs   /var/cache/apache

Il ne reste plus qu'à relancer Apache. Notre proxy est alors prêt à fonctionner sur le port du serveur ouèbe, le 80 (à moins que vous ayez changé les réglages par défaut). En fait, Apache répondra à deux types de requetes. Les requettes relatives, portant sur le ouèbe local et les requètes absolues (URL) portant sur tout l'Internet, qui seront transmises à son module proxy.

Bien entendu, pour profiter du proxy, les navigateurs devront être mis au courant de son existence. Pour Communicator par exemple, il suffit de modifier la section Edit/Preferences/Advanced/Proxies/Manual. Pour Lynx, positionner la variable d'environnement HTTP_PROXY à prox.linux.only:80.

Pour une plus grande souplesse dans les redirections, on peut aussi créer un fichier de configuration automatique du proxy monproxy.pac que l'on mettra par exemple dans la racine de notre serveur ouèbe. Voici un petit exemple de ce que peut contenir ce fichier (javascript):


    function FindProxyForURL(url, host)
    {
       if (isInNet(host, "127.0.0.0", "255.0.0.0") ||
           isInNet(host, "192.168.0.0", "255.255.255.0") ||
           shExpMatch(url, "*/cgi-bin/*") ||
           shExpMatch(url, "*.pl") ||
           shExpMatch(url, "*.py") ||           
           shExpMatch(url, "*.cgi") ||
           shExpMatch(url, "*.asp") ||
           url.substring(0, 7) == "gopher:" ||
           url.substring(0, 4) == "ftp:" ||
           url.substring(0, 5) == "news:")
         return "DIRECT";
       else
         return "PROXY proxy.linux.only:80; DIRECT";
    }

Il ne faut pas oublier non plus de vérifier que le fichier de configuration d'Apache srm.conf contient bien la ligne :


 AddType application/x-ns-proxy-autoconfig pac 

Il ne reste plus qu'à demander à son Mozilla favorit de lire le fichier http://www.linux.only/monproxy.pac dans la section Edit/Preferences/Advanced/Proxies/Automatic ou équivalente.