--- /dev/null
+<?xml version="1.0"?>
+<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
+<?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
+<!-- $LastChangedRevision$ -->
+<!-- French translation : Lucien GENTIS -->
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<modulesynopsis metafile="mod_proxy_beacon.xml.meta">
+
+<name>mod_proxy_beacon</name>
+<description>Inscription dynamique comme membre d’un répartiteur de charge où
+les serveurs dorsaux s’annoncent eux-mêmes au mandataire inverse à l’aide de
+datagrammes UDP unicast</description>
+<status>Extension</status>
+<sourcefile>mod_proxy_beacon.c</sourcefile>
+<identifier>proxy_beacon_module</identifier>
+<compatibility>Disponible à partir de la version 2.5 du serveur HTTP Apache</compatibility>
+
+<summary>
+ <p>Ce module permet à des serveurs dorsaux de <em>s’annoncer eux-mêmes</em>
+ à un mandataire inverse frontal qui les ajoute alors en tant que membre
+ actif (worker) d’un répartiteur de charge de
+ <module>mod_proxy_balancer</module>. Lorsqu’un serveur dorsal cesse de
+ s’annoncer, le mandataire l’enlève de la rotation. Cela permet une gestion
+ autonome (inscriptions et maintenance) de la liste des membres du
+ répartiteur sans avoir à éditer la configuration du mandataire ou piloter le
+ <code>balancer-manager</code> à la main.</p>
+
+ <p>La communication utilise des datagrammes pleinement <strong>unicast
+ UDP</strong> (pas de multicast qui est filtré sur la plupart des réseaux et
+ ne passe pas sur l’Internet public). Les données sont transmises du serveur
+ dorsal vers le mandataire :</p>
+
+ <ul>
+ <li>Le mandataire inverse se lie à un socket UDP et <em>reçoit</em> les
+ données sur une adresse fixe (<directive>ProxyBeaconListen</directive>).</li>
+ <li>Chaque serveur dorsal <em>envoie</em> périodiquement un court
+ datagramme d’annonce au mandataire
+ (<directive>ProxyBeaconAddress</directive>), indiquant son propre URL
+ routable (<directive>ProxyBeaconAdvertise</directive>).</li>
+ </ul>
+
+ <p>Les datagrammes sont envoyés en mode « fire-and-forget » : une annonce
+ perdue est récupérée par la prochaine annonce périodique, et le
+ réordonnancement est rejeté par une vérification d’horodatage par serveur
+ dorsal ; aucune connexion, reconnection ou couche de cadrage n’est donc
+ nécessaire.</p>
+
+ <p>Au niveau du mandataire, la directive
+ <directive>ProxyBeaconBalancer</directive> nomme le répartiteur de charge
+ auquel des serveurs dorsaux qui se sont annoncés ont été ajoutés. Les
+ changements d’appartenance s’appliquent en utilisant le même mécanisme
+ interne que l’interface web <code>balancer-manager</code> ; un serveur
+ dorsal ajouté de cette manière se comporte donc exactement comme un
+ <directive module="mod_proxy">BalancerMember</directive> configuré
+ statiquement ou ajouté manuellement, et est visible et éditable dans
+ <code>balancer-manager</code>.</p>
+
+ <p>Ce module nécessite les services de <module>mod_watchdog</module> et
+ <module>mod_proxy_balancer</module>. Le travail d’arrière-plan (écoute,
+ publication, ajout et suppression de membres) est effectué par un seul
+ processus enfant de <module>mod_watchdog</module> ; il n’est donc pas
+ disponible avec le comportement du MPM <code>prefork</code> où ce singleton
+ ne peut pas s’exécuter.</p>
+
+<note type="warning"><title>Authentification</title>
+ <p>Tout hôte qui peut atteindre le port de réception du mandataire peut
+ aussi annoncer un URL de serveur dorsal arbitraire et faire que le
+ mandataire envoie le trafic du client à ce dernier (et une adresse source
+ UDP est facile à usurper). Définissez la directive
+ <directive>ProxyBeaconSecret</directive> à la même valeur sur le mandataire
+ et sur chaque serveur dorsal de façon que les annonces soient authentifiées
+ avec un message-authentication code (MAC) avec clé et un horodatage.
+ Lorsqu’une phrase secrète est configurée, le mandataire rejette toute
+ annonce qui n’est pas valablement signée et récente. Si aucune phrase
+ secrète n’est configurée, le canal n’est <strong>pas authentifié</strong> et
+ le mandataire journalise un avertissement au démarrage.</p>
+</note>
+
+<note><title>Confidentialité</title>
+ <p>Les annonces sont authentifiées mais non chiffrées ; la charge utile
+ comporte des métadonnées opérationnelles (URLs de serveur dorsal) non
+ chiffrées. La confidentialité du transport (par exemple DTLS)
+ n’est actuellement pas prise en charge et fera l’objet d’une couche
+ séparée.</p>
+</note>
+
+</summary>
+<seealso><module>mod_proxy</module></seealso>
+<seealso><module>mod_proxy_balancer</module></seealso>
+<seealso><module>mod_proxy_hcheck</module></seealso>
+<seealso><module>mod_watchdog</module></seealso>
+
+<section id="examples">
+ <title>Exemple d’utilisation</title>
+
+ <p>L’exemple suivant configure un répartiteur de charge à enregistrement
+ autonome. Les serveurs dorsaux n’ont pas besoin de se connaître entre eux et
+ le mandataire n’a pas besoin d’entrées <directive
+ module="mod_proxy">BalancerMember</directive> prédéclarées — seulement
+ un répartiteur vide avec de la place pour grossir.</p>
+
+ <p>Sur le <strong>mandataire inverse</strong> :</p>
+ <highlight language="config">
+# Réception des annonces des serveurs dorsaux sur
+# l’interface réseau de cluster (UDP).
+ProxyBeaconListen 0.0.0.0:5555
+ProxyBeaconSecret "une_grande_phrase_secrète_partagée_aléatoire_de_cluster"
+ProxyBeaconBalancer cluster
+
+# Un serveur dorsal est éjecté de la rotation s’il ne
+# s’annonce pas pendant 30 secondes.
+ProxyBeaconTimeout 30
+
+# Un répartiteur initialement vide avec des emplacements
+# libres pour les membres dynamiques.
+<Proxy balancer://cluster>
+ ProxySet growth=16
+</Proxy>
+ProxyPass "/" "balancer://cluster/"
+ProxyPassReverse "/" "balancer://cluster/"
+ </highlight>
+
+ <p>Sur chaque <strong>serveur dorsal</strong> :</p>
+ <highlight language="config">
+# Annoncer au mandataire cette adresse routable de serveur dorsal
+# toutes les 10 secondes (UDP).
+ProxyBeaconAddress proxy.example.com:5555
+ProxyBeaconAdvertise http://10.0.0.5:8080
+ProxyBeaconSecret "une_grande_phrase_secrète_partagée_aléatoire_de_cluster"
+ProxyBeaconInterval 10
+ </highlight>
+
+ <p>Au démarrage d’un serveur dorsal, ce dernier commence à s’annoncer. Le
+ mandataire vérifie la validité de chaque annonce à l’aide de la phrase
+ secrète, ajoute <code>http://10.0.0.5:8080</code> comme membre de
+ <code>balancer://cluster</code>, et l’active. Si ce serveur dorsal arrête de
+ s’annoncer pendant une durée supérieure à la valeur de la directive
+ <directive>ProxyBeaconTimeout</directive>, le mandataire le désactive (en
+ l’enlevant de la rotation) ; si le serveur dorsal s’annonce à nouveau, il
+ est réactivé.</p>
+
+ <note>
+ <p>Un serveur dorsal ajouté à l’exécution occupe un des emplacements
+ du répartiteur pour la durée de vie du processus serveur ; plutôt que de le
+ supprimer lorsqu’il arrête de s’annoncer, il est désactivé, suivant en cela
+ le comportement du <code>balancer-manager</code> (qui peut ajouter des
+ membres à l’exécution, mais pas les supprimer). La taille du répartiteur
+ <code>augmente</code> jusqu’au nombre maximal de serveurs dorsaux que vous
+ souhaitez enregistrer.</p>
+ </note>
+
+</section>
+
+<directivesynopsis>
+<name>ProxyBeaconListen</name>
+<description>Adresse sur laquelle le mandataire inverse reçoit les annonces des
+serveurs dorsaux</description>
+<syntax>ProxyBeaconListen [<em>address</em>][:<em>port</em>]</syntax>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+ <p>La directive <directive>ProxyBeaconListen</directive> marque un serveur
+ comme <em>récepteur</em> « phare » (le mandataire inverse). Il lie un socket
+ UDP à l’adresse spécifiée, par exemple <code>0.0.0.0:5555</code> pour
+ effectuer la réception sur toutes les interfaces. Un préfixe de protocole
+ (tel que <code>tcp://</code>) est accepté et ignoré.</p>
+
+ <p>L’adresse et le port sont facultatifs et, s’ils sont omis, sont hérités
+ de l’adresse et du port de ce serveur (ses directives <directive
+ module="core">Listen</directive> et <directive
+ module="core">ServerName</directive>). Si aucun argument n’est fourni,
+ l’écouteur du « phare » lie les propres adresse et port du serveur ; si
+ seule l’adresse est donnée, le port est hérité, et ainsi de suite. Étant
+ donné que UDP et TCP sont des espaces de port indépendants, lier le socket
+ du « phare » au port du serveur n’entre <em>pas</em> en collision avec
+ l’écouteur TCP du serveur — faisant que le canal du « phare » partage
+ le point de terminaison du service, qui identifie aussi le mandataire auprès
+ des serveurs dorsaux avec son adresse réelle (comme l’écouteur effectue ses
+ liens dans un processus enfant non privilégié, un port privilégié comme 80
+ ou 443 ne peut pas être partagé de cette manière ; n’utilisez le port du
+ serveur que s’il est non privilégié).</p>
+
+ <p>Les serveurs dorsaux envoient leurs annonces à l’adresse spécifiée par la
+ directive <directive>ProxyBeaconAddress</directive>. Cette dernière doit
+ être utilisée conjointement avec la directive
+ <directive>ProxyBeaconBalancer</directive> ; dans le cas contraire, les
+ annonces sont reçues et journalisées, mais aucun membre n’est ajouté. Les
+ directives <directive>ProxyBeaconListen</directive> et
+ <directive>ProxyBeaconAddress</directive> sont mutuellement exclusives sur
+ un même serveur.</p>
+</usage>
+</directivesynopsis>
+
+<directivesynopsis>
+<name>ProxyBeaconAddress</name>
+<description>Adresse du mandataire inverse à laquelle un serveur dorsal envoie
+ses annonces</description>
+<syntax>ProxyBeaconAddress <em>address:port</em></syntax>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+ <p>La directive <directive>ProxyBeaconAddress</directive> marque un serveur
+ comme <em>émetteur</em> d’annonces (un serveur dorsal). Ce dernier envoie
+ des datagrammes UDP à l’adresse <directive>ProxyBeaconListen</directive> du
+ mandataire sous la forme <em>adresse:port</em>, par exemple
+ <code>proxy.example.com:5555</code> (un préfixe de protocole tel que
+ <code>tcp://</code> est accepté, mais ignoré). Étant donné que UDP est sans
+ connexion, un serveur dorsal peut être démarré avant que le mandataire soit
+ disponible : les datagrammes seront simplement supprimés et continueront à
+ être envoyés selon l’intervalle spécifié.</p>
+
+ <p>Utilisez la directive <directive>ProxyBeaconAdvertise</directive> pour
+ spécifier l’URL routable qu’annonce le serveur dorsal. Les
+ directives <directive>ProxyBeaconListen</directive> et
+ <directive>ProxyBeaconAddress</directive> sont mutuellement exclusives sur
+ un même serveur.</p>
+</usage>
+</directivesynopsis>
+
+<directivesynopsis>
+<name>ProxyBeaconAdvertise</name>
+<description>L’URL routable qu’annonce le serveur dorsal au mandataire inverse</description>
+<syntax>ProxyBeaconAdvertise <em>url</em></syntax>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+ <p>La directive <directive>ProxyBeaconAdvertise</directive> permet de
+ définir l’adresse à laquelle le serveur dorsal peut être atteint (par
+ exemple <code>http://10.0.0.5:8080</code>) et que le mandataire ajoutera en
+ tant que membre <directive module="mod_proxy">BalancerMember</directive>.
+ Il doit s’agir d’un URL complet comme <code>scheme://host[:port]</code> que
+ le mandataire pourra atteindre — pas l’adresse d’écoute locale —
+ et qui sera validé lors de l’analyse de la configuration.</p>
+
+ <p>Cette directive est utilisée sur un serveur dorsal avec la directive
+ <directive>ProxyBeaconAddress</directive>. Si elle est omise, le serveur
+ dorsal envoie quand-même un signe de vie, mais pas d’URL ; le mandataire
+ journalise alors l’annonce sans ajouter de membre.</p>
+</usage>
+</directivesynopsis>
+
+<directivesynopsis>
+<name>ProxyBeaconBalancer</name>
+<description>Le nom du répartiteur de charge auquel les serveurs dorsaux
+annoncés sont ajoutés</description>
+<syntax>ProxyBeaconBalancer <em>name</em></syntax>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+ <p>La directive <directive>ProxyBeaconBalancer</directive> permet de nommer
+ le répartiteur, sur le mandataire inverse, dans lequel les serveurs dorsaux
+ annoncés sont insérés en tant que membres. Indiquez seulement le nom du
+ répartiteur (par exemple <code>cluster</code> pour
+ <code>balancer://cluster</code>) ; le préfixe <code>balancer://</code> est
+ accepté et supprimé.</p>
+
+ <p>Le répartiteur nommé doit exister et disposer d’emplacements vides.
+ Déclarez-le dans un bloc <directive
+ module="mod_proxy"><Proxy></directive> avec un paramètre
+ <code>growth</code> (ou utilisez la valeur de la directive <directive
+ module="mod_proxy">BalancerGrowth</directive>) de façon qu’il y ait des
+ emplacements libres pour l’ajout dynamique de membres. Cette directive est
+ utilisée conjointement avec la directive
+ <directive>ProxyBeaconListen</directive>.</p>
+</usage>
+</directivesynopsis>
+
+<directivesynopsis>
+<name>ProxyBeaconInterval</name>
+<description>Périodicité de l’envoi d’annonces par le serveur dorsal</description>
+<syntax>ProxyBeaconInterval <em>interval</em></syntax>
+<default>ProxyBeaconInterval 5</default>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+ <p>La directive <directive>ProxyBeaconInterval</directive> permet de définir
+ la périodicité à laquelle un serveur dorsal (un serveur
+ <directive>ProxyBeaconAddress</directive>) envoie ses annonces. Elle utilise
+ la syntaxe de la directive <a
+ href="directive-dict.html#Syntax">time-interval</a> et sa valeur s’exprime
+ par défaut en secondes ; sa valeur par défaut est 5 secondes.</p>
+
+ <p>L’intervalle doit être significativement plus petit que la valeur de la
+ directive <directive>ProxyBeaconTimeout</directive>, de façon qu’une perte
+ occasionnelle ou qu’une annonce retardée ne provoquent pas l’éviction d’un
+ serveur dorsal opérationnel.</p>
+</usage>
+</directivesynopsis>
+
+<directivesynopsis>
+<name>ProxyBeaconTimeout</name>
+<description>Durée maximale de l’absence d’annonce d’un serveur dorsal au bout
+de laquelle le mandataire enlève ce dernier de la rotation</description>
+<syntax>ProxyBeaconTimeout <em>interval</em></syntax>
+<default>ProxyBeaconTimeout 0</default>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+ <p>La directive <directive>ProxyBeaconTimeout</directive> permet de définir
+ la durée maximale pendant laquelle le mandataire attendra une annonce en
+ provenance d’un serveur dorsal avant de désactiver ce dernier (en l’enlevant
+ de la rotation). Si ce serveur dorsal renvoie une annonce par la suite, il
+ est réactivé. Cette directive utilise
+ la syntaxe de la directive <a
+ href="directive-dict.html#Syntax">time-interval</a> et sa valeur s’exprime
+ par défaut en secondes.</p>
+
+ <p>La valeur par défaut, <code>0</code>, désactive complètement l’éviction :
+ les serveurs dorsaux sont ajoutés lorsqu’ils s’annoncent mais ne sont jamais
+ désactivés automatiquement. Définissez cette directive à un multiple de
+ (quelques fois) la valeur de la directive
+ <directive>ProxyBeaconInterval</directive> du serveur dorsal pour mettre en
+ œuvre une maintenance autonome des adhésions. Cette directive est définie
+ sur le mandataire.</p>
+</usage>
+</directivesynopsis>
+
+<directivesynopsis>
+<name>ProxyBeaconSecret</name>
+<description>Phrase secrète partagée à l’avance pour authentifier les annonces
+des serveurs dorsaux</description>
+<syntax>ProxyBeaconSecret <em>secret</em></syntax>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+ <p>La directive <directive>ProxyBeaconSecret</directive> permet de définir
+ une phrase secrète partagée à l’avance au sein de la grappe de serveurs.
+ Elle doit être définie avec la <em>même</em> valeur sur le mandataire
+ inverse et sur chaque serveur dorsal. Le serveur dorsal (l’émetteur) signe
+ chaque annonce avec un message-authentication code (un SipHash MAC) avec
+ clé, dérivé de la phrase secrète et avec un horodatage ; le mandataire (le
+ récepteur) recalcule le MAC et vérifie l’horodatage, en rejetant toute
+ annonce falsifiée, usurpée ou réenvoyée. Les messages réenvoyés sont
+ interceptés de deux manières : une fenêtre de fraîcheur (directive
+ <directive>ProxyBeaconMaxSkew</directive>) rejette les horodatages anciens,
+ et une vérification pour chaque serveur dorsal rejette toute annonce dont
+ l’horodatage n’avance pas strictement ; ainsi, un message capturé et renvoyé
+ (par exemple pour empêcher l’éviction d’un serveur dorsal éteint) sera
+ rejeté.</p>
+
+ <p>Si la directive <directive>ProxyBeaconSecret</directive> est définie sur
+ le mandataire, chaque annonce doit comporter un MAC valable et récent, sous
+ peine d’être rejetée. Si les phrases secrètes du mandataire et d’un serveur
+ dorsal diffèrent, les annonces de ce dernier seront rejetées silencieusement
+ (et journalisées), ce qui donne l’impression que le serveur dorsal n’a
+ jamais atteint le répartiteur de charge.</p>
+
+ <p>Si aucune phrase secrète n’est configurée, le canal n’est pas authentifié
+ et le mandataire émet un avertissement lorsqu’il commence à écouter. Étant
+ donné que la phrase secrète est stockée dans le fichier de configuration,
+ définissez les permissions de ce dernier comme s’il s’agissait d’une clé
+ privée.</p>
+
+ <note><title>Synchronisation de l’horloge</title>
+ <p>La protection contre la réémission basée sur l’horodatage compare le
+ moment de l’annonce avec l’horloge du mandataire ; le mandataire et les
+ serveurs dorsaux doivent donc avoir des horloges correctement synchronisées
+ (par exemple à l’aide de NTP). Voir la directive
+ <directive>ProxyBeaconMaxSkew</directive>.</p>
+ </note>
+</usage>
+</directivesynopsis>
+
+<directivesynopsis>
+<name>ProxyBeaconMaxSkew</name>
+<description>Age maximal autorisé d’une annonce signée</description>
+<syntax>ProxyBeaconMaxSkew <em>interval</em></syntax>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+ <p>La directive <directive>ProxyBeaconMaxSkew</directive> permet de définir
+ la fenêtre anti-réémission utilisée lorsque la directive
+ <directive>ProxyBeaconSecret</directive> est configurée : le mandataire
+ rejette toute annonce dont l’horodatage signé diffère du temps actuel d’une
+ valeur supérieure à celle de la directive
+ <directive>ProxyBeaconMaxSkew</directive>, et cela dans les deux directions.
+ Cette directive utilise la syntaxe de la directive <a
+ href="directive-dict.html#Syntax">time-interval</a> et sa valeur s’exprime
+ par défaut en secondes.</p>
+
+ <p>Si elle n’est pas définie, sa valeur par défaut est de 30 secondes. Une
+ fenêtre plus large tolère des écarts d’horloge plus grands entre les hôtes ;
+ une fenêtre plus petite restreint la tolérance sur la vérification de
+ fraîcheur. Notez que la vérification de la croissance stricte des
+ horodatages d’un même serveur (voir la directive
+ <directive>ProxyBeaconSecret</directive>) bloque les réémissions, quelle que
+ soit la valeur de cette fenêtre. Cette directive est utilisée au niveau du
+ mandataire.</p>
+</usage>
+</directivesynopsis>
+
+</modulesynopsis>