<-
Apache > Serveur HTTP > Documentation > Version 2.5 > Modules

Module Apache mod_proxy_beacon

Langues Disponibles:  en  |  fr 

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
Statut:Extension
Identificateur de Module:proxy_beacon_module
Fichier Source:mod_proxy_beacon.c
Compatibilité:Disponible à partir de la version 2.5 du serveur HTTP Apache

Sommaire

Ce module permet à des serveurs dorsaux de s’annoncer eux-mêmes à un mandataire inverse frontal qui les ajoute alors en tant que membre actif (worker) d’un répartiteur de charge de mod_proxy_balancer. 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 balancer-manager à la main.

La communication utilise des datagrammes pleinement unicast UDP (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 :

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.

Au niveau du mandataire, la directive ProxyBeaconBalancer 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 balancer-manager ; un serveur dorsal ajouté de cette manière se comporte donc exactement comme un BalancerMember configuré statiquement ou ajouté manuellement, et est visible et éditable dans balancer-manager.

Ce module nécessite les services de mod_watchdog et mod_proxy_balancer. Le travail d’arrière-plan (écoute, publication, ajout et suppression de membres) est effectué par un seul processus enfant de mod_watchdog ; il n’est donc pas disponible avec le comportement du MPM prefork où ce singleton ne peut pas s’exécuter.

Authentification

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 ProxyBeaconSecret à 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 pas authentifié et le mandataire journalise un avertissement au démarrage.

Confidentialité

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.

Sujets

Directives

Traitement des bugs

Voir aussi

top

Exemple d’utilisation

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 BalancerMember prédéclarées — seulement un répartiteur vide avec de la place pour grossir.

Sur le mandataire inverse :

# 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/"

Sur chaque serveur dorsal :

# 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

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 http://10.0.0.5:8080 comme membre de balancer://cluster, et l’active. Si ce serveur dorsal arrête de s’annoncer pendant une durée supérieure à la valeur de la directive ProxyBeaconTimeout, le mandataire le désactive (en l’enlevant de la rotation) ; si le serveur dorsal s’annonce à nouveau, il est réactivé.

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 balancer-manager (qui peut ajouter des membres à l’exécution, mais pas les supprimer). La taille du répartiteur augmente jusqu’au nombre maximal de serveurs dorsaux que vous souhaitez enregistrer.

top

Directive ProxyBeaconAddress

Description:Adresse du mandataire inverse à laquelle un serveur dorsal envoie ses annonces
Syntaxe:ProxyBeaconAddress address:port
Contexte:configuration globale, serveur virtuel
Statut:Extension
Module:mod_proxy_beacon

La directive ProxyBeaconAddress marque un serveur comme émetteur d’annonces (un serveur dorsal). Ce dernier envoie des datagrammes UDP à l’adresse ProxyBeaconListen du mandataire sous la forme adresse:port, par exemple proxy.example.com:5555 (un préfixe de protocole tel que tcp:// 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é.

Utilisez la directive ProxyBeaconAdvertise pour spécifier l’URL routable qu’annonce le serveur dorsal. Les directives ProxyBeaconListen et ProxyBeaconAddress sont mutuellement exclusives sur un même serveur.

top

Directive ProxyBeaconAdvertise

Description:L’URL routable qu’annonce le serveur dorsal au mandataire inverse
Syntaxe:ProxyBeaconAdvertise url
Contexte:configuration globale, serveur virtuel
Statut:Extension
Module:mod_proxy_beacon

La directive ProxyBeaconAdvertise permet de définir l’adresse à laquelle le serveur dorsal peut être atteint (par exemple http://10.0.0.5:8080) et que le mandataire ajoutera en tant que membre BalancerMember. Il doit s’agir d’un URL complet comme scheme://host[:port] que le mandataire pourra atteindre — pas l’adresse d’écoute locale — et qui sera validé lors de l’analyse de la configuration.

Cette directive est utilisée sur un serveur dorsal avec la directive ProxyBeaconAddress. 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.

top

Directive ProxyBeaconBalancer

Description:Le nom du répartiteur de charge auquel les serveurs dorsaux annoncés sont ajoutés
Syntaxe:ProxyBeaconBalancer name
Contexte:configuration globale, serveur virtuel
Statut:Extension
Module:mod_proxy_beacon

La directive ProxyBeaconBalancer 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 cluster pour balancer://cluster) ; le préfixe balancer:// est accepté et supprimé.

Le répartiteur nommé doit exister et disposer d’emplacements vides. Déclarez-le dans un bloc <Proxy> avec un paramètre growth (ou utilisez la valeur de la directive BalancerGrowth) 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 ProxyBeaconListen.

top

Directive ProxyBeaconInterval

Description:Périodicité de l’envoi d’annonces par le serveur dorsal
Syntaxe:ProxyBeaconInterval interval
Défaut:ProxyBeaconInterval 5
Contexte:configuration globale, serveur virtuel
Statut:Extension
Module:mod_proxy_beacon

La directive ProxyBeaconInterval permet de définir la périodicité à laquelle un serveur dorsal (un serveur ProxyBeaconAddress) envoie ses annonces. Elle utilise la syntaxe de la directive time-interval et sa valeur s’exprime par défaut en secondes ; sa valeur par défaut est 5 secondes.

L’intervalle doit être significativement plus petit que la valeur de la directive ProxyBeaconTimeout, de façon qu’une perte occasionnelle ou qu’une annonce retardée ne provoquent pas l’éviction d’un serveur dorsal opérationnel.

top

Directive ProxyBeaconListen

Description:Adresse sur laquelle le mandataire inverse reçoit les annonces des serveurs dorsaux
Syntaxe:ProxyBeaconListen [address][:port]
Contexte:configuration globale, serveur virtuel
Statut:Extension
Module:mod_proxy_beacon

La directive ProxyBeaconListen marque un serveur comme récepteur « phare » (le mandataire inverse). Il lie un socket UDP à l’adresse spécifiée, par exemple 0.0.0.0:5555 pour effectuer la réception sur toutes les interfaces. Un préfixe de protocole (tel que tcp://) est accepté et ignoré.

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 Listen et ServerName). 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 pas 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é).

Les serveurs dorsaux envoient leurs annonces à l’adresse spécifiée par la directive ProxyBeaconAddress. Cette dernière doit être utilisée conjointement avec la directive ProxyBeaconBalancer ; dans le cas contraire, les annonces sont reçues et journalisées, mais aucun membre n’est ajouté. Les directives ProxyBeaconListen et ProxyBeaconAddress sont mutuellement exclusives sur un même serveur.

top

Directive ProxyBeaconMaxSkew

Description:Age maximal autorisé d’une annonce signée
Syntaxe:ProxyBeaconMaxSkew interval
Contexte:configuration globale, serveur virtuel
Statut:Extension
Module:mod_proxy_beacon

La directive ProxyBeaconMaxSkew permet de définir la fenêtre anti-réémission utilisée lorsque la directive ProxyBeaconSecret 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 ProxyBeaconMaxSkew, et cela dans les deux directions. Cette directive utilise la syntaxe de la directive time-interval et sa valeur s’exprime par défaut en secondes.

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 ProxyBeaconSecret) bloque les réémissions, quelle que soit la valeur de cette fenêtre. Cette directive est utilisée au niveau du mandataire.

top

Directive ProxyBeaconSecret

Description:Phrase secrète partagée à l’avance pour authentifier les annonces des serveurs dorsaux
Syntaxe:ProxyBeaconSecret secret
Contexte:configuration globale, serveur virtuel
Statut:Extension
Module:mod_proxy_beacon

La directive ProxyBeaconSecret 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 même 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 ProxyBeaconMaxSkew) 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é.

Si la directive ProxyBeaconSecret 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.

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.

Synchronisation de l’horloge

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 ProxyBeaconMaxSkew.

top

Directive ProxyBeaconTimeout

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
Syntaxe:ProxyBeaconTimeout interval
Défaut:ProxyBeaconTimeout 0
Contexte:configuration globale, serveur virtuel
Statut:Extension
Module:mod_proxy_beacon

La directive ProxyBeaconTimeout 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 time-interval et sa valeur s’exprime par défaut en secondes.

La valeur par défaut, 0, 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 ProxyBeaconInterval du serveur dorsal pour mettre en Ĺ“uvre une maintenance autonome des adhésions. Cette directive est définie sur le mandataire.

Langues Disponibles:  en  |  fr