blob: 87bb972b2c1e669335ac51ed9eb2dc27ff95d3ba [file] [log] [blame]
willy tarreau0174f312005-12-18 01:02:42 +01001 -------------------
Willy Tarreau94b45912006-05-31 06:40:15 +02002 HAProxy
willy tarreau0174f312005-12-18 01:02:42 +01003 Manuel de référence
4 -------------------
Willy Tarreau2272dc12006-09-03 10:19:38 +02005 version 1.3.2
willy tarreauc5f73ed2005-12-18 01:26:38 +01006 willy tarreau
Willy Tarreau2272dc12006-09-03 10:19:38 +02007 2006/09/03
willy tarreau0f7af912005-12-17 12:21:26 +01008
Willy Tarreaua080eca2009-10-14 20:30:15 +02009
10 !!!! NOTE: CE DOCUMENT EST PERIME !!!!
11
12 Veuillez utiliser le fichier "configuration.txt" situé dans le même
13 répertoire, ou télécharger une version à jour à l'emplacement ci-dessous :
14
Willy Tarreaube6008f2009-10-14 22:22:03 +020015 http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
Willy Tarreaua080eca2009-10-14 20:30:15 +020016
17
willy tarreaub719f002005-12-17 12:55:07 +010018================
19| Introduction |
20================
willy tarreau0f7af912005-12-17 12:21:26 +010021
Willy Tarreau94b45912006-05-31 06:40:15 +020022HAProxy est un relais TCP/HTTP offrant des facilités d'intégration en
willy tarreau0f7af912005-12-17 12:21:26 +010023environnement hautement disponible. En effet, il est capable de :
willy tarreauc29948c2005-12-17 13:10:27 +010024 - effectuer un aiguillage statique défini par des cookies ;
willy tarreau64a3cc32005-12-18 01:13:11 +010025 - effectuer une répartition de charge avec création de cookies pour assurer
26 la persistence de session ;
willy tarreau0f7af912005-12-17 12:21:26 +010027 - fournir une visibilité externe de son état de santé ;
willy tarreau8337c6b2005-12-17 13:41:01 +010028 - s'arrêter en douceur sans perte brutale de service ;
willy tarreauc5f73ed2005-12-18 01:26:38 +010029 - modifier/ajouter/supprimer des en-têtes dans la requête et la réponse ;
willy tarreau8337c6b2005-12-17 13:41:01 +010030 - interdire des requêtes qui vérifient certaines conditions ;
31 - utiliser des serveurs de secours lorsque les serveurs principaux sont hors
32 d'usage.
willy tarreau532bb552006-05-13 18:40:37 +020033 - maintenir des clients sur le bon serveur serveur d'application en fonction
34 de cookies applicatifs.
willy tarreau8f635a42006-05-21 23:05:54 +020035 - fournir des rapports d'état en HTML à des utilisateurs authentifiés, à
36 travers des URI de l'application interceptées.
willy tarreau0f7af912005-12-17 12:21:26 +010037
willy tarreau64a3cc32005-12-18 01:13:11 +010038Il requiert peu de ressources, et son architecture événementielle mono-
39processus lui permet facilement de gérer plusieurs milliers de connexions
40simultanées sur plusieurs relais sans effondrer le système.
willy tarreaua1598082005-12-17 13:08:06 +010041
willy tarreau0f7af912005-12-17 12:21:26 +010042
43===========================
44| Paramètres de lancement |
45===========================
46
47Les options de lancement sont peu nombreuses :
48
49 -f <fichier de configuration>
50 -n <nombre maximal total de connexions simultanées>
willy tarreau532bb552006-05-13 18:40:37 +020051 = 'maxconn' dans la section 'global'
52 -N <nombre maximal de connexions simultanées par instance>
53 = 'maxconn' dans les sections 'listen' ou 'default'
willy tarreau0f7af912005-12-17 12:21:26 +010054 -d active le mode debug
55 -D passe en daemon
willy tarreau982249e2005-12-18 00:57:06 +010056 -q désactive l'affichage de messages sur la sortie standard.
57 -V affiche les messages sur la sortie standard, même si -q ou 'quiet' sont
58 spécifiés.
59 -c vérifie le fichier de configuration puis quitte avec un code de retour 0
60 si aucune erreur n'a été trouvée, ou 1 si une erreur de syntaxe a été
61 détectée.
willy tarreaufe2c5c12005-12-17 14:14:34 +010062 -p <fichier> indique au processus père qu'il doit écrire les PIDs de ses
63 fils dans ce fichier en mode démon.
willy tarreau34f45302006-04-15 21:37:14 +020064 -sf specifie une liste de PIDs auxquels envoyer un signal FINISH
65 -st specifie une liste de PIDs auxquels envoyer un signal TERMINATE
willy tarreau0f7af912005-12-17 12:21:26 +010066 -s affiche les statistiques (si option compilée)
67 -l ajoute des informations aux statistiques
Willy Tarreaude99e992007-04-16 00:53:59 +020068 -dk désactive l'utilisation de kqueue()
69 -ds désactive l'utilisation de epoll() speculatif
willy tarreau64a3cc32005-12-18 01:13:11 +010070 -de désactive l'utilisation de epoll()
71 -dp désactive l'utilisation de poll()
willy tarreau34f45302006-04-15 21:37:14 +020072 -db désactive la mise en arrière-plan (utile pour débugger)
73 -m <megs> applique une limitation de <megs> Mo d'utilisation mémoire
willy tarreau0f7af912005-12-17 12:21:26 +010074
willy tarreau64a3cc32005-12-18 01:13:11 +010075Le nombre maximal de connexion simultanées par proxy est le paramètre par
76défaut pour les proxies pour lesquels ce paramètre n'est pas précisé dans le
77fichier de configuration. Il s'agit du paramètre 'maxconn' dans les sections
78'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010079
willy tarreau64a3cc32005-12-18 01:13:11 +010080Le nombre maximal total de connexions simultanées limite le nombre de
81connexions TCP utilisables à un instant donné par le processus, tous proxies
82confondus. Ce paramètre remplace le paramètre 'maxconn' de la section 'global'.
willy tarreaua1598082005-12-17 13:08:06 +010083
willy tarreauc29948c2005-12-17 13:10:27 +010084Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
willy tarreauc5f73ed2005-12-18 01:26:38 +010085mode, toutes les connexions, déconnexions, et tous les échanges d'en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +010086sont affichés.
87
willy tarreau34f45302006-04-15 21:37:14 +020088Pour debugger, l'option '-db' est très pratique car elle désactive
89temporairement le mode daemon et le mode multi-processus. Le service peut alors
90être arrêté par un simple appui sur Ctrl-C, sans avoir à modifier la
91configuration ni à activer le mode debug complet.
92
willy tarreauc29948c2005-12-17 13:10:27 +010093Les statistiques ne sont disponibles que si le programme a été compilé avec
94l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
willy tarreau8f635a42006-05-21 23:05:54 +020095d'utilité que lors de benchmarks par exemple, et sont amenées à disparaitre.
willy tarreauc29948c2005-12-17 13:10:27 +010096
willy tarreau532bb552006-05-13 18:40:37 +020097Les paramètres '-st' et '-sf' sont utilisés pour la reconfiguration à chaud.
98Voir la section à ce sujet.
willy tarreau0f7af912005-12-17 12:21:26 +010099
100============================
101| Fichier de configuration |
102============================
103
willy tarreauc29948c2005-12-17 13:10:27 +0100104Structure
105=========
willy tarreau0f7af912005-12-17 12:21:26 +0100106
willy tarreaua1598082005-12-17 13:08:06 +0100107L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
willy tarreau64a3cc32005-12-18 01:13:11 +0100108les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est
109pas précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +0100110
111Le fichier de configuration est découpé en sections répérées par des mots clés
112tels que :
113
114 - 'global'
115 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +0100116 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +0100117
118Tous les paramètres font référence à la section définie par le dernier mot clé
119reconnu.
120
121
willy tarreauc29948c2005-12-17 13:10:27 +01001221) Paramètres globaux
123=====================
willy tarreaua1598082005-12-17 13:08:06 +0100124
125Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
126proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
127supportés sont :
128
willy tarreau8337c6b2005-12-17 13:41:01 +0100129 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100130 - maxconn <nombre>
131 - uid <identifiant>
132 - gid <identifiant>
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200133 - user <nom d'utilisateur>
134 - group <nom de groupe>
willy tarreaua1598082005-12-17 13:08:06 +0100135 - chroot <répertoire>
136 - nbproc <nombre>
137 - daemon
138 - debug
Willy Tarreaude99e992007-04-16 00:53:59 +0200139 - nokqueue
willy tarreau64a3cc32005-12-18 01:13:11 +0100140 - noepoll
141 - nopoll
willy tarreaua1598082005-12-17 13:08:06 +0100142 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100143 - pidfile <fichier>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100144 - ulimit-n <nombre>
Willy Tarreau1db37712007-06-03 17:16:49 +0200145 - tune.maxpollevents <nombre>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100146
willy tarreaua1598082005-12-17 13:08:06 +0100147
1481.1) Journalisation des événements
149----------------------------------
150La plupart des événements sont journalisés : démarrages, arrêts, disparition et
151apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
152syslog vers un ou deux serveurs. La syntaxe est la suivante :
153
willy tarreau8337c6b2005-12-17 13:41:01 +0100154 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100155
156Les connexions sont envoyées en niveau "info". Les démarrages de service et de
157serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
158arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau64a3cc32005-12-18 01:13:11 +0100159bien pour les proxies que pour les serveurs testés par les proxies. Le
160paramètre optionnel <niveau_max> définit le niveau maximal de traces émises
161parmi les 8 valeurs suivantes :
willy tarreau8337c6b2005-12-17 13:41:01 +0100162 emerg, alert, crit, err, warning, notice, info, debug
163
willy tarreaueedaa9f2005-12-17 14:08:03 +0100164Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100165est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100166
167Les catégories possibles sont :
168 kern, user, mail, daemon, auth, syslog, lpr, news,
169 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
170 local0, local1, local2, local3, local4, local5, local6, local7
171
willy tarreau036e1ce2005-12-17 13:46:33 +0100172Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
173
willy tarreaua1598082005-12-17 13:08:06 +0100174Exemple :
175---------
176 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100177 log 192.168.2.200 local3
178 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100179
1801.2) limitation du nombre de connexions
181---------------------------------------
182Il est possible et conseillé de limiter le nombre global de connexions par
willy tarreauc5f73ed2005-12-18 01:26:38 +0100183processus à l'aide du mot clé global 'maxconn'. Les connexions sont comprises
184au sens 'acceptation de connexion', donc il faut s'attendre en règle général à
185avoir un peu plus du double de sessions TCP que le maximum de connexions fixé.
186C'est important pour fixer le paramètre 'ulimit -n' avant de lancer le proxy.
187Pour comptabiliser le nombre de sockets nécessaires, il faut prendre en compte
188ces paramètres :
189
willy tarreaua1598082005-12-17 13:08:06 +0100190 - 1 socket par connexion entrante
191 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100192 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100193 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100194 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100195
willy tarreau64a3cc32005-12-18 01:13:11 +0100196Dans le cas où chaque proxy n'écoute que sur un couple adresse/port,
willy tarreauc5f73ed2005-12-18 01:26:38 +0100197positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
198(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
199il est possible de spécifier cette limite dans la configuration à l'aide du
200mot-clé global 'ulimit-n', à condition bien entendu que le proxy ait été
201démarré sous le compte root (ou avec des droits suffisants pour élever le
202nombre de descripteurs de fichiers). Cette solution met un terme au problème
203récurrent d'incertitude de l'adéquation entre les limites systèmes lors de la
204dernière relance du proxessus et les limites en nombre de connexions. Noter que
205cette limite s'applique par processus.
206
207Exemple :
208---------
209 global
210 maxconn 32000
211 ulimit-n 65536
212
willy tarreauc29948c2005-12-17 13:10:27 +0100213
2141.3) Diminution des privilèges
215------------------------------
216Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
217serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100218de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100219
willy tarreauc29948c2005-12-17 13:10:27 +0100220Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
221numérique d'utilisateur. La valeur 0, correspondant normalement au super-
222utilisateur, possède ici une signification particulière car elle indique que
223l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
224C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
225un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200226changer. Dans le cas où il ne serait pas possible de spécifier un identifiant
227numérique pour l'uid, il est possible de spécifier un nom d'utilisateur après
228le mot-clé 'user'. De la même manière, il est possible de préciser un nom de
229groupe après le mot-clé 'group'.
230
231Il est particulièrement déconseillé d'utiliser des comptes génériques tels que
232'nobody' car cette pratique revient à utiliser 'root' si d'autres processus
233utilisent les mêmes identifiants.
willy tarreauc29948c2005-12-17 13:10:27 +0100234
235Le paramètre 'chroot' autorise à changer la racine du processus une fois le
236programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100237puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100238généralement contournable sur certains OS (Linux, Solaris) pour peu que
239l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
240un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
241service pour cet usage, et de ne pas mutualiser un même répertoire pour
242plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
243il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
244l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100245
willy tarreau64a3cc32005-12-18 01:13:11 +0100246Remarque importante :
247---------------------
248Dans le cas où une telle faille serait mise en évidence, il est fort probable
249que les premières tentatives de son exploitation provoquent un arrêt du
willy tarreauc29948c2005-12-17 13:10:27 +0100250programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
willy tarreau64a3cc32005-12-18 01:13:11 +0100251encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur
252en environnement limité réduit les risques d'intrusion, il est parfois bien
253utile dans ces circonstances de connaître les conditions d'apparition du
254problème, via l'obtention d'un fichier 'core'. La plupart des systèmes, pour
255des raisons de sécurité, désactivent la génération du fichier 'core' après un
256changement d'identifiant pour le processus. Il faudra donc soit lancer le
257processus à partir d'un compte utilisateur aux droits réduits (mais ne pouvant
258pas effectuer le chroot), ou bien le faire en root sans réduction des droits
259(uid 0). Dans ce cas, le fichier se trouvera soit dans le répertoire de
260lancement, soit dans le répertoire spécifié après l'option 'chroot'. Ne pas
261oublier la commande suivante pour autoriser la génération du fichier avant de
262lancer le programme :
willy tarreauc29948c2005-12-17 13:10:27 +0100263
264# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100265
willy tarreauc29948c2005-12-17 13:10:27 +0100266Exemple :
267---------
268
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200269 # with uid/gid
willy tarreauc29948c2005-12-17 13:10:27 +0100270 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100271 uid 30000
272 gid 30000
273 chroot /var/chroot/haproxy
willy tarreauc29948c2005-12-17 13:10:27 +0100274
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200275 # with user/group
276 global
277 user haproxy
278 group public
279 chroot /var/chroot/haproxy
280
281
willy tarreaufe2c5c12005-12-17 14:14:34 +01002821.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100283----------------------------
284Le service peut fonctionner dans plusieurs modes :
285 - avant- / arrière-plan
286 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100287
willy tarreau64a3cc32005-12-18 01:13:11 +0100288Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne
289rend pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci
290dans un script de démarrage du système, sinon le système ne finirait pas son
willy tarreauc29948c2005-12-17 13:10:27 +0100291initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
292au processus appelant. C'est ce que fait l'option 'daemon' de la section
293'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100294
willy tarreau34f45302006-04-15 21:37:14 +0200295Le paramètre de ligne de commande '-db' inhibe les options globales 'daemon'
296et 'nbproc' pour faire fonctionner le processus en mode normal, avant-plan.
297
willy tarreauc29948c2005-12-17 13:10:27 +0100298Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
299standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
300logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
301Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100302
willy tarreauc29948c2005-12-17 13:10:27 +0100303Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
304problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
305entre les clients et les serveurs. Ce mode est incompatible avec les options
306'daemon' et 'quiet' pour des raisons de bon sens.
307
willy tarreaufe2c5c12005-12-17 14:14:34 +01003081.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100309-----------------------------------------------
310Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
311processeur pour effectuer les tâches de relayage, même si les charges
312nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
313grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
314programme sait démarrer plusieurs processus se répartissant la charge de
315travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
316section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100317qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
318la limite de nombre de descripteurs de fichiers allouée par processus sous
319Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100320
321Exemple :
322---------
323
324 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100325 daemon
326 quiet
327 nbproc 2
willy tarreauc29948c2005-12-17 13:10:27 +0100328
willy tarreaufe2c5c12005-12-17 14:14:34 +01003291.6) Simplification de la gestion des processus
330-----------------------------------------------
331Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
332paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
333d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
334le numéro de PID des processus fils, à raison d'un par ligne (valable
335uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
336afin de rester compatible avec un répertoire protégé en lecture seule. Il
337appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
3380644.
339
340Exemple :
341---------
342
343 global
344 daemon
345 quiet
346 nbproc 2
347 pidfile /var/run/haproxy-private.pid
348
349 # pour stopper seulement ces processus parmi d'autres :
350 # kill $(</var/run/haproxy-private.pid)
351
willy tarreau34f45302006-04-15 21:37:14 +0200352 # pour recharger une configuration avec un impact minimal sur le service,
353 # et sans casser les sessions existantes :
Willy Tarreau10806d52007-09-09 23:49:18 +0200354 # haproxy -f haproxy.cfg -p /var/run/haproxy-private.pid -sf $(</var/run/haproxy-private.pid)
willy tarreauc29948c2005-12-17 13:10:27 +0100355
willy tarreau64a3cc32005-12-18 01:13:11 +01003561.7) Mécanismes de traitements des événements
357---------------------------------------------
358A partir de la version 1.2.5, haproxy supporte les mécanismes poll() et
359epoll(). Sur les systems où select() est limité par FD_SETSIZE (comme Solaris),
360poll() peut être une alternative intéressante. Des tests de performance
361montrent que les performances de poll() ne décroissent pas aussi vite que le
362nombre de sockets augmente, ce qui en fait une solution sûre pour les fortes
363charges. Cela dit, Soalris utilise déjà poll() pour émuler select(), donc tant
364que le nombre de sockets ne dépasse pas FD_SETSIZE, poll() ne devrait pas
365apporter de performances supplémentaires. Sur les systèmes à base Linux
366incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
367qui est extrèmement rapide indépendamment du nombre de sockets. Les tests sur
368haproxy ont montré une performance constante de 1 à 40000 sessions simultanées.
Willy Tarreaude99e992007-04-16 00:53:59 +0200369La version 1.3.9 a introduit le support de kqueue() pour FreeBSD/OpenBSD, ainsi
370qu'une variante appelée "speculative epoll()" consistant à tenter d'effectuer
371les opérations d'entrées/sorties avant de chaîner les événements par les appels
372système.
willy tarreau64a3cc32005-12-18 01:13:11 +0100373
Willy Tarreau1db37712007-06-03 17:16:49 +0200374Afin d'optimiser la latence, il est désormais possible de limiter le nombre
375d'événements remontés à chaque appel. La limite par défaut est fixée à 200. Si
376une latence plus petite est recherchée, il peut être justifié d'abaisser cette
377limite par l'utilisation du paramètre 'tune.maxpollevents' dans la section
378'global'. L'augmenter permettra d'économiser un peu le processeur en présence
379de très grands nombres de connexions simultanées.
380
Willy Tarreaude99e992007-04-16 00:53:59 +0200381Haproxy utilisera kqueue() ou speculative epoll() lorsque ce sera disponible,
382puis epoll(), et se repliera sur poll(), puis en dernier lieu sur select().
383Cependant, si pour une raison quelconque il s'avérait nécessaire de désactiver
384epoll() ou poll() (p.ex: à cause d'un bug ou juste pour comparer les
385performances), de nouvelles options globales ont été ajoutées dans ce but :
Willy Tarreaue9f49e72012-11-11 17:42:00 +0100386'nokqueue', 'noepoll' et 'nopoll'.
willy tarreau64a3cc32005-12-18 01:13:11 +0100387
388Exemple :
389---------
390 global
391 # utiliser seulement select()
392 noepoll
393 nopoll
Willy Tarreau1db37712007-06-03 17:16:49 +0200394 tune.maxpollevents 100
willy tarreau64a3cc32005-12-18 01:13:11 +0100395
396Remarque :
397----------
398Dans le but d'assurer une portabilité maximale des configurations, ces options
399sont acceptées et ignorées si les mécanismes poll() ou epoll() n'ont pas été
400activés lors de la compilation.
401
402Afin de simplifier la résolution de problèmes, le paramètre '-de' en ligne de
Willy Tarreaude99e992007-04-16 00:53:59 +0200403commande désactive epoll(), le paramètre '-dp' désactive poll(), '-dk' kqueue()
404et '-ds' désactive speculative epoll(). Ils sont respectivement équivalents à
Willy Tarreaue9f49e72012-11-11 17:42:00 +0100405'noepoll', 'nopoll', et 'nokqueue'.
willy tarreau64a3cc32005-12-18 01:13:11 +0100406
407
willy tarreauc29948c2005-12-17 13:10:27 +01004082) Définition d'un service en écoute
409====================================
410
411Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100412
willy tarreaua41a8b42005-12-17 14:02:24 +0100413 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100414
willy tarreauc29948c2005-12-17 13:10:27 +0100415- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
willy tarreau64a3cc32005-12-18 01:13:11 +0100416 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé.
417 Aucun test n'est effectué concernant l'unicité de ce nom, qui n'est pas
418 obligatoire, mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100419
willy tarreaua41a8b42005-12-17 14:02:24 +0100420- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
421 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
422 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100423
willy tarreaua41a8b42005-12-17 14:02:24 +0100424- <plage_ports> correspond soit à un port, soit à une plage de ports sur
425 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
426 Cette plage peut être :
427 - soit un port numérique (ex: '80')
428 - soit une plage constituée de deux valeurs séparées par un tiret
429 (ex: '2000-2100') représentant les extrémités incluses dans la
430 plage.
431 Il faut faire attention à l'usage des plages, car chaque combinaison
432 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
433 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
434 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
willy tarreau64a3cc32005-12-18 01:13:11 +0100435 niveau de privilège particulier lors du lancement du programme
436 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100437
willy tarreaua41a8b42005-12-17 14:02:24 +0100438- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
439 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
440 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
441
442Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100443---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100444 listen http_proxy :80
445 listen x11_proxy 127.0.0.1:6000-6009
446 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
447 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100448
willy tarreaua41a8b42005-12-17 14:02:24 +0100449Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
450rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
451de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
452l'écriture de configurations :
453
454 bind [ <adresse_IP>:<plage_ports>[,...] ]
455
456Exemples :
457----------
458 listen http_proxy
459 bind :80,:443
willy tarreauc5f73ed2005-12-18 01:26:38 +0100460 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100461
willy tarreauc29948c2005-12-17 13:10:27 +01004622.1) Inhibition d'un service
463----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100464Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100465commenter toute une partie du fichier. Il suffit de positionner le mot clé
466"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100467
468 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100469 disabled
willy tarreau0f7af912005-12-17 12:21:26 +0100470
willy tarreaueedaa9f2005-12-17 14:08:03 +0100471Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
willy tarreauc5f73ed2005-12-18 01:26:38 +0100472 désactivé par le mot clé 'disabled', par exemple à cause d'une
473 configuration par défaut.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100474
willy tarreauc29948c2005-12-17 13:10:27 +01004752.2) Mode de fonctionnement
476---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100477Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100478 - TCP
479 - HTTP
willy tarreau532bb552006-05-13 18:40:37 +0200480 - état de santé
willy tarreau0f7af912005-12-17 12:21:26 +0100481
482Mode TCP
483--------
willy tarreau64a3cc32005-12-18 01:13:11 +0100484Dans ce mode, le service relaye, dès leur établissement, les connexions TCP
485vers un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il
486s'agit simplement d'une association
487 source<adresse:port> -> destination<adresse:port>.
willy tarreauc29948c2005-12-17 13:10:27 +0100488Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100489
willy tarreauc29948c2005-12-17 13:10:27 +0100490Exemple :
491---------
willy tarreau0f7af912005-12-17 12:21:26 +0100492 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100493 mode tcp
willy tarreau0f7af912005-12-17 12:21:26 +0100494
495Mode HTTP
496---------
willy tarreauc29948c2005-12-17 13:10:27 +0100497Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
498serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
willy tarreauc5f73ed2005-12-18 01:26:38 +0100499décision. Les en-têtes HTTP sont analysés pour y trouver un éventuel cookie, et
willy tarreauc29948c2005-12-17 13:10:27 +0100500certains d'entre-eux peuvent être modifiés par le biais d'expressions
501régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
502relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100503
willy tarreauc29948c2005-12-17 13:10:27 +0100504Exemple :
505---------
willy tarreau0f7af912005-12-17 12:21:26 +0100506 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100507 mode http
willy tarreau0f7af912005-12-17 12:21:26 +0100508
509Mode supervision
510----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100511Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
512santé du service. Il se contente de retourner "OK" à tout client se connectant
513sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100514déterminer quels sont les services utilisables. Si l'option 'httpchk' est
515activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
516attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100517le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100518
willy tarreauc29948c2005-12-17 13:10:27 +0100519Exemple :
520---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100521 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100522 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100523 mode health
willy tarreau0f7af912005-12-17 12:21:26 +0100524
willy tarreau197e8ec2005-12-17 14:10:59 +0100525 # réponse HTTP : 'HTTP/1.0 200 OK'
526 listen http_health_check 0.0.0.0:60001
willy tarreauc5f73ed2005-12-18 01:26:38 +0100527 mode health
528 option httpchk
willy tarreau197e8ec2005-12-17 14:10:59 +0100529
willy tarreau0f7af912005-12-17 12:21:26 +0100530
willy tarreau532bb552006-05-13 18:40:37 +02005312.2.1 Supervision
532-----------------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100533Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
534bon fonctionnement du proxy sans perturber le service. Le mot-clé 'monitor-net'
535a été créé dans le butd de spécifier un réseau d'équipements qui ne PEUVENT PAS
536utiliser le service pour autre chose que des tests de fonctionnement. C'est
537particulièrement adapté aux proxies TCP, car cela empêche le proxy de relayer
538des établissements de connexion émis par un outil de surveillance.
539
540Lorsque c'est utilisé sur un proxy TCP, la connexion est acceptée puis refermée
541et rien n'est logué. C'est suffisant pour qu'un répartiteur de charge en amont
542détecte que le service est disponible.
543
544Lorsque c'est utilisé sur un proxy HTTP, la connexion est acceptée, rien n'est
545logué, puis la réponse suivante est envoyée et la session refermée :
546"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un répartiteur de charge
547HTTP en amont détecte le service comme opérationnel, aussi bien à travers des
548tests TCP que HTTP.
549
550Les proxies utilisant le mot-clé 'monitor-net' peuvent accessoirement se passer
551de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
552émises depuis d'autres adresses que celles du réseau de tests.
553
554Exemple :
555---------
556
557 listen tse-proxy
558 bind :3389,:1494,:5900 # TSE, ICA and VNC at once.
559 mode tcp
560 balance roundrobin
561 server tse-farm 192.168.1.10
562 monitor-net 192.168.1.252/31 # L4 load-balancers on .252 and .253
563
564
Willy Tarreau1c47f852006-07-09 08:22:27 +0200565Lorsque le système effectuant les tests est situé derrière un proxy, le mot-clé
566'monitor-net' n'est pas utilisable du fait que haproxy verra toujours la même
567adresse pour le proxy. Pour pallier à cette limitation, la version 1.2.15 a
568apporté le mot-clé 'monitor-uri'. Il définit une URI qui ne sera ni retransmise
569ni logée, mais pour laquelle haproxy retournera immédiatement une réponse
570"HTTP/1.0 200 OK". Cela rend possibles les tests de validité d'une chaîne
571reverse-proxy->haproxy en une requête HTTP. Cela peut être utilisé pour valider
572une combinaision de stunnel+haproxy à l'aide de tests HTTPS par exemple. Bien
573entendu, ce mot-clé n'est valide qu'en mode HTTP, sinon il n'y a pas de notion
574d'URI. Noter que la méthode et la version HTTP sont simplement ignorées.
575
576Exemple :
577---------
578
579 listen stunnel_backend :8080
580 mode http
581 balance roundrobin
582 server web1 192.168.1.10:80 check
583 server web2 192.168.1.11:80 check
584 monitor-uri /haproxy_test
585
586
willy tarreauc29948c2005-12-17 13:10:27 +01005872.3) Limitation du nombre de connexions simultanées
588---------------------------------------------------
589Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
590connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
591d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
592limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100593
willy tarreauc29948c2005-12-17 13:10:27 +0100594Exemple :
595---------
596 listen tiny_server 0.0.0.0:80
597 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100598
599
willy tarreauc29948c2005-12-17 13:10:27 +01006002.4) Arrêt en douceur
601---------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100602Il est possible d'arrêter les services en douceur en envoyant un signal
willy tarreau22739ef2006-01-20 20:43:32 +0100603SIGUSR1 au processus relais. Tous les services seront alors mis en phase
willy tarreau64a3cc32005-12-18 01:13:11 +0100604d'arrêt, mais pourront continuer d'accepter des connexions pendant un temps
605défini par le paramètre 'grace' (en millisecondes). Cela permet par exemple,
606de faire savoir rapidement à un répartiteur de charge qu'il ne doit plus
607utiliser un relais, tout en continuant d'assurer le service le temps qu'il
608s'en rende compte.
609
610Remarque :
611----------
612Les connexions actives ne sont jamais cassées. Dans le pire des cas, il faudra
willy tarreau22739ef2006-01-20 20:43:32 +0100613attendre en plus leur expiration avant l'arrêt total du processus, ou bien tuer
614manuellement le processus par l'envoi d'un signal SIGTERM. La valeur par défaut
615du paramètre 'grace' est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100616
617Exemple :
618---------
willy tarreauc29948c2005-12-17 13:10:27 +0100619 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100620 # le service tournera encore 10 secondes après la demande d'arrêt
621 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100622 mode http
623 grace 10000
willy tarreau0f7af912005-12-17 12:21:26 +0100624
willy tarreauc29948c2005-12-17 13:10:27 +0100625 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100626 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100627 mode health
628 grace 0
willy tarreau0f7af912005-12-17 12:21:26 +0100629
willy tarreau39df2dc2006-01-29 21:56:05 +0100630A partir de la version 1.2.8, un nouveau mécanisme de reconfiguration à chaud
willy tarreau22739ef2006-01-20 20:43:32 +0100631a été introduit. Il est désormais possible de mettre les proxies en "pause" en
632envoyant un signal SIGTTOU aux processus. Cela désactivera les sockets d'écoute
633sans casser les sessions existantes. Suite à cela, l'envoi d'un signal SIGTTIN
634réactivera les sockets d'écoute. Ceci est très pratique pour tenter de charger
635une nouvelle configuration ou même une nouvelle version de haproxy sans casser
636les connexions existantes. Si le rechargement s'effectue correctement, il ne
637reste plus qu'à envoyer un signal SIGUSR1 aux anciens processus, ce qui
638provoquera leur arrêt immédiat dès que leurs connexions seront terminées ; en
639revanche, si le rechargement échoue, il suffit d'envoyer un signal SIGTTIN pour
640remettre les ports en écoute et rétablir le service immédiatement. Veuillez
641noter que le paramètre 'grace' est ignoré pour le signal SIGTTOU ainsi que le
642signal SIGUSR1 une fois le processus en pause. Aussi, il peut s'avérer très
643utile de sauver le fichier de pid avant de démarrer une nouvelle instance.
644
willy tarreau34f45302006-04-15 21:37:14 +0200645Ce mécanisme est pleinement exploité à partir de la version 1.2.11 avec les
willy tarreau532bb552006-05-13 18:40:37 +0200646options '-st' et '-sf' (voir ci-dessous).
647
6482.4) Reconfiguration à chaud
649----------------------------
650Les paramètres '-st' et '-sf' sont utilisés pour informer des processus
651existants que la configuration va être rechargée. Ils recevront le signal
652SIGTTOU, leur demandant de libérer les ports en écoute afin que le nouveau
653processus puisse les prendre. Si quoi que ce soit se passe mal, le nouveau
654processus leur enverra un signal SIGTTIN pour leur indiquer qu'ils peuvent
655se remettre en écoute et continuer leur travail. En revanche, si la
656configuration se charge correctement, alors ils recevront un signal de demande
657de fin de travail en douceur (-sf), ou de terminaison immédiate (-st) qui
658coupera les sessions en cours. Un usage typique tel que celui-ci permet de
659recharger une configuration sans interruption de service :
660
661 # haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
662
willy tarreau0f7af912005-12-17 12:21:26 +0100663
willy tarreauc29948c2005-12-17 13:10:27 +01006642.5) Temps d'expiration des connexions
665--------------------------------------
666Il est possible de paramétrer certaines durées d'expiration au niveau des
667connexions TCP. Trois temps indépendants sont configurables et acceptent des
668valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
669session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100670
671 - temps d'attente d'une donnée de la part du client, ou de la
672 possibilité de lui envoyer des données : "clitimeout" :
673
willy tarreauc5f73ed2005-12-18 01:26:38 +0100674 # time-out client à 2mn30.
675 clitimeout 150000
willy tarreau0f7af912005-12-17 12:21:26 +0100676
677 - temps d'attente d'une donnée de la part du serveur, ou de la
678 possibilité de lui envoyer des données : "srvtimeout" :
679
willy tarreauc5f73ed2005-12-18 01:26:38 +0100680 # time-out serveur à 30s.
681 srvtimeout 30000
willy tarreau0f7af912005-12-17 12:21:26 +0100682
683 - temps d'attente de l'établissement d'une connexion vers un serveur
684 "contimeout" :
685
willy tarreauc29948c2005-12-17 13:10:27 +0100686 # on abandonne si la connexion n'est pas établie après 4 secondes
willy tarreauc5f73ed2005-12-18 01:26:38 +0100687 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100688
willy tarreauc29948c2005-12-17 13:10:27 +0100689Remarques :
690-----------
691 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
692 type "health".
693 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
willy tarreau64a3cc32005-12-18 01:13:11 +0100694 possible de perdre des paquets. Du fait que la première retransmission
695 TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
696 inférieur à 3 secondes ne permet pas de se rattraper sur la perte
697 de paquets car la session aura été abandonnée avant la première
698 retransmission. Une valeur de 4 secondes réduira considérablement
699 le nombre d'échecs de connexion.
Willy Tarreaubefdff12007-12-02 22:27:38 +0100700 - A compter de la version 1.3.14, il est possible de spécifier les durées
701 d'expiration dans des unités de temps arbitraires à choisir parmi
702 { us, ms, s, m, h, d }. Pour cela, la valeur entière doit être suffixée
703 de l'unité.
willy tarreau0f7af912005-12-17 12:21:26 +0100704
willy tarreauc29948c2005-12-17 13:10:27 +01007052.6) Tentatives de reconnexion
706------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100707Lors d'un échec de connexion vers un serveur, il est possible de
708retenter (potentiellement vers un autre serveur, en cas de répartition
709de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100710abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100711
willy tarreauc29948c2005-12-17 13:10:27 +0100712Exemple :
713---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100714 # on essaie encore trois fois maxi
715 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100716
willy tarreau34f45302006-04-15 21:37:14 +0200717Il est à noter que la tentative de reconnexion peut amener à utiliser un autre
718serveur si le premier a disparu entre deux tentatives de connexion.
719
willy tarreau0f7af912005-12-17 12:21:26 +0100720
willy tarreauc29948c2005-12-17 13:10:27 +01007212.7) Adresse du serveur
722-----------------------
723Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
724le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
725serveur d'assignation de cookie dans le cas où le service consiste à assurer
726uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100727le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
728du serveur distant, et il est maintenant recommandé d'utiliser de préférence
729le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100730
willy tarreauc29948c2005-12-17 13:10:27 +0100731Exemple :
732---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100733 # on envoie toutes les nouvelles connexions ici
734 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100735
willy tarreauc29948c2005-12-17 13:10:27 +0100736Remarque :
737----------
738Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
739'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100740
willy tarreau0f7af912005-12-17 12:21:26 +0100741
willy tarreau240afa62005-12-17 13:14:35 +01007422.8) Adresse de sortie
743----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100744Il est possible de forcer l'adresse utilisée pour établir les connexions vers
745les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
746port, bien que cette fonctionnalité se limite à des usages très spécifiques.
747C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100748pour permettre aux serveurs de trouver le chemin de retour dans des contextes
749de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
750choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
751librement par le système. Il est à noter que depuis la version 1.1.18, les
752tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
753source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100754
755Exemples :
756----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100757 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100758 # toutes les connexions prennent l'adresse 192.168.1.200
759 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100760
willy tarreaua41a8b42005-12-17 14:02:24 +0100761 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100762 # utiliser l'adresse 192.168.1.200 et le port réservé 900
763 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100764
765
7662.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100767--------------------------------
768En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
769vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
770par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100771
willy tarreauc29948c2005-12-17 13:10:27 +0100772Exemple :
773---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100774 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100775 mode http
776 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100777
willy tarreauc29948c2005-12-17 13:10:27 +0100778On peut modifier l'utilisation du cookie pour la rendre plus intelligente
779vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
780réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
781cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100782de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
783inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100784
785Exemples :
786----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100787
788Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100789dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
790directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100791
willy tarreauc5f73ed2005-12-18 01:26:38 +0100792 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100793
willy tarreauc29948c2005-12-17 13:10:27 +0100794Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
795lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100796
willy tarreauc5f73ed2005-12-18 01:26:38 +0100797 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100798
willy tarreau64a3cc32005-12-18 01:13:11 +0100799Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
800accès en répartition de charge interne. Dans ce cas, il est souhaitable que
801tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100802retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100803
willy tarreauc5f73ed2005-12-18 01:26:38 +0100804 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100805
willy tarreau0174f312005-12-18 01:02:42 +0100806Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
807puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
808permet d'insérer une instance de haproxy devant une application sans risquer
809d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
810plus d'un cookie :
811
812 cookie JSESSIONID prefix
813
willy tarreau240afa62005-12-17 13:14:35 +0100814Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
815ajouter le mot clé 'nocache' après 'insert' :
816
willy tarreauc5f73ed2005-12-18 01:26:38 +0100817 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100818
willy tarreau64a3cc32005-12-18 01:13:11 +0100819Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
820mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100821
willy tarreauc5f73ed2005-12-18 01:26:38 +0100822 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100823
willy tarreau240afa62005-12-17 13:14:35 +0100824
willy tarreau96d40372005-12-17 13:11:56 +0100825Remarques :
826-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100827- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
828 s'adapter à des applications générant déjà le cookie, avec un contenu
829 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100830
willy tarreau96d40372005-12-17 13:11:56 +0100831- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
832 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
833 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100834
willy tarreau240afa62005-12-17 13:14:35 +0100835- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
836 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
837 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
838 cookie de persistence inséré, donc provoquer des changements de serveurs pour
839 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100840
willy tarreau0174f312005-12-18 01:02:42 +0100841- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
842 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
843 présenté par l'application qui est censée savoir à quel moment il peut
844 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
845 présenté par le client dans chaque requête ultérieure, il est indispensable
846 de s'assurer que le client et le serveur communiqueront sans "keep-alive
847 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
848
willy tarreaucd878942005-12-17 13:27:43 +0100849- lorsque l'application est bien connue, et que les parties nécessitant de la
850 persistence sont systématiquement accédées par un formulaire en mode POST,
851 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
852 et "indirect", car la page d'accueil reste cachable, et c'est l'application
853 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100854
willy tarreau240afa62005-12-17 13:14:35 +01008552.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100856----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100857En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
858par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100859
willy tarreau5cbea6f2005-12-17 12:48:26 +0100860 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100861
willy tarreauc29948c2005-12-17 13:10:27 +0100862- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
863 configuration et les logs.
864- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
865- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100866
867Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100868---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100869 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100870 mode http
871 cookie SERVERID
872 dispatch 192.168.1.100:80
873 server web1 192.168.1.1:80 cookie server01
874 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100875
876Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100877-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100878
willy tarreaua41a8b42005-12-17 14:02:24 +01008793) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100880=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100881
willy tarreauc29948c2005-12-17 13:10:27 +0100882Le relais peut effectuer lui-même la répartition de charge entre les différents
883serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
884cela, on précise le mot clé 'balance' dans la définition du service,
willy tarreau34f45302006-04-15 21:37:14 +0200885éventuellement suivi du nom d'un algorithme de répartition. Jusqu'à la version
8861.2.11, seul 'roundrobin' était géré, et c'est aussi la valeur implicite par
Willy Tarreau2fcb5002007-05-08 13:35:26 +0200887défaut. Avec la version 1.2.12, le nouveau mot clé 'source' est apparu. La
888version 1.3.10 a également apporté le mot clé 'uri'. Il est évident qu'en cas
889d'utilisation du répartiteur interne, il ne faudra pas spécifier d'adresse de
890dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100891
892Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100893---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100894
willy tarreaua41a8b42005-12-17 14:02:24 +0100895 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100896 mode http
897 cookie SERVERID
898 balance roundrobin
899 server web1 192.168.1.1:80 cookie server01
900 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100901
willy tarreaua41a8b42005-12-17 14:02:24 +0100902Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
903du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
904sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
905champ <port> de l'adresse serveur :
906
907 - non spécifié ou nul :
908 la connexion sera envoyée au serveur sur le même port que celui sur
909 lequel le relais a reçu la connexion.
910
911 - valeur numérique (seul cas supporté pour les versions antérieures) :
912 le serveur recevra la connexion sur le port désigné.
913
914 - valeur numérique précédée d'un signe '+' :
915 la connexion sera envoyée au serveur sur le même port que celui sur
916 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
917
918 - valeur numérique précédée d'un signe '-' :
919 la connexion sera envoyée au serveur sur le même port que celui sur
920 lequel le relais a reçu la connexion, duquel on soustrait la valeur
921 désignée.
922
923Exemples :
924----------
925
926# même que précédemment
927
928 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100929 mode http
930 cookie SERVERID
931 balance roundrobin
932 server web1 192.168.1.1 cookie server01
933 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100934
935# relayage simultané des ports 80 et 81 et 8080-8089
936
937 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100938 mode http
939 cookie SERVERID
940 balance roundrobin
941 server web1 192.168.1.1 cookie server01
942 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100943
944# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
945
946 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100947 mode tcp
948 balance roundrobin
949 server srv1 192.168.1.1:+1000
950 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100951
willy tarreau34f45302006-04-15 21:37:14 +0200952Comme indiqué précédemment, la version 1.2.12 apporta le nouveau mot clé
953'source'. Lorsque celui-ci est utilisé, l'adresse IP du client est hachée et
954distribuée de manière homogène parmi les serveurs disponibles, de sorte qu'une
955même adresse IP aille toujours sur le même serveur tant qu'il n'y a aucun
956changement dans le nombre de serveurs disponibles. Ceci peut être utilisé par
957exemple pour attacher le HTTP et le HTTPS sur un même serveur pour un même
958client. Cela peut également être utilisé pour améliorer la persistance
959lorsqu'une partie de la population des clients n'accepte pas les cookies. Dans
960ce cas, seuls ces derniers seront perturbés par la perte d'un serveur.
961
962NOTE: il est important de prendre en compte le fait que beaucoup d'internautes
963 naviguent à travers des fermes de proxies qui assignent des adresses IP
964 différentes à chaque requête. D'autres internautes utilisent des liens à
965 la demande et obtiennent une adresse IP différente à chaque connexion. De
966 ce fait, le paramètre 'source' doit être utilisé avec une extrème
967 précaution.
968
969Exemples :
970----------
971
972# assurer qu'une même adresse IP ira sur le même serveur pour tout service
973
974 listen http_proxy
975 bind :80,:443
976 mode http
977 balance source
978 server web1 192.168.1.1
979 server web2 192.168.1.2
980
981# améliorer la persistance par l'utilisation de la source en plus du cookie :
982
983 listen http_proxy :80
984 mode http
985 cookie SERVERID
986 balance source
987 server web1 192.168.1.1 cookie server01
988 server web2 192.168.1.2 cookie server02
989
Willy Tarreau2fcb5002007-05-08 13:35:26 +0200990De plus, tel qu'indiqué ci-dessus, la version 1.3.10 a introduit le mot clé
991'uri'. Il est très pratique dans le cas de répartition de charge entre des
992reverse-proxy-caches, parce qu'il utilisera le résultat d'un hachage de l'URI
993pour choisir un serveur, ce qui aura pour effet d'optimiser le taux de cache
994du fait que la même URI sera toujours envoyée au même cache. Ce mot-clé n'est
995autorisé qu'en mode HTTP.
996
997Example :
998---------
999
1000# Envoie toujours une URI donnée au même serveur
1001
1002 listen http_proxy
1003 bind :3128
1004 mode http
1005 balance uri
1006 server squid1 192.168.1.1
1007 server squid2 192.168.1.2
1008
Willy Tarreau01732802007-11-01 22:48:15 +01001009La version 1.3.14 a apporté une nouvelle méthode 'balance url_param'. Elle
1010consiste à se baser sur un paramètre passé dans l'URL pour effectuer un hachage
1011utilisé pour déterminer le serveur à utiliser. Ceci est principalement utile
1012pour des applications n'ayant pas une exigence stricte de persistance, mais
1013pour lesquelles elle procure un gain de performance notable dans des
1014environnements où il n'est pas toujours possible d'utiliser des cookies. En cas
1015d'absence du paramètre dans l'URL, alors une répartition de type 'round robin'
1016est effectuée.
1017
1018Example :
1019---------
1020
1021# hache le paramètre "basket_id" dans l'URL pour déterminer le serveur
1022
1023 listen http_proxy
1024 bind :3128
1025 mode http
1026 balance url_param basket_id
1027 server ebiz1 192.168.1.1
1028 server ebiz2 192.168.1.2
1029
willy tarreau0f7af912005-12-17 12:21:26 +01001030
willy tarreauc29948c2005-12-17 13:10:27 +010010313.1) Surveillance des serveurs
1032------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001033Il est possible de tester l'état des serveurs par établissement de connexion
1034TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
1035utilisé dans le processus de répartition de charge interne. Pour activer la
1036surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
1037Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
1038tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
1039paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
1040Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreau34f45302006-04-15 21:37:14 +02001041
willy tarreaue47c8d72005-12-17 12:55:52 +01001042 - inter : 2000
1043 - rise : 2
1044 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +01001045 - port : port de connexion du serveur
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001046 - addr : adresse de connexion du serveur (par defaut: adresse du serveur)
1047
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001048Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001049certains cas de pannes, des serveurs peuvent continuer à accepter les
1050connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
1051d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
1052et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
1053les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
1054contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
1055RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
10561.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
1057possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
1058l'avantage d'être facilement extractibles des logs, et de ne pas induire
1059d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
1060considérées valides, les autres (y compris non-réponses) aboutissent à un
1061échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
1062deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
1063"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
1064accepte donc 4 formes :
willy tarreau34f45302006-04-15 21:37:14 +02001065
willy tarreaueedaa9f2005-12-17 14:08:03 +01001066 - option httpchk -> OPTIONS / HTTP/1.0
1067 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
1068 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
1069 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreau34f45302006-04-15 21:37:14 +02001070
Willy Tarreauf3c69202006-07-09 16:42:34 +02001071HAProxy est souvent utilisé pour relayer divers protocoles reposant sur TCP,
1072tels que HTTPS, SMTP ou LDAP, le plus commun étant HTTPS. Un problème assez
1073couramment rencontré dans les data centers est le besoin de relayer du trafic
1074vers des serveurs lointains tout en maintenant la possibilité de basculer sur
1075un serveur de secours. Les tests purement TCP ne suffisent pas toujours dans
1076ces situations car l'on trouve souvent, dans la chaîne, des proxies, firewalls
1077ou répartiteurs de charge qui peuvent acquitter la connexion avant qu'elle
1078n'atteigne le serveur. La seule solution à ce problème est d'envoyer des tests
1079applicatifs. Comme la demande pour les tests HTTPS est élevée, ce test a été
1080implémenté en version 1.2.15 sur la base de messages SSLv3 CLIENT HELLO. Pour
1081l'activer, utiliser "option ssl-hello-chk". Ceci enverra des messages SSLv3
1082CLIENT HELLO aux serveurs, en annonçant un support pour la majorité des
1083algorithmes de chiffrement. Si en retour, le serveur envoie ce qui ressemble à
1084une réponse SSLv3 SERVER HELLO ou ALERT (refus des algorithmes), alors la
1085réponse sera considérée comme valide. Noter qu'Apache ne produit pas de log
1086lorsqu'il reçoit des messages HELLO, ce qui en fait un type de message
1087parfaitement adapté à ce besoin.
1088
Willy Tarreau23677902007-05-08 23:50:35 +02001089La version 1.3.10 est accompagnée d'un nouveau test d'état pour le SMTP. Par
1090défaut, il consiste à envoyer "HELO localhost" aux serveurs, et à attendre le
1091message "250" en retour. Notez qu'il peut aussi envoyer une requête plus
1092spécifique :
1093
1094 - option smtpchk -> envoie "HELO localhost"
1095 - option smtpchk EHLO mail.mydomain.com -> envoie ce message ESMTP
1096
willy tarreauc5f73ed2005-12-18 01:26:38 +01001097Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001098
willy tarreau8337c6b2005-12-17 13:41:01 +01001099Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
1100utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
1101ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
1102de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
1103les serveurs de secours qui le précèdent sont hors d'usage. Il n'y a donc pas
Willy TARREAU3481c462006-03-01 22:37:57 +01001104de répartition de charge entre des serveurs de secours par défaut. A partir
1105de la version 1.2.9, il est possible de les utiliser simultanément grâce à
1106l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
1107d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
1108de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
1109définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
1110qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +01001111
willy tarreaua41a8b42005-12-17 14:02:24 +01001112Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
1113vers un port différent de celui de service. C'est nécessaire principalement
1114pour les configurations où le serveur n'a pas de port prédéfini, par exemple
1115lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001116le paramètre 'port' suivi du numéro de port devant répondre aux requêtes. Il
1117est possible d'envoyer les tests de fonctionnement vers une adresse différente
1118de celle de service. Cela permet d'utiliser, sur la machine faisant fonctionner
1119HAproxy, un démon permettant des tests specifiques ( REGEX sur un résultat et
1120basculement de plusieurs fermes en cas d'erreur sur l'une d'elles).
willy tarreaua41a8b42005-12-17 14:02:24 +01001121
willy tarreau64a3cc32005-12-18 01:13:11 +01001122Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
1123l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
1124SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
1125envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
1126elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
1127local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +01001128
willy tarreau982249e2005-12-18 00:57:06 +01001129Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
1130logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
1131afin de notifier l'administrateur qu'il faut prendre une action immédiate.
1132
willy tarreau0174f312005-12-18 01:02:42 +01001133Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
1134même valeur de cookie. C'est particulièrement utile en mode backup, pour
1135sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
1136oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
1137temporairement vers une page d'erreur en attendant le redémarrage d'une
1138application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
1139le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
1140chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
1141le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
1142pour plus d'informations.
1143
willy tarreauc29948c2005-12-17 13:10:27 +01001144Exemples :
1145----------
willy tarreaua41a8b42005-12-17 14:02:24 +01001146# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001147 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001148 mode http
1149 cookie SERVERID
1150 balance roundrobin
1151 server web1 192.168.1.1:80 cookie server01 check
1152 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001153
willy tarreau2f6ba652005-12-17 13:57:42 +01001154# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001155 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001156 mode http
1157 cookie SERVERID
1158 balance roundrobin
1159 option httpchk
1160 server web1 192.168.1.1:80 cookie server01 check
1161 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +01001162
willy tarreau2f6ba652005-12-17 13:57:42 +01001163# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
1164 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001165 mode http
1166 cookie SERVERID
1167 balance roundrobin
1168 option httpchk /index.html
1169 server web1 192.168.1.1:80 cookie server01 check
1170 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +01001171
willy tarreaueedaa9f2005-12-17 14:08:03 +01001172# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1173 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001174 mode http
1175 cookie SERVERID
1176 balance roundrobin
1177 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1178 server web1 192.168.1.1:80 cookie server01 check
1179 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001180
willy tarreau0174f312005-12-18 01:02:42 +01001181# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1182# douceur utilisant un second port (81) juste pour les health-checks.
1183 listen http_proxy 0.0.0.0:80
1184 mode http
1185 cookie JSESSIONID prefix
1186 balance roundrobin
1187 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1188 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1189 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1190 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1191 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1192
willy tarreau96d40372005-12-17 13:11:56 +01001193# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001194# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1195# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +01001196 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001197 mode http
1198 cookie SERVERID insert nocache indirect
1199 balance roundrobin
1200 server web1 192.168.1.1:80 cookie server01 check
1201 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +01001202
willy tarreaueedaa9f2005-12-17 14:08:03 +01001203# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001204 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001205 mode http
1206 cookie SERVERID insert nocache indirect
1207 balance roundrobin
1208 server web1 192.168.1.1:80 cookie server01 check
1209 server web2 192.168.1.2:80 cookie server02 check
1210 server web-backup 192.168.2.1:80 cookie server03 check backup
1211 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001212
willy tarreaua41a8b42005-12-17 14:02:24 +01001213# relayage SMTP+TLS avec test du serveur et serveur de backup
1214
1215 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001216 mode tcp
1217 balance roundrobin
1218 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1219 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001220
Willy Tarreauf3c69202006-07-09 16:42:34 +02001221# relayage HTTPS avec test du serveur et serveur de backup
1222
1223 listen http_proxy :443
1224 mode tcp
1225 option ssl-hello-chk
1226 balance roundrobin
1227 server srv1 192.168.1.1 check inter 30000 rise 1 fall 2
1228 server srv2 192.168.1.2 backup
1229
Willy TARREAU3481c462006-03-01 22:37:57 +01001230# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1231 listen http_proxy 0.0.0.0:80
1232 mode http
1233 balance roundrobin
1234 option httpchk
1235 server inst1 192.168.1.1:80 cookie s1 check
1236 server inst2 192.168.1.2:80 cookie s2 check
1237 server inst3 192.168.1.3:80 cookie s3 check
1238 server back1 192.168.1.10:80 check backup
1239 server back2 192.168.1.11:80 check backup
1240 option allbackups # all backups will be used
1241
willy tarreau0f7af912005-12-17 12:21:26 +01001242
willy tarreauc29948c2005-12-17 13:10:27 +010012433.2) Reconnexion vers un répartiteur en cas d'échec direct
1244----------------------------------------------------------
1245En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1246seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1247définitivement privés de service. La spécification du paramètre 'redispatch'
1248autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1249(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001250
1251Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001252---------
willy tarreau0f7af912005-12-17 12:21:26 +01001253 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001254 mode http
1255 cookie SERVERID
1256 dispatch 192.168.1.100:80
1257 server web1 192.168.1.1:80 cookie server01
1258 server web2 192.168.1.2:80 cookie server02
1259 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001260
willy tarreau64a3cc32005-12-18 01:13:11 +01001261Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1262redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1263version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1264identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1265tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1266tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001267
1268 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001269 mode http
1270 option persist
1271 cookie SERVERID
1272 dispatch 192.168.1.100:80
1273 server web1 192.168.1.1:80 cookie server01
1274 server web2 192.168.1.2:80 cookie server02
1275 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001276
willy tarreauc29948c2005-12-17 13:10:27 +01001277
willy tarreau34f45302006-04-15 21:37:14 +020012783.3) Assignation de poids différents à des serveurs
1279---------------------------------------------------
1280Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1281d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1282que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1283soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1284raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1285plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1286plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1287la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1288une vue des serveurs disponibles la plus homogène possible en se basant sur
1289leur poids de sorte que la charge se distribue de la manière la plus lisse
1290possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
willy tarreau532bb552006-05-13 18:40:37 +02001291serveur par rapport aux autres. Le poids de 1 donne la fréquence d'apparition
1292la plus faible, et 256 la fréquence la plus élevée. De cette manière, si un
1293serveur disparait, les capacités restantes sont toujours respectées.
willy tarreau34f45302006-04-15 21:37:14 +02001294
1295
1296Exemple :
1297---------
1298# distribution équitable sur 2 opteron and un ancien pentium3
1299
1300 listen web_appl 0.0.0.0:80
1301 mode http
1302 cookie SERVERID insert nocache indirect
1303 balance roundrobin
1304 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1305 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1306 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1307 server web-backup1 192.168.2.1:80 cookie server04 check backup
1308 server web-excuse 192.168.3.1:80 check backup
1309
1310Notes :
1311-------
1312 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1313
1314 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1315 est plus propre d'utiliser les poids que de répliquer le même serveur
1316 plusieurs fois.
1317
1318 - les poids s'appliquent également aux serveurs de backup si l'option
1319 'allbackups' est positionnée.
1320
1321 - le poids s'applique aussi à la répartition selon la source
1322 ('balance source').
1323
1324 - quels que soient les poids, le premier serveur sera toujours assigné en
1325 premier. Cette règle facilite les diagnostics.
1326
1327 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1328 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1329 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1330
willy tarreau532bb552006-05-13 18:40:37 +02001331La distribution du trafic suivra exactement le séquencement suivant :
1332
1333 Request| 1 1 1 1
1334 number | 1 2 3 4 5 6 7 8 9 0 1 2 3
1335 --------+---------------------------
1336 p3-800 | X . . . . . . X . . . . .
1337 opt-20 | . X . X . X . . . X . X .
1338 opt-24 | . . X . X . X . X . X . X
1339
1340
13413.4) Limitation du nombre de sessions concurrentes par serveur
1342--------------------------------------------------------------
1343Certains serveurs web multi-processus tels qu'Apache souffrent dès qu'il y a
1344trop de sessions concurrentes, parce qu'il est très coûteux de faire
1345fonctionner des centaines ou des milliers de processus sur un système. Une
1346solution consiste à augmenter le nombre de serveurs et de répartir la charge
1347entre eux, mais cela pose un problème lorsque le but est uniquement de résister
1348à des pics de charge occasionnels.
1349
1350Pour résoudre ce problème, une nouvelle fonctionnalité a été implémentée dans
1351HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associée à une
1352file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
1353entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
1354de diminuer la valeur maxconn améliorera notablement les performances des
1355serveurs et diminuera les temps de réponse simplement parce que les serveurs
1356seront moins congestionnés.
1357
1358Quand une requête cherche à joindre n'importe quel serveur, le premier serveur
1359non saturé est utilisé, en respectant l'algorithme de répartition de charge. Si
1360tous les serveurs sont saturés, alors la requête sera mise dans la file
1361d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
1362toutes les requêtes précédentes auront été libérées et qu'un serveur aura été
1363libéré d'une connexion pour la traiter.
1364
1365Si une requête fait référence à un serveur en particulier (p.ex: hachage d'IP
1366source, ou persistance par cookie), et que ce server est saturé, alors la
1367requête sera mise dans la file d'attente dédiée à ce serveur. Cette file
1368d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
1369plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent déjà
1370que pour les nouveaux utilisateurs.
1371
1372Pour cela, les logs ont dû être enrichis pour indiquer le nombre de sessions
1373par serveur, la position de la requête dans les files d'attentes, et le temps
1374passé en file d'attente. Ceci aide considérablement à faire de la prévision de
1375capacité. Voir la section 'logs' plus bas pour plus d'informations.
1376
1377Exemple :
1378---------
1379 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1380 listen web_appl 0.0.0.0:80
1381 maxconn 10000
1382 mode http
1383 cookie SERVERID insert nocache indirect
1384 balance roundrobin
1385 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 maxconn 100 check
1386 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
1387 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
1388 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1389 server web-excuse 192.168.3.1:80 check backup
1390
willy tarreau8f635a42006-05-21 23:05:54 +02001391Cette option se montra si efficace pour réduire les temps de réponse des
1392serveurs que certains utilisateurs voulaient utiliser des valeurs trop basses
1393pour améliorer les performances de leurs serveurs. Seulement, ils n'étaient
1394alors plus en mesure de supporter de très fortes charges parce qu'il n'était
1395plus possible de les saturer. Pour cette raison, la version 1.2.14 a apporté la
1396limitation dynamique de connexions avec l'addition du paramètre "minconn".
1397Lorsque ce paramètre est associé à "maxconn", il active la limitation dynamique
1398basée sur la charge de l'instance. Le nombre maximal de sessions concurrentes
1399sur un serveur devient alors proportionnel au nombre de sessions de l'instance
1400par rapport à son 'maxconn'. Un minimum de <minconn> sessions sera toujours
1401permis quelle que soit la charge. Ceci assurera que les serveurs travailleront
1402au meilleur de leurs performances sous des charges normales, et qu'ils seront
1403tout de même capables de supporter de fortes pointes lorsque nécessaire. La
1404limite dynamique est calculée comme ceci :
1405
1406 srv.dyn_limit = max(srv.minconn, srv.maxconn * inst.sess / inst.maxconn)
1407
1408Exemple :
1409---------
1410 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1411 listen web_appl 0.0.0.0:80
1412 maxconn 10000
1413 mode http
1414 cookie SERVERID insert nocache indirect
1415 balance roundrobin
1416 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check
1417 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check
1418 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1419 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1420 server web-excuse 192.168.3.1:80 check backup
1421
1422Dans l'exemple ci-dessus, le serveur "pentium3-800' recevra au plus 100
1423connexions simultanées lorsque l'instance du proxy en atteindra 10000, et
1424recevra seulement 10 connexions simultanées tant que le proxy sera sous les 1000
1425sessions.
1426
Elijah Epifanovacafc5f2007-10-25 20:15:38 +02001427Il est possible de limiter la taille de la file d'attente dans le but de
1428redistribuer les connexions destinées à un serveur en particulier qui sont trop
1429loin pour avoir une chance d'être servies en un temps raisonnable. Ceci n'est
1430acceptable que dans le cas où l'affinité entre le client et le serveur n'est
1431pas obligatoire, mais motivée uniquement par des raisons de performances, par
1432exemple, par l'utilisation d'un cache local au serveur. L'option 'maxqueue'
1433permet de préciser la limite par serveur, tel que dans l'exemple ci-dessous :
1434
1435... (même exemple que précédemment)
1436 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check maxqueue 50
1437 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check maxqueue 200
1438 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1439
1440En l'absence du paramètre 'maxqueue', la file d'un serveur n'a pas de limite
1441définie. Dans le cas contraire, lorsque la file atteint la limite fixée par
1442'maxqueue', les clients sont déplacés vers la file globale.
1443
willy tarreau532bb552006-05-13 18:40:37 +02001444Notes :
1445-------
1446 - la requête ne restera pas indéfiniment en file d'attente, elle est
1447 assujétie au paramètre 'contimeout', et si une requête ne peut pas
1448 sortir de la file avant ce time-out, soit parce que le serveur est
1449 saturé, soit parce qu'il y a trop de requêtes en file d'attente,
1450 alors elle expirera avec une erreur 503.
1451
willy tarreau8f635a42006-05-21 23:05:54 +02001452 - si seul <minconn> est spécifié, il a le même effet que <maxconn>
1453
willy tarreau532bb552006-05-13 18:40:37 +02001454 - positionner des valeurs trop basses pour 'maxconn' peut améliorer les
1455 performances mais aussi permettre à des utilisateurs trop lents de bloquer
1456 un serveur pour les autres utilisateurs.
1457
willy tarreau34f45302006-04-15 21:37:14 +02001458
willy tarreau8f635a42006-05-21 23:05:54 +020014593.5) Abandon des requêtes abortées
1460----------------------------------
1461En présence de très fortes charges, les serveurs mettront un certain temps à
1462répondre. La file d'attente du proxy se remplira, et les temps de réponse
1463suivront une croissance proportionnelle à la taille de file d'attente fois
1464le temps moyen de réponse par session. Lorsque les clients attendront plus de
1465quelques secondes, ils cliqueront souvent sur le bouton 'STOP' de leur
1466navigateur, laissant des requêtes inutiles en file d'attente et ralentissant
1467donc les autres utilisateurs.
1468
1469Comme il n'y a aucun moyen de distinguer un vrai clic sur STOP d'une simple
1470fermeture du canal de sortie sur le client (shutdown(SHUT_WR)), les agents HTTP
1471doivent être conservateurs et considérer que le client n'a probablement fermé
1472que le canal de sortie en attendant la réponse. Toutefois, ceci introduit des
1473risques de congestion lorsque beaucoup d'utilisateurs font de même, et s'avère
1474aujourd'hui complètement inutile car probablement aucun client ne referme la
1475session en attendant la réponse. Certains agents HTTP supportent ceci (Squid,
1476Apache, HAProxy), et d'autres ne le supportent pas (TUX, et la plupart des
1477répartiteurs de charge matériels). Donc la probabilité pour qu'une notification
1478de fermeture d'un canal d'entrée côté client représente un utilisateur cliquant
1479sur 'STOP' est proche de 100%, et il est vraiment tentant d'abandonner la
1480requête prématurément sans polluer les serveurs.
1481
1482Pour cette raison, une nouvelle option "abortonclose" a été introduite en
1483version 1.2.14. Par défaut (sans l'option), le comportement reste conforme à
1484HTTP. Mais lorsque l'option est spécifiée, une session dont le canal entrant
1485est fermé sera abortée si cela est possible, c'est à dire que la requête est
1486soit en file d'attente, soit en tentative de connexion. Ceci réduit
1487considérablement la longueur des files d'attentes et la charge sur les serveurs
1488saturés lorsque les utilisateurs sont tentés de cliquer sur 'STOP', ce qui à
1489son tour, réduit les temps de réponse pour les autres utilisateurs.
1490
1491Exemple :
1492---------
1493 listen web_appl 0.0.0.0:80
1494 maxconn 10000
1495 mode http
1496 cookie SERVERID insert nocache indirect
1497 balance roundrobin
1498 server web1 192.168.1.1:80 cookie s1 weight 10 maxconn 100 check
1499 server web2 192.168.1.2:80 cookie s2 weight 10 maxconn 100 check
1500 server web3 192.168.1.3:80 cookie s3 weight 10 maxconn 100 check
1501 server bck1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1502 option abortonclose
1503
1504
willy tarreauc29948c2005-12-17 13:10:27 +010015054) Fonctionnalités additionnelles
1506=================================
1507
1508D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
willy tarreau8f635a42006-05-21 23:05:54 +02001509principalement du mode transparent, de la journalisation des connexions, de la
1510réécriture des en-têtes, et du statut sous forme de page HTML.
1511
willy tarreau5cbea6f2005-12-17 12:48:26 +01001512
willy tarreau0174f312005-12-18 01:02:42 +010015134.1) Fonctionnalités réseau
1514---------------------------
15154.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001516---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001517En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1518routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1519pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001520destination de la session détournée. Le système doit permettre de rediriger les
1521paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001522
1523Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001524---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001525 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001526 mode http
1527 transparent
1528 cookie SERVERID
1529 server server01 192.168.1.1:80
1530 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001531
1532 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1533 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001534
willy tarreaua41a8b42005-12-17 14:02:24 +01001535Remarque :
1536----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001537Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1538adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1539d'une même adresse avec une même instance et sans utiliser directement le mode
1540transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001541
1542Exemple :
1543---------
1544 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001545 mode tcp
1546 server server01 192.168.1.1 check port 60000
1547 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001548
1549 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1550 -j REDIRECT --to-ports 65000
1551
willy tarreau0174f312005-12-18 01:02:42 +01001552
15534.1.2) Choix d'une adresse source par serveur
1554---------------------------------------------------
1555Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1556IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1557backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1558pour joindre le même serveur. C'est également utilisable pour faciliter une
1559répartition de charge selon l'adresse IP source pour des connexions sortantes.
1560Bien entendu, la même adresse est utilisée pour les health-checks.
1561
1562Exemple :
1563---------
1564 # utiliser une adresse particulière pour joindre les 2 serveur
1565 listen http_proxy 0.0.0.0:65000
1566 mode http
1567 balance roundrobin
1568 server server01 192.168.1.1:80 source 192.168.2.13
1569 server server02 192.168.1.2:80 source 192.168.2.13
1570
1571Exemple :
1572---------
1573 # utiliser une adresse particulière pour joindre chaque serveur
1574 listen http_proxy 0.0.0.0:65000
1575 mode http
1576 balance roundrobin
1577 server server01 192.168.1.1:80 source 192.168.1.1
1578 server server02 192.168.2.1:80 source 192.168.2.1
1579
1580Exemple :
1581---------
1582 # faire une répartition d'adresse sources pour joindre le même proxy à
1583 # travers deux liens WAN
1584 listen http_proxy 0.0.0.0:65000
1585 mode http
1586 balance roundrobin
1587 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1588 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1589
1590Exemple :
1591---------
1592 # forcer une connexion TCP à s'attacher à un port particulier
1593 listen http_proxy 0.0.0.0:2000
1594 mode tcp
1595 balance roundrobin
1596 server srv1 192.168.1.1:80 source 192.168.2.1:20
1597 server srv2 192.168.1.2:80 source 192.168.2.1:20
1598
willy tarreaub952e1d2005-12-18 01:31:20 +010015994.1.3) Maintien de session TCP (keep-alive)
1600-------------------------------------------
1601Avec la version 1.2.7, il devient possible d'activer le maintien de session
1602TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1603d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1604externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1605aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1606time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1607positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1608vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1609pour activer le maintien de session TCP :
1610
1611 option tcpka # active le keep-alive côté client et côté serveur
1612 option clitcpka # active le keep-alive côté client
1613 option srvtcpka # active le keep-alive côté serveur
1614
Alexandre Cassen87ea5482007-10-11 20:48:58 +020016154.1.4) Rémanence des données TCP (lingering)
1616--------------------------------------------
1617Il est possible de désactiver la conservation de données non acquittées par un
1618client à la fin d'une session. Cela peut parfois s'avérer nécessaire lorsque
1619haproxy est utilisé en face d'un grand nombre de clients non fiables et qu'un
1620nombre élevé de sockets en état FIN_WAIT est observé sur la machine. L'option
1621peut être utilisée dans un frontend pour ajuster les connexions vers les
1622clients, et dans un backend pour ajuster les connexions vers les serveurs :
1623
1624 option nolinger # désactive la conservation de données
1625
willy tarreau0f7af912005-12-17 12:21:26 +01001626
willy tarreauc29948c2005-12-17 13:10:27 +010016274.2) Journalisation des connexions
1628----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001629
1630L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1631Il fournit probablement le plus fin niveau d'information disponible pour un
1632tel outil, ce qui est très important pour les diagnostics en environnements
1633complexes. En standard, les informations journalisées incluent le port client,
1634les chronométrages des états TCP/HTTP, des états de session précis au moment de
1635la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1636trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1637arbitraires.
1638
1639Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1640transparence sur les problèmes rencontrés, à la fois internes et externes, et
1641il est possible d'envoyer les logs vers des serveurs différents en même temps
1642avec des niveaux de filtrage différents :
1643
1644 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1645 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1646 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1647 - activité par instance (connexions clients), aussi bien lors de leur
1648 établissement qu'à leur terminaison.
1649
1650La possibilité de distribuer différents niveaux de logs à différents serveurs
1651permet à plusieurs équipes de production d'intéragir et de corriger leurs
1652problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1653occasionnellement les erreurs système, pendant que l'équipe application
1654surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1655que l'équipe sécurité analyse l'activité en différé d'une heure.
1656
1657
willy tarreauc1cae632005-12-17 14:12:23 +010016584.2.1) Niveaux de log
1659---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001660Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1661détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1662source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001663la requête HTTP, le code de retour, la quantité de données transmises, et même
1664dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1665Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1666la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001667est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001668
willy tarreau8337c6b2005-12-17 13:41:01 +01001669 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1670 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001671ou
1672 log global
1673
1674Remarque :
1675----------
1676La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1677paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001678
1679Exemple :
1680---------
1681 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001682 mode http
1683 log 192.168.2.200 local3
1684 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001685
willy tarreauc1cae632005-12-17 14:12:23 +010016864.2.2) Format des logs
1687----------------------
1688Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1689de la session entre le client et le relais. En précisant l'option 'tcplog',
1690la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1691sur son état lors de la déconnexion, ainsi que le temps de connexion et la
willy tarreau532bb552006-05-13 18:40:37 +02001692durée totale de la session. Le nombre de sessions restantes après la
1693déconnexion est également indiqué (pour le serveur, l'instance et le process).
willy tarreauc1cae632005-12-17 14:12:23 +01001694
willy tarreauc5f73ed2005-12-18 01:26:38 +01001695Exemple de journalisation TCP :
1696-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001697 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001698 mode tcp
1699 option tcplog
1700 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001701
willy tarreau532bb552006-05-13 18:40:37 +02001702>>> haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/0/5007 0 -- 1/1/1 0/0
willy tarreauc5f73ed2005-12-18 01:26:38 +01001703
willy tarreau532bb552006-05-13 18:40:37 +02001704 Champ Format / Description Exemple
1705
1706 1 nom_processus '[' pid ']:' haproxy[18989]:
1707 2 ip_client ':' port_client 127.0.0.1:34550
1708 3 '[' date ']' [15/Oct/2003:15:24:28]
1709 4 nom_instance relais-tcp
1710 5 nom_serveur Srv1
1711 6 temps_file '/' temps_connect '/' temps_total 0/0/5007
1712 7 octets lus 0
1713 8 etat_terminaison --
1714 9 conn_srv '/' conns_inst '/' conns_processus 1/1/1
1715 10 position en file d'attente srv '/' globale 0/0
willy tarreau982249e2005-12-18 00:57:06 +01001716
willy tarreauc1cae632005-12-17 14:12:23 +01001717Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1718notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1719surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1720les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1721ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1722(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001723
willy tarreauc5f73ed2005-12-18 01:26:38 +01001724Exemple de journalisation HTTP :
1725--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001726 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001727 mode http
1728 option httplog
1729 option dontlognull
1730 log 192.168.2.200 local3
1731
willy tarreau532bb552006-05-13 18:40:37 +02001732>>> haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 9/0/7/147/723 200 243 - - ---- 2/3/3 0/0 "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001733
1734Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001735
willy tarreau532bb552006-05-13 18:40:37 +02001736 haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/-1/11215 503 0 - - SC-- 137/202/205 0/0 {w.ods.org|Mozilla} {} "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001737
willy tarreau532bb552006-05-13 18:40:37 +02001738 Champ Format / Description Exemple
1739
1740 1 nom_processus '[' pid ']:' haproxy[18989]:
1741 2 ip_client ':' port_client 10.0.0.1:34552
1742 3 '[' date ']' [15/Oct/2003:15:26:31]
1743 4 nom_instance relais-http
1744 5 nom_serveur Srv1
1745 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt 3183/-1/-1/-1/11215
1746 7 Code_retour_HTTP 503
1747 8 octets lus 0
1748 9 cookies_requête_capturés -
1749 10 cookies_reponse_capturés -
1750 11 etat_terminaison SC--
1751 12 conns_srv '/' conns_inst '/' conns_processus 137/202/205
1752 13 position file serveur '/' globale 0/0
1753 14 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1754 15 '{' entetes_reponse_capturés '}' {}
1755 16 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001756
1757Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1758 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001759
1760Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1761de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1762Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001763la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1764tôt possible, c'est à dire juste avant que ne débutent les transferts de
1765données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1766de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001767traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1768représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001769
willy tarreau64a3cc32005-12-18 01:13:11 +01001770Afin d'éviter toute confusion avec les logs normaux, le temps total de
1771transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001772rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001773
1774Exemple :
1775---------
1776
1777 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001778 mode http
1779 option httplog
1780 option dontlognull
1781 option logasap
1782 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001783
willy tarreauc5f73ed2005-12-18 01:26:38 +01001784>>> haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/7/14/+30 200 +243 - - ---- 3/3 "GET /image.iso HTTP/1.0"
willy tarreau982249e2005-12-18 00:57:06 +01001785
1786
willy tarreauc1cae632005-12-17 14:12:23 +010017874.2.3) Chronométrage des événements
1788-----------------------------------
1789Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1790événements sont d'une très grande utilité. Tous les temps sont mesurés en
1791millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
willy tarreau532bb552006-05-13 18:40:37 +02001792la forme Tq/Tw/Tc/Tr/Tt :
willy tarreauc1cae632005-12-17 14:12:23 +01001793
1794 - Tq: temps total de réception de la requête HTTP de la part du client.
1795 C'est le temps qui s'est écoulé entre le moment où le client a établi
1796 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1797 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1798 que la requête complète n'a jamais été reçue.
1799
willy tarreau532bb552006-05-13 18:40:37 +02001800 - Tw: temps total passé dans les files d'attente avant d'obtenir une place
1801 vers un serveur. Ceci tient compte à la fois de la file d'attente globale
1802 et de celle du serveur, et dépend du nombre de requêtes dans la file et du
1803 temps nécessaire au serveur pour compléter les sessions précédentes. La
1804 valeur '-1' indique que la requête a été détruite avant d'atteindre une
1805 file.
1806
willy tarreauc1cae632005-12-17 14:12:23 +01001807 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1808 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1809 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1810 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1811 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1812 vers le serveur.
1813
1814 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001815 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001816 la connexion. Ca représente exactement le temps de traitement de la
1817 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001818 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001819
1820 - Tt: durée de vie totale de la session, entre le moment où la demande de
1821 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001822 refermée aux deux extrémités (client et serveur). La signification change
1823 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
willy tarreau532bb552006-05-13 18:40:37 +02001824 uniquement à (Tq + Tw + Tc + Tr), et se trouve préfixé d'un signe '+'. On
1825 peut donc déduire Td, le temps de transfert des données, en excluant les
1826 autres temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001827
willy tarreau532bb552006-05-13 18:40:37 +02001828 Td = Tt - (Tq + Tw + Tc + Tr)
willy tarreauc1cae632005-12-17 14:12:23 +01001829
1830 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1831
willy tarreau532bb552006-05-13 18:40:37 +02001832En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
willy tarreauc1cae632005-12-17 14:12:23 +01001833rapportés.
1834
1835Ces temps fournissent de précieux renseignement sur des causes probables de
1836problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1837de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1838de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1839problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1840valeur de time-out dans la configuration, c'est souvent qu'une session a été
1841abandonnée sur expiration d'un time-out.
1842
1843Cas les plus fréquents :
1844
1845 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1846 le client et le relais.
1847 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1848 le relais et le serveur durant la phase de connexion. Cet indicateur
1849 devrait normalement toujours être très bas (moins de quelques dizaines).
1850 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1851 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1852 de pertes entre le relais et le serveur.
1853 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1854 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1855 session est maintenue après la fin des échanges. Voir plus loin pour
1856 savoir comment désactiver le keep-alive HTTP.
1857
1858Autres cas ('xx' représentant une valeur quelconque à ignorer) :
willy tarreau532bb552006-05-13 18:40:37 +02001859 -1/xx/xx/xx/Tt: le client n'a pas envoyé sa requête dans le temps imparti ou
willy tarreauc5f73ed2005-12-18 01:26:38 +01001860 a refermé sa connexion sans compléter la requête.
willy tarreau532bb552006-05-13 18:40:37 +02001861 Tq/-1/xx/xx/Tt: Il n'était pas possible de traiter la request, probablement
1862 parce que tous les serveurs étaient hors d'usage.
1863 Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'établir vers le serveur (refus ou
1864 time-out au bout de Tt-(Tq+Tw) ms).
1865 Tq/Tw/Tc/-1/Tt: le serveur a accepté la connexion mais n'a pas répondu dans
willy tarreauc5f73ed2005-12-18 01:26:38 +01001866 les temps ou bien a refermé sa connexion trop tôt, au bout
willy tarreau532bb552006-05-13 18:40:37 +02001867 de Tt-(Tq+Tw+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001868
18694.2.4) Conditions de déconnexion
1870--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001871Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1872le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1873un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1874une signification précise :
1875
1876 - sur le premier caractère, un code précisant le premier événement qui a causé
1877 la terminaison de la session :
1878
1879 C : fermeture inattendue de la session TCP de la part du client.
1880
1881 S : fermeture inattendue de la session TCP de la part du serveur, ou
1882 refus explicite de connexion de la part de ce dernier.
1883
1884 P : terminaison prématurée des sessions par le proxy, pour cause
1885 d'imposition d'une limite sur le nombre de connexions, pour cause
1886 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1887 sécurité a détecté et bloqué une anomalie dans la réponse du
1888 serveur qui aurait pu causer une fuite d'informations (par exemple,
1889 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001890
willy tarreauc5f73ed2005-12-18 01:26:38 +01001891 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1892 source, ...). Généralement, cela arrive au cours de l'établissement
1893 d'une connexion, et les logs système doivent contenir une copie de
1894 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001895
willy tarreauc5f73ed2005-12-18 01:26:38 +01001896 I : une erreur interne a été identifiée par le proxy à la suite d'un
1897 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1898 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001899
willy tarreauc5f73ed2005-12-18 01:26:38 +01001900 c : le délai maximal d'attente du client a expiré (clitimeout).
1901
1902 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1903
1904 - : terminaison normale de session.
1905
1906 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1907 la fermeture :
1908
1909 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1910 été transmis au serveur.
1911
willy tarreau532bb552006-05-13 18:40:37 +02001912 Q : attente en file d'attente (QUEUE) d'une place pour avoir une
1913 connexion vers un serveur. Ne peut apparaître que sur un serveur
1914 possédant un paramètre 'maxconn'. Aucune connexion n'a été envoyée
1915 au serveur.
1916
willy tarreauc5f73ed2005-12-18 01:26:38 +01001917 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1918 serveur peut au plus avoir vu la tentative de connexion, mais
1919 aucune donnée n'a été échangée.
1920
1921 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1922
1923 D : transfert des DONNEES du serveur vers le client.
1924
1925 L : transfert des dernières ("LAST") données du proxy vers le client,
1926 alors que le serveur a déjà fini.
1927
Willy Tarreau2272dc12006-09-03 10:19:38 +02001928 T : requête bloquée en mode "tarpit" par le proxy. Elle a été maintenue
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001929 ouverte vers le client pendant toute la durée du contimeout ou
1930 jusqu'à l'abandon de la part du client.
Willy Tarreau2272dc12006-09-03 10:19:38 +02001931
willy tarreauc5f73ed2005-12-18 01:26:38 +01001932 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001933
1934 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001935 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001936
willy tarreauc5f73ed2005-12-18 01:26:38 +01001937 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1938 cas sur les NOUVELLES connexions clients.
1939
1940 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1941 serveur connu. Ceci peut être dû à un changement de configuration
1942 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1943 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001944
willy tarreauc5f73ed2005-12-18 01:26:38 +01001945 D : le client a présenté un cookie correspondant à un serveur hors
1946 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1947 un autre serveur ou a tout de même tenté de se connecter sur celui
1948 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001949
willy tarreauc5f73ed2005-12-18 01:26:38 +01001950 V : le client a présenté un cookie VALIDE et a pu se connecter au
1951 serveur correspondant.
1952
1953 - : non appliquable (pas de cookie positionné dans la configuration).
1954
1955 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1956 persistence retrourné par le serveur (uniquement en mode HTTP) :
1957
1958 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1959 n'a été inséré.
1960
1961 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1962 proxy en a INSERE un.
1963
willy tarreau197e8ec2005-12-17 14:10:59 +01001964 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001965 tel quel ("PASSIF").
1966
1967 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1968
1969 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1970 ne pas être retourné au client.
1971
1972 - : non appliquable
1973
1974
1975La combinaison des deux premiers indicateurs fournit une grande quantitié
1976d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1977peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1978des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001979
willy tarreauc5f73ed2005-12-18 01:26:38 +01001980Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1981
1982 Indic Raison
1983 CR Le client a abandonné avant d'émettre une requête complète. Il est
1984 très probable que la requête ait été tapée à la main dans un client
1985 telnet et abortée trop tôt.
1986
1987 cR Le temps imparti au client a expiré avant réception d'une requête
1988 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1989 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1990 transporter des paquets entiers, ou par des clients qui énvoient des
1991 requêtes à la main et ne tapent pas assez vite.
1992
1993 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1994 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1995 être la couche réseau qui indique au proxy que le serveur n'est pas
1996 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1997
1998 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1999
2000 PC Le proxy a refusé d'établir une connexion au serveur parce que le
2001 nombre de connexions a atteint la limite 'maxconn' (global ou de
2002 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
2003 augmenté, tout comme le paramètre 'maxconn' global.
2004
2005 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
2006 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
2007 diront précisément ce qui manquait. Dans tous les cas, le seul remède
2008 consiste à affiner le paramétrage système.
2009
2010 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
2011 est parfois causé par un paramètre TCP MSS trop élevé sur le client
2012 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
2013 paquets entiers.
2014
willy tarreau078c79a2006-05-13 12:23:58 +02002015 CH Le client a abandonné alors qu'il attendait un début de réponse de la
2016 part du serveur. Cela peut être causé par le serveur qui mettait trop
2017 de temps à répondre, ou par un client cliquant précipitamment sur le
2018 bouton 'Stop'.
2019
2020 CQ Le client a abandonné alors que sa session était mise en file
2021 d'attente pour obtenir un serveur avec suffisamment de connexions
2022 libres pour l'accepter. Cela signifie soit que l'ensemble des
2023 serveurs étaient saturés, soit que le serveur assigné a mis trop de
2024 temps à répondre.
2025
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002026 CT Le client a abandonné alors que sa session était bloquée en mode
2027 tarpit.
2028
willy tarreau078c79a2006-05-13 12:23:58 +02002029 sQ La session a attendu trop longtemps en file d'attente et a été
2030 expirée.
2031
willy tarreauc5f73ed2005-12-18 01:26:38 +01002032 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
2033 en-têtes. En général, cela indique qu'il a crashé.
2034
2035 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
2036 des transactions trop longues, probablement causées par un back-end
2037 saturé. Les seules solutions sont de corriger le problème sur
2038 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
2039 des attentes plus longues au risque que les clients abandonnent à
2040 leur tour, ou bien d'ajouter des serveurs.
2041
2042 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
2043 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
2044 soit à cause d'une requête validant un filtre d'interdiction, auquel
2045 cas le proxy a renvoyé une erreur HTTP 403.
2046
2047 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
2048 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
2049 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
2050 renvoyée au client.
2051
Willy Tarreau2272dc12006-09-03 10:19:38 +02002052 PT Le proxy a bloqué une requête du client et a maintenu sa connection
2053 ouverte avant de lui retourner une erreur "500 server error". Rien
2054 n'a été envoyé au serveur.
2055
willy tarreauc5f73ed2005-12-18 01:26:38 +01002056 cD Le client n'a pas lu de données pendant le temps qui lui était
2057 imparti. Ceci est souvent causé par des problèmes réseau côté client.
2058
2059 CD Le client a aborté sa connection de manière inattendue pendant le
2060 transfert des données. Ceci est provoqué soit par le crash d'un
2061 navigateur, ou par une session en HTTP keep-alive entre le serveur
2062 et le client terminée en premier par le client.
2063
2064 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
2065 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
2066 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
2067 situés entre le proxy et le serveur.
2068
20694.2.5) Caractères non-imprimables
2070---------------------------------
2071Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
2072tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
2073hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
2074dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
2075caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
2076est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
2077les en-têtes.
2078
20794.2.6) Capture d'en-têtes HTTP et de cookies
2080--------------------------------------------
2081La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
2082capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
2083
2084Les captures de cookies facilitent le suivi et la reconstitution d'une session
2085utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01002086
2087 capture cookie <préfixe_cookie> len <longueur_capture>
2088
willy tarreauc5f73ed2005-12-18 01:26:38 +01002089Ceci activera la capture de cookies à la fois dans les requêtes et dans les
2090réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
2091bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
2092nouveau cookie.
2093
willy tarreau8337c6b2005-12-17 13:41:01 +01002094Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
2095transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
2096caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
2097le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
2098place dans les logs.
2099
2100Exemples :
2101----------
2102 # capture du premier cookie dont le nom commence par "ASPSESSION"
2103 capture cookie ASPSESSION len 32
2104
2105 # capture du premier cookie dont le nom est exactement "vgnvisitor"
2106 capture cookie vgnvisitor= len 32
2107
willy tarreau036e1ce2005-12-17 13:46:33 +01002108Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01002109positionné par le serveur, précédé du cookie positionné par le client. Chacun
2110de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01002111par le client ou le serveur, ou lorsque l'option est désactivée..
2112
2113Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
2114pour suivre un identifiant de requête globalement unique positionné par un
2115autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
2116de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
2117peut chercher des informations relatives à la longueur annoncée de la réponse,
2118le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
2119de redirection. Tout comme pour les captures de cookies, il est possible
2120d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
2121la suivante :
2122
2123 capture request header <nom> len <longueur max>
2124 capture response header <nom> len <longueur max>
2125
2126Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01002127
willy tarreauc5f73ed2005-12-18 01:26:38 +01002128Exemples:
2129---------
2130 # conserver le nom du serveur virtuel accédé par le client
2131 capture request header Host len 20
2132 # noter la longueur des données envoyées dans un POST
2133 capture request header Content-Length len 10
2134
2135 # noter le fonctionnement attendu du cache par le serveur
2136 capture response header Cache-Control len 8
2137 # noter l'URL de redirection
2138 capture response header Location len 20
2139
2140Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
2141fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
2142regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
2143chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
2144réponse sont présentés de la même manière, mais après un espace suivant le bloc
2145d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
2146
2147 Config:
2148
2149 capture request header Host len 20
2150 capture request header Content-Length len 10
2151 capture request header Referer len 20
2152 capture response header Server len 20
2153 capture response header Content-Length len 10
2154 capture response header Cache-Control len 8
2155 capture response header Via len 20
2156 capture response header Location len 20
2157
2158 Log :
2159
willy tarreau532bb552006-05-13 18:40:37 +02002160 Aug 9 20:26:09 localhost haproxy[2022]: 127.0.0.1:34014 [09/Aug/2004:20:26:09] relais-http netcache 0/0/0/162/+162 200 +350 - - ---- 0/0/0 0/0 {fr.adserver.yahoo.co||http://fr.f416.mail.} {|864|private||} "GET http://fr.adserver.yahoo.com/"
2161 Aug 9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34020 [09/Aug/2004:20:30:46] relais-http netcache 0/0/0/182/+182 200 +279 - - ---- 0/0/0 0/0 {w.ods.org||} {Formilux/0.1.8|3495|||} "GET http://w.ods.org/sytadin.html HTTP/1.1"
2162 Aug 9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34028 [09/Aug/2004:20:30:46] relais-http netcache 0/0/2/126/+128 200 +223 - - ---- 0/0/0 0/0 {www.infotrafic.com||http://w.ods.org/syt} {Apache/2.0.40 (Red H|9068|||} "GET http://www.infotrafic.com/images/live/cartesidf/grandes/idf_ne.png HTTP/1.1"
willy tarreauc5f73ed2005-12-18 01:26:38 +01002163
21644.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01002165-----------------------
willy tarreau532bb552006-05-13 18:40:37 +02002166- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/0/7/147/6723 200 243 - - ---- 1/3/5 0/0"HEAD / HTTP/1.0"
willy tarreauc1cae632005-12-17 14:12:23 +01002167 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
2168 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01002169
willy tarreau532bb552006-05-13 18:40:37 +02002170- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/1230/7/147/6870 200 243 - - ---- 99/239/324 0/9 "HEAD / HTTP/1.0"
2171 => Idem, mais la requête a été mise en attente dans la file globale derrière
2172 9 autres requêtes déjà présentes, et y a attendu 1230 ms.
2173
2174- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/0/7/14/+30 200 +243 - - ---- 1/3/3 0/0 "GET /image.iso HTTP/1.0"
willy tarreau982249e2005-12-18 00:57:06 +01002175 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
2176 log a été généré juste avant le transfert de données. Le serveur a répondu
willy tarreauc5f73ed2005-12-18 01:26:38 +01002177 en 14 ms, 243 octets d'en-têtes ont été transférés au client, et le temps
willy tarreau982249e2005-12-18 00:57:06 +01002178 total entre l'accept() et le premier octet de donnée est de 30 ms.
2179
willy tarreau532bb552006-05-13 18:40:37 +02002180- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/0/7/14/30 502 243 - - PH-- 0/2/3 0/0 "GET /cgi-bin/bug.cgi? HTTP/1.0"
willy tarreau982249e2005-12-18 00:57:06 +01002181 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
2182 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
2183 d'informations risquant d'être cachées. Dans ce cas, la réponse est
2184 remplacée par '502 bad gateway'.
2185
willy tarreau532bb552006-05-13 18:40:37 +02002186- haproxy[18113]: 127.0.0.1:34548 [15/Oct/2003:15:18:55] relais-http <NOSRV> -1/-1/-1/-1/8490 -1 0 - - CR-- 0/2/2 0/0 ""
willy tarreauc1cae632005-12-17 14:12:23 +01002187 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01002188 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01002189 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01002190
willy tarreau532bb552006-05-13 18:40:37 +02002191- haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06] relais-http <NOSRV> -1/-1/-1/-1/50001 408 0 - - cR-- 0/2/2 0/0 ""
willy tarreauc1cae632005-12-17 14:12:23 +01002192 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01002193 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01002194 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
2195 pu renvoyer un message 408 au client.
2196
willy tarreauc5f73ed2005-12-18 01:26:38 +01002197- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
2198 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
2199 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01002200
willy tarreau532bb552006-05-13 18:40:37 +02002201- haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/-1/11215 503 0 - - SC-- 115/202/205 0/0 "HEAD / HTTP/1.0"
willy tarreauc1cae632005-12-17 14:12:23 +01002202 => La requête client met 3s à entrer (peut-être un problème réseau), et la
2203 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreau532bb552006-05-13 18:40:37 +02002204 secondes (retries 3 dans la conf), puis un code 503 est retourné au
2205 client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
2206 instance, et 205 sur l'ensemble des instances pour ce processus. Il est
2207 possible que le serveur ait refusé la connexion parce qu'il y en avait
2208 déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01002209
willy tarreau4302f492005-12-18 01:00:37 +01002210
willy tarreauc5f73ed2005-12-18 01:26:38 +010022114.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01002212----------------------------------
2213En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
2214requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01002215possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
2216de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01002217connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
2218comme faisant partie des échanges de données consécutifs à la première requête.
2219Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01002220
2221La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01002222 reqadd <string> pour ajouter un en-tête dans la requête
2223 reqrep <search> <replace> pour modifier la requête
2224 reqirep <search> <replace> idem sans distinction majuscules/minuscules
2225 reqdel <search> pour supprimer un en-tête dans la requête
2226 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002227 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01002228 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002229 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01002230 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002231 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01002232 reqipass <search> idem sans distinction majuscules/minuscules
Willy Tarreau2272dc12006-09-03 10:19:38 +02002233 reqtarpit <search> bloquer et maintenir une request validant <search>
2234 reqitarpit <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002235
willy tarreau036e1ce2005-12-17 13:46:33 +01002236 rspadd <string> pour ajouter un en-tête dans la réponse
2237 rsprep <search> <replace> pour modifier la réponse
2238 rspirep <search> <replace> idem sans distinction majuscules/minuscules
2239 rspdel <search> pour supprimer un en-tête dans la réponse
2240 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01002241 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01002242 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01002243 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002244
willy tarreau0f7af912005-12-17 12:21:26 +01002245
willy tarreau036e1ce2005-12-17 13:46:33 +01002246<search> est une expression régulière compatible POSIX regexp supportant le
2247groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
2248doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
2249chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
2250backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01002251
2252 \t pour une tabulation
2253 \r pour un retour charriot
2254 \n pour un saut de ligne
2255 \ pour différencier un espace d'un séparateur
2256 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01002257 \\ pour utiliser un backslash dans la regex
2258 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01002259 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01002260
willy tarreau0f7af912005-12-17 12:21:26 +01002261
willy tarreau5cbea6f2005-12-17 12:48:26 +01002262<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
2263Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
2264groupe délimité par des parenthèses dans l'expression régulière, par sa
Willy Tarreau2272dc12006-09-03 10:19:38 +02002265position numérale. Les positions vont de 0 à 9, et sont codées par un '\'
2266suivi du chiffre désiré (0 désignant la ligne complète). Il est également
2267possible d'insérer un caractère non imprimable (utile pour le saut de ligne)
2268inscrivant '\x' suivi du code hexadécimal de ce caractère (comme en C).
willy tarreau5cbea6f2005-12-17 12:48:26 +01002269
2270<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01002271dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002272
2273Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01002274-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002275 - la première ligne de la requête et celle de la réponse sont traitées comme
willy tarreauc29948c2005-12-17 13:10:27 +01002276 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002277 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
2278 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
2279 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01002280 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
2281 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
2282 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01002283 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01002284 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
2285 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
Willy Tarreau2272dc12006-09-03 10:19:38 +02002286 - une requête bloquée par 'reqtarpit' sera maintenue pendant une durée égale
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002287 au paramètre 'contimeout', ou jusqu'à l'abandon du client. Rien ne sera
2288 envoyé au serveur. Lorsque le temps alloué expire, le proxy répondra avec
2289 une réponse "500 server error" de sorte que l'attaquant ne suspecte pas
2290 qu'il ait été bloqué. Les logs rapporteront aussi ce code 500, mais les
2291 flags de terminaison indiqueront "PT".
willy tarreau0f7af912005-12-17 12:21:26 +01002292
2293Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01002294----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01002295 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01002296
willy tarreauc5f73ed2005-12-18 01:26:38 +01002297 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
2298 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
2299 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002300
willy tarreauc5f73ed2005-12-18 01:26:38 +01002301 # force proxy connections to close
2302 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
2303 # rewrite locations
2304 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002305
willy tarreauc5f73ed2005-12-18 01:26:38 +01002306 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01002307
willy tarreau197e8ec2005-12-17 14:10:59 +01002308 # Every header should end with a colon followed by one space.
2309 reqideny ^[^:\ ]*[\ ]*$
2310
2311 # block Apache chunk exploit
2312 reqideny ^Transfer-Encoding:[\ ]*chunked
2313 reqideny ^Host:\ apache-
2314
2315 # block annoying worms that fill the logs...
2316 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
2317 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
2318 reqideny ^[^:\ ]*\ .*<script
2319 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
2320
Willy Tarreau2272dc12006-09-03 10:19:38 +02002321 # tarpit attacks on the login page.
2322 reqtarpit ^[^:\ ]*\ .*\.php?login=[^0-9]
2323
willy tarreau197e8ec2005-12-17 14:10:59 +01002324 # allow other syntactically valid requests, and block any other method
2325 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
2326 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
2327 reqideny ^[^:\ ]*\
2328
2329 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01002330 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01002331
willy tarreauc5f73ed2005-12-18 01:26:38 +01002332 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01002333 rspidel ^Server:\
2334 rspadd Server:\ Formilux/0.1.8
2335
willy tarreau0f7af912005-12-17 12:21:26 +01002336
willy tarreau982249e2005-12-18 00:57:06 +01002337De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01002338'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002339connaître l'adresse IP du client initial. Depuis la version 1.3.8, il est
2340possible de préciser le mot-clé "except" suivi d'une adresse ou un réseau
2341IP source pour lequel l'entête ne sera pas ajouté. C'est très pratique dans le
2342cas où un autre reverse-proxy ajoutant déjà l'entête est installé sur la même
2343machine ou dans une DMZ connue. Le cas le plus fréquent est lié à l'utilisation
2344de stunnel en local.
willy tarreauc1cae632005-12-17 14:12:23 +01002345
willy tarreau982249e2005-12-18 00:57:06 +01002346Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01002347en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01002348Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
2349méthode impliquant 4 règles.
2350
willy tarreauc1cae632005-12-17 14:12:23 +01002351Exemple :
2352---------
2353 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002354 mode http
2355 log global
2356 option httplog
2357 option dontlognull
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002358 option forwardfor except 127.0.0.1/8
willy tarreauc5f73ed2005-12-18 01:26:38 +01002359 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01002360
Willy TARREAU767ba712006-03-01 22:40:50 +01002361Notons que certains serveurs HTTP ne referment pas nécessairement la session
2362TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
2363ce qui se traduit par des grands nombres de sessions établies et des temps
2364globaux très longs sur les requêtes. Pour contourner ce problème, la version
23651.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
2366vers le serveur dès qu'il commence à répondre et seulement si le tampon de
2367requête est vide. Attention toutefois à ne PAS utiliser cette option si des
2368méthodes CONNECT sont attendues entre le client et le serveur. L'option
2369'forceclose' implique l'option 'httpclose'.
2370
2371Exemple :
2372---------
2373 listen http_proxy 0.0.0.0:80
2374 mode http
2375 log global
2376 option httplog
2377 option dontlognull
2378 option forwardfor
2379 option forceclose
2380
2381
willy tarreauc29948c2005-12-17 13:10:27 +010023824.4) Répartition avec persistence
2383---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002384La combinaison de l'insertion de cookie avec la répartition de charge interne
2385permet d'assurer une persistence dans les sessions HTTP d'une manière
2386pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01002387 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01002388 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01002389 - insérer un cookie dans les réponses issues d'une répartition uniquement,
2390 et faire en sorte que des caches ne mémorisent pas ce cookie.
2391 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002392
2393Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01002394---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002395 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002396 mode http
2397 cookie SERVERID insert nocache indirect
2398 balance roundrobin
2399 server srv1 192.168.1.1:80 cookie server01 check
2400 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01002401
willy tarreau0174f312005-12-18 01:02:42 +01002402L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
2403cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
2404Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
2405client et le serveur de travailler en mode "keep-alive" afin que le proxy
2406puisse corriger le nom du cookie dans toutes les futures requêtes.
2407
2408 listen application 0.0.0.0:80
2409 mode http
2410 cookie JSESSIONID prefix
2411 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002412 server srv1 192.168.1.1:80 cookie srv1 check
2413 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002414 option httpclose
2415
2416
willy tarreau982249e2005-12-18 00:57:06 +010024174.5) Protection contre les fuites d'informations du serveur
2418-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002419Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002420créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002421'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2422un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2423activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002424 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002425 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002426 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002427 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002428 un en-tête 'Cache-control: public' ;
2429 - celles qui ont un en-tête 'Pragma: no-cache' ;
2430 - celles qui ont un en-tête 'Cache-control: private' ;
2431 - celles qui ont un en-tête 'Cache-control: no-store' ;
2432 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2433 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2434 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2435 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2436 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002437 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002438
willy tarreau982249e2005-12-18 00:57:06 +01002439Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2440même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2441message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2442dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002443en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002444l'administrateur sache qu'il y a une action correctrice à entreprendre.
2445
24464.6) Personalisation des erreurs
2447--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002448Certaines situations conduisent à retourner une erreur HTTP au client :
2449 - requête invalide ou trop longue => code HTTP 400
2450 - requête mettant trop de temps à venir => code HTTP 408
2451 - requête interdite (bloquée par un reqideny) => code HTTP 403
2452 - erreur interne du proxy => code HTTP 500
2453 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2454 - aucun serveur disponible pour cette requête => code HTTP 503
2455 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2456
2457Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2458Cependant, en fonction du type de clientèle, on peut préférer retourner des
Willy Tarreau3f49b302007-06-11 00:29:26 +02002459pages personnalisées. Ceci est possible de deux manières, l'une reposant sur
2460une redirection vers un serveur connu, et l'autre consistant à retourner un
2461fichier local.
2462
24634.6.1) Redirection
2464------------------
2465Une redirection d'erreur est assurée par le biais de la commande "errorloc" :
willy tarreau8337c6b2005-12-17 13:41:01 +01002466
2467 errorloc <code_HTTP> <location>
2468
2469Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2470le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2471d'une page précisée dans <location>. Cette adresse peut être relative au site,
2472ou absolue. Comme cette réponse est traîtée par le navigateur du client
2473lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2474
2475Exemple :
2476---------
2477 listen application 0.0.0.0:80
2478 errorloc 400 /badrequest.html
2479 errorloc 403 /forbidden.html
2480 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002481 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002482 errorloc 502 http://192.168.114.58/error50x.html
2483 errorloc 503 http://192.168.114.58/error50x.html
2484 errorloc 504 http://192.168.114.58/error50x.html
2485
willy tarreauc1f47532005-12-18 01:08:26 +01002486Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2487accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2488problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2489régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2490dans le champ Location avec la méthode GET uniquement. Seulement, certains
2491navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2492plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2493devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002494l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2495visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002496
2497Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2498utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2499dès que vous savez que vos clients supportent le code de retour HTTP 303.
2500
Willy Tarreau3f49b302007-06-11 00:29:26 +020025014.6.2) Fichiers locaux
2502----------------------
2503Parfois il est souhaitable de changer l'erreur retournée sans recourir à des
2504redirections. La seconde méthode consiste à charger des fichiers locaux lors
2505du démarrage et à les envoyer en guise de pur contenu HTTP en cas d'erreur.
2506C'est ce que fait le mot clé 'errorfile'.
2507
2508Attention, il y a des pièges à prendre en compte :
2509 - les fichiers sont chargés durant l'analyse de la configuration, avant de
2510 faire le chroot(). Donc ils sont relatifs au système de fichiers réel. Pour
2511 cette raison, il est recommandé de toujours passer un chemin absolu vers ces
2512 fichiers.
2513
2514 - le contenu de ces fichiers n'est pas du HTML mais vraiment du protocole HTTP
2515 avec potentiellement un corps HTML. Donc la première ligne et les en-têtes
2516 sont obligatoires. Idéalement, chaque ligne dans la partie HTTP devrait se
2517 terminer par un CR-LF pour un maximum de compatibilité.
2518
2519 - les réponses sont limitées à une taille de buffer (BUFSIZE), généralement 8
2520 ou 16 ko.
2521
2522 - les réponses ne devraient pas inclure de références aux serveurs locaux,
2523 afin de ne pas risquer de créer des boucles infinies sur le navigateur dans
2524 le cas d'une panne locale.
2525
2526Exemple :
2527---------
2528 errorfile 400 /etc/haproxy/errorfiles/400badreq.http
2529 errorfile 403 /etc/haproxy/errorfiles/403forbid.http
2530 errorfile 503 /etc/haproxy/errorfiles/503sorry.http
2531
2532
willy tarreau982249e2005-12-18 00:57:06 +010025334.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002534--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002535Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2536évite de répéter des paramètres communs à toutes les instances, tels que les
2537timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002538
2539Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2540précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2541'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2542section implique une annulation de tous les paramètres par défaut positionnés
2543précédemment, dans le but de les remplacer.
2544
2545La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2546paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2547un commentaire en guise paramètre.
2548
willy tarreau982249e2005-12-18 00:57:06 +01002549Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2550positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002551 - log (le premier et le second)
2552 - mode { tcp, http, health }
2553 - balance { roundrobin }
2554 - disabled (pour désactiver toutes les instances qui suivent)
2555 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2556 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002557 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2558 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002559 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002560 - cookie, capture
2561 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002562
2563Ne sont pas supportés dans cette version, les adresses de dispatch et les
2564configurations de serveurs, ainsi que tous les filtres basés sur les
2565expressions régulières :
2566 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002567 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002568
2569Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2570positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2571défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2572paramètres par défaut avant la déclaration de l'instance.
2573
2574Exemples :
2575----------
2576 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002577 log global
2578 mode tcp
2579 balance roundrobin
2580 clitimeout 180000
2581 srvtimeout 180000
2582 contimeout 4000
2583 retries 3
2584 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002585
2586 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002587 server srv1 192.168.1.1 check port 6000 inter 10000
2588 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002589
2590 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002591 server srv1 192.168.2.1 check port 6000 inter 10000
2592 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002593
2594 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002595 log global
2596 mode http
2597 option httplog
2598 option forwardfor
2599 option dontlognull
2600 balance roundrobin
2601 clitimeout 20000
2602 srvtimeout 20000
2603 contimeout 4000
2604 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002605
2606 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002607 cookie SERVERID postonly insert indirect
2608 capture cookie userid= len 10
2609 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2610 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002611
2612 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002613 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002614
willy tarreau8f635a42006-05-21 23:05:54 +02002615
26164.8) Rapport d'état sous forme de page HTML
2617-------------------------------------------
2618Avec la version 1.2.14, il devient possible pour haproxy d'interceptre des
2619requêtes pour une URI particulière et de retourner un rapport complet d'état de
2620l'activité du proxy, et des statistiques sur les serveurs. Ceci est disponible
2621via le mot clé "stats" associé à n'importe laquelle de ces options :
2622
2623 - stats enable
2624 - stats uri <uri prefix>
2625 - stats realm <authentication realm>
2626 - stats auth <user:password>
2627 - stats scope <proxy_id> | '.'
2628
2629
2630Par défaut, le rapport est désactivé. Le fait de spécifier une des combinaision
2631ci-dessus active le rapport pour l'instance de proxy qui le référence. La
2632solution la plus simple est d'utiliser "stats enable" qui activera le rapport
2633avec les paramètres par défaut suivant :
2634
2635 - default URI : "/haproxy?stats" (CONFIG_STATS_DEFAULT_URI)
2636 - default auth : non spécifié (pas d'authentication)
2637 - default realm : "HAProxy Statistics" (CONFIG_STATS_DEFAULT_REALM)
2638 - default scope : non specifié (accès à toutes les instances)
2639
2640L'option "stats uri <uri_prefix>" permet d'intercepter un autre préfixe d'URI
2641que celui par défaut. Noter que n'importe quelle URI qui COMMENCE avec cette
2642chaîne sera validée. Par exemple, une instance pourrait être dédiée à la page
2643d'état seulement et répondre à toute URI.
2644
2645Example :
2646---------
2647 # intercepte n'importe quelle URI et retourne la page d'état.
2648 listen stats :8080
2649 mode http
2650 stats uri /
2651
2652
2653L'option "stats auth <user:password>" active l'authentification "Basic" et
2654ajoute un couple "user:password" valide à la liste des comptes autorisés.
2655L'utilisateur <user> et le mot de passe <password> doivent être précisés
2656en clair dans le fichier de configuration, et comme ceci est de
2657l'authentification HTTP "Basic", il faut être conscient qu'ils transitent en
2658clair sur le réseau, donc il ne faut pas utiliser de compte sensible. La liste
2659est illimitée dans le but de pouvoir fournir des accès facilement à des
2660développeurs ou à des clients.
2661
2662L'option "stats realm <realm>" définit le "domaine" ("realm") de validité du
2663mot de passe qui sera présenté dans la boîte de dialogue du navigateur
2664lorsqu'il demandera un compte utilisateur et un mot de passe. Il est important
2665de s'assurer que celui-ci soit différent de ceux utilisés par l'application,
2666autrement le navigateur tentera d'en utiliser un caché depuis l'application.
2667Noter que les espaces dans le nom de "realm" doivent être protégés par un
2668backslash ('\').
2669
2670L'option "stats scope <proxy_id>" limite la portée du rapport d'état. Par
2671défaut, toutes les instances proxy sont listées. Mais dans certaines
2672circonstances, il serait préférable de ne lister que certains proxies ou
2673simplement le proxy courant. C'est ce que fait cette option. Le nom spécial "."
2674(un simple point) référence le proxy courant. Cette option peut être répétée
2675autant de fois que nécessaire pour autoriser d'autres proxies, même pour des
2676noms référencés plus loin dans la configuration ou bien des noms qui n'existent
2677pas encore. Le nom précisé est celui qui apparait après le mot clé "listen".
2678
2679Exemple :
2680---------
2681 # simple application embarquant la page d'état authentifiée
2682 listen app1 192.168.1.100:80
2683 mode http
2684 option httpclose
2685 balance roundrobin
2686 cookie SERVERID postonly insert indirect
2687 server srv1 192.168.1.1:8080 cookie srv1 check inter 1000
2688 server srv1 192.168.1.2:8080 cookie srv2 check inter 1000
2689 stats uri /my_stats
2690 stats realm Statistics\ for\ MyApp1-2
2691 stats auth guest:guest
2692 stats auth admin:AdMiN123
2693 stats scope .
2694 stats scope app2
2695
2696 # simple application embarquant la page d'état sans authentification
2697 listen app2 192.168.2.100:80
2698 mode http
2699 option httpclose
2700 balance roundrobin
2701 cookie SERVERID postonly insert indirect
2702 server srv1 192.168.2.1:8080 cookie srv1 check inter 1000
2703 server srv1 192.168.2.2:8080 cookie srv2 check inter 1000
2704 stats uri /my_stats
2705 stats realm Statistics\ for\ MyApp2
2706 stats scope .
2707
2708 listen admin_page :8080
2709 mode http
2710 stats uri /my_stats
2711 stats realm Global\ statistics
2712 stats auth admin:AdMiN123
2713
2714Notes :
2715-------
2716 - les options "stats" peuvent aussi être spécifiées dans une section
2717 "defaults", auquel cas la même configuration exactement sera fournie à
2718 toutes les instances suivantes, d'où l'utilité du scope ".". Toutefois, si
2719 une instance redéfinit n'importe quel paramètre "stats", alors les défauts
2720 ne lui seront pas appliqués.
2721
2722 - l'authentification "Basic" est très simpliste et non sécurisée contre la
2723 capture réseau. Aucun mot de passe sensible ne doit être utilisé, et il
2724 est bon de savoir qu'il n'existe pas de moyen de le supprimer du navigateur
2725 après usage, donc il sera envoyé tel quel à l'application au cours des
2726 accès successifs.
2727
2728 - Il est très important de préciser l'option "httpclose", sinon le proxy ne
2729 sera pas en mesure de détecter les URI dans les sessions keep-alive
2730 maintenues entre le navigateur et les serveurs, donc les URI de stats
2731 seront transmises telles quelles aux serveurs comme si l'option n'était
2732 pas précisée.
2733
2734
Willy Tarreau726c2bf2007-05-09 01:31:45 +020027355) Listes d'accès
2736=================
2737
2738Avec la version 1.3.10, un nouveau concept de listes d'accès (ACL) a vu le
2739jour. Comme il n'était pas nécessaire de réinventer la roue, et du fait que
2740toutes les réflexions passées aboutissaient à des propositions non
2741satisfaisantes, il a finalement été décidé que quelque chose de proche de ce
2742que Squid offre serait un bon compromis entre une richesse fonctionnelle et une
2743facilité d'utilisation
2744
2745Le principe est très simple : les ACLs sont déclarées avec un nom, un test et
2746une liste de valeurs valides à tester. Des conditions sont appliquées sur
2747diverses actions, et ces conditions effectuent un ET logique entre les ACLs. La
2748condition n'est donc validée que si toutes les ACLs sont vraies.
2749
2750Il est également possible d'utiliser le mot réservé "OR" dans les conditions,
2751et il est possible pour une ACL d'être spécifiée plusieurs fois, même avec des
2752tests différents, auquel cas le premier test réussi validera l'ACL.
2753
Willy Tarreauae8b7962007-06-09 23:10:04 +02002754Au stade de la version 1.3.12, seuls les tests suivants ont été implémentés :
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002755
2756 Niveaux 3/4 :
2757 src <ipv4_address>[/mask] ... : match IPv4 source address
2758 dst <ipv4_address>[/mask] ... : match IPv4 destination address
Willy Tarreauae8b7962007-06-09 23:10:04 +02002759 src_port <range> ... : match source port range
2760 dst_port <range> ... : match destination port range
2761 dst_conn <range> ... : match #connections on frontend
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002762
2763 Niveau 7 :
2764 method <HTTP method> ... : match HTTP method
2765 req_ver <1.0|1.1> ... : match HTTP request version
2766 resp_ver <1.0|1.1> ... : match HTTP response version
Willy Tarreauae8b7962007-06-09 23:10:04 +02002767 status <range> ... : match HTTP response status code in range
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002768 url <string> ... : exact string match on URI
2769 url_reg <regex> ... : regex string match on URI
2770 url_beg <string> ... : true if URI begins with <string>
2771 url_end <string> ... : true if URI ends with <string>
2772 url_sub <string> ... : true if URI contains <string>
2773 url_dir <string> ... : true if URI contains <string> between slashes
2774 url_dom <string> ... : true if URI contains <string> between slashes or dots
2775
Willy Tarreauae8b7962007-06-09 23:10:04 +02002776Une plage ('range') est constituée d'un ou deux entiers qui peuvent être
2777préfixés d'un opérateur. La syntaxe est :
2778
2779 [<op>] <min>[:<max>]
2780
2781Avec <op> pouvant être :
2782 'eq' : la valeur doit égaler <min> ou être comprise entre <min> et <max>
2783 'le' : la valeur doit être inférieure ou égale à <min>
2784 'lt' : la valeur doit être strictement inférieure à <min>
2785 'ge' : la valeur doit être supérieure ou égale à <min>
2786 'gt' : la valeur doit être strictement supérieure à <min>
2787
2788Lorsqu'aucun opérateur n'est défini, 'eq' est employé. Noter que lorsqu'un
2789opérateur est spécifié, il s'applique à toutes les plages de valeurs suivantes
2790jusqu'à la fin de la ligne ou bien jusqu'à ce qu'un nouvel opérateur soit
2791précisé. Exemple :
2792
2793 acl status_error status 400:599
2794 acl saturated_frt dst_conn ge 1000
2795 acl invalid_ports src_port lt 512 ge 65535
2796
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002797D'autres tests arrivent (entêtes, cookies, heure, authentification), c'est
2798juste une question de temps. Il est aussi prévu de permettre de lire les
2799valeurs depuis un fichier, ainsi que d'ignorer la casse pour certains tests.
2800
2801La seule commande supportant les conditions d'ACL à ce jour est la nouvelle
2802commande "block" qui bloque une requête et retourne un statut 403 si sa
2803condition est validée (cas du "if") ou invalidée (cas du "unless").
2804
2805Exemple :
2806---------
2807
2808 acl options_uris url *
2809 acl meth_option method OPTIONS
2810 acl http_1.1 req_ver 1.1
2811 acl allowed_meth method GET HEAD POST OPTIONS CONNECT
2812 acl connect_meth method CONNECT
2813 acl proxy_url url_beg http://
2814
2815 # block if reserved URI "*" used with a method other than "OPTIONS"
2816 block if options_uris !meth_option
2817
2818 # block if the OPTIONS method is used with HTTP 1.0
2819 block if meth_option !http_1.1
2820
2821 # allow non-proxy url with anything but the CONNECT method
2822 block if !connect_meth !proxy_url
2823
2824 # block all unknown methods
2825 block unless allowed_meth
2826
2827Note: Cette documentation est embryonnaire mais doit permettre de démarrer et
2828surtout d'avancer sur le projet sans être trop ralenti par la documentation.
2829
2830
willy tarreaub719f002005-12-17 12:55:07 +01002831=======================
2832| Paramétrage système |
2833=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002834
2835Sous Linux 2.4
2836==============
2837
willy tarreaub719f002005-12-17 12:55:07 +01002838-- cut here --
2839#!/bin/sh
2840# set this to about 256/4M (16384 for 256M machine)
2841MAXFILES=16384
2842echo $MAXFILES > /proc/sys/fs/file-max
2843ulimit -n $MAXFILES
2844
2845if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002846 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002847fi
2848
2849if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002850 # 30 seconds for fin, 15 for time wait
2851 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2852 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2853 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2854 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002855fi
2856
willy tarreau0f7af912005-12-17 12:21:26 +01002857echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002858echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2859echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002860echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002861echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2862echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002863echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2864echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002865echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002866echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002867echo 0 > /proc/sys/net/ipv4/tcp_dsack
2868
2869# auto-tuned on 2.4
2870#echo 262143 > /proc/sys/net/core/rmem_max
2871#echo 262143 > /proc/sys/net/core/rmem_default
2872
2873echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2874echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2875
2876-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002877
willy tarreau197e8ec2005-12-17 14:10:59 +01002878Sous FreeBSD
2879============
2880
2881Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2882Clement Laforet <sheepkiller@cultdeadsheep.org>.
2883
2884Pour plus d'informations :
2885http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2886http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2887http://www.freshports.org/net/haproxy
2888
2889
willy tarreau0f7af912005-12-17 12:21:26 +01002890-- fin --