]> granicus.if.org Git - apache/blob - docs/manual/mod/mod_unique_id.html.fr
Fix xml validation error
[apache] / docs / manual / mod / mod_unique_id.html.fr
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>mod_unique_id - 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>
19 <div id="page-header">
20 <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>
21 <p class="apache">Serveur HTTP Apache Version 2.5</p>
22 <img alt="" src="../images/feather.png" /></div>
23 <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
24 <div id="path">
25 <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="./">Modules</a></div>
26 <div id="page-content">
27 <div id="preamble"><h1>Module Apache mod_unique_id</h1>
28 <div class="toplang">
29 <p><span>Langues Disponibles: </span><a href="../en/mod/mod_unique_id.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
30 <a href="../fr/mod/mod_unique_id.html" title="Français">&nbsp;fr&nbsp;</a> |
31 <a href="../ja/mod/mod_unique_id.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
32 <a href="../ko/mod/mod_unique_id.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
33 </div>
34 <table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Fournit une variable d'environnement contenant un
35 identifiant unique pour chaque requête</td></tr>
36 <tr><th><a href="module-dict.html#Status">Statut:</a></th><td>Extension</td></tr>
37 <tr><th><a href="module-dict.html#ModuleIdentifier">Identificateur de Module:</a></th><td>unique_id_module</td></tr>
38 <tr><th><a href="module-dict.html#SourceFile">Fichier Source:</a></th><td>mod_unique_id.c</td></tr></table>
39 <h3>Sommaire</h3>
40
41
42     <p>Ce module fournit un identifiant dont l'unicité est garantie
43     parmi "toutes" les requêtes sous des conditions très précises.
44     L'identifiant unique le sera aussi parmi plusieurs machines
45     appartenant à un cluster correctement configuré. L'identifiant est
46     affecté à la variable d'environnement <code>UNIQUE_ID</code> pour
47     chaque requête. Les identifiants uniques sont utiles pour diverses
48     raisons dont la nature se situe au delà de la portée de ce
49     document.</p>
50 </div>
51 <div id="quickview"><h3>Sujets</h3>
52 <ul id="topics">
53 <li><img alt="" src="../images/down.gif" /> <a href="#theory">Théorie</a></li>
54 </ul><h3 class="directives">Directives</h3>
55 <p>Ce module ne fournit aucune directive.</p>
56 <h3>Traitement des bugs</h3><ul class="seealso"><li><a href="https://www.apache.org/dist/httpd/CHANGES_2.4">Journal des modifications de httpd</a></li><li><a href="https://bz.apache.org/bugzilla/buglist.cgi?bug_status=__open__&amp;list_id=144532&amp;product=Apache%20httpd-2&amp;query_format=specific&amp;order=changeddate%20DESC%2Cpriority%2Cbug_severity&amp;component=mod_unique_id">Problèmes connus</a></li><li><a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2&amp;component=mod_unique_id">Signaler un bug</a></li></ul><h3>Voir aussi</h3>
57 <ul class="seealso">
58 <li><a href="#comments_section">Commentaires</a></li></ul></div>
59 <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
60 <div class="section">
61 <h2><a name="theory" id="theory">Théorie</a><a title="Lien permanent" href="#theory" class="permalink">&para;</a></h2>
62     
63
64     <p>Tout d'abord un bref rappel de la manière dont le serveur Apache
65     fonctionne sous Unix (cette fonctionnalité n'étant actuellement pas
66     supportée sous Windows NT). Sous Unix, Apache crée plusieurs
67     processus enfants, ces derniers traitant les requêtes une par une.
68     Chaque processus enfant peut traiter plusieurs requêtes pendant sa
69     durée de vie. Dans le cadre de cette discussion, nous supposerons
70     que les différents processus enfants ne s'échangent pas de données
71     entre eux. Nous nous référerons aux processus enfants sous le nom de
72     <dfn>processus httpd</dfn>.</p>
73
74     <p>Votre site web est réparti entre une ou plusieurs machines dont
75     vous êtes l'administrateur, et que nous nommerons cluster de
76     serveurs. Chaque serveur peut exécuter plusieurs instances d'Apache.
77     L'ensemble de ces dernières sera considéré comme "l'Univers", et
78     sous certaines hypothèses, nous montrerons qu'il est possible dans
79     cet univers, de générer des identifiants uniques pour chaque
80     requête, sans pour autant nécessiter une communication importante
81     entre les différents serveurs du cluster.</p>
82
83     <p>Les machines de votre cluster doivent satisfaire ces conditions
84     (même si le cluster ne comporte qu'une machine, vous devez
85     synchroniser son horloge avec NTP) :</p>
86
87     <ul>
88       <li>Les temps des machines sont synchronisés via NTP ou tout autre
89       protocole de synchronisation du temps en réseau.</li>
90
91       <li>Les nom d'hôtes des machines sont tous différents, de façon à
92       ce que le module puisse recevoir une adresse IP différente pour
93       chaque machine du cluster en effectuant une recherche sur le nom
94       d'hôte.</li>
95     </ul>
96
97     <p>Au vu des caractéristiques actuelles du système d'exploitation,
98     nous supposerons que les pids (identifiants processus) sont codés
99     sur 32 bits. Si le système d'exploitation utilise plus de 32 bits
100     pour un pid, la correction est triviale mais doit être effectuée
101     dans le code.</p>
102
103     <p>Ces hypothèses posées, à un instant donné, nous pouvons
104     distinguer tout processus httpd sur toute machine du cluster de tous
105     les autres processus httpd. Pour ce faire, il suffit d'utiliser
106     l'adresse IP de la machine et le pid du processus httpd. Un
107     processus httpd peut traiter plusieurs requêtes simultanément si
108     vous utilisez un module MPM multi-threadé. Pour identifier les
109     threads, Apache httpd utilise en interne un index de threads. Ainsi,
110     afin de générer des identifiants uniques pour chaque requête, il
111     suffit d'effectuer une distinction en fonction du temps.</p>
112
113     <p>Pour déterminer le temps, nous utiliserons un repère de temps
114     Unix (les secondes écoulées depuis le 1er janvier 1970 UTC), et un
115     compteur 16 bits. La précision du repère de temps n'étant que d'une
116     seconde, le compteur va représenter 65536 valeurs par seconde. Le
117     quadruplet <em>(adresse IP, pid, repère de temps, compteur)</em> est
118     en mesure de distinguer 65536 requêtes par seconde par processus
119     httpd. Il peut cependant arriver que le même pid soit réutilisé au
120     cours du temps, et le compteur est là pour pallier cet
121     inconvénient.</p>
122
123     <p>Lorsqu'un processus enfant httpd est créé, le compteur est
124     initialisé avec (nombre de microsecondes actuel divisé par 10)
125     modulo 65536 (cette formule a été choisie pour éliminer certains
126     problème de variance avec les bits de poids faibles du compteur de
127     microsecondes sur certains systèmes). Lorsqu'un identifiant unique
128     est généré, le repère de temps utilisé est le moment où la requête
129     arrive sur le serveur web. Le compteur est incrémenté à chaque
130     création d'identifiant (et peut repasser à 0 lorsqu'il a atteint sa
131     valeur maximale).</p>
132
133     <p>Le noyau génère un pid pour chaque processus lors de sa création,
134     et le compteur de pid est réinitialisé à une certaine valeur
135     lorsqu'il a atteint sa valeur maximale (les pid sont codés sur 16
136     bits sous de nombreux Unixes, mais les systèmes les plus récents les
137     ont étendus à 32 bits). La même valeur de pid pourra donc être
138     réutilisée au cours du temps. Cependant, tant qu'elle n'est pas
139     réutilisée dans la même seconde, elle ne remet pas en cause
140     l'unicité de notre quadruplet. Nous supposerons donc que le système
141     ne créera pas plus de 65536 processus en une seconde (ce nombre peut
142     être de 32768 sous certains Unixes, mais même dans ce cas, on est en
143     général loin de cette situation).</p>
144
145     <p>Il est possible que le temps se répète pour une raison
146     quelconque.
147     Supposons par exemple que l'horloge système soit retardée et repasse
148     par un temps passé (ou bien, comme elle avançait, elle a été remise
149     à l'heure, et elle repasse par un temps futur). Dans ce cas, il peut
150     être facilement démontré que le couple pid/repère de temps peut être
151     réutilisé. Le choix de la formule d'initialisation du compteur a
152     été effectué dans l'intention de pallier ce problème. Notez qu'un
153     nombre vraiment aléatoire serait souhaitable pour initialiser le
154     compteur, mais il n'existe pas de tel nombre directement lisible sur
155     la plupart des systèmes (c'est à dire que vous ne pouvez pas
156     utiliser rand() car vous devez déclencher le générateur avec une
157     valeur unique, et vous ne pouvez pas utiliser le temps à cet effet
158     car celui-ci , au moins à la seconde près, s'est répété). Il ne
159     s'agit donc pas d'une défense parfaite.</p>
160
161     <p>Même si elle n'est pas parfaite, quel est le degré d'efficacité
162     de cette défense ? Supposons
163     qu'une de vos machines serve au plus 500 requêtes par seconde (ce
164     qui constitue une limite supérieure très raisonnable au moment où ce
165     document est écrit, car les systèmes ne se contentent en général pas
166     de débiter des fichiers statiques). Pour y parvenir, un certain nombre
167     de processus enfants sera nécessaire, qui dépendra du nombre de
168     clients simultanés présents. Mais soyons pessimiste et supposons
169     qu'un seul processus enfant soit capable de servir 500 requêtes par
170     secondes.
171     Il existe 1000 valeurs de démarrage possibles du compteur pour
172     lesquelles deux séquences de 500 requêtes puissent se recouvrir. Il
173     y a donc 1,5% de chance que le processus enfant répète une valeur de
174     compteur si le temps se répète (avec une résolution d'une seconde),
175     et l'unicité sera alors remise en cause. C'est cependant un exemple
176     très pessimiste, et avec les valeurs du monde réel, il y a bien
177     moins de chances que cela ne se produise. Si vous estimez que ceci a
178     tout de même quelque chances de se produire sur votre système, vous
179     pouvez migrer vers un compteur à 32 bits (en modifiant le code).</p>
180
181     <p>On pourrait supposer que ceci a plus de chance de se produire
182     lors du passage à l'heure d'hiver où l'horloge est "retardée". Cela
183     ne constitue cependant pas un problème car les temps pris en compte
184     ici sont des temps UTC, qui vont "toujours" de l'avant. Notez que
185     les Unixes à base de processeur x86 peuvent nécessiter une
186     configuration particulière pour que ceci soit vrai -- il doivent
187     être configurés pour assumer que l'horloge système est en UTC et
188     compenser de manière appropriée. Mais même dans ce cas, si vous
189     utilisez NTP, votre temps UTC sera correct peu après le
190     redémarrage.</p>
191
192     
193     <p>La variable d'environnement <code>UNIQUE_ID</code> est construite
194     par codage du quadruplet de 144 bits (adresse IP sur 32 bits, pid
195     sur 32 bits, repère de temps sur 32 bits, compteur 16 bits et index
196     de threads sur 32 bits) en
197     utilisant l'alphabet <code>[A-Za-z0-9@-]</code> d'une manière
198     similaire à celle du codage MIME base64, et sa valeur se présente
199     sous la forme d'une chaîne de 24 caractères. L'alphabet MIME base64
200     est en fait <code>[A-Za-z0-9+/]</code> ; cependant, les caractères
201     <code>+</code> et <code>/</code> nécessitent un codage particulier
202     dans les URLs, ce qui rend leur utilisation peu commode. Toutes les
203     valeurs sont codées dans l'ordre des octets d'une adresse réseau de
204     façon à ce
205     que le codage soit comparable entre des architectures où l'ordre des
206     octets est différent. L'ordre réel de codage est : repère de temps,
207     adresse IP, pid, compteur. Cet ordre de codage possède un but
208     précis, mais il faut souligner que les applications n'ont aucun
209     intérêt à entrer dans les détails de ce codage. Les applications
210     doivent se contenter de traiter la variable <code>UNIQUE_ID</code>
211     comme un symbole opaque, qui peut être comparé avec d'autres
212     <code>UNIQUE_ID</code>s en ne testant que leur égalité.</p>
213
214     <p>L'ordre a été choisi de façon à ce qu'il soit possible de
215     modifier le codage dans le futur sans avoir à se préoccuper de
216     conflits éventuels avec une base de données de
217     <code>UNIQUE_ID</code>s existante. Les nouveaux codages doivent
218     conserver le repère de temps comme premier élément, et pour le
219     reste, utiliser les même alphabet et longueur en bits. Comme les
220     repères de temps constituent essentiellement un séquence croissante,
221     il suffit que toutes les machines du cluster arrêtent de traiter
222     toute requête dans la même <em>seconde repère</em>, et n'utilisent
223     alors plus l'ancien format de codage. Ensuite, elles peuvent
224     reprendre le traitement des requêtes en utilisant les nouveaux
225     codages.</p>
226
227     <p>Nous pensons que ceci apporte une solution relativement portable
228     au problème. Les
229     identifiants générés possèdent une durée de vie pratiquement infinie
230     car les identifiants futurs pourront être allongés selon les
231     besoins. Pratiquement aucune communication n'est requise entre les
232     machines du cluster (seule la synchronisation NTP est requise, ce
233     qui représente une charge très faible), et aucune communication
234     entre les processus httpd n'est nécessaire (la communication est
235     implicite et incluse dans le pid assigné par le noyau). Dans des
236     situations très spécifiques, l'identifiant peut être raccourci, mais
237     dans ce cas, d'avantage d'informations doivent être admises (par
238     exemple, les 32 bits de l'adresse IP sont excessifs pour la plupart
239     des sites, mais il n'existe pas de valeur de remplacement portable
240     plus courte).</p>
241 </div>
242 </div>
243 <div class="bottomlang">
244 <p><span>Langues Disponibles: </span><a href="../en/mod/mod_unique_id.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
245 <a href="../fr/mod/mod_unique_id.html" title="Français">&nbsp;fr&nbsp;</a> |
246 <a href="../ja/mod/mod_unique_id.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
247 <a href="../ko/mod/mod_unique_id.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
248 </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>
249 <script type="text/javascript"><!--//--><![CDATA[//><!--
250 var comments_shortname = 'httpd';
251 var comments_identifier = 'http://httpd.apache.org/docs/trunk/mod/mod_unique_id.html';
252 (function(w, d) {
253     if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
254         d.write('<div id="comments_thread"><\/div>');
255         var s = d.createElement('script');
256         s.type = 'text/javascript';
257         s.async = true;
258         s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
259         (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
260     }
261     else {
262         d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
263     }
264 })(window, document);
265 //--><!]]></script></div><div id="footer">
266 <p class="apache">Copyright 2018 The Apache Software Foundation.<br />Autorisé sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
267 <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[//><!--
268 if (typeof(prettyPrint) !== 'undefined') {
269     prettyPrint();
270 }
271 //--><!]]></script>
272 </body></html>