]> granicus.if.org Git - apache/blob - docs/manual/caching.xml.fr
Rebuild.
[apache] / docs / manual / caching.xml.fr
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE manualpage SYSTEM "style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="style/manual.fr.xsl"?>
4 <!-- French translation : Lucien GENTIS -->
5 <!-- Reviewed by : Vincent Deffontaines -->
6 <!-- English Revision: 1766103 -->
7
8 <!--
9  Licensed to the Apache Software Foundation (ASF) under one or more
10  contributor license agreements.  See the NOTICE file distributed with
11  this work for additional information regarding copyright ownership.
12  The ASF licenses this file to You under the Apache License, Version 2.0
13  (the "License"); you may not use this file except in compliance with
14  the License.  You may obtain a copy of the License at
15
16      http://www.apache.org/licenses/LICENSE-2.0
17
18  Unless required by applicable law or agreed to in writing, software
19  distributed under the License is distributed on an "AS IS" BASIS,
20  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  See the License for the specific language governing permissions and
22  limitations under the License.
23 -->
24
25 <manualpage metafile="caching.xml.meta">
26
27   <title>Guide de la mise en cache</title>
28
29   <summary>
30     <p>Ce document complète la documentation de référence des modules
31     <module>mod_cache</module>, <module>mod_cache_disk</module>,
32     <module>mod_file_cache</module> et du programme <a
33     href="programs/htcacheclean.html">htcacheclean</a>.
34     Il décrit l'utilisation des fonctionnalités de mise en
35     cache du serveur HTTP Apache
36     pour accélérer les services web et proxy, tout en évitant les problèmes
37     courants et les erreurs de configuration.</p>
38   </summary>
39
40   <section id="introduction">
41     <title>Introduction</title>
42
43     <p>Le serveur HTTP Apache offre tout un ensemble de fonctionnalités
44     de mise en cache qui ont été conçues pour améliorer les performances
45     du serveur de différentes manières.</p>
46
47     <dl>
48         <dt>Mise en cache HTTP à trois états RFC2616</dt>
49         <dd><module>mod_cache</module> et son module de fournisseur
50         <module>mod_cache_disk</module> proposent une mise en cache
51         intelligente de niveau HTTP. Le contenu proprement dit est
52         stocké dans le cache, et mod_cache vise à respecter tous les
53         en-têtes HTTP, ainsi que les options qui contrôlent la mise en
54         cache du contenu comme décrit dans la <a
55         href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html">Section
56         13 de la RFC2616</a>. <module>mod_cache</module> peut gérer des
57         configurations de mise en cache simples, mais aussi complexes
58         comme dans les cas où vous avez à faire à des contenus mandatés,
59         à des contenus locaux dynamiques, ou lorsque vous avez besoin
60         d'accélérer l'accès aux fichiers locaux situés sur disque
61         supposé lent.
62         </dd>
63
64         <dt>Mise en cache d'objets partagés de forme clé/valeur à deux
65         états</dt>
66         <dd>
67             L'<a href="socache.html">API du cache d'objets partagés</a> (socache)
68             et ses modules de fournisseurs
69             proposent une mise en cache d'objets partagés à base de
70             couples clé/valeur de niveau serveur. Ces modules sont
71             conçus pour la mise en cache de données de bas niveau comme
72             les sessions SSL et les données d'authentification. les
73             serveurs d'arrière-plan permettent le stockage des données
74             au niveau serveur en mémoire partagée, ou au niveau
75             datacenter dans un cache comme memcache ou distcache.
76         </dd>
77
78         <dt>Mise en cache de fichiers spécialisée</dt>
79         <dd>
80             <module>mod_file_cache</module> offre la possibilité de
81             précharger des fichiers en mémoire au démarrage du serveur,
82             et peut améliorer les temps d'accès et sauvegarder les
83             gestionnaires de fichiers pour les fichiers qui font l'objet
84             d'accès fréquents, évitant ainsi d'avoir à accéder au disque
85             à chaque requête.
86         </dd>
87     </dl>
88
89     <p>Pour tirer parti efficacement de ce document, les bases de HTTP doivent
90     vous être familières, et vous devez avoir lu les sections
91     <a href="urlmapping.html">Mise en correspondance des
92     URLs avec le système de fichiers</a> et
93     <a href="content-negotiation.html">Négociation sur le contenu</a>
94     du guide de l'utilisateur.</p>
95
96   </section>
97
98   <section id="http-caching">
99
100     <title>Mise en cache HTTP à trois états RFC2616</title>
101
102     <related>
103       <modulelist>
104         <module>mod_cache</module>
105         <module>mod_cache_disk</module>
106       </modulelist>
107       <directivelist>
108         <directive module="mod_cache">CacheEnable</directive>
109         <directive module="mod_cache">CacheDisable</directive>
110         <directive module="core">UseCanonicalName</directive>
111         <directive module="mod_negotiation">CacheNegotiatedDocs</directive>
112       </directivelist>
113     </related>
114
115     <p>Le module <module>mod_cache</module> permet de tirer avantage du
116     mécanisme de mise en cache en ligne faisant partie
117     intégrante du protocole HTTP, et décrit dans la <a
118     href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html">section
119     13 de la RFC2616</a>.</p>
120
121     <p>A la différence d'un cache simple clé/valeur à deux états où le
122     contenu est supprimé lorsqu'il est périmé, un cache HTTP comporte un
123     mécanisme permettant de conserver temporairement un contenu périmé,
124     de demander au serveur original si ce contenu périmé a été modifié,
125     et dans le cas contraire de le rendre à nouveau valide.</p>
126
127     <p>Une entrée d'un cache HTTP peut se présenter sous un de ces trois
128     états :</p>
129
130     <dl>
131     <dt>Frais</dt>
132     <dd>
133         Si un contenu est suffisamment récent (plus jeune que sa
134         <strong>durée de fraîcheur</strong>), il est considéré comme
135         <strong>frais</strong>. Un cache HTTP peut servir un contenu
136         frais sans avoir à demander quoi que ce soit au serveur
137         d'origine.
138     </dd>
139     <dt>Périmé</dt>
140     <dd>
141         <p>Si le contenu est trop ancien (plus vieux que sa
142         <strong>durée de fraîcheur</strong>), il est considéré comme
143         <strong>périmé</strong>. Un cache HTTP doit contacter le serveur
144         original pour vérifier si le contenu, même s'il est périmé, est
145         encore à jour avant de le servir au client. Soit le serveur
146         original va répondre en envoyant un contenu de remplacement si
147         le contenu périmé n'est plus à jour, soit dans le cas idéal il
148         renverra un code pour signaler au cache que le contenu est
149         encore à jour, et qu'il est inutile de le générer ou de
150         l'envoyer à nouveau. Le contenu repasse à l'état "frais" et le
151         cycle continue.</p>
152
153         <p>Le protocole HTTP permet au cache de servir des données
154         périmées dans certaines circonstances, comme lorsqu'une
155         tentative de rafraîchir une entrée depuis un serveur original
156         se solde par un échec avec un code d'erreur 5xx, ou lorsqu'une
157         autre requête est déjà en train d'essayer de rafraîchir la même
158         entrée. Dans ces cas, un en-tête <code>Warning</code> est ajouté
159         à la réponse.</p>
160     </dd>
161     <dt>Non Existent</dt>
162     <dd>
163         Si le cache est plein, il se réserve la possibilité de supprimer
164         des entrées pour faire de la place. Une entrée peut être
165         supprimée à tout moment, qu'elle soit fraîche ou périmée.
166         L'outil <a href="programs/htcacheclean.html">htcacheclean</a>
167         peut être utilisé à la demande, ou lancé en tant que démon afin
168         de conserver la taille du cache ou le nombre d'inodes en deçà de
169         valeurs spécifiées. Cet outil essaie cependant de
170         supprimer les entrées périmées avant les entrées fraîches.
171     </dd>
172     </dl>
173
174     <p>Le fonctionnement détaillé d'un cache HTTP est décrit dans la <a
175     href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html">Section
176     13 de la RFC2616</a>.</p>
177
178     <section>
179       <title>Interaction avec le serveur</title>
180
181       <p>Le module <module>mod_cache</module> interagit avec le serveur
182       à deux niveaux possibles en fonction de la directive <directive
183       module="mod_cache">CacheQuickHandler</directive> :
184       </p>
185
186       <dl>
187         <dt>Phase du gestionnaire rapide</dt>
188         <dd>
189           <p>Cette phase se déroule très tôt au cours du traitement de
190           la requête, juste après l'interprétation de cette dernière. Si
191           le contenu se trouve dans le cache, il est servi immédiatement
192           et pratiquement tout le reste du traitement de la requête est
193           court-circuité.</p>
194
195               <p>Dans ce scénario, le cache se comporte comme s'il avait
196               été "boulonné" à l'entrée du serveur.</p>
197               
198               <p>Ce mode possède les meilleures performances car la
199               majorité des traitements au niveau du serveur sont
200               court-circuités. Cependant, il court-circuite aussi les
201               phases d'authentification et d'autorisation du traitement
202               au niveau du serveur, et il doit donc être utilisé avec
203               prudence lorsque que ces phases sont importantes.</p>
204
205               <p>Les requêtes contenant un en-tête "Authorization"
206               header (par exemple dans le cas de l'authentification HTTP
207               basique) ne peuvent ni être mises en cache, ni servies
208               depuis le cache lorsque <module>mod_cache</module>
209               s'exécute dans cette phase.</p>
210           </dd>
211           <dt>Phase du gestionnaire normal</dt>
212           <dd>
213               <p>Cette phase se déroule très tard au cours du traitement
214               de la requête, en fait après toutes les phases de ce
215               traitement.</p>
216
217               <p>Dans ce scénario, le cache se comporte comme s'il avait
218               été "boulonné" à la sortie du serveur.</p>
219
220               <p>Ce mode offre la plus grande souplesse, car il permet
221               de faire intervenir la mise en cache en un point
222               précisément spécifié de la chaîne de filtrage, et le
223               contenu issu du cache peut être filtré ou personnalisé
224               avant d'être servi au client.</p>
225           </dd>
226         </dl>
227
228         <p>Si l'URL ne se trouve pas dans le cache,
229         <module>mod_cache</module> ajoutera un <a
230         href="filter.html">filtre</a> à la chaîne de filtrage afin
231         d'enregistrer la réponse dans le cache, puis passera la main
232         pour permettre le déroulement normal de la suite du traitement
233         de la requête. Si la mise en cache du contenu est autorisée, il
234         sera enregistré dans le cache pour pouvoir être servi à nouveau
235         ; dans le cas contraire, le contenu sera ignoré.</p>
236
237         <p>Si le contenu trouvé dans le cache est périmé, le module
238         <module>mod_cache</module> convertit la requête en
239         <strong>requête conditionnelle</strong>. Si le serveur original
240         renvoie une réponse normale, elle est enregistrée dans le cache
241         en lieu et place du contenu périmé. Si le serveur original
242         renvoie une réponse "304 Not Modified", le contenu repasse à
243         l'état "frais" et est servi par le filtre au lieu d'être
244         sauvegardé.</p>
245     </section>
246
247     <section>
248       <title>Amélioration du taux de présence dans le cache</title>
249
250       <p>Lorsqu'un serveur virtuel est connu sous la forme d'un des
251       nombreux alias du serveur, la définition de la directive
252       <directive module="core">UseCanonicalName</directive> à
253       <code>On</code> peut augmenter de manière significative le nombre
254       de correspondances positives dans le cache. Ceci est du au fait
255       que la clé du cache contient le nom d'hôte du serveur virtuel.     
256       Avec <directive module="core">UseCanonicalName</directive> positionnée
257       à <code>On</code>,
258       les hôtes virtuels possédant plusieurs noms de serveur ou alias ne
259       généreront pas d'entités de cache différentes, et le contenu sera mis en
260       cache en faisant référence au nom d'hôte canonique.</p>
261
262     </section>
263
264     <section>
265       <title>Durée de fraîcheur</title>
266
267        <p>Un contenu bien formé destiné à être mis en cache doit déclarer
268        explicitement une durée de fraîcheur via les champs
269        <code>max-age</code> ou <code>s-maxage</code> de l'en-tête
270        <code>Cache-Control</code>, ou en incluant un en-tête
271        <code>Expires</code>.</p>
272       
273       <p>De plus, un client peut passer outre la durée de fraîcheur
274       définie pour le serveur original en ajoutant son propre en-tête
275       <code>Cache-Control</code> à la requête. Dans ce cas, c'est la
276       durée de fraîcheur la plus basse entre la requête et la réponse
277       qui l'emporte.</p>
278
279       <p>Lorsque cette durée de fraîcheur est absente de la requête ou
280       de la réponse, une durée de fraîcheur par défaut s'applique. La
281       durée de fraîcheur par défaut des entrées du cache est d'une heure
282       ; elle peut cependant être facilement modifiée à l'aide de
283       la directive <directive
284       module="mod_cache">CacheDefaultExpire</directive>.</p>
285
286       <p>Si une réponse ne contient pas d'en-tête <code>Expires</code> mais
287       inclut un en-tête <code>Last-Modified</code>, <module>mod_cache</module>
288       peut déduire une durée de fraîcheur en se basant sur une
289       heuristique, qui peut être contrôlée via la directive <directive
290       module="mod_cache">CacheLastModifiedFactor</directive>.</p>
291
292       <p>Pour les contenus locaux, ou les contenus distants qui ne
293       spécifient pas leur propre en-tête <code>Expires</code>,
294       <module>mod_expires</module> permet de régler finement la durée de
295       fraîcheur via les paramètres <code>max-age</code> et
296       <code>Expires</code>.</p>
297
298       <p>On peut aussi contrôler la durée de fraîcheur maximale en utilisant
299       la directive <directive module="mod_cache">CacheMaxExpire</directive>.</p>
300
301     </section>
302
303     <section>
304       <title>Guide succinct des requêtes conditionnelles</title>
305
306      <p>Lorsqu'un contenu du cache est périmé, httpd modifie la requête
307      pour en faire une requête conditionnelle</p>
308
309       <p>Lorsque la réponse originale du cache contient un en-tête
310       <code>ETag</code>, <module>mod_cache</module> ajoute un en-tête
311       <code>If-None-Match</code> à la requête envoyée au serveur
312       d'origine. Lorsque la réponse originale du cache contient un en-tête
313       <code>Last-Modified</code>, <module>mod_cache</module> ajoute un en-tête
314       <code>If-Modified-Since</code> à la requête envoyée au serveur
315       d'origine. Dans ces deux cas, la requête devient une requête
316       <strong>conditionnelle</strong>.</p>
317
318       <p>Lorsqu'un serveur d'origine reçoit une requête conditionnelle,
319       il vérifie si le paramètre Etag ou Last-Modified a été modifié en
320       fonction des paramètres de la requête. Si ce n'est pas le cas, il
321       répondra avec le message lapidaire "304 Not Modified". Ceci
322       informe le cache que le contenu est périmé mais encore à jour, et
323       peut être utilisé tel quel pour les prochaines requêtes jusqu'à ce
324       qu'il atteigne à nouveau sa date de péremption.</p>
325
326       <p>Si le contenu a été modifié, il est servi comme s'il s'agissait
327       d'une requête normale et non conditionnelle.</p>
328
329       <p>Les requêtes conditionnelles offrent deux avantages. D'une
330       part, il est facile de déterminer si le contenu du serveur
331       d'origine correspond à celui situé
332       dans le cache, et ainsi d'économiser la consommation de ressources
333       nécessaire au transfert du contenu dans son ensemble.</p>
334
335       <p>D'autre part, un serveur d'origine bien conçu sera configuré de
336       telle manière que les requêtes conditionnelles nécessitent pour
337       leur production bien moins de ressources qu'une réponse complète.
338       Dans le cas des fichiers statiques, il suffit en général d'un
339       appel système de type <code>stat()</code> ou similaire pour
340       déterminer si la taille ou la date de modification du fichier a
341       été modifiée. Ainsi, même un contenu local pourra être servi plus
342       rapidement depuis le cache s'il n'a pas été modifié.</p>
343       
344       <p>Il serait souhaitable que tous les serveurs d'origine
345       supportent les requêtes conditionnelles, car dans le cas
346       contraire, ils répondent comme s'il s'agissait d'une requête
347       normale, et le cache répond comme si le contenu avait été
348       modifié et enregistre ce dernier. Le cache se comporte alors
349       comme un simple cache à deux état, où le contenu est servi s'il
350       est à jour, ou supprimé dans le cas contraire.</p>
351     </section>
352
353     <section>
354       <title>Que peut-on mettre en cache ?</title>
355
356       <p>La liste complète des conditions nécessaires pour qu'une
357       réponse puisse être enregistrée dans un cache HTTP est fournie
358       dans la <a
359       href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.4">section
360       13.4 Response Cacheability de la RFC2616</a>, et peut se résumer
361       ainsi :</p>
362
363       <ol>
364         <li>La mise en cache doit être activée pour cette URL. Voir les
365         directives <directive
366         module="mod_cache">CacheEnable</directive> et <directive
367         module="mod_cache">CacheDisable</directive>.</li>
368
369         <li>La reponse doit avoir un code de statut HTTP de 200, 203, 300, 301
370         ou 410.</li>
371
372         <li>La requête doit être de type HTTP GET.</li>
373
374         <li>Si la réponse contient un en-tête "Authorization:", elle doit aussi
375         contenir une option "s-maxage", "must-revalidate" ou "public"
376         dans l'en-tête "Cache-Control:".</li>
377
378         <li>Si l'URL contient une chaîne de requête
379         (provenant par exemple d'une méthode GET de formulaire HTML), elle ne
380         sera pas mise en cache, à moins que la réponse ne
381         spécifie explicitement un délai d'expiration via un
382         en-tête "Expires:" ou une directive max-age ou s-maxage de
383         l'en-tête "Cache-Control:" comme indiqué dans les
384         sections 13.2.1. et 13.9 de la RFC2616.</li>
385
386         <li>Si la réponse a un statut de 200 (OK), elle doit aussi contenir
387         au moins un des en-têtes "Etag", "Last-Modified" ou
388         "Expires", ou une directive max-age ou s-maxage de
389         l'en-tête "Cache-Control:", à moins que la directive
390         <directive module="mod_cache">CacheIgnoreNoLastMod</directive>
391         ne précise d'autres contraintes.</li>
392
393         <li>Si la réponse contient l'option "private" dans un en-tête
394         "Cache-Control:", elle ne sera pas mise en cache à moins que la
395         directive
396         <directive module="mod_cache">CacheStorePrivate</directive>
397         ne précise d'autres contraintes.</li>
398
399         <li>De même, si la réponse contient l'option "no-store" dans un en-tête
400         "Cache-Control:", elle ne sera pas mise en cache à moins que la
401         directive
402         <directive module="mod_cache">CacheStoreNoStore</directive>
403         n'ait été utilisée.</li>
404
405         <li>Une réponse ne sera pas mise en cache si elle comporte un en-tête
406         "Vary:" contenant le caractère "*" qui correspond à toute
407         chaîne de caractères.</li>
408       </ol>
409     </section>
410
411     <section>
412       <title>Qu'est ce qui ne doit pas être mis en cache ?</title>
413
414       <p>Le client qui crée la requête ou le serveur d'origine qui
415       génère la réponse doit être à même de déterminer si le contenu
416       doit pouvoir être mis en cache ou non en définissant correctement
417       l'en-tête <code>Cache-Control</code>, et
418       <module>mod_cache</module> sera alors en mesure de satisfaire les
419       souhaits du client ou du serveur de manière appropriée.
420       </p>
421
422       <p>Les contenus qui varient au cours du temps, ou en fonction de
423       particularités de la requête non prises en compte par la
424       négociation HTTP ne doivent pas être mis en cache. Ce type de
425       contenu doit se déclarer lui-même "à ne pas mettre en cache" via
426       l'en-tête <code>Cache-Control</code>.</p>
427       
428       <p>Si le contenu change souvent, suite par exemple à une durée de
429       fraîcheur de l'ordre de la minute ou de la seconde, il peut tout
430       de même être mis en cache, mais il est alors fortement souhaitable
431       que le serveur d'origine supporte correctement les
432       <strong>requêtes conditionnelles</strong> afin que des réponses
433       complètes ne soient pas systématiquement générées.</p>
434
435       <p>Un contenu qui varie en fonction d'en-têtes de requête fournis
436       par le client peut être mis en cache, sous réserve d'une
437       utilisation appropriée de l'en-tête de réponse <code>Vary</code>.</p>
438     </section>
439
440     <section>
441       <title>Contenu variable et/ou négocié</title>
442
443       <p>Lorsque le serveur d'origine est configuré pour servir des
444       contenus différents en fonction de la valeur de certains en-têtes
445       de la requête, par exemple pour servir une ressource en plusieurs
446       langages à partir d'une seule URL, le mécanisme de mise en cache
447       d'HTTP permet de mettre en cache plusieurs variantes de la même
448       page à partir d'une seule URL.</p>
449       
450       <p>Pour y parvenir, le serveur d'origine ajoute un en-tête
451       <code>Vary</code> pour indiquer quels en-têtes doivent être pris
452       en compte par un cache pour déterminer si deux variantes sont
453       différentes l'une de l'autre.</p>
454
455       <p>Si par exemple, une réponse est reçue avec l'en-tête Vary suivant,</p>
456
457       <example>
458 Vary: negotiate,accept-language,accept-charset
459       </example>
460
461       <p><module>mod_cache</module> ne servira aux demandeurs que le contenu
462       mis en cache qui correspond au contenu des en-têtes accept-language et
463       accept-charset de la requête originale.</p>
464
465       <p>Plusieurs variantes d'un contenu peuvent être mises en cache
466       simultanément ; <module>mod_cache</module> utilise l'en-tête
467       <code>Vary</code> et les valeurs correspondantes des en-têtes de
468       la requête spécifiés dans ce dernier pour
469       déterminer quelle variante doit être servie au client.</p>
470           
471     </section>
472
473   </section>
474
475   <section id="examples">
476
477     <title>Exemples de configuration du cache</title>
478
479     <related>
480       <modulelist>
481         <module>mod_cache</module>
482         <module>mod_cache_disk</module>
483         <module>mod_cache_socache</module>
484         <module>mod_socache_memcache</module>
485       </modulelist>
486       <directivelist>
487         <directive module="mod_cache">CacheEnable</directive>
488         <directive module="mod_cache_disk">CacheRoot</directive>
489         <directive module="mod_cache_disk">CacheDirLevels</directive>
490         <directive module="mod_cache_disk">CacheDirLength</directive>
491         <directive module="mod_cache_socache">CacheSocache</directive>
492       </directivelist>
493     </related>
494
495     <section id="disk">
496       <title>Mise en cache sur disque</title>
497
498       <p>Le module <module>mod_cache</module> s'appuie sur des
499       implémentations de stockage en arrière-plan spécifiques pour gérer
500       le cache ; à ce titre, <module>mod_cache_disk</module> fournit le
501       support de la mise en cache sur disque.</p>
502
503       <p>En général, le module se configure comme suit :</p>
504
505       <highlight language="config">
506 CacheRoot   "/var/cache/apache/"
507 CacheEnable disk /
508 CacheDirLevels 2
509 CacheDirLength 1
510     </highlight>
511
512     <p>Il est important de savoir que, les fichiers mis en cache étant stockés
513     localement, la mise en cache par l'intermédiaire du système d'exploitation
514     sera en général aussi appliquée à leurs accès. Si bien que même si les
515     fichiers sont stockés sur disque, s'il font l'objet d'accès fréquents,
516     il est probable que le système d'exploitation s'appliquera à ce qu'ils
517     soient servis à partir de la mémoire.</p>
518
519     </section>
520
521     <section>
522       <title>Comprendre le stockage dans le cache</title>
523
524       <p>Pour stocker des entités dans le cache,
525       le module <module>mod_cache_disk</module> crée une empreinte (hash) de 22
526       caractères de l'URL qui a fait l'objet d'une requête. Cette empreinte
527       comprend le nom d'hôte, le protocole, le port, le chemin et tout argument
528       de type CGI associé à l'URL, ainsi que les éléments
529       spécifiés dans l'en-tête Vary afin d'être sur que plusieurs URLs
530       n'interfèrent pas entre elles.</p>
531
532       <p>Chaque position de l'empreinte peut contenir un caractère
533       choisi parmi 64 caractères différents, il y a donc
534       64^22 possibilités pour une empreinte. Par exemple, une URL peut posséder
535       l'empreinte <code>xyTGxSMO2b68mBCykqkp1w</code>. Cette empreinte est
536       utilisée pour préfixer les noms de fichiers spécifiques à cette URL à
537       l'intérieur du cache; cependant, elle est tout d'abord placée dans les
538       répertoires du cache selon les directives
539       <directive module="mod_cache_disk">CacheDirLevels</directive> et
540       <directive module="mod_cache_disk">CacheDirLength</directive>.</p>
541
542       <p>La directive
543       <directive module="mod_cache_disk">CacheDirLevels</directive>
544       définit le nombre de niveaux de sous-répertoires, et
545       <directive module="mod_cache_disk">CacheDirLength</directive>
546       le nombre de caractères composant le nom des sous-répertoires. Dans
547       l'exemple donné plus haut, l'empreinte se trouvera à :
548       <code>/var/cache/apache/x/y/TGxSMO2b68mBCykqkp1w</code>.</p>
549
550       <p>Cette technique a pour but principal de réduire le nombre de
551       sous-répertoires ou de fichiers contenus dans un répertoire particulier,
552       car le fonctionnement de la plupart des systèmes de fichiers est ralenti
553       quand ce nombre augmente. Avec la valeur "1" pour la directive
554       <directive module="mod_cache_disk">CacheDirLength</directive>,
555       il peut y avoir au plus 64 sous-répertoires à un niveau quelconque.
556       Avec la valeur "2", il peut y en avoir 64 * 64, etc...
557       A moins d'avoir une bonne raison pour ne pas le faire, l'utilisation de
558       la valeur "1" pour la directive
559       <directive module="mod_cache_disk">CacheDirLength</directive>
560       est recommandée.</p>
561
562       <p>Le paramétrage de la directive
563       <directive module="mod_cache_disk">CacheDirLevels</directive>
564       dépend du nombre de fichiers que vous pensez stocker dans le cache.
565       Avec une valeur de "2" comme dans l'exemple donné plus haut,
566       4096 sous-répertoires peuvent être créés au total. Avec 1 million de
567       fichiers dans le cache, cela équivaut à environ 245 URLs mises en cache
568       dans chaque répertoire.</p>
569
570       <p>Chaque URL nécessite au moins deux fichiers dans le cache. Ce sont en
571       général un fichier ".header", qui contient des meta-informations à propos
572       de l'URL, comme la date de son arrivée à expiration,
573       et un fichier ".data" qui est la copie exacte du contenu à servir.</p>
574
575       <p>Dans le cas d'un contenu négocié via l'en-tête "Vary", un répertoire
576       ".vary" sera créé pour l'URL en question. Ce répertoire contiendra de
577       multiples fichiers ".data" correspondant aux différents contenus
578       négociés.</p>
579     </section>
580
581     <section>
582       <title>Maintenance du cache sur disque</title>
583
584       <p>Le module <module>mod_cache_disk</module> n'effectue aucune
585       régulation de l'espace disque utilisé par le cache, mais s'il
586       s'arrête en douceur en cas d'erreur disque et se comporte alors
587       comme si le cache n'avait jamais existé.</p>
588
589       <p>Par contre l'utilitaire
590       <a href="programs/htcacheclean.html">htcacheclean</a> fourni avec
591       httpd
592       vous permet de nettoyer le cache périodiquement.
593       Déterminer la fréquence à laquelle lancer <a
594       href="programs/htcacheclean.html">htcacheclean</a> et la taille souhaitée
595       pour le cache est une tâche relativement complexe et il vous faudra de
596       nombreux essais et erreurs pour arriver à sélectionner des valeurs
597       optimales.</p>
598
599       <p><a href="programs/htcacheclean.html">htcacheclean</a> opère selon deux
600       modes. Il peut s'exécuter comme démon résident, ou être lancé
601       périodiquement par cron. <a
602       href="programs/htcacheclean.html">htcacheclean</a> peut mettre une heure
603       ou plus pour traiter de très grands caches (plusieurs dizaines de
604       Gigaoctets) et si vous l'exécutez à partir de cron, il vous est
605       conseillé de déterminer la durée typique d'un traitement, afin d'éviter
606       d'exécuter plusieurs instances à la fois.</p>
607
608       <p>Il est aussi conseillé d'attribuer un niveau de priorité "nice"
609       approprié à htcacheclean de façon à ce qu'il n'effectue pas trop
610       d'accès disque pendant le fonctionnement du serveur.</p>
611
612       <p class="figure">
613       <img src="images/caching_fig1.gif" alt="" width="600"
614           height="406" /><br />
615       <a id="figure1" name="figure1"><dfn>Figure 1</dfn></a>: Croissance
616       typique du cache / séquence de nettoyage.</p>
617
618       <p>Comme <module>mod_cache_disk</module> ne tient pas compte de l'espace
619       utilisé dans le cache, vous devez vous assurer que
620       <a href="programs/htcacheclean.html">htcacheclean</a> est configuré de
621       façon à laisser suffisamment d'"espace de croissance"
622       à la suite d'un nettoyage.</p>
623     </section>
624
625     <section id="memcache">
626       <title>Cache en mémoire</title>
627
628       <p>En utilisant le module <module>mod_cache_socache</module>,
629       <module>mod_cache</module> peut mettre en cache des données à partir de
630       diverses implémentations aussi nommées "fournisseurs". Par exemple, en
631       utilisant le module <module>mod_socache_memcache</module>, on peut
632       spécifier que c'est <a href="http://memcached.org">memcached</a> qui doit
633       être utilisé comme mécanisme de stockage sous-jacent.</p>
634
635       <p>Typiquement, le module sera configuré comme suit :</p>
636
637       <highlight language="config">
638 CacheEnable socache /
639 CacheSocache memcache:memcd.example.com:11211
640       </highlight>
641
642       <p>En outre, il est possible de spécifier plusieurs serveurs
643       <code>memcached</code> en les ajoutant à la fin de la ligne
644       <code>CacheSocache memcache:</code> et en les séparant par des virgules :</p>
645
646       <highlight language="config">
647 CacheEnable socache /
648 CacheSocache memcache:mem1.example.com:11211,mem2.example.com:11212
649       </highlight>
650
651       <p>Divers autres fournisseurs <module>mod_cache_socache</module> utilisent
652       aussi ce format. Par exemple :</p>
653
654       <highlight language="config">
655 CacheEnable socache /
656 CacheSocache shmcb:/path/to/datafile(512000)
657       </highlight>
658
659       <highlight language="config">
660 CacheEnable socache /
661 CacheSocache dbm:/path/to/datafile
662       </highlight>
663
664     </section>
665
666   </section>
667
668   <section id="socache-caching">
669
670     <title>Mise en cache générale d'objets partagés à deux états de forme
671     clé/valeur</title>
672
673     <related>
674       <modulelist>
675         <module>mod_authn_socache</module>
676         <module>mod_socache_dbm</module>
677         <module>mod_socache_dc</module>
678         <module>mod_socache_memcache</module>
679         <module>mod_socache_shmcb</module>
680         <module>mod_ssl</module>
681       </modulelist>
682         <directivelist>
683           <directive module="mod_authn_socache">AuthnCacheSOCache</directive>
684           <directive module="mod_ssl">SSLSessionCache</directive>
685           <directive module="mod_ssl">SSLStaplingCache</directive>
686         </directivelist>
687     </related>
688     
689     <p>Le serveur HTTP Apache fournit un cache d'objets partagés de bas
690     niveau pour la mise en cache d'informations comme les sessions SSL
691     ou les données d'authentification dans l'interface <a
692     href="socache.html">socache</a>.</p>
693
694     <p>Pour chaque implémentation un module supplémentaire est fourni
695     qui offre les services d'arrière-plan suivants :</p>
696
697     <dl>
698     <dt><module>mod_socache_dbm</module></dt>
699     <dd>Cache d'objets partagés basé sur DBM.</dd>
700     <dt><module>mod_socache_dc</module></dt>
701     <dd>Cache d'objets partagés basé sur Distcache.</dd>
702     <dt><module>mod_socache_memcache</module></dt>
703     <dd>Cache d'objets partagés basé sur Memcache.</dd>
704     <dt><module>mod_socache_shmcb</module></dt>
705     <dd>Cache d'objets partagés basé sur la mémoire partagée.</dd>
706     </dl>
707
708     <section id="mod_authn_socache-caching">
709       <title>Mise en cache des données d'authentification</title>
710
711       <related>
712         <modulelist>
713           <module>mod_authn_socache</module>
714         </modulelist>
715         <directivelist>
716           <directive module="mod_authn_socache">AuthnCacheSOCache</directive>
717         </directivelist>
718       </related>
719
720       <p>Le module <module>mod_authn_socache</module> permet la mise en
721       cache des données issues d'une authentification, diminuant ainsi
722       la charge des serveurs d'authentification en arrière-plan.</p>
723
724     </section>
725
726     <section id="mod_ssl-caching">
727       <title>Mise en cache des sessions SSL</title>
728
729       <related>
730         <modulelist>
731           <module>mod_ssl</module>
732         </modulelist>
733         <directivelist>
734           <directive module="mod_ssl">SSLSessionCache</directive>
735           <directive module="mod_ssl">SSLStaplingCache</directive>
736         </directivelist>
737       </related>
738
739       <p>Le module <module>mod_ssl</module> utilise l'interface
740       <code>socache</code> pour fournir un cache de session et un cache
741       de base.</p>
742
743     </section>
744
745   </section>
746
747   <section id="file-caching">
748
749     <title>Mise en cache à base de fichiers spécialisés</title>
750
751     <related>
752       <modulelist>
753         <module>mod_file_cache</module>
754       </modulelist>
755       <directivelist>
756         <directive module="mod_file_cache">CacheFile</directive>
757         <directive module="mod_file_cache">MMapFile</directive>
758       </directivelist>
759     </related>
760
761     <p>Sur les plateformes où le système de fichiers peut être lent, ou
762     lorsque les descripteurs de fichiers sont gourmands en ressources,
763     il est possible de précharger des fichiers en mémoire au démarrage
764     du serveur.</p>
765
766     <p>Sur les systèmes où l'ouverture des fichiers est lente, il est
767     possible d'ouvrir le fichier au démarrage du serveur et de mettre en
768     cache le descripteur de fichier. Ces options peuvent vous aider sur
769     les systèmes où l'accès aux fichiers statiques est lent.</p>
770
771     <section id="filehandle">
772       <title>Mise en cache des descripteurs de fichier</title>
773
774       <p>Le processus d'ouverture d'un fichier peut être en soi une
775       source de ralentissement, en particulier sur les systèmes de
776       fichiers sur le réseau. httpd permet d'éviter ce ralentissement en
777       maintenant un cache des descripteurs de fichiers ouverts pour les
778       fichiers souvent servis. Actuellement, httpd fournit une seule
779       implémentation de mise en cache des descripteurs de fichiers.</p>
780
781       <section>
782         <title>CacheFile</title>
783
784         <p>La forme la plus basique de mise en cache que propose httpd
785         est la mise en cache des descripteurs de fichiers fournie par le
786         module <module>mod_file_cache</module>. Plutôt que de mettre en
787         cache le contenu des fichiers, ce cache maintient une table des
788         descripteurs de fichiers ouverts. Les fichiers devant faire
789         l'objet d'une mise en cache de ce type sont spécifiés dans le
790         fichier de configuration via la directive <directive
791         module="mod_file_cache">CacheFile</directive>.</p>
792
793         <p>La directive <directive
794         module="mod_file_cache">CacheFile</directive> informe httpd
795         qu'il doit ouvrir le fichier lors de son démarrage et qu'il doit
796         réutiliser le descripteur de fichier mis en cache pour tous les
797         accès futurs à ce fichier.</p>
798
799         <highlight language="config">
800         CacheFile /usr/local/apache2/htdocs/index.html
801         </highlight>
802
803         <p>Si vous désirez mettre en cache un grand nombre de fichiers
804         de cette manière, vous devez vous assurer que le nombre maximal
805         de fichiers ouverts pour votre système d'exploitation est défini
806         à une valeur suffisante.</p>
807
808         <p>Bien que l'utilisation de la directive <directive
809         module="mod_file_cache">CacheFile</directive> n'entraîne pas de
810         mise en cache du contenu du fichier proprement dit, elle
811         implique que si le fichier est modifié pendant l'exécution du
812         serveur, ces modifications ne seront pas prises en compte. Le
813         fichier sera toujours servi dans l'état où il se trouvait au
814         moment du démarrage du serveur.</p>
815
816         <p>Si le fichier est supprimé pendant l'exécution du serveur, ce
817         dernier conservera le descripteur de fichier ouvert associé et
818         servira le fichier dans l'état où il se trouvait au
819         moment du démarrage du serveur. Cela signifie aussi que même si
820         le fichier a été supprimé, et n'apparaît donc plus dans le
821         système de fichiers, l'espace disque libéré ne sera disponible
822         qu'une fois le serveur httpd arrêté et donc le descripteur de
823         fichier fermé.</p>
824       </section>
825
826     </section>
827
828     <section id="inmemory">
829       <title>In-Memory Caching</title>
830
831     <p>Servir un contenu directement depuis la mémoire système est
832     universellement reconnu comme la méthode la plus rapide. Lire des fichiers
833     depuis un contrôleur de disque ou pire, depuis un réseau distant est plus
834     lent de plusieurs ordres de grandeur. Les contrôleurs de disque réalisent
835     en général des opérations mécaniques, et l'accès au réseau est limité par la
836     bande passante dont vous disposez. Par contre, les temps d'accès à la
837     mémoire sont de l'ordre de la nano-seconde.</p>
838
839     <p>Cependant la mémoire système n'est pas bon marché; à capacité égale,
840     c'est de loin le type de stockage le plus coûteux et il est important de
841     s'assurer qu'elle est utilisée efficacement. Le fait de mettre en cache
842     des fichiers en mémoire diminue d'autant la quantité de mémoire système
843     disponible. Comme nous le verrons plus loin, ce n'est pas un problème en
844     soi dans le cas de la mise en cache par l'intermédiaire du système
845     d'exploitation, mais si l'on utilise la mise en cache en mémoire propre à
846     httpd, il faut prendre garde à ne pas allouer trop de mémoire au cache.
847     Sinon le système sera contraint d'utiliser le swap, ce qui dégradera
848     sensiblement les performances.</p>
849
850       <section>
851       <title>Mise en cache par l'intermédiaire du système d'exploitation</title>
852
853       <p>Dans la plupart des systèmes d'exploitation modernes, c'est le noyau
854       qui gère directement la mise en cache en mémoire des données relatives
855       aux fichiers. C'est une fonctionnalité puissante, et les systèmes
856       d'exploitation s'en acquittent fort bien pour la plus grande partie.
857       Considérons par exemple, dans le cas de Linux, la différence entre le
858       temps nécessaire à la première lecture d'un fichier et le temps
859       nécessaire à sa deuxième lecture;</p>
860
861         <example><pre>
862 colm@coroebus:~$ time cat testfile &gt; /dev/null
863 real    0m0.065s
864 user    0m0.000s
865 sys     0m0.001s
866 colm@coroebus:~$ time cat testfile &gt; /dev/null
867 real    0m0.003s
868 user    0m0.003s
869 sys     0m0.000s</pre>
870         </example>
871
872       <p>Même pour ce petit fichier, il y a une grande différence entre les
873       temps nécessaires pour lire le fichier. Ceci est du au fait que le
874       noyau a mis en cache le contenu du fichier en mémoire.</p>
875
876       <p>Du fait de toujours pouvoir disposer de mémoire système, vous pouvez
877       être assuré qu'il y aura de plus en plus de contenus de fichiers stockés
878       dans ce cache. Ceci peut s'avérer une méthode de mise en cache en mémoire
879       très efficace, et ne nécessite aucune configuration supplémentaire
880       de httpd.</p>
881
882       <p>De plus, comme le système d'exploitation sait si des fichiers
883       ont été
884       supprimés ou modifiés, il peut effacer automatiquement des contenus de
885       fichiers du cache lorsque cela s'avère nécessaire. Ceci constitue un gros
886       avantage par rapport à la mise en cache en mémoire
887       de httpd qui n'a
888       aucune possibilité de savoir si un fichier a été modifié.</p>
889       </section>
890
891     <p>En dépit des performances et des avantages de la mise en cache
892     automatique par le système d'exploitation, la mise en cache en mémoire
893     peut être effectuée plus efficacement par httpd dans certaines
894     circonstances.</p>
895
896     <section>
897       <title>Mise en cache à l'aide de la directive MMapFile</title>
898
899       <p>La directive <directive module="mod_file_cache">MMapFile</directive>
900       fournie par le module <module>mod_file_cache</module> vous permet de
901       demander à httpd de charger un contenu de fichier statique en mémoire
902       lors de son démarrage (à l'aide de l'appel
903       système mmap). httpd
904       utilisera le contenu chargé en mémoire pour satisfaire ultérieurement
905       toutes les demandes d'accès à ce fichier.</p>
906
907         <highlight language="config">
908         MMapFile /usr/local/apache2/htdocs/index.html
909         </highlight>
910
911       <p>Comme dans le cas de la directive
912       <directive module="mod_file_cache">CacheFile</directive>, toute
913       modification du fichier ne sera plus prise en compte par httpd une fois
914       ce dernier démarré.</p>
915
916       <p> La directive
917       <directive module="mod_file_cache">MMapFile</directive> ne gardant
918       pas la trace de la quantité de mémoire qu'elle alloue, vous devez prendre
919       garde de ne pas en abuser. Chaque processus enfant de httpd utilisant
920       sa propre réplique de la mémoire allouée, il est donc d'une importance
921       critique de s'assurer que les fichiers chargés ne sont pas d'une taille
922       trop importante afin d'épargner au système l'utilisation du swap.</p>
923       </section>
924     </section>
925
926   </section>
927
928   <section id="security">
929     <title>Considérations sur la sécurité</title>
930
931     <section>
932       <title>Autorisation et contrôle d'accès</title>
933
934       <p>Utiliser <module>mod_cache</module> revient sensiblement à la même
935       chose qu'avoir un mandataire inverse intégré (reverse-proxy). Les requêtes
936       seront servies par le module de mise en cache sauf si ce dernier
937       détermine qu'un processus d'arrière-plan doit être appelé. La mise en
938       cache de ressources locales modifie considérablement le modèle de
939       sécurité de httpd.</p>
940
941       <p>Comme le parcours de la hiérarchie d'un système de fichiers pour
942       examiner le contenu d'éventuels fichiers
943       <code>.htaccess</code> serait une opération très coûteuse en ressources,
944       annulant partiellement de ce fait l'intérêt de la mise en cache
945       (accélérer le traitement des requêtes),
946       <module>mod_cache</module> ne se préoccupe pas de savoir s'il a
947       l'autorisation de servir une entité mise en cache. En d'autres termes,
948       si <module>mod_cache</module> a mis en cache un certain contenu, ce
949       dernier sera servi à partir du cache tant qu'il ne sera pas arrivé à
950       expiration.</p>
951
952       <p>Si par exemple, votre configuration autorise l'accès à une ressource
953       en fonction de l'adresse IP, vous devez vous assurer que ce contenu n'est
954       pas mis en cache. Ceci est possible en utilisant la directive
955       <directive module="mod_cache">CacheDisable</directive>, ou le module
956       <module>mod_expires</module>. Livré à lui-même,
957       <module>mod_cache</module> - pratiquement comme un mandataire inverse -
958       mettrait en cache le contenu lors de son service, et le servirait ensuite
959       à tout client, vers n'importe quelle adresse IP.</p>
960
961       <p>Lorsque la directive <directive
962       module="mod_cache">CacheQuickHandler</directive> est définie à
963       <code>Off</code>, toutes les phases du traitement de la requête
964       sont exécutées et le modèle de sécurité reste le même.</p>
965
966     </section>
967
968     <section>
969       <title>Piratages locaux</title>
970
971       <p>Etant donné que les requêtes des utilisateurs finaux peuvent être
972       servies depuis le cache, ce dernier est une cible potentielle pour ceux
973       qui veulent défigurer un contenu ou interférer avec lui. Il est important
974       de garder à l'esprit que l'utilisateur sous lequel tourne
975       httpd doit
976       toujours avoir l'accès en écriture dans le cache. Ceci est en contraste
977       total avec la recommandation usuelle d'interdire à l'utilisateur sous
978       lequel tourne Apache
979       l'accès en écriture à tout contenu.</p>
980
981       <p>Si l'utilisateur sous lequel tourne Apache est compromis,
982       par exemple à cause d'une
983       faille de sécurité dans un processus CGI, il est possible que le cache
984       fasse l'objet d'une attaque. Il est relativement aisé d'insérer ou de
985       modifier une entité dans le cache en utilisant le module
986       <module>mod_cache_disk</module>.</p>
987
988       <p>Cela représente un risque relativement élévé par rapport aux autres
989       types d'attaques qu'il est possible de mener sous l'utilisateur apache.
990       Si vous utilisez <module>mod_cache_disk</module>, vous devez garder ceci
991       à l'esprit : effectuez toujours les mises à jour de
992       httpdquand des
993       correctifs de sécurité sont annoncés et exécutez les processus CGI sous
994       un utilisateur autre qu'apache en utilisant
995       <a href="suexec.html">suEXEC</a> dans la mesure du possible.</p>
996
997     </section>
998
999     <section>
1000       <title>Empoisonnement du cache (Cache Poisoning)</title>
1001
1002       <p>Si vous utilisez httpd comme serveur mandataire avec mise en cache,
1003       vous vous exposez aussi à un éventuel "Empoisonnement du
1004       cache" (Cache poisoning). L'empoisonnement du cache est un terme général
1005       pour désigner les attaques au cours desquelles l'attaquant fait en sorte
1006       que le serveur mandataire renvoie à un contenu incorrect (et souvent
1007       indésirable) suite à en provenance du serveur d'arrière-plan.
1008       </p>
1009
1010       <p>Par exemple, si les serveur DNS qu'utilise votre système où tourne
1011       httpd sont vulnérables à l'empoisonnement du cache des DNS, un attaquant
1012       pourra contrôler vers où httpd se connecte lorsqu'il demande un contenu
1013       depuis le serveur d'origine.
1014       Un autre exemple est constitué par les attaques ainsi nommées
1015       "Dissimulation de requêtes HTTP" (HTTP request-smuggling).</p>
1016
1017       <p>Ce document n'est pas le bon endroit pour une discussion approfondie
1018       à propos de la Dissimulation de requêtes HTTP (utilisez plutôt votre
1019       moteur de recherche favori); il est cependant important de savoir qu'il
1020       est possible d'élaborer une série de requêtes, et d'exploiter une
1021       vulnérabilité d'un serveur web d'origine de telle façon que l'attaquant
1022       puisse contrôler entièrement le contenu renvoyé par le mandataire.</p>
1023     </section>
1024
1025     <section>
1026       <title>Déni de Service / Cachebusting</title>
1027
1028       <p>Le mécanisme utilisé via l'en-tête Vary permet de mettre en
1029       cache simultanément plusieurs variantes d'une ressource avec la
1030       même URL. Le cache sélectionne la variante correcte à envoyer au
1031       client en fonction des valeurs d'en-tête fournies par ce dernier.
1032       Ce mécanisme peut devenir un problème lorsqu'on tente d'appliquer
1033       le mécanisme des variantes à un en-tête connu pour pouvoir
1034       posséder un grand nombre de valeurs
1035       possibles en utilisation normal, comme par exemple l'en-tête
1036       <code>User-Agent</code>. En fonction de la popularité du site web,
1037       des milliers ou même des millions d'entrées de cache dupliquées
1038       peuvent être créées pour la même URL, submergeant les autres
1039       entrées du cache.</p>
1040       
1041       <p>Dans d'autres cas, il peut être nécessaire de modifier l'URL
1042       d'une ressource particulière à chaque requête, en général en lui
1043       ajoutant une chaîne "cachebuster". Si ce contenu est déclaré comme
1044       pouvant être mis en cache par un serveur avec une durée de
1045       fraîcheur significative, ces entrées peuvent submerger les entrées
1046       légitimes du cache. Alors que <module>mod_cache</module> fournit
1047       une directive <directive
1048       module="mod_cache">CacheIgnoreURLSessionIdentifiers</directive>,
1049       cette dernière doit être utilisée avec prudence pour s'assurer que
1050       les caches du navigateur ou du mandataire le plus proche
1051       (downstream proxy) ne sont pas victimes du même problème de Déni de
1052       service.</p>
1053     </section>
1054   </section>
1055
1056
1057 </manualpage>