<!doctype linuxdoc system>

<article>

<title>
 Utilisation du module proxy d'Apache
</title>

<author>
 par Djalil Chafaï,
 <htmlurl url="mailto:dchafai@mail.dotcom.fr" name="dchafai@mail.dotcom.fr">
</author>

<date>
 Révision 1998-09-23. Toulouse.
</date>

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

<p>
Tout le monde connait le serveur ouèbe 
<htmlurl url="http://www.apache.org/" name="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 <tt>1.1</tt> d'Apache, cependant, la 
stabilité n'est venue qu'avec la version <tt>1.2</tt>.
</p>

<p>
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.
</p>

<p>
Déléguer ses requettes siginifie qu'au lieu de contacter le serveur ouèbe du
site ouèbe <it>www.site.ouebe</it> et de faire un <tt>GET /index.html</tt>,
il suffit au client ouèbe de contacter le serveur <it>proxy.votre.domaine</it> 
et de faire un <tt>GET http://www.site.ouebe/index.html</tt> 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.
</p>

<p>
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
liason 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.
</p>

<p>
Voici un petit schéma explicatif :
<code>
 -----------------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
</code>              
</p>
        
<p>
Certes les performances ne seront pas mirobolantes et les paramétrages
sont quelque peu rudimentaires (&ccedil;a n'est pas 
<htmlurl url="http://squid.nlanr.net/Squid/" name="Squid">
quand même...) mais c'est amplement suffisant pour un petit
réseau local.
</p>

<p>
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.
</p>

<p>
Je fais tourner un Apache (1.3) sur 
<it>sakapuss.linux.only</it>, ma machine 
<htmlurl url="http://www.linux.org/" name="Linux"> personnelle,
reliée à l'Internet par modem (PPP) de fa&ccedil;on intermitante.
Elle fait office de serveur de documentation et de centre d'essai pour
les modifications que j'apporte au 
<htmlurl url="http://savage.iut-blagnac.fr/" name="ouèbe du CULTe">
(via IP-aliasing pour m'amuser avec le multihosting mais c'est une autre 
histoire...).
</p>

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

<p>
L'activation du module proxy d'Apache a été très simple, voici un extrait
du fichier <tt>http.conf</tt>
<code>
# 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 
</code>
</p>

<p>
Je vous renvoie à la 
<htmlurl url="http://www.apache.org/docs/mod/mod_proxy.html"
         name="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
<tt>/var/cache/apache</tt>, doit exister et doit être au moins en <it>+w</it> 
pour le serveur ouèbe. Par exemple si le serveur tourne en <it>www-data</it>,
il est conseillé de faire (en tant qu'utilisateur root)
<code>
 chgrp www-data /var/cache/apache
 chmod g=rwxs   /var/cache/apache
</code>
</p>

<p>
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.
</p>

<p>
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
<tt>Edit/Preferences/Advanced/Proxies/Manual</tt>.
Pour Lynx,  positionner la variable d'environnement
<tt>HTTP_PROXY</tt> à <it>prox.linux.only:80</it>.
</p>

<p>
Pour une plus grande souplesse dans les redirections, on peut aussi créer un 
fichier de configuration automatique du proxy <tt>monproxy.pac</tt> 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):
<code>
    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";
    }
</code>
</p>

<p>
Il ne faut pas oublier non plus de vérifier que le fichier de 
configuration d'Apache <tt>srm.conf</tt> contient bien la ligne : 
<code>
 AddType application/x-ns-proxy-autoconfig pac 
</code>
</p>

<p>
Il ne reste plus qu'à demander à son 
<htmlurl url="http://www.mozilla.org/" name="Mozilla">
favorit de lire le fichier
<tt>http://www.linux.only/monproxy.pac</tt>
dans la section <tt>Edit/Preferences/Advanced/Proxies/Automatic</tt>
ou équivalente.
</p>

</article>


