]> granicus.if.org Git - apache/blob - docs/manual/misc/perf-scaling.html.fr.utf8
Help doc writer to spot places where:
[apache] / docs / manual / misc / perf-scaling.html.fr.utf8
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head>
4 <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
5 <!--
6         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7               This file is generated from xml source: DO NOT EDIT
8         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9       -->
10 <title>Amélioration des performances - Serveur HTTP Apache Version 2.5</title>
11 <link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
12 <link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
13 <link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
14 <script src="../style/scripts/prettify.min.js" type="text/javascript">
15 </script>
16
17 <link href="../images/favicon.ico" rel="shortcut icon" /></head>
18 <body id="manual-page"><div id="page-header">
19 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p>
20 <p class="apache">Serveur HTTP Apache Version 2.5</p>
21 <img alt="" src="../images/feather.png" /></div>
22 <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
23 <div id="path">
24 <a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.5</a> &gt; <a href="./">Documentations diverses</a></div><div id="page-content"><div id="preamble"><h1>Amélioration des performances</h1>
25 <div class="toplang">
26 <p><span>Langues Disponibles: </span><a href="../en/misc/perf-scaling.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
27 <a href="../es/misc/perf-scaling.html" hreflang="es" rel="alternate" title="Español">&nbsp;es&nbsp;</a> |
28 <a href="../fr/misc/perf-scaling.html" title="Français">&nbsp;fr&nbsp;</a></p>
29 </div>
30
31         
32         <p>Il est dit dans la documentation d'Apache 1.3
33         à propos de l'amélioration des performances : 
34         </p>
35         <blockquote><p>
36             "Apache est un serveur web à vocation générale, conçu pour
37             être non seulement efficace mais aussi rapide. Dans sa
38             configuration de base, ses performances sont déjà
39             relativement satisfaisantes. La plupart des sites possèdent
40             une bande passante en sortie inférieure à 10 Mbits que le
41             serveur Apache peut mettre pleinement à profit en utilisant un serveur à base
42             de processeur Pentium bas de gamme."</p>
43         </blockquote>
44         <p>Cette phrase ayant été écrite il y a plusieurs années,
45         entre temps de nombreuses choses ont changé. D'une part, les
46         serveurs sont devenus beaucoup plus rapides. D'autre part, de
47         nombreux sites se voient maintenant allouée une bande passante
48         en sortie bien supérieure à 10 Mbits. En outre, les applications
49         web sont devenues beaucoup plus complexes. Les sites classiques
50         ne proposant que des pages du style brochure sont toujours
51         présents, mais le web a souvent évolué vers une plateforme
52         exécutant des traitements, et les webmasters peuvent maintenant
53         mettre en ligne des contenus dynamiques en Perl, PHP ou Java,
54         qui exigent un niveau de performances bien supérieur. 
55         </p>
56         <p>C'est pourquoi en dépit des progrès en matière de bandes passantes
57         allouées et de rapidité       des serveurs, les performances
58         des serveurs web et des applications web sont toujours un sujet
59         d'actualité. C'est dans ce cadre que cette documentation s'attache à
60         présenter de nombreux points concernant les performances des
61         serveurs web. 
62         </p>
63         
64     </div>
65 <div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#what-will-and-will-not-be-discussed">Ce qui sera abordé et ce qui ne le sera pas</a></li>
66 <li><img alt="" src="../images/down.gif" /> <a href="#monitoring-your-server">Monitoring de votre serveur</a></li>
67 <li><img alt="" src="../images/down.gif" /> <a href="#configuring-for-performance">Configuration dans une optique de performances
68         </a></li>
69 <li><img alt="" src="../images/down.gif" /> <a href="#caching-content">Mise en cache des contenus
70         </a></li>
71 <li><img alt="" src="../images/down.gif" /> <a href="#further-considerations">Pour aller plus loin
72         </a></li>
73 </ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="#comments_section">Commentaires</a></li></ul></div>
74 <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
75 <div class="section">
76 <h2><a name="what-will-and-will-not-be-discussed" id="what-will-and-will-not-be-discussed">Ce qui sera abordé et ce qui ne le sera pas</a> <a title="Lien permanent" href="#what-will-and-will-not-be-discussed" class="permalink">&para;</a></h2>
77         
78         <p>Ce document se concentre sur l'amélioration des performances
79         via des options facilement accessibles, ainsi que sur les outils
80         de monitoring. Les outils de monitoring vous permettront de
81         surveiller le fonctionnement de votre serveur web afin de
82         rassembler des informations à propos de ses performances et des
83         éventuels problèmes qui s'y rapportent. Nous supposerons
84         que votre budget n'est pas illimité ; c'est pourquoi les
85         améliorations apportées le seront sans modifier l'infrastructure
86         matérielle existante. Vous ne souhaitez probablement pas
87         compiler vous-même votre serveur Apache, ni recompiler le noyau
88         de votre système d'exploitation ; nous supposerons cependant que
89         vous possédez quelques notions à propos du fichier de
90         configuration du serveur HTTP Apache. 
91         </p>
92         
93     </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
94 <div class="section">
95 <h2><a name="monitoring-your-server" id="monitoring-your-server">Monitoring de votre serveur</a> <a title="Lien permanent" href="#monitoring-your-server" class="permalink">&para;</a></h2>
96         
97         <p>Si vous envisagez de redimensionner ou d'améliorer les performances
98         de votre serveur, vous devez tout d'abord observer la manière dont il
99         fonctionne. En observant son fonctionnement en conditions réelles ou
100         sous une charge créée artificiellement, vous serez en mesure
101         d'extrapoler son fonctionnement sous une charge accrue, par exemple dans
102         le cas où il serait mentionné sur Slashdot.  </p>
103         
104         
105         <h3><a name="monitoring-tools" id="monitoring-tools">Outils de monitoring</a></h3>
106             
107             
108             <h4><a name="top" id="top">top
109                 </a></h4>
110                 
111                 <p>L'outil top est fourni avec Linux et FreeBSD. Solaris
112                 quant à lui, fournit <code>prstat(1)</code>. Cet outil
113                 permet de rassembler de nombreuses données statistiques
114                 à propos du système et de chaque processus en cours
115                 d'exécution avant de les afficher de manière
116                 interactive sur votre terminal. Les données affichées
117                 sont rafraîchies toutes les secondes et varient en
118                 fonction de la plateforme, mais elles comportent en
119                 général la charge moyenne du système, le nombre de
120                 processus et leur état courant, le pourcentage de temps
121                 CPU(s) passé à exécuter le code système et utilisateur,
122                 et l'état de la mémoire virtuelle système. Les données
123                 affichées pour chaque processus sont en général
124                 configurables et comprennent le nom et l'identifiant du
125                 processus, sa priorité et la valeur définie par nice,
126                 l'empreinte mémoire, et le pourcentage d'utilisation CPU.
127                 L'exemple suivant montre plusieurs processus httpd (avec
128                 les MPM worker et event) s'exécutant sur un système
129                 Linux (Xen) : 
130                 </p>
131                 
132                 <div class="example"><pre>top - 23:10:58 up 71 days,  6:14,  4 users,  load average: 0.25, 0.53, 0.47
133 Tasks: 163 total,   1 running, 162 sleeping,   0 stopped,   0 zombie
134 Cpu(s): 11.6%us,  0.7%sy,  0.0%ni, 87.3%id,  0.4%wa,  0.0%hi,  0.0%si,  0.0%st
135 Mem:   2621656k total,  2178684k used,   442972k free,   100500k buffers
136 Swap:  4194296k total,   860584k used,  3333712k free,  1157552k cached
137
138   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
139 16687 example_  20   0 1200m 547m 179m S   45 21.4   1:09.59 httpd-worker
140 15195 www       20   0  441m  33m 2468 S    0  1.3   0:41.41 httpd-worker
141     1 root      20   0 10312  328  308 S    0  0.0   0:33.17 init
142     2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd
143     3 root      RT  -5     0    0    0 S    0  0.0   0:00.14 migration/0
144     4 root      15  -5     0    0    0 S    0  0.0   0:04.58 ksoftirqd/0
145     5 root      RT  -5     0    0    0 S    0  0.0   4:45.89 watchdog/0
146     6 root      15  -5     0    0    0 S    0  0.0   1:42.52 events/0
147     7 root      15  -5     0    0    0 S    0  0.0   0:00.00 khelper
148    19 root      15  -5     0    0    0 S    0  0.0   0:00.00 xenwatch
149    20 root      15  -5     0    0    0 S    0  0.0   0:00.00 xenbus
150    28 root      RT  -5     0    0    0 S    0  0.0   0:00.14 migration/1
151    29 root      15  -5     0    0    0 S    0  0.0   0:00.20 ksoftirqd/1
152    30 root      RT  -5     0    0    0 S    0  0.0   0:05.96 watchdog/1
153    31 root      15  -5     0    0    0 S    0  0.0   1:18.35 events/1
154    32 root      RT  -5     0    0    0 S    0  0.0   0:00.08 migration/2
155    33 root      15  -5     0    0    0 S    0  0.0   0:00.18 ksoftirqd/2
156    34 root      RT  -5     0    0    0 S    0  0.0   0:06.00 watchdog/2
157    35 root      15  -5     0    0    0 S    0  0.0   1:08.39 events/2
158    36 root      RT  -5     0    0    0 S    0  0.0   0:00.10 migration/3
159    37 root      15  -5     0    0    0 S    0  0.0   0:00.16 ksoftirqd/3
160    38 root      RT  -5     0    0    0 S    0  0.0   0:06.08 watchdog/3
161    39 root      15  -5     0    0    0 S    0  0.0   1:22.81 events/3
162    68 root      15  -5     0    0    0 S    0  0.0   0:06.28 kblockd/0
163    69 root      15  -5     0    0    0 S    0  0.0   0:00.04 kblockd/1
164    70 root      15  -5     0    0    0 S    0  0.0   0:00.04 kblockd/2</pre></div>
165                 
166                 <p>Top est un merveilleux outil, même s'il est
167                 relativement gourmand en ressources (lorsqu'il
168                 s'exécute, son propre processus se trouve en général
169                 dans le top dix des consommations CPU). Il est
170                 indispensable pour déterminer la taille d'un processus
171                 en cours d'exécution, information précieuse lorsque vous
172                 voudrez déterminer combien de processus httpd vous
173                 pourrez exécuter sur votre machine. La méthode pour
174                 effectuer ce calcul est décrite ici : <a href="#sizing-maxClients">calculer MaxClients</a>. Top
175                 est cependant un outil interactif, et l'exécuter de
176                 manière continu présente peu ou pas d'avantage. 
177                 </p>
178             
179             <h4><a name="free" id="free">free
180                 </a></h4>
181                 
182                 <p>Cette commande n'est disponible que sous Linux. Elle
183                 indique la mémoire vive et l'espace de swap utilisés.
184                 Linux alloue la mémoire inutilisée en tant que cache du
185                 système de fichiers. La commande free montre
186                 l'utilisation de la mémoire avec et sans ce cache. On
187                 peut utiliser la commande free pour déterminer la
188                 quantité de mémoire utilisée par le système, comme
189                 décrit dans le paragraphe <a href="#sizing-maxClients">calculer MaxClients</a>.
190                 L'affichage de la sortie de la commande free ressemble à
191                 ceci : 
192                 </p>
193                 
194                 <div class="example"><pre>sctemme@brutus:~$ free
195               total       used     free   shared    buffers    cached
196 Mem:        4026028    3901892   124136         0    253144    841044
197 -/+ buffers/cache:     2807704  1218324
198 Swap:       3903784      12540  3891244</pre></div>
199             
200             
201             <h4><a name="vmstat" id="vmstat">vmstat
202                 </a></h4>
203                 
204                 <p>Cette commande est disponible sur de nombreuses
205                 plateformes de style Unix. Elle affiche un grand nombre
206                 de données système. Lancée sans argument, elle affiche
207                 une ligne d'état pour l'instant actuel. Lorsqu'on lui
208                 ajoute un chiffre, la ligne d'état actuelle est ajoutée à
209                 intervalles réguliers à l'affichage existant.
210                 Par exemple, la commande
211                 <code>vmstat 5</code> ajoute la ligne d'état actuelle
212                 toutes les 5 secondes. La commande vmstat affiche la
213                 quantité de mémoire virtuelle utilisée, la quantité de
214                 mémoire échangée avec l'espace de swap en entrée et en
215                 sortie à chaque seconde, le nombre de processus
216                 actuellement en cours d'exécution ou inactifs, le nombre
217                 d'interruptions et de changements de contexte par
218                 seconde, et le pourcentage d'utilisation du CPU. 
219                 </p>
220                 <p>
221                     Voici la sortie de la commande <code>vmstat</code>
222                     pour un serveur inactif : 
223                 </p>
224                 
225                 
226                 <div class="example"><pre>[sctemme@GayDeceiver sctemme]$ vmstat 5 3
227    procs                      memory     swap         io    system        cpu
228  r b w     swpd   free   buff cache si so       bi    bo in     cs us  sy id
229  0 0 0        0 186252   6688 37516    0    0   12     5 47    311  0   1 99
230  0 0 0        0 186244   6696 37516    0    0    0    16 41    314  0   0 100
231  0 0 0        0 186236   6704 37516    0    0    0     9 44    314  0   0 100</pre></div>
232                 
233                 <p>Et voici cette même sortie pour un serveur en charge
234                 de cent connexions simultanées pour du contenu statique        : 
235                 </p>
236                 
237                 <div class="example"><pre>[sctemme@GayDeceiver sctemme]$ vmstat 5 3
238    procs                      memory     swap    io      system       cpu
239  r b w     swpd   free   buff cache si so     bi bo   in     cs us sy  id
240  1 0 1        0 162580   6848 40056    0    0 11  5 150     324  1  1  98
241  6 0 1        0 163280   6856 40248    0    0  0 66 6384 1117   42 25  32
242 11 0 0        0 162780   6864 40436    0    0  0 61 6309 1165   33 28  40</pre></div>
243                 
244                 <p>La première ligne indique des valeurs moyennes depuis
245                 le dernier redémarrage. Les lignes suivantes donnent des
246                 informations d'état à intervalles de 5 secondes. Le
247                 second argument demande à vmstat de générer 3 lignes
248                 d'état, puis de s'arrêter. 
249                 </p>
250                  
251             
252             <h4><a name="se-toolkit" id="se-toolkit">Boîte à outils SE
253                 </a></h4>
254                 
255                 <p>La boîte à outils SE est une solution de supervision
256                 pour Solaris. Son langage de programmation est basé sur
257                 le préprocesseur C et est fourni avec de nombreux
258                 exemples de scripts. Les informations fournies
259                 peuvent être exploitées en mode console ou en mode
260                 graphique. Cette boîte à outils peut aussi être programmée pour
261                 appliquer des règles aux données système. Avec l'exemple
262                 de script de la Figure 2, Zoom.se, des voyants verts,
263                 oranges ou rouges s'allument lorsque certaines valeurs
264                 du système dépassent un seuil spécifié. Un autre script
265                 fourni, Virtual Adrian, permet d'affiner les
266                 performances en tenant compte de ces valeurs. 
267                 </p>
268                 <p>Depuis sa création, de nombreux propriétaires se sont
269                 succédés à la tête de la boîte à outils SE, et elle a de
270                 ce fait largement évolué. Il semble qu'elle ait
271                 maintenant trouvé sa place chez Sunfreeware.com d'où
272                 elle peut être téléchargée gratuitement. Il n'y a qu'un
273                 seul paquet pour Solaris 8, 9 et 10 sur SPARC et x86, et
274                 il inclut le code source. Le concepteur de la boîte à
275                 outils SE, Richard Pettit, a fondé une nouvelle sociéte,
276                 Captive Metrics4, et a l'intention de mettre sur le
277                 marché un outil de supervision multiplateforme en Java basé sur
278                 les mêmes principes que la boîte à outils SE. 
279                 </p>
280                 
281                 
282             
283             <h4><a name="dtrace" id="dtrace">DTrace
284                 </a></h4>
285                 
286                 <p>Etant donné que DTrace est disponible sous Solaris,
287                 FreeBSD et OS X, il serait intéressant de l'étudier. Il
288                 y a aussi le module mod_dtrace pour httpd. 
289                 </p>
290                 
291                 
292             
293             <h4><a name="mod_status" id="mod_status">mod_status
294                 </a></h4>
295                 
296                 <p>Le module mod_status donne un aperçu des performances
297                 du serveur à un instant donné. Il génère une page HTML
298                 comportant, entre autres, le nombre de processus Apache
299                 en cours d'exécution avec la quantité de données qu'ils
300                 ont servies, ainsi que la charge CPU induite par httpd
301                 et le reste du système. L'Apache Software Foundation
302                 utilise elle-même <code class="module"><a href="../mod/mod_status.html">mod_status</a></code> pour son
303                 propre <a href="http://apache.org/server-status">site
304                 web</a>. Si vous ajoutez une directive
305                 <code>ExtendedStatus On</code> à votre fichier
306                 <code>httpd.conf</code>, la page de
307                 <code class="module"><a href="../mod/mod_status.html">mod_status</a></code> vous fournira d'avantage
308                 d'informations, au prix d'une consommation de ressources
309                 légèrement supérieure par requête. 
310                 </p>
311                 
312                 
313             
314         
315         <h3><a name="web-server-log-files" id="web-server-log-files">Les journaux du serveur web
316             </a></h3>
317             
318             <p>Le moyen le plus efficace pour vérifier la bonne santé et
319             le niveau de performance de votre serveur consiste à
320             surveiller et analyser les journaux écrits par httpd. La
321             surveillance du journal des erreurs vous permet de
322             déterminer les sources d'erreurs, de détecter des attaques
323             ou des problèmes de performance. L'analyse du journal des
324             accès vous indique le niveau de charge de votre serveur,
325             quelles sont les ressources les plus populaires, ainsi que
326             la provenance de vos utilisateurs. Une analyse historique des
327             données de journalisation peut vous fournir des informations
328             précieuses quant aux tendances d'utilisation de votre
329             serveur au cours du temps, ce qui vous permet de prévoir les
330             périodes où les besoins en performance risquent de dépasser
331             les capacités du serveur. 
332             </p>
333             
334             
335             <h4><a name="ErrorLog" id="ErrorLog">Journal des erreurs
336                 </a></h4>
337                 
338                 <p>Le journal des erreurs peut indiquer que le nombre
339                 maximum de processus actifs ou de fichiers ouverts
340                 simultanément a été atteint. Le journal des erreurs
341                 signele aussi le lancement de processus supplémentaires selon un
342                 taux supérieur à la normale en réponse à
343                 une augmentation soudaine de la charge. Lorsque le
344                 serveur démarre, le descripteur de fichier stderr est
345                 redirigé vers le journal des erreurs, si bien que toute
346                 erreur rencontrée par httpd après avoir ouvert ses
347                 fichiers journaux apparaîtra dans ce journal. Consulter
348                 fréquemment le journal des erreurs est donc une bonne
349                 habitude. 
350                 </p>
351                 <p>Lorsque Apache httpd n'a pas encore ouvert ses
352                 fichiers journaux, tout message d'erreur sera envoyé
353                 vers la sortie d'erreur standard stderr. Si vous
354                 démarrez httpd manuellement, ces messages d'erreur
355                 apparaîtront sur votre terminal, et vous pourrez les
356                 utiliser directement pour résoudre les problèmes de
357                 votre serveur. Si httpd est lancé via un script de
358                 démarrage, la destination de ces messages d'erreur
359                 dépend de leur conception.
360                 <code>/var/log/messages</code> est alors le premier fichier à
361                 consulter. Sous Windows, ces messages d'erreur précoces
362                 sont écrits dans le journal des évènements des
363                 applications, qui peut être visualisé via l'observateur
364                 d'évènements dans les outils d'administration. 
365                 </p>
366                 <p>
367                     Le journal des erreurs est configuré via les
368                     directives de configuration <code class="directive"><a href="../mod/core.html#errorlog">ErrorLog</a></code> et <code class="directive"><a href="../mod/core.html#loglevel">LogLevel</a></code>. Le journal des
369                     erreurs de la configuration du serveur principal de
370                     httpd reçoit les messages d'erreur concernant
371                     l'ensemble du serveur : démarrage, arrêt, crashes,
372                     lancement de processus supplémentaires excessif,
373                     etc... La directive <code class="directive"><a href="../mod/core.html#errorlog">ErrorLog</a></code> peut aussi être
374                     utilisée dans les blocs de configuration des
375                     serveurs virtuels. Le journal des erreurs d'un
376                     serveur virtuel ne reçoit que les messages d'erreur
377                     spécifiques à ce serveur virtuel, comme les erreurs
378                     d'authentification et les erreurs du style 'File not
379                     Found'. 
380                 </p>
381                 <p>Dans le cas d'un serveur accessible depuis Internet,
382                 attendez-vous à voir de nombreuses tentatives
383                 d'exploitation et attaques de vers dans le journal des
384                 erreurs. La plupart d'entre elles ciblent des serveurs
385                 autres qu'Apache, mais dans l'état actuel des choses,
386                 les scripts se contentent d'envoyer leurs attaques vers
387                 tout port ouvert, sans tenir compte du serveur web
388                 effectivement en cours d'exécution ou du type
389                 des applications installées. Vous pouvez bloquer ces
390                 tentatives d'attaque en utilisant un pare-feu ou le
391                 module <a href="http://www.modsecurity.org/">mod_security</a>,
392                 mais ceci dépasse la portée de cette discussion. 
393                 </p>
394                 <p>
395                     La directive <code class="directive"><a href="../mod/core.html#loglevel">LogLevel</a></code> permet de définir
396                     le niveau de détail des messages enregistrés dans
397                     les journaux. Il existe huit niveaux de
398                     journalisation : 
399                 </p>
400                 <table>
401                     <tr>
402                         <td>
403                             <p><strong>Niveau</strong></p>
404                         </td>
405                         <td>
406                             <p><strong>Description</strong></p>
407                         </td>
408                     </tr>
409                     <tr>
410                         <td>
411                             <p>emerg</p>
412                         </td>
413                         <td>
414                             <p>Urgence - le système est inutilisable.</p>
415                         </td>
416                     </tr>
417                     <tr>
418                         <td>
419                             <p>alert</p>
420                         </td>
421                         <td>
422                             <p>Une action doit être entreprise
423                             immédiatement.</p>
424                         </td>
425                     </tr>
426                     <tr>
427                         <td>
428                             <p>crit</p>
429                         </td>
430                         <td>
431                             <p>Situations critiques.</p>
432                         </td>
433                     </tr>
434                     <tr>
435                         <td>
436                             <p>error</p>
437                         </td>
438                         <td>
439                             <p>Situations d'erreur.</p>
440                         </td>
441                     </tr>
442                     <tr>
443                         <td>
444                             <p>warn</p>
445                         </td>
446                         <td>
447                             <p>Situations provoquant un avertissement.</p>
448                         </td>
449                     </tr>
450                     <tr>
451                         <td>
452                             <p>notice</p>
453                         </td>
454                         <td>
455                             <p>Evènement normal, mais important.</p>
456                         </td>
457                     </tr>
458                     <tr>
459                         <td>
460                             <p>info</p>
461                         </td>
462                         <td>
463                             <p>Informations.</p>
464                         </td>
465                     </tr>
466                     <tr>
467                         <td>
468                             <p>debug</p>
469                         </td>
470                         <td>
471                             <p>Messages de débogage.</p>
472                         </td>
473                     </tr>
474                 </table>
475                 <p>Le niveau de journalisation par défaut est warn. Un
476                 serveur en production ne doit pas s'exécuter en mode
477                 debug, mais augmenter le niveau de détail dans le
478                 journal des erreurs peut s'avérer utile pour résoudre
479                 certains problèmes. A partir de la
480                 version 2.3.8, la directive <code class="directive"><a href="../mod/core.html#loglevel">LogLevel</a></code> peut être définie au
481                 niveau de chaque module : 
482                 </p>
483                 
484                 <pre class="prettyprint lang-config">LogLevel debug mod_ssl:warn</pre>
485
486                 
487                 <p>
488                   Dans cet exemple, l'ensemble du serveur est en mode
489                   debug, sauf le module <code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code>
490                   qui a tendance à être très bavard. 
491                 </p>
492                 
493                 
494             
495             <h4><a name="AccessLog" id="AccessLog">Journal des accès
496                 </a></h4>
497                 
498                 <p>Apache httpd garde la trace de toutes les requêtes
499                 qu'il reçoit dans son journal des accès. En plus de
500                 l'heure et de la nature d'une requête, httpd peut
501                 enregistrer l'adresse IP du client, la date et l'heure
502                 de la requête, le résultat et quantité d'autres
503                 informations. Les différents formats de journaux sont
504                 documentés dans le manuel. Le fichier concerne par
505                 défaut le serveur principal, mais il peut être configuré
506                 pour chaque serveur virtuel via les directives de
507                 configuration  <code class="directive"><a href="../mod/mod_log_config.html#transferlog">TransferLog</a></code> ou
508                 <code class="directive"><a href="../mod/mod_log_config.html#customlog">CustomLog</a></code>. 
509                 </p>
510                 <p>De nombreux programmes libres ou commerciaux
511                 permettent d'analyser les journaux d'accès. Analog et
512                 Webalyser sont des programmes d'analyse libres parmi les
513                 plus populaires. L'analyse des journaux doit s'effectuer
514                 hors ligne afin de ne pas surcharger le serveur web avec
515                 le traitement des fichiers journaux. La plupart des
516                 programmes d'analyse des journaux sont compatibles avec le format
517                 de journal "Common". Voici une description des
518                 différents champs présents dans une entrée du journal :  
519                 </p>
520                 
521                 
522                 <div class="example"><pre>195.54.228.42 - - [24/Mar/2007:23:05:11 -0400] "GET /sander/feed/ HTTP/1.1" 200 9747
523 64.34.165.214 - - [24/Mar/2007:23:10:11 -0400] "GET /sander/feed/atom HTTP/1.1" 200 9068
524 60.28.164.72 - - [24/Mar/2007:23:11:41 -0400] "GET / HTTP/1.0" 200 618
525 85.140.155.56 - - [24/Mar/2007:23:14:12 -0400] "GET /sander/2006/09/27/44/ HTTP/1.1" 200 14172
526 85.140.155.56 - - [24/Mar/2007:23:14:15 -0400] "GET /sander/2006/09/21/gore-tax-pollution/ HTTP/1.1" 200 15147
527 74.6.72.187 - - [24/Mar/2007:23:18:11 -0400] "GET /sander/2006/09/27/44/ HTTP/1.0" 200 14172
528 74.6.72.229 - - [24/Mar/2007:23:24:22 -0400] "GET /sander/2006/11/21/os-java/ HTTP/1.0" 200 13457</pre></div>
529                 
530                 <table>
531                     <tr>
532                         <td>
533                             <p><strong>Champ</strong></p>
534                         </td>
535                         <td>
536                             <p><strong>Contenu</strong></p>
537                         </td>
538                         <td>
539                             <p><strong>Explication</strong></p>
540                         </td>
541                     </tr>
542                     <tr>
543                         <td>
544                             <p>Adresse IP client</p>
545                         </td>
546                         <td>
547                             <p>195.54.228.42</p>
548                         </td>
549                         <td>
550                             <p>Adresse IP d'où provient la requête</p>
551                         </td>
552                     </tr>
553                     <tr>
554                         <td>
555                             <p>Identité RFC 1413</p>
556                         </td>
557                         <td>
558                             <p>-</p>
559                         </td>
560                         <td>
561                           <p>Identité de l'utilisateur distant renvoyée
562                           par son démon identd</p>
563                         </td>
564                     </tr>
565                     <tr>
566                         <td>
567                             <p>Nom utilisateur</p>
568                         </td>
569                         <td>
570                             <p>-</p>
571                         </td>
572                         <td>
573                             <p>Nom de l'utilisateur distant issu de
574                             l'authentification Apache</p>
575                         </td>
576                     </tr>
577                     <tr>
578                         <td>
579                             <p>Horodatage</p>
580                         </td>
581                         <td>
582                             <p>[24/Mar/2007:23:05:11 -0400]</p>
583                         </td>
584                         <td>
585                             <p>Date et heure de la requête</p>
586                         </td>
587                     </tr>
588                     <tr>
589                         <td>
590                             <p>Requête</p>
591                         </td>
592                         <td>
593                             <p>"GET /sander/feed/ HTTP/1.1"</p>
594                         </td>
595                         <td>
596                             <p>La requête proprement dite</p>
597                         </td>
598                     </tr>
599                     <tr>
600                         <td>
601                             <p>Code d'état</p>
602                         </td>
603                         <td>
604                             <p>200</p>
605                         </td>
606                         <td>
607                             <p>Code d'état renvoyé avec la réponse</p>
608                         </td>
609                     </tr>
610                     <tr>
611                         <td>
612                             <p>Contenu en octets</p>
613                         </td>
614                         <td>
615                             <p>9747</p>
616                         </td>
617                         <td>
618                             <p>Total des octets transférés sans les
619                             en-têtes</p>
620                         </td>
621                     </tr>
622                 </table>
623                 
624             
625             <h4><a name="rotating-log-files" id="rotating-log-files">Rotation des fichiers journaux
626                 </a></h4>
627                 
628                 <p>Il y a de nombreuses raisons pour mettre en oeuvre la
629                 rotation des fichiers journaux. Même si pratiquement
630                 plus aucun système d'exploitation n'impose une limite de
631                 taille pour les fichiers de deux GigaOctets, avec le
632                 temps, les fichiers journaux deviennent trop gros pour
633                 pouvoir être traités. En outre, toute analyse de journal
634                 ne doit pas être effectuée sur un fichier dans lequel le
635                 serveur est en train d'écrire. Une rotation périodique
636                 des fichiers journaux permet de faciliter leur analyse,
637                 et de se faire une idée plus précise des habitudes
638                 d'utilisation. 
639                 </p>
640                 <p>Sur les systèmes unix, vous pouvez simplement
641                 effectuer cette rotation en changeant le nom du fichier
642                 journal via la commande mv. Le serveur continuera à
643                 écrire dans le fichier ouvert même s'il a changé de nom.
644                 Lorsque vous enverrez un signal de redémarrage
645                 "Graceful" au serveur, il ouvrira un nouveau fichier
646                 journal avec le nom configuré par défaut. Par exemple,
647                 vous pouvez écrire un script de ce style pour cron : 
648                 </p>
649                 
650                 
651                 <div class="example"><p><code>
652                     APACHE=/usr/local/apache2<br />
653                     HTTPD=$APACHE/bin/httpd<br />
654                     mv $APACHE/logs/access_log
655                     $APACHE/logarchive/access_log-`date +%F`<br />
656                     $HTTPD -k graceful
657                 </code></p></div>
658                 
659                 <p>Cette approche fonctionne aussi sous Windows, mais
660                 avec moins de souplesse. Alors que le processus httpd de
661                 votre serveur sous Windows continuera à écrire dans le
662                 fichier journal une fois ce dernier renommé, le service
663                 Windows qui exécute Apache n'est pas en mesure
664                 d'effectuer un redémarrage graceful. Sous Windows, le
665                 redémarrage d'un service consiste simplement à l'arrêter
666                 et à le démarrer à nouveau, alors qu'avec un redémarrage
667                 graceful, les processus enfants terminent
668                 le traitement des requêtes en cours avant de s'arrêter,
669                 et le serveur httpd est alors immédiatement à
670                 nouveau disponible pour traiter les nouvelles requêtes.
671                 Sous Windows, le processus d'arrêt/redémarrage du
672                 service interrompt les traitements de requêtes en cours,
673                 et le serveur demeure indisponible jusqu'à ce qu'il ait
674                 terminé son redémarrage. Vous devez donc tenir compte de
675                 toutes ces contraintes lorsque vous planifiez un
676                 redémarrage. 
677                 </p>
678                 <p>
679                   Une seconde approche consiste à utiliser la
680                   redirection des logs. Les directives <code class="directive"><a href="../mod/mod_log_config.html#customlog">CustomLog</a></code>,
681                   <code class="directive"><a href="../mod/mod_log_config.html#transferlog">TransferLog</a></code> ou
682                   <code class="directive"><a href="../mod/core.html#errorlog">ErrorLog</a></code>
683                   permettent de rediriger les données de journalisation
684                   vers tout programme via le caractère pipe
685                   (<code>|</code>) comme dans cet exemple : 
686                 </p>
687                 
688                 <div class="example"><p><code>CustomLog "|/usr/local/apache2/bin/rotatelogs
689                     /var/log/access_log 86400" common
690                 </code></p></div>
691                 
692                 <p>Le programme cible de la redirection recevra alors les
693                 données de journalisation d'Apache sur son entrée
694                 standard stdin, et pourra en faire ce qu'il voudra. Le
695                 programme rotatelogs fourni avec Apache effectue une
696                 rotation des journaux de manière transparente en
697                 fonction du temps ou de la quantité de données écrites,
698                 et archive l'ancien fichier journal en ajoutant un
699                 suffixe d'horodatage à son nom. Cependant, si cette
700                 méthode fonctionne de manière satisfaisante sur les
701                 plateformes de style unix, il n'en est pas de même sous
702                 Windows. 
703                 </p>
704                 
705                 
706             
707             <h4><a name="logging-and-performance" id="logging-and-performance">Journalisation et performances
708                 </a></h4>
709                 
710                 <p>L'écriture d'entrées dans les fichiers journaux est
711                 consommatrice de ressources, mais l'importance de ces
712                 données est telle qu'il est fortement déconseillé de
713                 désactiver la journalisation. Pour optimiser les
714                 performances, vous devez enregistrer vos journaux sur un
715                 disque physique différent de celui où se situe votre
716                 site web car les modes d'accès sont très différents. La
717                 lecture de données sur un disque possède un caractère
718                 essentiellement aléatoire, alors que l'écriture dans les
719                 fichiers journaux s'effectue de manière séquentielle. 
720                 </p>
721                 <p>
722                   Ne définissez jamais la directive <code class="directive"><a href="../mod/core.html#loglevel">LogLevel</a></code> à debug pour un
723                   serveur en production. En effet, lorsque ce niveau de
724                   journalisation est défini, une grande quantité de
725                   données est écrite dans le journal des erreurs, y
726                   compris, dans le cas d'un accès SSL, toutes les
727                   opérations de lecture/écriture de la négociation de la
728                   connexion. Les implications en matière de performances
729                   sont donc importantes et vous devez plutôt utiliser le
730                   niveau de journalisation warn. 
731                 </p>
732                 <p>Si votre serveur possède plus d'un serveur virtuel,
733                 il est conseillé d'attribuer un journal des accès séparé à
734                 chacun d'entre eux, ce qui a pour effet de faciliter son
735                 exploitation ultérieure. Par contre, si votre serveur
736                 possède un grand nombre de serveurs virtuels, le nombre
737                 de fichiers journaux à ouvrir va représenter une
738                 consommation de ressources importante pour votre
739                 système, et il sera peut-être alors plus judicieux
740                 d'utiliser un seul fichier journal avec l'aménagement
741                 suivant : utiliser l'élément de format <code>%v</code>
742                 en tête de votre directive <code class="directive"><a href="../mod/mod_log_config.html#logformat">LogFormat</a></code> (et de
743                 votre directive <code class="directive"><a href="../mod/core.html#errorlog">ErrorLog</a></code> depuis la version
744                 2.3.8) afin que httpd enregistre le nom du serveur
745                 virtuel qui traite la requête ou l'erreur au début de
746                 chaque entrée du journal. Un simple script Perl peut
747                 alors éclater le journal en fichiers spécifiques à
748                 chaque serveur virtuel après sa rotation ; Apache
749                 fournit un tel script dans le répertoire
750                 <code>support/split-logfile</code>.
751                 </p>
752                 <p>
753                     Vous pouvez aussi utiliser la directive <code class="directive"><a href="../mod/mod_log_config.html#bufferedlogs">BufferedLogs</a></code>
754                     pour qu'Apache conserve en mémoire plusieurs entrées
755                     de journal avant de les écrire sur disque. Gardez
756                     cependant à l'esprit que si les performances peuvent
757                     s'en trouver améliorées, la chronologie des
758                     évènements enregistrés peut quant à elle s'en
759                     trouver affectée. 
760                 </p>
761                 
762                 
763             
764         
765         <h3><a name="generating-a-test-load" id="generating-a-test-load">Mise en oeuvre d'une charge de test
766             </a></h3>
767             
768             <p>Il est interessant de mettre en oeuvre une charge de test
769             afin d'évaluer les performances du système en conditions
770             réelles de fonctionnement. A cet effet, il existe des
771             paquets commerciaux comme <a href="http://learnloadrunner.com/">LoadRunner</a>, mais
772             aussi de nombreux outils libres permettant de générer une
773             charge de test pour votre serveur web. 
774             </p>
775             <ul>
776                 <li>Apache est fourni avec un programme de test nommé ab
777                 (initiales de Apache Bench). Ce dernier peut générer une
778                 charge de serveur web consistant à demander le même
779                 fichier de manière répétitive à un rythme rapide. Vous
780                 pouvez spécifier le nombre de connexions simultanées, et
781                 choisir entre une durée de fonctionnement ou un nombre
782                 de requêtes. 
783                 </li>
784                 <li>http load11 est un autre exemple de générateur de
785                 charge libre. Ce programme fonctionne avec un ficher
786                 d'URLs et peut être compilé avec le support SSL. 
787                 </li>
788                 <li>L'Apache Software Foundation propose un outil nommé
789                 flood12. Flood est un programme assez sophistiqué que
790                 l'on configure via un fichier XML. 
791                 </li>
792                 <li>Pour finir, JMeter13, un sous-projet de Jakarta, est
793                 un outil de test en charge entièrement en Java. Alors
794                 que les premières versions de cette application étaient
795                 lentes et difficiles d'utilisation, la version 2.1.1
796                 actuelle semble être plus souple d'utilisation et
797                 efficace. 
798                 </li>
799                 <li>
800                     <p>Des projets externes à l'ASF et réputés
801                     relativement corrects : grinder, httperf, tsung, <a href="http://funkload.nuxeo.org/">FunkLoad</a>.
802                     </p>
803                 </li>
804             </ul>
805             <p>Lorsque vous appliquez une charge de test à votre serveur
806             web, gardez à l'esprit que si ce dernier est en production,
807             la charge de test peut en affecter négativement les
808             performances. En outre, le transfert de données
809             supplémentaires induit peut être comptabilisé dans le
810             quota mensuel qui vous a été éventuellement alloué.
811             </p>
812             
813             
814         
815     </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
816 <div class="section">
817 <h2><a name="configuring-for-performance" id="configuring-for-performance">Configuration dans une optique de performances
818         </a> <a title="Lien permanent" href="#configuring-for-performance" class="permalink">&para;</a></h2>
819         
820         
821         
822         <h3><a name="apache-configuration" id="apache-configuration">Configuration de httpd
823             </a></h3>
824             
825             <p>httpd version 2.2 est par défaut un serveur web avec des
826             processus enfants lancés au préalable. Au démarrage du
827             serveur, le processus parent lance un certain nombre de
828             processus enfants et ce sont eux qui seront chargés de traiter les
829             requêtes. Mais avec httpd version 2.0 est apparu le concept
830             de module multi-process (MPM). Les développeurs purent alors
831             écrire des MPMs qui pouvaient fonctionner avec l'architecture
832             à base de processus ou de threads de leur système
833             d'exploitation spécifique. Apache 2 est fourni avec des MPMs
834             spécifiques pour Windows, OS/2, Netware et BeOS. Pour les
835             plateformes de style unix, les deux MPMS les plus connus
836             sont Prefork et Worker. Le MPM Prefork offre le même modèle
837             de processus enfants prélancés que celui d'Apache 1.3. Le
838             MPM Worker quant à lui, lance un nombre de processus enfants
839             moins important, mais attribue à chacun d'entre eux un
840             certain nombre de threads pour traiter les requêtes. Avec la
841             version 2.4, le MPM n'est plus défini à la compilation,
842             mais peut être chargé à l'exécution via la directive
843             <code class="directive"><a href="../mod/core.html#loadmodule">LoadModule</a></code>. Le MPM par
844             défaut pour la version 2.4 est le MPM event. 
845             </p>
846             <p>Le nombre maximum de process, à savoir le nombre de  processus
847             enfants prélancés et/ou de threads, donne une approximation
848             du nombre de requêtes que votre serveur peut traiter
849             simultanément. Ce n'est cependant qu'une estimation car le
850             noyau peut mettre en file d'attente des tentatives de
851             connexion à votre serveur. Lorsque votre site approche de la
852             saturation et si le nombre maximum de process est atteint, la
853             machine n'impose pas de limite absolue au
854             delà de laquelle les clients se verront refuser l'accès.
855             Cependant, lorsque les requêtes commencent à être mises en
856             file d'attente, les performances du système se dégradent
857             rapidement. 
858             </p>
859             <p>Enfin, si le serveur httpd en question n'exécute aucun
860             code tiers via <code>mod_php</code>, <code>mod_perl</code>,
861             etc..., nous recommandons l'utilisation de
862             <code class="module">mpm_event</code>. Ce MPM est idéal pour les
863             situations où httpd sert d'intermédiaire entre les clients
864             et des serveurs d'arrière-plan qui accomplissent le travail
865             proprement dit (par exemple en mode mandataire ou cache).
866             </p>
867             
868             
869             <h4><a name="MaxClients" id="MaxClients">MaxClients
870                 </a></h4>
871                 
872                 <p>La directive <code>MaxClients</code> permet de
873                 spécifier le nombre maximum de process que votre serveur
874                 pourra créer. Deux autres directives lui sont associées
875                 : <code>MinSpareServers</code> et
876                 <code>MaxSpareServers</code>, qui permettent d'encadrer
877                 le nombre de process que httpd garde en réserve pour
878                 traiter les requêtes. Le nombre total de process que
879                 httpd peut créer peut
880                 être défini via la directive <code>ServerLimit</code>. 
881                 </p>
882                 
883                 
884             
885             <h4><a name="spinning-threads" id="spinning-threads">Rotation des threads
886                 </a></h4>
887                 
888                 <p>Les directives ci-dessus suffisent pour définir les
889                 limites des nombres de process dans le cas du MPM Prefork.
890                 Cependant, si vous utilisez un MPM à base de threads, la
891                 situation est un peu plus compliquée. Les MPMs à base de
892                 threads supportent la directive
893                 <code>ThreadsPerChild</code>. httpd impose le fait que
894                 <code>MaxClients</code> doit être divisible par
895                 <code>ThreadsPerChild</code>. Si les valeurs que vous
896                 attribuez à ces deux directives ne respectent pas cette
897                 règle, httpd affichera un message d'erreur et corrigera
898                 la valeur de la directive <code>ThreadsPerChild</code>
899                 en la diminuant jusqu'à ce que la valeur de la directive
900                 <code>MaxClients</code> soit divisible par elle.
901                 </p>
902                 
903                 
904             
905             <h4><a name="sizing-maxClients" id="sizing-maxClients">Choix de la valeur de MaxClients
906                 </a></h4>
907                 
908                 <p>Idéalement, le nombre maximum de processus devrait
909                 être choisi de façon à ce que toute la mémoire système
910                 soit utilisée, sans la dépasser. En effet, si votre
911                 système est surchargé au point de devoir faire appel de
912                 manière intensive au swap (utilisation de la mémoire
913                 disque), les performances vont se dégrader rapidement.
914                 La formule permettant de déterminer la valeur de
915                 <code class="directive"><a href="../mod/mpm_common.html#maxrequestworkers">MaxClients</a></code>
916                 est assez simple : 
917                 </p>
918                 
919                 <div class="example"><p><code>
920                     MaxClients = (RAM totale − RAM système − RAM pour
921                     les programmes externes) divisé par la RAM nécessaire pour
922                     chaque processus enfant.
923                 </code></p></div>
924                 
925                 <p>L'observation est la meilleure manière de déterminer
926                 les différentes quantités de mémoire allouées au
927                 système, aux programmes externes et aux processus httpd
928                 : à cet effet, vous pouvez utiliser les commandes top et
929                 free décrites plus haut pour étudier l'empreinte mémoire
930                 du système lorsque le serveur web n'est pas en cours
931                 d'exécution. Vous pouvez aussi étudier l'empreinte d'un
932                 processus type du serveur web via la commande top ; en
933                 effet, la plupart des implémentations de cette commande
934                 présentent une colonne Mémoire résidente (RSS - Resident
935                 Size) et Mémoire partagée (Shared Memory). 
936                 </p>
937                 <p>La différence entre ces deux colonnes est la
938                 quantité de mémoire par processus. Le segment de mémoire
939                 partagée n'existe effectivement qu'une seule fois, et
940                 est utilisé par le code et les bibliothèques chargées et
941                 la concurrence inter-processus (ou tableau de résultat -
942                 scoreboard) géré par Apache. La quantité de mémoire
943                 utilisée par chaque processus dépend fortement du nombre
944                 et du type de modules utilisés. La meilleure façon d'en
945                 déterminer les besoins consiste à générer une charge
946                 type pour votre site web et à observer l'importance que
947                 prennent les processus httpd. 
948                 </p>
949                 <p>La RAM pour les programmes externes comprend
950                 principalement la mémoire utilisée pour les programmes
951                 CGI et les scripts qui s'exécutent indépendamment des
952                 processus httpd. Par contre, si vous utilisez une
953                 machine virtuelle Java qui exécute Tomcat sur le même
954                 serveur, cette dernière va aussi nécessiter une quantité
955                 de mémoire significative. En conséquence, la formule
956                 ci-dessus qui sert à calculer la valeur maximale de
957                 <code>MaxClients</code> permet d'effectuer une première approche,
958                 mais ne constitue en aucun cas une science exacte. En
959                 cas de doute, soyez pragmatique et utilisez une valeur assez
960                 basse pour <code>MaxClients</code>. Le noyau Linux
961                 réserve une certaine quantité de mémoire pour la mise en
962                 cache des accès disque. Sous Solaris par contre, il faut disposer
963                 de suffisamment de mémoire RAM pour créer un processus,
964                 et si ce n'est pas le cas, httpd va démarrer avec un
965                 message d'erreur du style "No space left on device" dans
966                 le journal des erreurs, et sera incapable de créer
967                 d'autres processus httpd enfants ; une valeur trop
968                 élevée pour <code>MaxClients</code> constituera alors
969                 réellement un désavantage. 
970                 </p>
971                 
972             
973             <h4><a name="selecting-your-mpm" id="selecting-your-mpm">Choisir votre MPM
974                 </a></h4>
975                 
976                 <p>La commutation entre threads est plus
977                 aisée pour le système, et ceux-ci consomment moins de
978                 ressources que les processus ; c'est la raison
979                 principale pour laquelle il est recommandé de choisir un
980                 MPM threadé. Et
981                 ceci est encore plus flagrant pour certains systèmes
982                 d'exploitation que pour d'autres. Par exemple, sous
983                 Solaris ou AIX, la manipulation des processus est assez
984                 lourde en termes de ressources système ; l'utilisation
985                 d'un MPM threadé est donc tout à fait indiquée pour ces
986                 systèmes. Sous Linux en revanche, l'implémentation des
987                 threads utilise en fait un processus par thread. Les
988                 processus Linux sont assez légers, mais cela signifie qu'un
989                 MPM threadé présentera ici un gain en performance
990                 moindre que sous d'autres systèmes. 
991                 </p>
992                 <p>Dans certaines situations cependant, l'utilisation
993                 d'un MPM threadé peut induire des problèmes de
994                 stabilité. Par exemple, si un processus enfant du MPM
995                 prefork se crashe, au plus une connexion client sera
996                 affectée ; par contre, si un processus enfant threadé se
997                 crashe, ce sont tous les threads de ce processus qui
998                 vont se crasher à leur tour, ce qui signifie que tous
999                 les clients qui étaient servis par ce processus verront
1000                 leur connexion interrompue. De plus, certains problèmes
1001                 de sécurité des threads ("thread-safety")
1002                 peuvent apparaître, particulièrement avec les
1003                 bibliothèques tierces. Avec les applications threadées,
1004                 les différents threads peuvent avoir accès aux mêmes
1005                 variables sans distinction, sans savoir si une variable
1006                 n'a pas été modifiée par un autre thread.
1007                 </p>
1008                 <p>Ce problème a fait l'objet d'un point sensible au
1009                 sein de la communauté PHP car Le processeur PHP repose
1010                 fortement sur des bibliothèques tierces, et il n'est pas
1011                 garanti que la totalité d'entre elles soient
1012                 "thread-safe". Bonne nouvelle cependant : si vous
1013                 exécutez Apache sous Linux, vous pouvez utiliser PHP
1014                 avec le MPM prefork sans craindre une diminution de
1015                 performance trop importante par rapport à une option
1016                 threadée. 
1017                 </p>
1018                 
1019                 
1020             
1021             <h4><a name="spinning-locks" id="spinning-locks">Verrous tournants</a></h4>
1022                 
1023                 <p>Apache httpd maintient un verrou inter-processus du
1024                 point de vue de son écoute du réseau. Dans les faits,
1025                 cela signifie qu'un seul processus httpd enfant à la
1026                 fois peut recevoir une requête. Ainsi, soient les autres
1027                 processus en profitent alors pour traiter les requêtes
1028                 qu'ils ont déjà reçues, soient ils attendent de pouvoir
1029                 à leur tour récupérer le verrou et ainsi écouter le
1030                 réseau pour recevoir une nouvelle requête. Ceci peut se
1031                 voir comme une porte tournante par laquelle un seul
1032                 processus peut passer à la fois. Sur un serveur web
1033                 fortement chargé où les requêtes arrivent constamment,
1034                 la porte tourne rapidement et les requêtes sont
1035                 acceptées à un rythme soutenu. Sur un serveur faiblement
1036                 chargé en revanche, le processus qui "détient"
1037                 le verrou est suceptible de garder sa porte ouverte un
1038                 certain temps durant lequel tous les autres processus
1039                 seront inactifs, attendant de pouvoir s'approprier le
1040                 verrou. Dans une telle situation, le processus parent
1041                 pourra décider d'arrêter quelques processus enfants en
1042                 fonction de la valeur de la directive
1043                 <code>MaxSpareServers</code>.</p>
1044                 
1045             
1046             <h4><a name="the-thundering-herd" id="the-thundering-herd">L'assaut de la foule
1047                 </a></h4>
1048                 
1049                 <p>La fonction de l'"accept mutex" (c'est le nom donné au
1050                 verrou inter-processus) consiste à gérer la réception
1051                 des requêtes de manière ordonnée. Si ce verrou est
1052                 absent, le syndrome de l'"assaut de la foule" peut
1053                 apparaître. 
1054                 </p>
1055                 <p>Imaginez une équipe de football américain en attente
1056                 devant la ligne de remise en jeu. Si les joueurs se
1057                 comportaient comme des processus Apache, ils se
1058                 précipiteraient tous à la fois pour récupérer la balle au
1059                 signal de la reprise. Un seul d'entre eux y
1060                 parviendrait, et tous les autres n'auraient plus qu'à se
1061                 regrouper à nouveau sur la ligne jusqu'à la reprise
1062                 suivante. Dans cette métaphore, c'est le quaterback qui
1063                 va jouer le rôle d'"accept mutex" en donnant la balle
1064                 au joueur approprié. 
1065                 </p>
1066                 <p>La transmission d'une telle quantité d'informations
1067                 représente naturellement beaucoup de travail et, comme
1068                 une personne intelligente, un serveur intelligent
1069                 tentera d'éviter cette surcharge dans la mesure du
1070                 possible, d'où l'idée de la porte tournante. Dans les
1071                 dernières années, de nombreux systèmes d'exploitation,
1072                 comme Linux et Solaris, ont développé du code pour
1073                 éviter le syndrome de l'"assaut de la foule". Apache
1074                 reconnaît ce code, et si vous n'effectuez qu'une seule
1075                 écoute du réseau, autrement dit si vous n'utilisez que
1076                 le serveur principal ou un seul serveur virtuel, Apache
1077                 n'utilisera pas d'"accept mutex" ; par contre, si vous
1078                 effectuez plusieurs écoutes du réseau (par exemple si
1079                 un serveur virtuel sert les requêtes SSL), Apache
1080                 utilisera un "accept mutex" afin d'éviter les conflits
1081                 internes. 
1082                 </p>
1083                 <p>Vous pouvez manipuler l'"accept mutex" via la
1084                 directive <code>AcceptMutex</code>. Cette dernière
1085                 permet en particulier de fermer l'"accept mutex", mais
1086                 aussi de sélectionner le mécanisme de verrouillage. Les
1087                 mécanismes de verrouillage courants comprennent fcntl,
1088                 les sémaphores System V et le verrouillage par threads.
1089                 Tous ne sont pas supportés par toutes les plateformes,
1090                 et leur disponibilité dépend aussi des options de
1091                 compilation. Les différents mécanismes de verrouillage
1092                 peuvent avoir des exigences particulières en matière de
1093                 ressources système ; il est donc recommandé de les
1094                 utiliser avec précautions. 
1095                 </p>
1096                 <p>Il n'existe aucune raison particulière pour
1097                 désactiver l'"accept mutex". Apache détermine
1098                 automatiquement s'il doit utiliser ou non mutex sur
1099                 votre plateforme en fonction du nombre d'écoutes réseau
1100                 de votre serveur, comme décrit précédemment. 
1101                 </p>
1102                 
1103             
1104         
1105         <h3><a name="tuning-the-operating-system" id="tuning-the-operating-system">Optimisation du système d'exploitation
1106             </a></h3>
1107             
1108             <p>Souvent, les utilisateurs recherchent le paramètre magique qui va
1109             multiplier par quatre les performances de leur système. En
1110             fait, les systèmes de type Unix actuels sont déjà optimisés
1111             à l'origine, et il n'y a plus grand chose à faire pour
1112             améliorer leurs performances. L'administrateur peut
1113             cependant encore effectuer quelques modifications qui
1114             permettront de peaufiner la configuration. 
1115             </p>
1116             
1117             
1118             <h4><a name="ram-and-swap-space" id="ram-and-swap-space">RAM et swap
1119                 </a></h4>
1120                 
1121                 <p>Le leitmotiv en matière de mémoire est souvent "plus
1122                 on en a, mieux c'est". En effet, comme nous avons dit
1123                 plus haut, la mémoire inutilisée peut être
1124                 avantageusement utilisée comme cache du système de
1125                 fichiers. Plus vous chargez de modules, plus les processus
1126                 Apache grossissent, et ceci d'autant plus si vous
1127                 utilisez des modules qui génèrent des contenus
1128                 dynamiques comme PHP et mod_perl. Un gros fichier de
1129                 configuration - avec de nombreux serveurs virtuels - a
1130                 aussi tendance à augmenter l'empreinte mémoire des
1131                 processus. Une quantité de mémoire importante vous
1132                 permettra d'exécuter Apache avec plus de processus
1133                 enfants, et donc de traiter d'avantage de requêtes
1134                 simultanément. 
1135                 </p>
1136                 <p>Même si les différentes plateformes traitent leur
1137                 mémoire virtuelle de différentes manières, il est
1138                 déconseillé de configurer un espace disque de swap
1139                 inférieur à la mémoire RAM. En effet, le système de mémoire
1140                 virtuelle a été conçu de manière à prendre le relai
1141                 lorsque la mémoire RAM fait défaut, et lorsque l'espace
1142                 disque, et donc l'espace de swap vient à manquer, votre
1143                 serveur risque de s'arrêter. Vous devrez alors
1144                 redémarrer physiquement votre serveur, et votre
1145                 hébergeur pourra vous facturer le service. 
1146                 </p>
1147                 <p>Evidemment, ce genre problème survient au moment le
1148                 plus défavorable : lorsque le monde vient découvrir votre
1149                 site web et se présente avec insistance à votre porte.
1150                 Si votre espace de swap est suffisant, même si la
1151                 machine sera de plus en plus surchargée et deviendra
1152                 très très lente car le système devra swapper les pages
1153                 entre la mémoire et le disque, lorsque la charge diminuera à
1154                 nouveau, le système reviendra dans son mode de
1155                 fonctionnement normal. Rappelez-vous que vous disposez
1156                 de la directive <code>MaxClients</code> pour garder le contrôle.
1157                 </p>
1158                 <p>La plupart des systèmes de type Unix utilisent des
1159                 partitions dédiées au swap. Au démarrage du système,
1160                 celui-ci enregistre toutes les partitions de swap du ou
1161                 des disques en fonction du type de la partition ou du
1162                 contenu du fichier <code>/etc/fstab</code> et les
1163                 active de manière automatique. Lorsque vous ajoutez un
1164                 disque, ou lorsque vous installez le système
1165                 d'exploitation, assurez-vous d'allouer suffisamment
1166                 d'espace de swap afin de rester en adéquation avec une
1167                 éventuelle augmentation de la mémoire RAM. La
1168                 réallocation d'espace disque sur un système en
1169                 production est en effet pénible et fastidieuse. 
1170                 </p>
1171                 <p>Prévoyez un espace de swap de deux fois la taille de
1172                 votre mémoire RAM, et même jusqu'à quatre fois lorsque
1173                 les surcharges peuvent s'avérer fréquentes. Assurez-vous
1174                 de réajuster ces valeurs lorsque vous augmentez la
1175                 quantité de mémoire RAM de votre système. En secours,
1176                 vous pouvez aussi utilisez un fichier comme espace de
1177                 swap. Pour ce faire, vous trouverez les instructions
1178                 dans les pages de manuel de <code>mkswap</code> et
1179                 <code>swapon</code>, ou dans celles des programmes de
1180                 <code>swap</code>. 
1181                 </p>
1182                 
1183                
1184             
1185             <h4><a name="ulimit-files-and-processes" id="ulimit-files-and-processes">ulimit: fichiers et processus
1186                 </a></h4>
1187                 
1188                 <p>Supposons que vous disposiez d'une machine possédant
1189                 une énorme quantité de mémoire RAM et un processeur aux
1190                 performances astronomiques ; vous pourrez alors exécuter
1191                 des centaines de processus Apache selon vos besoins,
1192                 mais tout en restant en deçà des limites imposées par le
1193                 noyau de votre système. 
1194                 </p>
1195                 <p>Considérez maintenant une situation où plusieurs
1196                 centaines de serveurs web sont en cours d'exécution ; si
1197                 certains d'entre eux doivent à leur tour lancer des
1198                 processus CGI, le nombre maximum de processus autorisé
1199                 par le noyau sera vite atteint.
1200                 </p>
1201                 <p>Dans ce cas, vous pouvez modifier cette limite avec
1202                 la commande : 
1203                 </p>
1204                 
1205                 <div class="example"><p><code>
1206                     ulimit [-H|-S] -u [nouvelle valeur]
1207                 </code></p></div>
1208                 
1209                 <p>Cette modification doit être effectuée avant le
1210                 démarrage du serveur, car la nouvelle valeur ne sera
1211                 prise en compte que dans le shell courant et pour les
1212                 programmes lancés depuis ce dernier. Dans les derniers
1213                 noyaux Linux, la valeur par défaut a été fixée à 2048.
1214                 Sous FreeBSD, ce nombre semble être limité à la valeur
1215                 inhabituelle de 513. Dans le shell par défaut de ce
1216                 système, <code>csh</code>, la commande équivalente est
1217                 <code>limit</code> et possède une syntaxe analogue à
1218                 celle de la commande de style Bourne <code>ulimit</code> :
1219                 </p>
1220                 
1221                 <div class="example"><p><code>
1222                     limit [-h] maxproc [newvalue]
1223                 </code></p></div>
1224                 
1225                 <p>En outre, le noyau peut limiter le nombre de fichiers
1226                 ouverts par processus. Ce n'est généralement pas un
1227                 problème pour les serveurs dont les processus sont lancés
1228                 à l'avance, et où chacun de ceux-ci ne traite qu'une
1229                 requête à la fois. Les processus des serveurs threadés,
1230                 quant à eux, traitent plusieurs requêtes simultanément,
1231                 et sont d'avantage susceptibles de dépasser la limite du
1232                 nombre de descripteurs de fichiers. Vous pouvez alors
1233                 augmenter cette valeur limite du nombre de fichiers
1234                 ouverts avec la commande : 
1235                 </p>
1236                 
1237                 <div class="example"><p><code>ulimit -n [newvalue]
1238                 </code></p></div>
1239                 
1240                 <p>Là encore, cette modification doit être effectuée
1241                 avant le démarrage du serveur Apache. 
1242                 </p>
1243                 
1244                 
1245             
1246             <h4><a name="setting-user-limits-on-system-startup" id="setting-user-limits-on-system-startup">Définition des limites en fonction de l'utilisateur ou du
1247                 groupe au démarrage du système
1248                 </a></h4>
1249                 
1250                 <p>Sous Linux, vous pouvez définir les paramètres de
1251                 ulimit au démarrage en éditant le fichier
1252                 <code>/etc/security/limits.conf</code>. Ce fichier vous
1253                 permet de définir des limites "soft" et "hard"
1254                 en fonction de l'utilisateur ou du groupe ;
1255                 vous y trouverez aussi des commentaires explicatifs des
1256                 différentes options. Pour que ce fichier soit pris en
1257                 compte, le fichier <code>/etc/pam.d/login</code> doit
1258                 contenir la ligne : 
1259                 </p>
1260                 
1261                 <div class="example"><p><code>session required /lib/security/pam_limits.so
1262                 </code></p></div>
1263                 
1264                 <p>Chaque item peut posséder une valeur "soft" et
1265                 "hard" : la première est la valeur
1266                 par défaut, et la seconde la valeur maximale de cet
1267                 item. 
1268                 </p>
1269                 <p>Dans le fichier <code>/etc/login.conf</code> de
1270                 FreeBSD, ces valeurs peuvent être limitées ou étendues à
1271                 tout le système de manière analogue au fichier
1272                 <code>limits.conf</code>. Les limites "soft" sont
1273                 spécifiées via le paramètre <code>-cur</code>, et les
1274                 limites "hard" via le paramètre <code>-max</code>.
1275                 </p>
1276                 <p>Solaris possède un mécanisme similaire pour manipuler
1277                 les valeurs limites au démarrage du système : dans le
1278                 fichier <code>/etc/system</code>, vous pouvez définir au
1279                 démarrage des paramètres du noyau valables pour
1280                 l'ensemble du système. Ce sont les mêmes paramètres que
1281                 ceux définis à l'exécution par le débogueur de noyau
1282                 <code>mdb</code>. Les commandes équivalentes à ulimit -u
1283                 pour définir les limites hard et soft seront du style : 
1284                 </p>
1285                 
1286                 <div class="example"><p><code>
1287                     set rlim_fd_max=65536<br />
1288                     set rlim_fd_cur=2048
1289                 </code></p></div>
1290                 
1291                 <p>Solaris calcule le nombre maximal de processus
1292                 autorisé par utilisateur (<code>maxuprc</code>) en
1293                 fonction de la mémoire système disponible
1294                 (<code>maxusers</code>). Vous pouvez obtenir ces valeurs
1295                 avec la commande : 
1296                 </p>
1297                 
1298                 <div class="example"><p><code>sysdef -i | grep maximum
1299                 </code></p></div>
1300                 
1301                 <p>Il est cependant déconseillé de les modifier. 
1302                 </p>
1303                 
1304                 
1305             
1306             <h4><a name="turn-off-unused-services-and-modules" id="turn-off-unused-services-and-modules">Désactiver les services et modules non utilisés
1307                 </a></h4>
1308                 
1309                 <p>Dans la plupart des distributions Unix et Linux, de
1310                 nombreux services sont activés par défaut, et vous n'
1311                 avez probablement besoin que d'une minorité d'entre eux.
1312                 Par exemple, votre serveur web n'a pas besoin de
1313                 sendmail, de fournir le service NFS, etc... Désactivez
1314                 les tout simplement. 
1315                 </p>
1316                 <p>Pour ce faire, sous RedHat Linux, vous
1317                 disposez de l'utilitaire chkconfig en ligne de commande.
1318                 Sous Solaris, les commandes <code>svcs</code> et
1319                 <code>svcadm</code> vous permettent respectivement
1320                 de lister les services activés et de désactiver ceux
1321                 dont vous n'avez pas besoin. 
1322                 </p>
1323                 <p>Vous devez aussi prêter attention aux modules Apache
1324                 chargés par défaut. La plupart des distributions binaires
1325                 d'Apache httpd et des versions préinstallées fournies
1326                 avec les distributions de Linux chargent les modules
1327                 Apache via la directive
1328                 <code class="directive">LoadModule</code>. 
1329                 </p>
1330                 <p>Les modules inutilisés peuvent être désactivés : si
1331                 vous n'avez pas besoin de leurs fonctionnalités et des
1332                 directives de configuration qu'ils implémentent,
1333                 désactivez-les en commentant les lignes
1334                 <code class="directive">LoadModule</code> correspondantes. Vous
1335                 devez cependant lire la documentation relative à ces
1336                 modules avant de les désactiver, et garder à l'esprit que
1337                 la désactivation d'un module très peu gourmand en
1338                 ressources n'est pas absolument nécessaire. 
1339                 </p>
1340                 
1341                 
1342             
1343         
1344     </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
1345 <div class="section">
1346 <h2><a name="caching-content" id="caching-content">Mise en cache des contenus
1347         </a> <a title="Lien permanent" href="#caching-content" class="permalink">&para;</a></h2>
1348         
1349         <p>Les requêtes impliquant des contenus dynamiques nécessitent
1350         en général d'avantage de ressources que les
1351         requêtes pour des contenus statiques. Les contenus statiques
1352         consistent en simples pages issues de documents ou images
1353         sur disque, et sont servis très rapidement. En outre, de
1354         nombreux systèmes d'exploitation mettent automatiquement en
1355         cache en mémoire les contenus des fichiers fréquemment accédés. 
1356         </p>
1357         <p>Comme indiqué précédemment, le traitement des requêtes dynamiques peut
1358         nécessiter beaucoup plus de ressources. L'exécution de scripts
1359         CGI, le transfert de requêtes à un serveur d'applications
1360         externe, ou les accès à une base de données peuvent impliquer
1361         des temps d'attente et charges de travail significatifs pour un
1362         serveur web fortement sollicité. Dans de nombreuses
1363         circonstances, vous pourrez alors améliorer les performances en
1364         transformant les requêtes dynamiques courantes en requêtes
1365         statiques. Pour ce faire, deux approches seront discutées dans
1366         la suite de cette section. 
1367         </p>
1368         
1369         
1370         <h3><a name="making-popular-pages-static" id="making-popular-pages-static">Transformation des pages courantes en contenus
1371             statiques
1372             </a></h3>
1373             
1374             <p>En générant à l'avance les réponses pour les requêtes les
1375             plus courantes de votre application, vous pouvez améliorer
1376             de manière significative les performances de votre serveur
1377             sans abandonner la flexibilité des contenus générés
1378             dynamiquement. Par exemple, si votre application est un
1379             service de livraison de fleurs, vous aurez tout intérêt à
1380             générer à l'avance les pages de votre catalogue concernant
1381             les roses rouges dans les semaines précédant le jour de la
1382             Saint Valentin. Lorsqu'un utilisateur cherchera des roses
1383             rouges, il téléchargera alors les pages générées à
1384             l'avance. Par contre, les recherches de roses jaunes seront
1385             quant à elles traitées directement via une requête vers la
1386             base de données. Pour effectuer ces aiguillages de requêtes,
1387             vous disposez d'un outil particulièrement approprié fourni
1388             avec Apache : le module mod_rewrite. 
1389             </p>
1390             
1391             
1392             <h4><a name="example-a-statically-rendered-blog" id="example-a-statically-rendered-blog">Exemple : un blog servi statiquement
1393                 </a></h4>
1394                 
1395                     
1396                     
1397                 <p>Blosxom est un programme CGI de journalisation web
1398                 léger. Il est écrit en Perl et utilise des fichiers
1399                 texte pour ses entrées. Outre sa qualité de programme
1400                 CGI, Blosxom peut être exécuté en ligne de commande pour
1401                 générer à l'avance des pages de blog. Lorsque votre blog
1402                 commence à être lu par un grand nombre de personnes, la
1403                 génération à l'avance de pages en HTML satique peut
1404                 améliorer de manière significative les performances de
1405                 votre serveur. 
1406                 </p>
1407                 <p>Pour générer des pages statiques avec blosxom, éditez
1408                 le script CGI selon la documentation. Définissez la
1409                 variable $static dir à la valeur de
1410                 <code class="directive">DocumentRoot</code> de votre serveur
1411                 web, et exécutez le script en ligne de commande comme
1412                 suit : 
1413                 </p>
1414                 
1415                 <div class="example"><p><code>$ perl blosxom.cgi -password='whateveryourpassword'
1416                 </code></p></div>
1417                 
1418                 <p>Vous pouvez exécuter ce script périodiquement via
1419                 cron, à chaque fois que vous ajoutez un nouveau contenu. Pour
1420                 faire en sorte qu'Apache substitue les pages
1421                 statiques au contenu dynamique, nous
1422                 utiliserons mod_rewrite. Ce module est fourni avec le
1423                 code source d'Apache, mais n'est pas compilé par défaut.
1424                 Pour le compiler avec la distribution d'Apache, vous
1425                 pouvez utiliser l'option de la commande configure
1426                 <code>--enable-rewrite[=shared]</code>. De nombreuses
1427                 distributions binaires d'Apache sont fournies avec
1428                 <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> inclus. Dans l'exemple
1429                 suivant, un serveur virtuel Apache utilise les pages de
1430                 blog générées à l'avance : 
1431                 </p>
1432                 
1433 <pre class="prettyprint lang-config">Listen *:8001
1434   &lt;VirtualHost *:8001&gt;
1435       ServerName blog.sandla.org:8001
1436       ServerAdmin sander@temme.net
1437       DocumentRoot "/home/sctemme/inst/blog/httpd/htdocs"
1438       &lt;Directory "/home/sctemme/inst/blog/httpd/htdocs"&gt;
1439           Options +Indexes
1440           Require all granted
1441           RewriteEngine on
1442           RewriteCond "%{REQUEST_FILENAME}" "!-f"
1443           RewriteCond "%{REQUEST_FILENAME}" "!-d"
1444           RewriteRule "^(.*)$" "/cgi-bin/blosxom.cgi/$1" [L,QSA]
1445       &lt;/Directory&gt;
1446       RewriteLog "/home/sctemme/inst/blog/httpd/logs/rewrite_log"
1447       RewriteLogLevel 9
1448       ErrorLog "/home/sctemme/inst/blog/httpd/logs/error_log"
1449       LogLevel debug
1450       CustomLog "/home/sctemme/inst/blog/httpd/logs/access_log common"
1451       ScriptAlias "/cgi-bin/" "/home/sctemme/inst/blog/bin/"
1452       &lt;Directory "/home/sctemme/inst/blog/bin"&gt;
1453           Options +ExecCGI
1454           Require all granted
1455       &lt;/Directory&gt;
1456   &lt;/VirtualHost&gt;</pre>
1457
1458                 
1459                 <p>
1460                     Si les directives <code class="directive">RewriteCond</code>
1461                     indiquent que la ressource demandée n'existe ni en tant que
1462                     fichier, ni en tant que répertoire, son
1463                     chemin sera redirigé par la directive                  
1464                     <code class="directive">RewriteRule</code> vers le programme
1465                     CGI Blosxom qui va générer la réponse. Blosxom
1466                     utilise Path Info pour spécifier les entrées de blog
1467                     en tant que pages d'index, et si un chemin dans
1468                     Blosxom existe en tant que fichier statique dans le système de
1469                     fichiers, c'est ce dernier qui sera par conséquent privilégié.
1470                     Toute requête dont la réponse n'a pas été générée à
1471                     l'avance sera traitée par le programme CGI. Cela
1472                     signifie que les entrées individuelles comme les
1473                     commentaires seront toujours servies par le
1474                     programme CGI, et seront donc toujours visibles.
1475                     Cette configuration permet aussi de ne pas faire
1476                     apparaître le programme CGI Blosxom dans l'URL de la barre
1477                     d'adresse. Enfin, mod_rewrite est un module extrêmement
1478                     souple et puissant ; prenez le temps de bien
1479                     l'étudier afin de parvenir à la configuration qui
1480                     correspondra le mieux à votre situation. 
1481                 </p>
1482                 
1483                 
1484             
1485         
1486         <h3><a name="caching-content-with-mod_cache" id="caching-content-with-mod_cache">Mise en cache du contenu avec mod_cache
1487             </a></h3>
1488             
1489             <p>Le module mod_cache implémente une mise en cache
1490             intelligente des réponses HTTP : il tient compte des délais
1491             de péremption et des contraintes en matière de contenu
1492             inhérentes à la spécification HTTP. Le module mod_cache met
1493             en cache les URL des contenus des réponses. Si un contenu envoyé au
1494             client peut être mis en cache, il est sauvegardé sur disque.
1495             Les requêtes ultérieures pour cette URL seront alors servies
1496             directement depuis le cache. Le module fournisseur pour
1497             mod_cache, mod_disk_cache, détermine la manière dont les
1498             contenus sont stockés sur disque. La plupart des systèmes de
1499             serveur possèdent plus d'espace disque que de mémoire, et il
1500             est bon de garder à l'esprit que certains noyaux système mettent en
1501             cache de manière transparente en mémoire les contenus sur
1502             disque fréquemment accédés ; il n'est donc pas très utile de
1503             répéter cette opération au niveau du serveur. 
1504             </p>
1505             <p>Pour mettre en oeuvre une mise en cache de contenu
1506             efficace et éviter de présenter à l'utilisateur un contenu
1507             invalide ou périmé, l'application qui génère le contenu à
1508             jour doit envoyer les en-têtes de réponse corrects. En
1509             effet, en l'absence d'en-têtes comme <code>Etag:</code>,
1510             <code>Last-Modified:</code> ou <code>Expires:</code>,
1511             <code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code> ne sera pas en mesure de décider
1512             de manière appropriée
1513             s'il doit mettre le contenu en cache, s'il doit le servir
1514             directement depuis ce dernier, ou s'il doit tout simplement
1515             ne rien faire. Lorsque vous testerez la mise en cache, vous
1516             devrez peut-être modifier votre application ou, en cas
1517             d'impossibilité, désactiver de manière sélective la mise en
1518             cache des URLs qui posent problème. Les modules mod_cache ne
1519             sont pas compilés par défaut ; pour ce faire, vous devez
1520             utiliser l'option <code>--enable-cache[=shared]</code> du
1521             script configure. Si vous utilisez une distribution binaire
1522             d'Apache httpd, ou si elle fait partie de votre portage ou
1523             de votre sélection de paquets, <code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code>
1524             sera probablement déjà inclus. 
1525             </p>
1526             
1527             
1528             <h4><a name="example-wiki" id="example-wiki">Exemple : wiki.apache.org
1529                 </a></h4>
1530                 
1531                     
1532                 <p>
1533                     Le Wiki de l'Apache Software Foundation est servi
1534                     par MoinMoin. MoinMoin est écrit en Python et
1535                     s'exécute en tant que programme CGI. A l'heure
1536                     actuelle, toute tentative pour l'exécuter via
1537                     mod_python s'est soldée par un échec. Le programme
1538                     CGI induit une charge inacceptable sur le serveur,
1539                     particulièrement lorsque le Wiki est indexé par des
1540                     moteurs de recherche comme Google. Pour alléger la
1541                     charge de la machine, l'équipe d'infrastructure
1542                     d'Apache s'est tournée vers mod_cache. Il s'est
1543                     avéré que <a href="/httpd/MoinMoin">MoinMoin</a>
1544                     nécessitait un petit patch pour adopter un
1545                     comportement approprié en aval du serveur de mise
1546                     en cache : certaines requêtes ne pouvaient jamais
1547                     être mises en cache, et les modules Python
1548                     concernés ont été mis à jour pour pouvoir envoyer
1549                     les en-têtes de réponse HTTP corrects. Après cette
1550                     modification, la mise en cache en amont du Wiki a
1551                     été activée via l'insertion des lignes suivantes
1552                     dans le fichier de configuration
1553                     <code>httpd.conf</code> :
1554                 </p>
1555                 
1556 <pre class="prettyprint lang-config">CacheRoot /raid1/cacheroot
1557 CacheEnable disk /
1558 # Une page modifiée il y a 100 minutes expirera dans 10 minutes
1559 CacheLastModifiedFactor .1
1560 # Dans tous les cas, vérifier la validité des pages après 6 heures
1561 CacheMaxExpire 21600</pre>
1562
1563                 
1564                 <p>Cette configuration essaie de mettre en cache tout
1565                 contenu de son serveur virtuel. Elle ne mettra jamais en
1566                 cache un contenu plus vieux que 6 heures (voir la
1567                 directive <code class="directive"><a href="../mod/mod_cache.html#cachemaxexpire">CacheMaxExpire</a></code>). Si
1568                 l'en-tête <code>Expires:</code> est absent de la
1569                 réponse, <code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code> va calculer une date
1570                 d'expiration en fonction du contenu de l'en-tête
1571                 <code>Last-Modified:</code>. Le principe de ce calcul
1572                 qui utilise la directive <code class="directive"><a href="../mod/mod_cache.html#cachelastmodifiedfactor">CacheLastModifiedFactor</a></code>
1573                 se base sur l'hypothèse que si une page a été modifiée
1574                 récemment, il y a de fortes chances pour qu'elle le soit
1575                 à nouveau dans un futur proche et devra donc être remise
1576                 en cache. 
1577                 </p>
1578                 <p>
1579                     Notez qu'il peut s'avérer payant de
1580                     <em>désactiver</em> l'en-tête <code>ETag:</code> :
1581                     pour les fichiers inférieurs à 1 ko, le serveur
1582                     doit calculer la somme de vérification checksum (en
1583                     général MD5) et envoyer une réponse <code>304 Not
1584                     Modified</code>, ce qui utilise des ressources CPU
1585                     et réseau pour le transfert (1 paquet TCP). Pour les
1586                     ressources supérieures à 1 ko, les ressources CPU
1587                     consommées peuvent devenir importantes car l'en-tête
1588                     est calculé à chaque requête. Malheureusement, il
1589                     n'existe actuellement aucun moyen pour mettre en
1590                     cache ces en-têtes. 
1591                 </p>
1592 <pre class="prettyprint lang-config">&lt;FilesMatch "\.(jpe?g|png|gif|js|css|x?html|xml)"&gt;
1593     FileETag None
1594 &lt;/FilesMatch&gt;</pre>
1595
1596                 
1597                 <p>
1598                     Dans l'exemple précédent: la génération d'un en-tête
1599                     <code>ETag:</code> sera désactivée pour la plupart
1600                     des ressources statiques. Le serveur ne génère pas
1601                     ces en-têtes pour les ressources dynamiques. 
1602                 </p>
1603                 
1604                 
1605             
1606         
1607     </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
1608 <div class="section">
1609 <h2><a name="further-considerations" id="further-considerations">Pour aller plus loin
1610         </a> <a title="Lien permanent" href="#further-considerations" class="permalink">&para;</a></h2>
1611         
1612         <p>Armés du savoir-faire pour personnaliser un système afin
1613         qu'il affiche les performances désirées, nous découvrirons vite
1614         qu'<em>1</em> sytème à lui seul peut constituer un goulot
1615         d'étranglement. A ce sujet, la page du Wiki <a href="http://wiki.apache.org/httpd/PerformanceScalingOut">PerformanceScalingOut</a>
1616         décrit comment adapter un système à mesure qu'il prend de
1617         l'ampleur, ou comment personnaliser plusieurs systèmes dans leur
1618         ensemble.
1619         </p>
1620     </div></div>
1621 <div class="bottomlang">
1622 <p><span>Langues Disponibles: </span><a href="../en/misc/perf-scaling.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
1623 <a href="../es/misc/perf-scaling.html" hreflang="es" rel="alternate" title="Español">&nbsp;es&nbsp;</a> |
1624 <a href="../fr/misc/perf-scaling.html" title="Français">&nbsp;fr&nbsp;</a></p>
1625 </div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Commentaires</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
1626 <script type="text/javascript"><!--//--><![CDATA[//><!--
1627 var comments_shortname = 'httpd';
1628 var comments_identifier = 'http://httpd.apache.org/docs/trunk/misc/perf-scaling.html';
1629 (function(w, d) {
1630     if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
1631         d.write('<div id="comments_thread"><\/div>');
1632         var s = d.createElement('script');
1633         s.type = 'text/javascript';
1634         s.async = true;
1635         s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
1636         (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
1637     }
1638     else {
1639         d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
1640     }
1641 })(window, document);
1642 //--><!]]></script></div><div id="footer">
1643 <p class="apache">Copyright 2019 The Apache Software Foundation.<br />Autorisé sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
1644 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
1645 if (typeof(prettyPrint) !== 'undefined') {
1646     prettyPrint();
1647 }
1648 //--><!]]></script>
1649 </body></html>