]> granicus.if.org Git - apache/blob - docs/manual/mod/mod_unique_id.xml.fr
Update docco xforms
[apache] / docs / manual / mod / mod_unique_id.xml.fr
1 <?xml version="1.0"?>
2 <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
3 <?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
4 <!-- English Revision : 981084 -->
5 <!-- French translation : Lucien GENTIS -->
6 <!-- Reviewed by : Vincent Deffontaines -->
7
8 <!--
9  Licensed to the Apache Software Foundation (ASF) under one or more
10  contributor license agreements.  See the NOTICE file distributed with
11  this work for additional information regarding copyright ownership.
12  The ASF licenses this file to You under the Apache License, Version 2.0
13  (the "License"); you may not use this file except in compliance with
14  the License.  You may obtain a copy of the License at
15
16      http://www.apache.org/licenses/LICENSE-2.0
17
18  Unless required by applicable law or agreed to in writing, software
19  distributed under the License is distributed on an "AS IS" BASIS,
20  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  See the License for the specific language governing permissions and
22  limitations under the License.
23 -->
24
25 <modulesynopsis metafile="mod_unique_id.xml.meta">
26
27 <name>mod_unique_id</name>
28 <description>Fournit une variable d'environnement contenant un
29 identifiant unique pour chaque requ&ecirc;te</description>
30 <status>Extension</status>
31 <sourcefile>mod_unique_id.c</sourcefile>
32 <identifier>unique_id_module</identifier>
33
34 <summary>
35
36     <p>Ce module fournit un identifiant dont l'unicit&eacute; est garantie
37     parmi "toutes" les requ&ecirc;tes sous des conditions tr&egrave;s pr&eacute;cises.
38     L'identifiant unique le sera aussi parmi plusieurs machines
39     appartenant &agrave; un cluster correctement configur&eacute;. L'identifiant est
40     affect&eacute; &agrave; la variable d'environnement <code>UNIQUE_ID</code> pour
41     chaque requ&ecirc;te. Les identifiants uniques sont utiles pour diverses
42     raisons dont la nature se situe au del&agrave; de la port&eacute;e de ce
43     document.</p>
44 </summary>
45
46 <section id="theory">
47     <title>Th&eacute;orie</title>
48
49     <p>Tout d'abord un bref rappel de la mani&egrave;re dont le serveur Apache
50     fonctionne sous Unix (cette fonctionnalit&eacute; n'&eacute;tant actuellement pas
51     support&eacute;e sous Windows NT). Sous Unix, Apache cr&eacute;e plusieurs
52     processus enfants, ces derniers traitant les requ&ecirc;tes une par une.
53     Chaque processus enfant peut traiter plusieurs requ&ecirc;tes pendant sa
54     dur&eacute;e de vie. Dans le cadre de cette discussion, nous supposerons
55     que les diff&eacute;rents processus enfants ne s'&eacute;changent pas de donn&eacute;es
56     entre eux. Nous nous r&eacute;f&eacute;rerons aux processus enfants sous le nom de
57     <dfn>processus httpd</dfn>.</p>
58
59     <p>Votre site web est r&eacute;parti entre une ou plusieurs machines dont
60     vous &ecirc;tes l'administrateur, et que nous nommerons cluster de
61     serveurs. Chaque serveur peut ex&eacute;cuter plusieurs instances d'Apache.
62     L'ensemble de ces derni&egrave;res sera consid&eacute;r&eacute; comme "l'Univers", et
63     sous certaines hypoth&egrave;ses, nous montrerons qu'il est possible dans
64     cet univers, de g&eacute;n&eacute;rer des identifiants uniques pour chaque
65     requ&ecirc;te, sans pour autant n&eacute;cessiter une communication importante
66     entre les diff&eacute;rents serveurs du cluster.</p>
67
68     <p>Les machines de votre cluster doivent satisfaire ces conditions
69     (m&ecirc;me si le cluster ne comporte qu'une machine, vous devez
70     synchroniser son horloge avec NTP) :</p>
71
72     <ul>
73       <li>Les temps des machines sont synchronis&eacute;s via NTP ou tout autre
74       protocole de synchronisation du temps en r&eacute;seau.</li>
75
76       <li>Les nom d'h&ocirc;tes des machines sont tous diff&eacute;rents, de fa&ccedil;on &agrave;
77       ce que le module puisse recevoir une adresse IP diff&eacute;rente pour
78       chaque machine du cluster en effectuant une recherche sur le nom
79       d'h&ocirc;te.</li>
80     </ul>
81
82     <p>Au vu des caract&eacute;ristiques actuelles du syst&egrave;me d'exploitation,
83     nous supposerons que les pids (identifiants processus) sont cod&eacute;s
84     sur 32 bits. Si le syst&egrave;me d'exploitation utilise plus de 32 bits
85     pour un pid, la correction est triviale mais doit &ecirc;tre effectu&eacute;e
86     dans le code.</p>
87
88     <p>Ces hypoth&egrave;ses pos&eacute;es, &agrave; un instant donn&eacute;, nous pouvons
89     distinguer tout processus httpd sur toute machine du cluster de tous
90     les autres processus httpd. Pour ce faire, il suffit d'utiliser
91     l'adresse IP de la machine et le pid du processus httpd. Un
92     processus httpd peut traiter plusieurs requ&ecirc;tes simultan&eacute;ment si
93     vous utilisez un module MPM multi-thread&eacute;. Pour identifier les
94     threads, Apache httpd utilise en interne un index de threads. Ainsi,
95     afin de g&eacute;n&eacute;rer des identifiants uniques pour chaque requ&ecirc;te, il
96     suffit d'effectuer une distinction en fonction du temps.</p>
97
98     <p>Pour d&eacute;terminer le temps, nous utiliserons un rep&egrave;re de temps
99     Unix (les secondes &eacute;coul&eacute;es depuis le 1er janvier 1970 UTC), et un
100     compteur 16 bits. La pr&eacute;cision du rep&egrave;re de temps n'&eacute;tant que d'une
101     seconde, le compteur va repr&eacute;senter 65536 valeurs par seconde. Le
102     quadruplet <em>(adresse IP, pid, rep&egrave;re de temps, compteur)</em> est
103     en mesure de distinguer 65536 requ&ecirc;tes par seconde par processus
104     httpd. Il peut cependant arriver que le m&ecirc;me pid soit r&eacute;utilis&eacute; au
105     cours du temps, et le compteur est l&agrave; pour pallier cet
106     inconv&eacute;nient.</p>
107
108     <p>Lorsqu'un processus enfant httpd est cr&eacute;&eacute;, le compteur est
109     initialis&eacute; avec (nombre de microsecondes actuel divis&eacute; par 10)
110     modulo 65536 (cette formule a &eacute;t&eacute; choisie pour &eacute;liminer certains
111     probl&egrave;me de variance avec les bits de poids faibles du compteur de
112     microsecondes sur certains syst&egrave;mes). Lorsqu'un identifiant unique
113     est g&eacute;n&eacute;r&eacute;, le rep&egrave;re de temps utilis&eacute; est le moment o&ugrave; la requ&ecirc;te
114     arrive sur le serveur web. Le compteur est incr&eacute;ment&eacute; &agrave; chaque
115     cr&eacute;ation d'identifiant (et peut repasser &agrave; 0 lorsqu'il a atteint sa
116     valeur maximale).</p>
117
118     <p>Le noyau g&eacute;n&egrave;re un pid pour chaque processus lors de sa cr&eacute;ation,
119     et le compteur de pid est r&eacute;initialis&eacute; &agrave; une certaine valeur
120     lorsqu'il a atteint sa valeur maximale (les pid sont cod&eacute;s sur 16
121     bits sous de nombreux Unixes, mais les syst&egrave;mes les plus r&eacute;cents les
122     ont &eacute;tendus &agrave; 32 bits). La m&ecirc;me valeur de pid pourra donc &ecirc;tre
123     r&eacute;utilis&eacute;e au cours du temps. Cependant, tant qu'elle n'est pas
124     r&eacute;utilis&eacute;e dans la m&ecirc;me seconde, elle ne remet pas en cause
125     l'unicit&eacute; de notre quadruplet. Nous supposerons donc que le syst&egrave;me
126     ne cr&eacute;era pas plus de 65536 processus en une seconde (ce nombre peut
127     &ecirc;tre de 32768 sous certains Unixes, mais m&ecirc;me dans ce cas, on est en
128     g&eacute;n&eacute;ral loin de cette situation).</p>
129
130     <p>Il est possible que le temps se r&eacute;p&egrave;te pour une raison
131     quelconque.
132     Supposons par exemple que l'horloge syst&egrave;me soit retard&eacute;e et repasse
133     par un temps pass&eacute; (ou bien, comme elle avan&ccedil;ait, elle a &eacute;t&eacute; remise
134     &agrave; l'heure, et elle repasse par un temps futur). Dans ce cas, il peut
135     &ecirc;tre facilement d&eacute;montr&eacute; que le couple pid/rep&egrave;re de temps peut &ecirc;tre
136     r&eacute;utilis&eacute;. Le choix de la formule d'initialisation du compteur a
137     &eacute;t&eacute; effectu&eacute; dans l'intention de pallier ce probl&egrave;me. Notez qu'un
138     nombre vraiment al&eacute;atoire serait souhaitable pour initialiser le
139     compteur, mais il n'existe pas de tel nombre directement lisible sur
140     la plupart des syst&egrave;mes (c'est &agrave; dire que vous ne pouvez pas
141     utiliser rand() car vous devez d&eacute;clencher le g&eacute;n&eacute;rateur avec une
142     valeur unique, et vous ne pouvez pas utiliser le temps &agrave; cet effet
143     car celui-ci , au moins &agrave; la seconde pr&egrave;s, s'est r&eacute;p&eacute;t&eacute;). Il ne
144     s'agit donc pas d'une d&eacute;fense parfaite.</p>
145
146     <p>M&ecirc;me si elle n'est pas parfaite, quel est le degr&eacute; d'efficacit&eacute;
147     de cette d&eacute;fense ? Supposons
148     qu'une de vos machines serve au plus 500 requ&ecirc;tes par seconde (ce
149     qui constitue une limite sup&eacute;rieure tr&egrave;s raisonnable au moment o&ugrave; ce
150     document est &eacute;crit, car les syst&egrave;mes ne se contentent en g&eacute;n&eacute;ral pas
151     de d&eacute;biter des fichiers statiques). Pour y parvenir, un certain nombre
152     de processus enfants sera n&eacute;cessaire, qui d&eacute;pendra du nombre de
153     clients simultan&eacute;s pr&eacute;sents. Mais soyons pessimiste et supposons
154     qu'un seul processus enfant soit capable de servir 500 requ&ecirc;tes par
155     secondes.
156     Il existe 1000 valeurs de d&eacute;marrage possibles du compteur pour
157     lesquelles deux s&eacute;quences de 500 requ&ecirc;tes puissent se recouvrir. Il
158     y a donc 1,5% de chance que le processus enfant r&eacute;p&egrave;te une valeur de
159     compteur si le temps se r&eacute;p&egrave;te (avec une r&eacute;solution d'une seconde),
160     et l'unicit&eacute; sera alors remise en cause. C'est cependant un exemple
161     tr&egrave;s pessimiste, et avec les valeurs du monde r&eacute;el, il y a bien
162     moins de chances que cela ne se produise. Si vous estimez que ceci a
163     tout de m&ecirc;me quelque chances de se produire sur votre syst&egrave;me, vous
164     pouvez migrer vers un compteur &agrave; 32 bits (en modifiant le code).</p>
165
166     <p>On pourrait supposer que ceci a plus de chance de se produire
167     lors du passage &agrave; l'heure d'hiver o&ugrave; l'horloge est "retard&eacute;e". Cela
168     ne constitue cependant pas un probl&egrave;me car les temps pris en compte
169     ici sont des temps UTC, qui vont "toujours" de l'avant. Notez que
170     les Unixes &agrave; base de processeur x86 peuvent n&eacute;cessiter une
171     configuration particuli&egrave;re pour que ceci soit vrai -- il doivent
172     &ecirc;tre configur&eacute;s pour assumer que l'horloge syst&egrave;me est en UTC et
173     compenser de mani&egrave;re appropri&eacute;e. Mais m&ecirc;me dans ce cas, si vous
174     utilisez NTP, votre temps UTC sera correct peu apr&egrave;s le
175     red&eacute;marrage.</p>
176
177     <!-- FIXME: thread_index is unsigned int, so not always 32bit.-->
178     <p>La variable d'environnement <code>UNIQUE_ID</code> est construite
179     par codage du quadruplet de 144 bits (adresse IP sur 32 bits, pid
180     sur 32 bits, rep&egrave;re de temps sur 32 bits, compteur 16 bits et index
181     de threads sur 32 bits) en
182     utilisant l'alphabet <code>[A-Za-z0-9@-]</code> d'une mani&egrave;re
183     similaire &agrave; celle du codage MIME base64, et sa valeur se pr&eacute;sente
184     sous la forme d'une cha&icirc;ne de 24 caract&egrave;res. L'alphabet MIME base64
185     est en fait <code>[A-Za-z0-9+/]</code> ; cependant, les caract&egrave;res
186     <code>+</code> et <code>/</code> n&eacute;cessitent un codage particulier
187     dans les URLs, ce qui rend leur utilisation peu commode. Toutes les
188     valeurs sont cod&eacute;es dans l'ordre des octets d'une adresse r&eacute;seau de
189     fa&ccedil;on &agrave; ce
190     que le codage soit comparable entre des architectures o&ugrave; l'ordre des
191     octets est diff&eacute;rent. L'ordre r&eacute;el de codage est : rep&egrave;re de temps,
192     adresse IP, pid, compteur. Cet ordre de codage poss&egrave;de un but
193     pr&eacute;cis, mais il faut souligner que les applications n'ont aucun
194     int&eacute;r&ecirc;t &agrave; entrer dans les d&eacute;tails de ce codage. Les applications
195     doivent se contenter de traiter la variable <code>UNIQUE_ID</code>
196     comme un symbole opaque, qui peut &ecirc;tre compar&eacute; avec d'autres
197     <code>UNIQUE_ID</code>s en ne testant que leur &eacute;galit&eacute;.</p>
198
199     <p>L'ordre a &eacute;t&eacute; choisi de fa&ccedil;on &agrave; ce qu'il soit possible de
200     modifier le codage dans le futur sans avoir &agrave; se pr&eacute;occuper de
201     conflits &eacute;ventuels avec une base de donn&eacute;es de
202     <code>UNIQUE_ID</code>s existante. Les nouveaux codages doivent
203     conserver le rep&egrave;re de temps comme premier &eacute;l&eacute;ment, et pour le
204     reste, utiliser les m&ecirc;me alphabet et longueur en bits. Comme les
205     rep&egrave;res de temps constituent essentiellement un s&eacute;quence croissante,
206     il suffit que toutes les machines du cluster arr&ecirc;tent de servir et
207     de requ&eacute;rir dans la m&ecirc;me <em>seconde rep&egrave;re</em>, et n'utilisent
208     alors plus l'ancien format de codage. Ensuite, elles peuvent
209     reprendre le traitement des requ&ecirc;tes en utilisant les nouveaux
210     codages.</p>
211
212     <p>Nous pensons que ceci apporte une solution relativement portable
213     au probl&egrave;me. Les
214     identifiants g&eacute;n&eacute;r&eacute;s poss&egrave;dent une dur&eacute;e de vie pratiquement infinie
215     car les identifiants futurs pourront &ecirc;tre allong&eacute;s selon les
216     besoins. Pratiquement aucune communication n'est requise entre les
217     machines du cluster (seule la synchronisation NTP est requise, ce
218     qui repr&eacute;sente une charge tr&egrave;s faible), et aucune communication
219     entre les processus httpd n'est n&eacute;cessaire (la communication est
220     implicite et incluse dans le pid assign&eacute; par le noyau). Dans des
221     situations tr&egrave;s sp&eacute;cifiques, l'identifiant peut &ecirc;tre raccourci, mais
222     dans ce cas, d'avantage d'informations doivent &ecirc;tre admises (par
223     exemple, les 32 bits de l'adresse IP sont excessifs pour la plupart
224     des sites, mais il n'existe pas de valeur de remplacement portable
225     plus courte).</p>
226 </section>
227
228
229 </modulesynopsis>