<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
<!--
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
This file is generated from xml source: DO NOT EDIT
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-->
<title>mod_proxy_balancer - Serveur HTTP Apache Version 2.4</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<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" />
<script src="../style/scripts/prettify.min.js" type="text/javascript">
</script>
<link href="../images/favicon.ico" rel="shortcut icon" /></head>
<body>
<div id="page-header">
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.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>
<p class="apache">Serveur HTTP Apache Version 2.4</p>
<img alt="" src="../images/feather.png" /></div>
<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">Serveur HTTP</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.4</a> > <a href="./">Modules</a></div>
<div id="page-content">
<div id="preamble"><h1>Module Apache mod_proxy_balancer</h1>
<div class="toplang">
<p><span>Langues Disponibles: </span><a href="../en/mod/mod_proxy_balancer.html" hreflang="en" rel="alternate" title="English"> en </a> |
<a href="../fr/mod/mod_proxy_balancer.html" title="Français"> fr </a> |
<a href="../ja/mod/mod_proxy_balancer.html" hreflang="ja" rel="alternate" title="Japanese"> ja </a></p>
</div>
<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Extension de <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code> pour le support de
la répartition de charge</td></tr>
<tr><th><a href="module-dict.html#Status">Statut:</a></th><td>Extension</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">Identificateur de Module:</a></th><td>proxy_balancer_module</td></tr>
<tr><th><a href="module-dict.html#SourceFile">Fichier Source:</a></th><td>mod_proxy_balancer.c</td></tr>
<tr><th><a href="module-dict.html#Compatibility">Compatibilité:</a></th><td>Disponible depuis la version 2.1 d'Apache</td></tr></table>
<h3>Sommaire</h3>
<p>Pour pouvoir fonctionner, ce module <em>requiert</em> le
chargement de <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>, et il fournit le support de
la répartition de charge pour tous les protocoles supportés. Parmi ces
protocoles, les plus importants sont :</p>
<ul>
<li>HTTP, avec le module <code class="module"><a href="../mod/mod_proxy_http.html">mod_proxy_http</a></code></li>
<li>FTP, avec le module <code class="module"><a href="../mod/mod_proxy_ftp.html">mod_proxy_ftp</a></code></li>
<li>AJP13, avec le module <code class="module"><a href="../mod/mod_proxy_ajp.html">mod_proxy_ajp</a></code></li>
<li>WebSocket, avec le module <code class="module"><a href="../mod/mod_proxy_wstunnel.html">mod_proxy_wstunnel</a></code></li>
</ul>
<p>L'algorithme de planification de la répartition de charge n'est pas
fourni par ce module, mais par ceux-ci :</p>
<ul>
<li><code class="module"><a href="../mod/mod_lbmethod_byrequests.html">mod_lbmethod_byrequests</a></code></li>
<li><code class="module"><a href="../mod/mod_lbmethod_bytraffic.html">mod_lbmethod_bytraffic</a></code></li>
<li><code class="module"><a href="../mod/mod_lbmethod_bybusyness.html">mod_lbmethod_bybusyness</a></code></li>
<li><code class="module"><a href="../mod/mod_lbmethod_heartbeat.html">mod_lbmethod_heartbeat</a></code></li>
</ul>
<p>Ainsi, pour mettre en oeuvre la répartition de charge,
<code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>, <code class="module"><a href="../mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code> et
au moins un des modules fournissant l'algorithme de planification de
la répartition de charge doivent être chargés dans le serveur.</p>
<div class="warning"><h3>Avertissement</h3>
<p>N'activez pas la fonctionnalité de mandataire avant d'avoir <a href="mod_proxy.html#access">sécurisé votre serveur</a>. Les
serveurs mandataires ouverts sont dangereux non seulement pour
votre réseau, mais aussi pour l'Internet au sens large.</p>
</div>
</div>
<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><h3>Sujets</h3>
<ul id="topics">
<li><img alt="" src="../images/down.gif" /> <a href="#scheduler">L'algorithme de planification de la répartition de
charge</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#stickyness">Répartition de charge avec abonnement utilisateur
(stickyness)</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#example">Exemples de configuration d'un répartiteur</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#environment">Variables d'environnement exportées</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#balancer_manager">Activation du support du gestionnaire de répartiteur</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#stickyness_implementation">Détails à propos de la répartition de charge par abonnement
(stickyness)</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#stickyness_troubleshooting">Résolution des problèmes liés à la répartition de charge par
abonnement</a></li>
</ul><h3 class="directives">Directives</h3>
<p>Ce module ne fournit aucune directive.</p>
<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__&list_id=144532&product=Apache%20httpd-2&query_format=specific&order=changeddate%20DESC%2Cpriority%2Cbug_severity&component=mod_proxy_balancer">Problèmes connus</a></li><li><a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2&component=mod_proxy_balancer">Signaler un bug</a></li></ul><h3>Voir aussi</h3>
<ul class="seealso">
<li><code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code></li>
<li><code class="directive"><a href="../mod/mod_proxy.html#balancermember">BalancerMember</a></code></li>
<li><code class="directive"><a href="../mod/mod_proxy.html#balancergrowth">BalancerGrowth</a></code></li>
<li><code class="directive"><a href="../mod/mod_proxy.html#balancerpersist">BalancerPersist</a></code></li>
<li><code class="directive"><a href="../mod/mod_proxy.html#balancerinherit">BalancerInherit</a></code></li>
<li><a href="#comments_section">Commentaires</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="scheduler" id="scheduler">L'algorithme de planification de la répartition de
charge</a></h2>
<p>A l'heure actuelle, 4 algorithmes de planification de la répartition de
charge sont disponibles : ils se basent respectivement sur le comptage des
requêtes (<code class="module"><a href="../mod/mod_lbmethod_byrequests.html">mod_lbmethod_byrequests</a></code>), la mesure de
l'intensité du trafic (<code class="module"><a href="../mod/mod_lbmethod_bytraffic.html">mod_lbmethod_bytraffic</a></code>), le comptage
des requêtes en attente (<code class="module"><a href="../mod/mod_lbmethod_bybusyness.html">mod_lbmethod_bybusyness</a></code>) et la
mesure de l'activité du serveur (<code class="module"><a href="../mod/mod_lbmethod_heartbeat.html">mod_lbmethod_heartbeat</a></code>).
Ils sont contrôlés par la valeur de <code>lbmethod</code> dans la définition
du répartiteur. Voir la directive <code class="directive"><a href="../mod/mod_proxy.html#proxypass">ProxyPass</a></code> pour plus de détails, et en
particulier la configuration du répartiteur et de ses membres.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="stickyness" id="stickyness">Répartition de charge avec abonnement utilisateur
(stickyness)</a></h2>
<p>Le répartiteur supporte l'abonnement utilisateur. Lorsqu'une
requête est mandatée vers un serveur d'arrière-plan particulier,
toutes les requêtes suivantes du même utilisateur seront alors
mandatées vers le même serveur d'arrière-plan. De nombreux
répartiteurs de charge implémentent cette fonctionnalité via une
table qui associe les adresses IP des clients aux serveurs
d'arrière-plan. Cette approche est transparente aux clients et aux
serveurs d'arrière-plan, mais induit certains problèmes :
distribution de charge inégale si les clients se trouvent eux-mêmes
derrière un mandataire, erreurs d'abonnement lorsqu'un client
possède une adresse IP dynamique qui peut changer au cours d'une
session et perte d'abonnement en cas de dépassement de la table de
correspondances.</p>
<p>Le module <code class="module"><a href="../mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code> implémente
l'abonnement selon deux alternatives : les cookies et le codage
d'URL. Le cookie peut être fourni par le serveur d'arrière-plan ou
par le serveur web Apache lui-même, alors que le codage d'URL est en
général effectué par le serveur d'arrière-plan.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="example" id="example">Exemples de configuration d'un répartiteur</a></h2>
<p>Avant de nous plonger dans les détails techniques, voici un
exemple d'utilisation de <code class="module"><a href="../mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code> mettant
en oeuvre la répartition de charge entre deux serveurs
d'arrière-plan :
</p>
<dt><var><a name="balancer_worker_route" id="balancer_worker_route">BALANCER_WORKER_ROUTE</a></var></dt>
<dd>
<p>Cette variable se voit assignée la <var>route</var> du membre du
groupe de répartition de charge qui sera utilisé pour la requête
courante.</p>
</dd>
<dt><var><a name="balancer_route_changed" id="balancer_route_changed">BALANCER_ROUTE_CHANGED</a></var></dt>
<dd>
<p>Cette variable est définie à 1 si la route de la session ne
correspond pas à celle du membre du groupe de répartition de charge
(BALANCER_SESSION_ROUTE != BALANCER_WORKER_ROUTE), ou si la session
ne possède pas encore de route établie. Elle peut servir à
déterminer quand il est éventuellement nécessaire d'envoyer au
client une route mise à jour lorsque les sessions persistantes sont
utilisées.</p>
</dd>
</dl>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="balancer_manager" id="balancer_manager">Activation du support du gestionnaire de répartiteur</a></h2>
<p>Cette fonctionnalité <em>nécessite</em> le chargement du module
<code class="module"><a href="../mod/mod_status.html">mod_status</a></code>. Le gestionnaire de répartiteur permet
la mise à jour dynamique des membres du groupe de répartition de
charge. Vous pouvez utiliser le gestionnaire de répartiteur pour
modifier le facteur de charge d'un membre particulier, ou passer ce
dernier en mode hors ligne.
</p>
<p>Ainsi, pour mettre en oeuvre la gestion du répartiteur de charge,
<code class="module"><a href="../mod/mod_status.html">mod_status</a></code> et <code class="module"><a href="../mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code>
doivent être chargés dans le serveur.</p>
<p>Pour permettre la gestion du répartiteur de charge aux
navigateurs appartenant au domaine example.com, ajoutez ces lignes à
votre fichier de configuration <code>httpd.conf</code> :</p>
<pre class="prettyprint lang-config"><Location "/balancer-manager">
SetHandler balancer-manager
Require host example.com
</Location></pre>
<p>Vous pourrez alors accéder au gestionnaire du répartiteur de
charge en utilisant un navigateur web pour afficher la page
<code>http://nom.de.votre.serveur/balancer-manager</code>. Notez que
pour pouvoir contrôler dynamiquement un membre de groupe de
répartition, ce dernier ne doit pas être défini au sein d'une
section <code><Location ...></code>.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="stickyness_implementation" id="stickyness_implementation">Détails à propos de la répartition de charge par abonnement
(stickyness)</a></h2>
<p>Si l'abonnement s'appuie sur un cookie, vous devez définir le nom
de ce cookie dont le contenu précise le serveur d'arrière-plan à
utiliser. Pour ce faire, on utilise l'attribut
<var>stickysession</var> avec la directive <code class="directive"><a href="../mod/mod_proxy.html#proxypass">ProxyPass</a></code> ou <code class="directive"><a href="../mod/mod_proxy.html#proxyset">ProxySet</a></code>. Le nom du cookie est
sensible à la casse. Le répartiteur extrait le contenu du cookie et
recherche un serveur membre dont la <var>route</var> correspond à
cette valeur. La route doit aussi être définie dans la directive <code class="directive"><a href="../mod/mod_proxy.html#proxypass">ProxyPass</a></code> ou <code class="directive"><a href="../mod/mod_proxy.html#proxyset">ProxySet</a></code>. Le cookie peut être défini
soit par le serveur d'arrière-plan, soit, comme indiqué dans l'<a href="#example">exemple</a> ci-dessus par le serveur web Apache
lui-même.</p>
<p>Certains serveurs d'arrière-plan, tels qu'Apache Tomcat,
utilisent une forme sensiblement différente de cookie d'abonnement.
Tomcat ajoute le nom de l'instance Tomcat à la fin de son
identifiant de session, précédé par un point. Ainsi, si le serveur
web Apache trouve un point dans la valeur du cookie d'abonnement, il
n'utilisera que la partie située après ce point pour
rechercher sa route. Pour que Tomcat puisse connaître son nom
d'instance, vous devez définir l'attribut <code>jvmRoute</code> dans
son fichier de configuration <code>conf/server.xml</code> à la
valeur de la <var>route</var> du serveur qui se connecte au Tomcat
considéré. Le nom du cookie de session utilisé par Tomcat (et plus
généralement par les applications web Java à base de servlets) est
<code>JSESSIONID</code> (en majuscules), mais peut être modifié.</p>
<p>La seconde méthode pour implémenter l'abonnement est le codage
d'URL. Ici, le serveur web recherche un paramètre dans l'URL de la
requête. Le nom du paramètre est spécifié par l'attribut
<var>stickysession</var>. Pour trouver un serveur membre, on
recherche un serveur dont la <var>route</var> est égale à la valeur
du paramètre. Comme il n'est pas aisé d'extraire et de manipuler
tous les liens URL contenus dans les réponses, le travail consistant
à ajouter les paramètres à chaque lien est généralement effectué par
le serveur d'arrière-plan qui génère le contenu. Bien qu'il soit
possible dans certains cas d'effectuer ces ajouts au niveau du
serveur web via les modules <code class="module"><a href="../mod/mod_substitute.html">mod_substitute</a></code> ou
<code class="module"><a href="../mod/mod_sed.html">mod_sed</a></code>, cette méthode peut dégrader les
performances.</p>
<p>Les standards Java implémentent le codage d'URL de manière
sensiblement différente. Ils ajoutent une information de chemin à
l'URL en utilisant un point-virgule (<code>;</code>) comme
séparateur, puis ajoutent enfin l'identifiant de session. Comme dans
le cas des cookies, Apache Tomcat peut insérer la valeur de
l'attribut <code>jvmRoute</code> dans cette information de chemin.
Pour qu'Apache puisse trouver ce genre d'information de chemin, vous
devez définir <code>scolonpathdelim</code> à <code>On</code> dans la
directive <code class="directive"><a href="../mod/mod_proxy.html#proxypass">ProxyPass</a></code> ou
<code class="directive"><a href="../mod/mod_proxy.html#proxyset">ProxySet</a></code>.</p>