blob: 4702c7f6733aab9d718727f61fbcfcc55052996c [file] [log] [blame]
willy tarreau0174f312005-12-18 01:02:42 +01001 -------------------
2 H A - P r o x y
3 Manuel de référence
4 -------------------
willy tarreau34f45302006-04-15 21:37:14 +02005 version 1.2.12
willy tarreauc5f73ed2005-12-18 01:26:38 +01006 willy tarreau
willy tarreau34f45302006-04-15 21:37:14 +02007 2006/04/15
willy tarreau0f7af912005-12-17 12:21:26 +01008
willy tarreaub719f002005-12-17 12:55:07 +01009================
10| Introduction |
11================
willy tarreau0f7af912005-12-17 12:21:26 +010012
13HA-Proxy est un relais TCP/HTTP offrant des facilités d'intégration en
14environnement hautement disponible. En effet, il est capable de :
willy tarreauc29948c2005-12-17 13:10:27 +010015 - effectuer un aiguillage statique défini par des cookies ;
willy tarreau64a3cc32005-12-18 01:13:11 +010016 - effectuer une répartition de charge avec création de cookies pour assurer
17 la persistence de session ;
willy tarreau0f7af912005-12-17 12:21:26 +010018 - fournir une visibilité externe de son état de santé ;
willy tarreau8337c6b2005-12-17 13:41:01 +010019 - s'arrêter en douceur sans perte brutale de service ;
willy tarreauc5f73ed2005-12-18 01:26:38 +010020 - modifier/ajouter/supprimer des en-têtes dans la requête et la réponse ;
willy tarreau8337c6b2005-12-17 13:41:01 +010021 - interdire des requêtes qui vérifient certaines conditions ;
22 - utiliser des serveurs de secours lorsque les serveurs principaux sont hors
23 d'usage.
willy tarreau0f7af912005-12-17 12:21:26 +010024
willy tarreau64a3cc32005-12-18 01:13:11 +010025Il requiert peu de ressources, et son architecture événementielle mono-
26processus lui permet facilement de gérer plusieurs milliers de connexions
27simultanées sur plusieurs relais sans effondrer le système.
willy tarreaua1598082005-12-17 13:08:06 +010028
willy tarreau0f7af912005-12-17 12:21:26 +010029
30===========================
31| Paramètres de lancement |
32===========================
33
34Les options de lancement sont peu nombreuses :
35
36 -f <fichier de configuration>
37 -n <nombre maximal total de connexions simultanées>
38 -N <nombre maximal de connexions simultanées par proxy>
39 -d active le mode debug
40 -D passe en daemon
willy tarreau982249e2005-12-18 00:57:06 +010041 -q désactive l'affichage de messages sur la sortie standard.
42 -V affiche les messages sur la sortie standard, même si -q ou 'quiet' sont
43 spécifiés.
44 -c vérifie le fichier de configuration puis quitte avec un code de retour 0
45 si aucune erreur n'a été trouvée, ou 1 si une erreur de syntaxe a été
46 détectée.
willy tarreaufe2c5c12005-12-17 14:14:34 +010047 -p <fichier> indique au processus père qu'il doit écrire les PIDs de ses
48 fils dans ce fichier en mode démon.
willy tarreau34f45302006-04-15 21:37:14 +020049 -sf specifie une liste de PIDs auxquels envoyer un signal FINISH
50 -st specifie une liste de PIDs auxquels envoyer un signal TERMINATE
willy tarreau0f7af912005-12-17 12:21:26 +010051 -s affiche les statistiques (si option compilée)
52 -l ajoute des informations aux statistiques
willy tarreau64a3cc32005-12-18 01:13:11 +010053 -de désactive l'utilisation de epoll()
54 -dp désactive l'utilisation de poll()
willy tarreau34f45302006-04-15 21:37:14 +020055 -db désactive la mise en arrière-plan (utile pour débugger)
56 -m <megs> applique une limitation de <megs> Mo d'utilisation mémoire
willy tarreau0f7af912005-12-17 12:21:26 +010057
willy tarreau64a3cc32005-12-18 01:13:11 +010058Le nombre maximal de connexion simultanées par proxy est le paramètre par
59défaut pour les proxies pour lesquels ce paramètre n'est pas précisé dans le
60fichier de configuration. Il s'agit du paramètre 'maxconn' dans les sections
61'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010062
willy tarreau64a3cc32005-12-18 01:13:11 +010063Le nombre maximal total de connexions simultanées limite le nombre de
64connexions TCP utilisables à un instant donné par le processus, tous proxies
65confondus. Ce paramètre remplace le paramètre 'maxconn' de la section 'global'.
willy tarreaua1598082005-12-17 13:08:06 +010066
willy tarreauc29948c2005-12-17 13:10:27 +010067Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
willy tarreauc5f73ed2005-12-18 01:26:38 +010068mode, toutes les connexions, déconnexions, et tous les échanges d'en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +010069sont affichés.
70
willy tarreau34f45302006-04-15 21:37:14 +020071Pour debugger, l'option '-db' est très pratique car elle désactive
72temporairement le mode daemon et le mode multi-processus. Le service peut alors
73être arrêté par un simple appui sur Ctrl-C, sans avoir à modifier la
74configuration ni à activer le mode debug complet.
75
willy tarreauc29948c2005-12-17 13:10:27 +010076Les statistiques ne sont disponibles que si le programme a été compilé avec
77l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
78d'utilité que lors de benchmarks par exemple.
79
willy tarreau34f45302006-04-15 21:37:14 +020080Les paramètres '-st' et '-sf' sont utilisés pour informer des processus
81existants que la configuration va être rechargée. Ils recevront le signal
82SIGTTOU, leur demandant de libérer les ports en écoute afin que le nouveau
83processus puisse les prendre. Si quoi que ce soit se passe mal, le nouveau
84processus leur enverra un signal SIGTTIN pour leur indiquer qu'ils peuvent
85se remettre en écoute et continuer leur travail. En revanche, si la
86configuration se charge correctement, alors ils recevront un signal de demande
87de fin de travail en douceur (-sf), ou de terminaison immédiate (-st) qui
88coupera les sessions en cours. Un usage typique tel que celui-ci permet de
89recharger une configuration sans interruption de service :
90
91 # haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
willy tarreau0f7af912005-12-17 12:21:26 +010092
93============================
94| Fichier de configuration |
95============================
96
willy tarreauc29948c2005-12-17 13:10:27 +010097Structure
98=========
willy tarreau0f7af912005-12-17 12:21:26 +010099
willy tarreaua1598082005-12-17 13:08:06 +0100100L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
willy tarreau64a3cc32005-12-18 01:13:11 +0100101les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est
102pas précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +0100103
104Le fichier de configuration est découpé en sections répérées par des mots clés
105tels que :
106
107 - 'global'
108 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +0100109 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +0100110
111Tous les paramètres font référence à la section définie par le dernier mot clé
112reconnu.
113
114
willy tarreauc29948c2005-12-17 13:10:27 +01001151) Paramètres globaux
116=====================
willy tarreaua1598082005-12-17 13:08:06 +0100117
118Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
119proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
120supportés sont :
121
willy tarreau8337c6b2005-12-17 13:41:01 +0100122 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100123 - maxconn <nombre>
124 - uid <identifiant>
125 - gid <identifiant>
126 - chroot <répertoire>
127 - nbproc <nombre>
128 - daemon
129 - debug
willy tarreau64a3cc32005-12-18 01:13:11 +0100130 - noepoll
131 - nopoll
willy tarreaua1598082005-12-17 13:08:06 +0100132 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100133 - pidfile <fichier>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100134 - ulimit-n <nombre>
135
willy tarreaua1598082005-12-17 13:08:06 +0100136
1371.1) Journalisation des événements
138----------------------------------
139La plupart des événements sont journalisés : démarrages, arrêts, disparition et
140apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
141syslog vers un ou deux serveurs. La syntaxe est la suivante :
142
willy tarreau8337c6b2005-12-17 13:41:01 +0100143 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100144
145Les connexions sont envoyées en niveau "info". Les démarrages de service et de
146serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
147arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau64a3cc32005-12-18 01:13:11 +0100148bien pour les proxies que pour les serveurs testés par les proxies. Le
149paramètre optionnel <niveau_max> définit le niveau maximal de traces émises
150parmi les 8 valeurs suivantes :
willy tarreau8337c6b2005-12-17 13:41:01 +0100151 emerg, alert, crit, err, warning, notice, info, debug
152
willy tarreaueedaa9f2005-12-17 14:08:03 +0100153Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100154est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100155
156Les catégories possibles sont :
157 kern, user, mail, daemon, auth, syslog, lpr, news,
158 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
159 local0, local1, local2, local3, local4, local5, local6, local7
160
willy tarreau036e1ce2005-12-17 13:46:33 +0100161Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
162
willy tarreaua1598082005-12-17 13:08:06 +0100163Exemple :
164---------
165 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100166 log 192.168.2.200 local3
167 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100168
1691.2) limitation du nombre de connexions
170---------------------------------------
171Il est possible et conseillé de limiter le nombre global de connexions par
willy tarreauc5f73ed2005-12-18 01:26:38 +0100172processus à l'aide du mot clé global 'maxconn'. Les connexions sont comprises
173au sens 'acceptation de connexion', donc il faut s'attendre en règle général à
174avoir un peu plus du double de sessions TCP que le maximum de connexions fixé.
175C'est important pour fixer le paramètre 'ulimit -n' avant de lancer le proxy.
176Pour comptabiliser le nombre de sockets nécessaires, il faut prendre en compte
177ces paramètres :
178
willy tarreaua1598082005-12-17 13:08:06 +0100179 - 1 socket par connexion entrante
180 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100181 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100182 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100183 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100184
willy tarreau64a3cc32005-12-18 01:13:11 +0100185Dans le cas où chaque proxy n'écoute que sur un couple adresse/port,
willy tarreauc5f73ed2005-12-18 01:26:38 +0100186positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
187(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
188il est possible de spécifier cette limite dans la configuration à l'aide du
189mot-clé global 'ulimit-n', à condition bien entendu que le proxy ait été
190démarré sous le compte root (ou avec des droits suffisants pour élever le
191nombre de descripteurs de fichiers). Cette solution met un terme au problème
192récurrent d'incertitude de l'adéquation entre les limites systèmes lors de la
193dernière relance du proxessus et les limites en nombre de connexions. Noter que
194cette limite s'applique par processus.
195
196Exemple :
197---------
198 global
199 maxconn 32000
200 ulimit-n 65536
201
willy tarreauc29948c2005-12-17 13:10:27 +0100202
2031.3) Diminution des privilèges
204------------------------------
205Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
206serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100207de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100208
willy tarreauc29948c2005-12-17 13:10:27 +0100209Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
210numérique d'utilisateur. La valeur 0, correspondant normalement au super-
211utilisateur, possède ici une signification particulière car elle indique que
212l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
213C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
214un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
215changer. Il est particulièrement déconseillé d'utiliser des comptes génériques
216tels que 'nobody' car cette pratique revient à utiliser 'root' si d'autres
217processus utilisent les mêmes identifiants.
218
219Le paramètre 'chroot' autorise à changer la racine du processus une fois le
220programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100221puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100222généralement contournable sur certains OS (Linux, Solaris) pour peu que
223l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
224un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
225service pour cet usage, et de ne pas mutualiser un même répertoire pour
226plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
227il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
228l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100229
willy tarreau64a3cc32005-12-18 01:13:11 +0100230Remarque importante :
231---------------------
232Dans le cas où une telle faille serait mise en évidence, il est fort probable
233que les premières tentatives de son exploitation provoquent un arrêt du
willy tarreauc29948c2005-12-17 13:10:27 +0100234programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
willy tarreau64a3cc32005-12-18 01:13:11 +0100235encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur
236en environnement limité réduit les risques d'intrusion, il est parfois bien
237utile dans ces circonstances de connaître les conditions d'apparition du
238problème, via l'obtention d'un fichier 'core'. La plupart des systèmes, pour
239des raisons de sécurité, désactivent la génération du fichier 'core' après un
240changement d'identifiant pour le processus. Il faudra donc soit lancer le
241processus à partir d'un compte utilisateur aux droits réduits (mais ne pouvant
242pas effectuer le chroot), ou bien le faire en root sans réduction des droits
243(uid 0). Dans ce cas, le fichier se trouvera soit dans le répertoire de
244lancement, soit dans le répertoire spécifié après l'option 'chroot'. Ne pas
245oublier la commande suivante pour autoriser la génération du fichier avant de
246lancer le programme :
willy tarreauc29948c2005-12-17 13:10:27 +0100247
248# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100249
willy tarreauc29948c2005-12-17 13:10:27 +0100250Exemple :
251---------
252
253 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100254 uid 30000
255 gid 30000
256 chroot /var/chroot/haproxy
willy tarreauc29948c2005-12-17 13:10:27 +0100257
willy tarreaufe2c5c12005-12-17 14:14:34 +01002581.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100259----------------------------
260Le service peut fonctionner dans plusieurs modes :
261 - avant- / arrière-plan
262 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100263
willy tarreau64a3cc32005-12-18 01:13:11 +0100264Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne
265rend pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci
266dans un script de démarrage du système, sinon le système ne finirait pas son
willy tarreauc29948c2005-12-17 13:10:27 +0100267initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
268au processus appelant. C'est ce que fait l'option 'daemon' de la section
269'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100270
willy tarreau34f45302006-04-15 21:37:14 +0200271Le paramètre de ligne de commande '-db' inhibe les options globales 'daemon'
272et 'nbproc' pour faire fonctionner le processus en mode normal, avant-plan.
273
willy tarreauc29948c2005-12-17 13:10:27 +0100274Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
275standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
276logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
277Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100278
willy tarreauc29948c2005-12-17 13:10:27 +0100279Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
280problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
281entre les clients et les serveurs. Ce mode est incompatible avec les options
282'daemon' et 'quiet' pour des raisons de bon sens.
283
willy tarreaufe2c5c12005-12-17 14:14:34 +01002841.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100285-----------------------------------------------
286Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
287processeur pour effectuer les tâches de relayage, même si les charges
288nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
289grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
290programme sait démarrer plusieurs processus se répartissant la charge de
291travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
292section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100293qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
294la limite de nombre de descripteurs de fichiers allouée par processus sous
295Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100296
297Exemple :
298---------
299
300 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100301 daemon
302 quiet
303 nbproc 2
willy tarreauc29948c2005-12-17 13:10:27 +0100304
willy tarreaufe2c5c12005-12-17 14:14:34 +01003051.6) Simplification de la gestion des processus
306-----------------------------------------------
307Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
308paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
309d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
310le numéro de PID des processus fils, à raison d'un par ligne (valable
311uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
312afin de rester compatible avec un répertoire protégé en lecture seule. Il
313appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
3140644.
315
316Exemple :
317---------
318
319 global
320 daemon
321 quiet
322 nbproc 2
323 pidfile /var/run/haproxy-private.pid
324
325 # pour stopper seulement ces processus parmi d'autres :
326 # kill $(</var/run/haproxy-private.pid)
327
willy tarreau34f45302006-04-15 21:37:14 +0200328 # pour recharger une configuration avec un impact minimal sur le service,
329 # et sans casser les sessions existantes :
330 # haproxy -f haproxy.cfg -p $(</var/run/haproxy-private.pid) -st $(</var/run/haproxy-private.pid)
willy tarreauc29948c2005-12-17 13:10:27 +0100331
willy tarreau64a3cc32005-12-18 01:13:11 +01003321.7) Mécanismes de traitements des événements
333---------------------------------------------
334A partir de la version 1.2.5, haproxy supporte les mécanismes poll() et
335epoll(). Sur les systems où select() est limité par FD_SETSIZE (comme Solaris),
336poll() peut être une alternative intéressante. Des tests de performance
337montrent que les performances de poll() ne décroissent pas aussi vite que le
338nombre de sockets augmente, ce qui en fait une solution sûre pour les fortes
339charges. Cela dit, Soalris utilise déjà poll() pour émuler select(), donc tant
340que le nombre de sockets ne dépasse pas FD_SETSIZE, poll() ne devrait pas
341apporter de performances supplémentaires. Sur les systèmes à base Linux
342incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
343qui est extrèmement rapide indépendamment du nombre de sockets. Les tests sur
344haproxy ont montré une performance constante de 1 à 40000 sessions simultanées.
345
346Haproxy utilisera epoll() lorsqu'il est disponible, et se repliera sur poll(),
347puis en dernier lieu sur select(). Cependant, si pour une raison quelconque il
348s'avérait nécessaire de désactiver epoll() ou poll() (p.ex: à cause d'un bug ou
349juste pour comparer les performances), deux nouvelles options globales ont été
350ajoutées dans ce but : 'noepoll' et 'nopoll'.
351
352Exemple :
353---------
354 global
355 # utiliser seulement select()
356 noepoll
357 nopoll
358
359Remarque :
360----------
361Dans le but d'assurer une portabilité maximale des configurations, ces options
362sont acceptées et ignorées si les mécanismes poll() ou epoll() n'ont pas été
363activés lors de la compilation.
364
365Afin de simplifier la résolution de problèmes, le paramètre '-de' en ligne de
366commande désactive epoll() et le paramètre '-dp' désactive poll(). Ils sont
367respectivement équivalents à 'noepoll' et 'nopoll'.
368
369
willy tarreauc29948c2005-12-17 13:10:27 +01003702) Définition d'un service en écoute
371====================================
372
373Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100374
willy tarreaua41a8b42005-12-17 14:02:24 +0100375 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100376
willy tarreauc29948c2005-12-17 13:10:27 +0100377- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
willy tarreau64a3cc32005-12-18 01:13:11 +0100378 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé.
379 Aucun test n'est effectué concernant l'unicité de ce nom, qui n'est pas
380 obligatoire, mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100381
willy tarreaua41a8b42005-12-17 14:02:24 +0100382- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
383 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
384 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100385
willy tarreaua41a8b42005-12-17 14:02:24 +0100386- <plage_ports> correspond soit à un port, soit à une plage de ports sur
387 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
388 Cette plage peut être :
389 - soit un port numérique (ex: '80')
390 - soit une plage constituée de deux valeurs séparées par un tiret
391 (ex: '2000-2100') représentant les extrémités incluses dans la
392 plage.
393 Il faut faire attention à l'usage des plages, car chaque combinaison
394 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
395 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
396 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
willy tarreau64a3cc32005-12-18 01:13:11 +0100397 niveau de privilège particulier lors du lancement du programme
398 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100399
willy tarreaua41a8b42005-12-17 14:02:24 +0100400- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
401 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
402 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
403
404Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100405---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100406 listen http_proxy :80
407 listen x11_proxy 127.0.0.1:6000-6009
408 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
409 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100410
willy tarreaua41a8b42005-12-17 14:02:24 +0100411Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
412rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
413de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
414l'écriture de configurations :
415
416 bind [ <adresse_IP>:<plage_ports>[,...] ]
417
418Exemples :
419----------
420 listen http_proxy
421 bind :80,:443
willy tarreauc5f73ed2005-12-18 01:26:38 +0100422 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100423
willy tarreauc29948c2005-12-17 13:10:27 +01004242.1) Inhibition d'un service
425----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100426Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100427commenter toute une partie du fichier. Il suffit de positionner le mot clé
428"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100429
430 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100431 disabled
willy tarreau0f7af912005-12-17 12:21:26 +0100432
willy tarreaueedaa9f2005-12-17 14:08:03 +0100433Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
willy tarreauc5f73ed2005-12-18 01:26:38 +0100434 désactivé par le mot clé 'disabled', par exemple à cause d'une
435 configuration par défaut.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100436
willy tarreauc29948c2005-12-17 13:10:27 +01004372.2) Mode de fonctionnement
438---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100439Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100440 - TCP
441 - HTTP
442 - supervision
443
444Mode TCP
445--------
willy tarreau64a3cc32005-12-18 01:13:11 +0100446Dans ce mode, le service relaye, dès leur établissement, les connexions TCP
447vers un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il
448s'agit simplement d'une association
449 source<adresse:port> -> destination<adresse:port>.
willy tarreauc29948c2005-12-17 13:10:27 +0100450Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100451
willy tarreauc29948c2005-12-17 13:10:27 +0100452Exemple :
453---------
willy tarreau0f7af912005-12-17 12:21:26 +0100454 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100455 mode tcp
willy tarreau0f7af912005-12-17 12:21:26 +0100456
457Mode HTTP
458---------
willy tarreauc29948c2005-12-17 13:10:27 +0100459Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
460serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
willy tarreauc5f73ed2005-12-18 01:26:38 +0100461décision. Les en-têtes HTTP sont analysés pour y trouver un éventuel cookie, et
willy tarreauc29948c2005-12-17 13:10:27 +0100462certains d'entre-eux peuvent être modifiés par le biais d'expressions
463régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
464relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100465
willy tarreauc29948c2005-12-17 13:10:27 +0100466Exemple :
467---------
willy tarreau0f7af912005-12-17 12:21:26 +0100468 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100469 mode http
willy tarreau0f7af912005-12-17 12:21:26 +0100470
471Mode supervision
472----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100473Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
474santé du service. Il se contente de retourner "OK" à tout client se connectant
475sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100476déterminer quels sont les services utilisables. Si l'option 'httpchk' est
477activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
478attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100479le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100480
willy tarreauc29948c2005-12-17 13:10:27 +0100481Exemple :
482---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100483 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100484 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100485 mode health
willy tarreau0f7af912005-12-17 12:21:26 +0100486
willy tarreau197e8ec2005-12-17 14:10:59 +0100487 # réponse HTTP : 'HTTP/1.0 200 OK'
488 listen http_health_check 0.0.0.0:60001
willy tarreauc5f73ed2005-12-18 01:26:38 +0100489 mode health
490 option httpchk
willy tarreau197e8ec2005-12-17 14:10:59 +0100491
willy tarreau0f7af912005-12-17 12:21:26 +0100492
willy tarreauc5f73ed2005-12-18 01:26:38 +0100493Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
494bon fonctionnement du proxy sans perturber le service. Le mot-clé 'monitor-net'
495a été créé dans le butd de spécifier un réseau d'équipements qui ne PEUVENT PAS
496utiliser le service pour autre chose que des tests de fonctionnement. C'est
497particulièrement adapté aux proxies TCP, car cela empêche le proxy de relayer
498des établissements de connexion émis par un outil de surveillance.
499
500Lorsque c'est utilisé sur un proxy TCP, la connexion est acceptée puis refermée
501et rien n'est logué. C'est suffisant pour qu'un répartiteur de charge en amont
502détecte que le service est disponible.
503
504Lorsque c'est utilisé sur un proxy HTTP, la connexion est acceptée, rien n'est
505logué, puis la réponse suivante est envoyée et la session refermée :
506"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un répartiteur de charge
507HTTP en amont détecte le service comme opérationnel, aussi bien à travers des
508tests TCP que HTTP.
509
510Les proxies utilisant le mot-clé 'monitor-net' peuvent accessoirement se passer
511de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
512émises depuis d'autres adresses que celles du réseau de tests.
513
514Exemple :
515---------
516
517 listen tse-proxy
518 bind :3389,:1494,:5900 # TSE, ICA and VNC at once.
519 mode tcp
520 balance roundrobin
521 server tse-farm 192.168.1.10
522 monitor-net 192.168.1.252/31 # L4 load-balancers on .252 and .253
523
524
willy tarreauc29948c2005-12-17 13:10:27 +01005252.3) Limitation du nombre de connexions simultanées
526---------------------------------------------------
527Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
528connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
529d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
530limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100531
willy tarreauc29948c2005-12-17 13:10:27 +0100532Exemple :
533---------
534 listen tiny_server 0.0.0.0:80
535 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100536
537
willy tarreauc29948c2005-12-17 13:10:27 +01005382.4) Arrêt en douceur
539---------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100540Il est possible d'arrêter les services en douceur en envoyant un signal
willy tarreau22739ef2006-01-20 20:43:32 +0100541SIGUSR1 au processus relais. Tous les services seront alors mis en phase
willy tarreau64a3cc32005-12-18 01:13:11 +0100542d'arrêt, mais pourront continuer d'accepter des connexions pendant un temps
543défini par le paramètre 'grace' (en millisecondes). Cela permet par exemple,
544de faire savoir rapidement à un répartiteur de charge qu'il ne doit plus
545utiliser un relais, tout en continuant d'assurer le service le temps qu'il
546s'en rende compte.
547
548Remarque :
549----------
550Les connexions actives ne sont jamais cassées. Dans le pire des cas, il faudra
willy tarreau22739ef2006-01-20 20:43:32 +0100551attendre en plus leur expiration avant l'arrêt total du processus, ou bien tuer
552manuellement le processus par l'envoi d'un signal SIGTERM. La valeur par défaut
553du paramètre 'grace' est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100554
555Exemple :
556---------
willy tarreauc29948c2005-12-17 13:10:27 +0100557 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100558 # le service tournera encore 10 secondes après la demande d'arrêt
559 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100560 mode http
561 grace 10000
willy tarreau0f7af912005-12-17 12:21:26 +0100562
willy tarreauc29948c2005-12-17 13:10:27 +0100563 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100564 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100565 mode health
566 grace 0
willy tarreau0f7af912005-12-17 12:21:26 +0100567
willy tarreau39df2dc2006-01-29 21:56:05 +0100568A partir de la version 1.2.8, un nouveau mécanisme de reconfiguration à chaud
willy tarreau22739ef2006-01-20 20:43:32 +0100569a été introduit. Il est désormais possible de mettre les proxies en "pause" en
570envoyant un signal SIGTTOU aux processus. Cela désactivera les sockets d'écoute
571sans casser les sessions existantes. Suite à cela, l'envoi d'un signal SIGTTIN
572réactivera les sockets d'écoute. Ceci est très pratique pour tenter de charger
573une nouvelle configuration ou même une nouvelle version de haproxy sans casser
574les connexions existantes. Si le rechargement s'effectue correctement, il ne
575reste plus qu'à envoyer un signal SIGUSR1 aux anciens processus, ce qui
576provoquera leur arrêt immédiat dès que leurs connexions seront terminées ; en
577revanche, si le rechargement échoue, il suffit d'envoyer un signal SIGTTIN pour
578remettre les ports en écoute et rétablir le service immédiatement. Veuillez
579noter que le paramètre 'grace' est ignoré pour le signal SIGTTOU ainsi que le
580signal SIGUSR1 une fois le processus en pause. Aussi, il peut s'avérer très
581utile de sauver le fichier de pid avant de démarrer une nouvelle instance.
582
willy tarreau34f45302006-04-15 21:37:14 +0200583Ce mécanisme est pleinement exploité à partir de la version 1.2.11 avec les
584options '-st' et '-sf' (voir plus haut).
willy tarreau0f7af912005-12-17 12:21:26 +0100585
willy tarreauc29948c2005-12-17 13:10:27 +01005862.5) Temps d'expiration des connexions
587--------------------------------------
588Il est possible de paramétrer certaines durées d'expiration au niveau des
589connexions TCP. Trois temps indépendants sont configurables et acceptent des
590valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
591session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100592
593 - temps d'attente d'une donnée de la part du client, ou de la
594 possibilité de lui envoyer des données : "clitimeout" :
595
willy tarreauc5f73ed2005-12-18 01:26:38 +0100596 # time-out client à 2mn30.
597 clitimeout 150000
willy tarreau0f7af912005-12-17 12:21:26 +0100598
599 - temps d'attente d'une donnée de la part du serveur, ou de la
600 possibilité de lui envoyer des données : "srvtimeout" :
601
willy tarreauc5f73ed2005-12-18 01:26:38 +0100602 # time-out serveur à 30s.
603 srvtimeout 30000
willy tarreau0f7af912005-12-17 12:21:26 +0100604
605 - temps d'attente de l'établissement d'une connexion vers un serveur
606 "contimeout" :
607
willy tarreauc29948c2005-12-17 13:10:27 +0100608 # on abandonne si la connexion n'est pas établie après 4 secondes
willy tarreauc5f73ed2005-12-18 01:26:38 +0100609 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100610
willy tarreauc29948c2005-12-17 13:10:27 +0100611Remarques :
612-----------
613 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
614 type "health".
615 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
willy tarreau64a3cc32005-12-18 01:13:11 +0100616 possible de perdre des paquets. Du fait que la première retransmission
617 TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
618 inférieur à 3 secondes ne permet pas de se rattraper sur la perte
619 de paquets car la session aura été abandonnée avant la première
620 retransmission. Une valeur de 4 secondes réduira considérablement
621 le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100622
willy tarreauc29948c2005-12-17 13:10:27 +01006232.6) Tentatives de reconnexion
624------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100625Lors d'un échec de connexion vers un serveur, il est possible de
626retenter (potentiellement vers un autre serveur, en cas de répartition
627de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100628abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100629
willy tarreauc29948c2005-12-17 13:10:27 +0100630Exemple :
631---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100632 # on essaie encore trois fois maxi
633 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100634
willy tarreau34f45302006-04-15 21:37:14 +0200635Il est à noter que la tentative de reconnexion peut amener à utiliser un autre
636serveur si le premier a disparu entre deux tentatives de connexion.
637
willy tarreau0f7af912005-12-17 12:21:26 +0100638
willy tarreauc29948c2005-12-17 13:10:27 +01006392.7) Adresse du serveur
640-----------------------
641Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
642le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
643serveur d'assignation de cookie dans le cas où le service consiste à assurer
644uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100645le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
646du serveur distant, et il est maintenant recommandé d'utiliser de préférence
647le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100648
willy tarreauc29948c2005-12-17 13:10:27 +0100649Exemple :
650---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100651 # on envoie toutes les nouvelles connexions ici
652 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100653
willy tarreauc29948c2005-12-17 13:10:27 +0100654Remarque :
655----------
656Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
657'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100658
willy tarreau0f7af912005-12-17 12:21:26 +0100659
willy tarreau240afa62005-12-17 13:14:35 +01006602.8) Adresse de sortie
661----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100662Il est possible de forcer l'adresse utilisée pour établir les connexions vers
663les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
664port, bien que cette fonctionnalité se limite à des usages très spécifiques.
665C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100666pour permettre aux serveurs de trouver le chemin de retour dans des contextes
667de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
668choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
669librement par le système. Il est à noter que depuis la version 1.1.18, les
670tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
671source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100672
673Exemples :
674----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100675 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100676 # toutes les connexions prennent l'adresse 192.168.1.200
677 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100678
willy tarreaua41a8b42005-12-17 14:02:24 +0100679 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100680 # utiliser l'adresse 192.168.1.200 et le port réservé 900
681 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100682
683
6842.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100685--------------------------------
686En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
687vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
688par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100689
willy tarreauc29948c2005-12-17 13:10:27 +0100690Exemple :
691---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100692 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100693 mode http
694 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100695
willy tarreauc29948c2005-12-17 13:10:27 +0100696On peut modifier l'utilisation du cookie pour la rendre plus intelligente
697vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
698réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
699cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100700de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
701inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100702
703Exemples :
704----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100705
706Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100707dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
708directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100709
willy tarreauc5f73ed2005-12-18 01:26:38 +0100710 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100711
willy tarreauc29948c2005-12-17 13:10:27 +0100712Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
713lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100714
willy tarreauc5f73ed2005-12-18 01:26:38 +0100715 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100716
willy tarreau64a3cc32005-12-18 01:13:11 +0100717Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
718accès en répartition de charge interne. Dans ce cas, il est souhaitable que
719tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100720retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100721
willy tarreauc5f73ed2005-12-18 01:26:38 +0100722 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100723
willy tarreau0174f312005-12-18 01:02:42 +0100724Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
725puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
726permet d'insérer une instance de haproxy devant une application sans risquer
727d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
728plus d'un cookie :
729
730 cookie JSESSIONID prefix
731
willy tarreau240afa62005-12-17 13:14:35 +0100732Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
733ajouter le mot clé 'nocache' après 'insert' :
734
willy tarreauc5f73ed2005-12-18 01:26:38 +0100735 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100736
willy tarreau64a3cc32005-12-18 01:13:11 +0100737Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
738mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100739
willy tarreauc5f73ed2005-12-18 01:26:38 +0100740 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100741
willy tarreau240afa62005-12-17 13:14:35 +0100742
willy tarreau96d40372005-12-17 13:11:56 +0100743Remarques :
744-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100745- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
746 s'adapter à des applications générant déjà le cookie, avec un contenu
747 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100748
willy tarreau96d40372005-12-17 13:11:56 +0100749- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
750 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
751 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100752
willy tarreau240afa62005-12-17 13:14:35 +0100753- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
754 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
755 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
756 cookie de persistence inséré, donc provoquer des changements de serveurs pour
757 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100758
willy tarreau0174f312005-12-18 01:02:42 +0100759- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
760 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
761 présenté par l'application qui est censée savoir à quel moment il peut
762 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
763 présenté par le client dans chaque requête ultérieure, il est indispensable
764 de s'assurer que le client et le serveur communiqueront sans "keep-alive
765 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
766
willy tarreaucd878942005-12-17 13:27:43 +0100767- lorsque l'application est bien connue, et que les parties nécessitant de la
768 persistence sont systématiquement accédées par un formulaire en mode POST,
769 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
770 et "indirect", car la page d'accueil reste cachable, et c'est l'application
771 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100772
willy tarreau240afa62005-12-17 13:14:35 +01007732.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100774----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100775En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
776par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100777
willy tarreau5cbea6f2005-12-17 12:48:26 +0100778 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100779
willy tarreauc29948c2005-12-17 13:10:27 +0100780- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
781 configuration et les logs.
782- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
783- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100784
785Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100786---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100787 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100788 mode http
789 cookie SERVERID
790 dispatch 192.168.1.100:80
791 server web1 192.168.1.1:80 cookie server01
792 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100793
794Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100795-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100796
willy tarreaua41a8b42005-12-17 14:02:24 +01007973) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100798=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100799
willy tarreauc29948c2005-12-17 13:10:27 +0100800Le relais peut effectuer lui-même la répartition de charge entre les différents
801serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
802cela, on précise le mot clé 'balance' dans la définition du service,
willy tarreau34f45302006-04-15 21:37:14 +0200803éventuellement suivi du nom d'un algorithme de répartition. Jusqu'à la version
8041.2.11, seul 'roundrobin' était géré, et c'est aussi la valeur implicite par
805défaut. Avec la version 1.2.12, le nouveau mot clé 'source' est apparu. Il est
806évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
willy tarreauc29948c2005-12-17 13:10:27 +0100807spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100808
809Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100810---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100811
willy tarreaua41a8b42005-12-17 14:02:24 +0100812 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100813 mode http
814 cookie SERVERID
815 balance roundrobin
816 server web1 192.168.1.1:80 cookie server01
817 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100818
willy tarreaua41a8b42005-12-17 14:02:24 +0100819Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
820du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
821sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
822champ <port> de l'adresse serveur :
823
824 - non spécifié ou nul :
825 la connexion sera envoyée au serveur sur le même port que celui sur
826 lequel le relais a reçu la connexion.
827
828 - valeur numérique (seul cas supporté pour les versions antérieures) :
829 le serveur recevra la connexion sur le port désigné.
830
831 - valeur numérique précédée d'un signe '+' :
832 la connexion sera envoyée au serveur sur le même port que celui sur
833 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
834
835 - valeur numérique précédée d'un signe '-' :
836 la connexion sera envoyée au serveur sur le même port que celui sur
837 lequel le relais a reçu la connexion, duquel on soustrait la valeur
838 désignée.
839
840Exemples :
841----------
842
843# même que précédemment
844
845 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100846 mode http
847 cookie SERVERID
848 balance roundrobin
849 server web1 192.168.1.1 cookie server01
850 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100851
852# relayage simultané des ports 80 et 81 et 8080-8089
853
854 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100855 mode http
856 cookie SERVERID
857 balance roundrobin
858 server web1 192.168.1.1 cookie server01
859 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100860
861# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
862
863 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100864 mode tcp
865 balance roundrobin
866 server srv1 192.168.1.1:+1000
867 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100868
willy tarreau34f45302006-04-15 21:37:14 +0200869Comme indiqué précédemment, la version 1.2.12 apporta le nouveau mot clé
870'source'. Lorsque celui-ci est utilisé, l'adresse IP du client est hachée et
871distribuée de manière homogène parmi les serveurs disponibles, de sorte qu'une
872même adresse IP aille toujours sur le même serveur tant qu'il n'y a aucun
873changement dans le nombre de serveurs disponibles. Ceci peut être utilisé par
874exemple pour attacher le HTTP et le HTTPS sur un même serveur pour un même
875client. Cela peut également être utilisé pour améliorer la persistance
876lorsqu'une partie de la population des clients n'accepte pas les cookies. Dans
877ce cas, seuls ces derniers seront perturbés par la perte d'un serveur.
878
879NOTE: il est important de prendre en compte le fait que beaucoup d'internautes
880 naviguent à travers des fermes de proxies qui assignent des adresses IP
881 différentes à chaque requête. D'autres internautes utilisent des liens à
882 la demande et obtiennent une adresse IP différente à chaque connexion. De
883 ce fait, le paramètre 'source' doit être utilisé avec une extrème
884 précaution.
885
886Exemples :
887----------
888
889# assurer qu'une même adresse IP ira sur le même serveur pour tout service
890
891 listen http_proxy
892 bind :80,:443
893 mode http
894 balance source
895 server web1 192.168.1.1
896 server web2 192.168.1.2
897
898# améliorer la persistance par l'utilisation de la source en plus du cookie :
899
900 listen http_proxy :80
901 mode http
902 cookie SERVERID
903 balance source
904 server web1 192.168.1.1 cookie server01
905 server web2 192.168.1.2 cookie server02
906
willy tarreau0f7af912005-12-17 12:21:26 +0100907
willy tarreauc29948c2005-12-17 13:10:27 +01009083.1) Surveillance des serveurs
909------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100910Il est possible de tester l'état des serveurs par établissement de connexion
911TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
912utilisé dans le processus de répartition de charge interne. Pour activer la
913surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
914Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
915tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
916paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
917Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreau34f45302006-04-15 21:37:14 +0200918
willy tarreaue47c8d72005-12-17 12:55:52 +0100919 - inter : 2000
920 - rise : 2
921 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +0100922 - port : port de connexion du serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +0100923
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100924Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +0100925certains cas de pannes, des serveurs peuvent continuer à accepter les
926connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
927d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
928et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
929les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
930contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
931RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
9321.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
933possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
934l'avantage d'être facilement extractibles des logs, et de ne pas induire
935d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
936considérées valides, les autres (y compris non-réponses) aboutissent à un
937échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
938deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
939"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
940accepte donc 4 formes :
willy tarreau34f45302006-04-15 21:37:14 +0200941
willy tarreaueedaa9f2005-12-17 14:08:03 +0100942 - option httpchk -> OPTIONS / HTTP/1.0
943 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
944 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
945 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreau34f45302006-04-15 21:37:14 +0200946
willy tarreauc5f73ed2005-12-18 01:26:38 +0100947Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100948
willy tarreau8337c6b2005-12-17 13:41:01 +0100949Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
950utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
951ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
952de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
953les 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 +0100954de répartition de charge entre des serveurs de secours par défaut. A partir
955de la version 1.2.9, il est possible de les utiliser simultanément grâce à
956l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
957d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
958de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
959définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
960qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +0100961
willy tarreaua41a8b42005-12-17 14:02:24 +0100962Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
963vers un port différent de celui de service. C'est nécessaire principalement
964pour les configurations où le serveur n'a pas de port prédéfini, par exemple
965lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
966le paramètre 'port' suivi du numéro de port devant répondre aux requêtes.
967
willy tarreau64a3cc32005-12-18 01:13:11 +0100968Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
969l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
970SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
971envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
972elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
973local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +0100974
willy tarreau982249e2005-12-18 00:57:06 +0100975Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
976logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
977afin de notifier l'administrateur qu'il faut prendre une action immédiate.
978
willy tarreau0174f312005-12-18 01:02:42 +0100979Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
980même valeur de cookie. C'est particulièrement utile en mode backup, pour
981sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
982oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
983temporairement vers une page d'erreur en attendant le redémarrage d'une
984application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
985le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
986chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
987le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
988pour plus d'informations.
989
willy tarreauc29948c2005-12-17 13:10:27 +0100990Exemples :
991----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100992# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100993 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100994 mode http
995 cookie SERVERID
996 balance roundrobin
997 server web1 192.168.1.1:80 cookie server01 check
998 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100999
willy tarreau2f6ba652005-12-17 13:57:42 +01001000# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001001 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001002 mode http
1003 cookie SERVERID
1004 balance roundrobin
1005 option httpchk
1006 server web1 192.168.1.1:80 cookie server01 check
1007 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +01001008
willy tarreau2f6ba652005-12-17 13:57:42 +01001009# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
1010 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001011 mode http
1012 cookie SERVERID
1013 balance roundrobin
1014 option httpchk /index.html
1015 server web1 192.168.1.1:80 cookie server01 check
1016 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +01001017
willy tarreaueedaa9f2005-12-17 14:08:03 +01001018# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1019 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001020 mode http
1021 cookie SERVERID
1022 balance roundrobin
1023 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1024 server web1 192.168.1.1:80 cookie server01 check
1025 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001026
willy tarreau0174f312005-12-18 01:02:42 +01001027# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1028# douceur utilisant un second port (81) juste pour les health-checks.
1029 listen http_proxy 0.0.0.0:80
1030 mode http
1031 cookie JSESSIONID prefix
1032 balance roundrobin
1033 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1034 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1035 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1036 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1037 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1038
willy tarreau96d40372005-12-17 13:11:56 +01001039# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001040# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1041# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +01001042 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001043 mode http
1044 cookie SERVERID insert nocache indirect
1045 balance roundrobin
1046 server web1 192.168.1.1:80 cookie server01 check
1047 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +01001048
willy tarreaueedaa9f2005-12-17 14:08:03 +01001049# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001050 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001051 mode http
1052 cookie SERVERID insert nocache indirect
1053 balance roundrobin
1054 server web1 192.168.1.1:80 cookie server01 check
1055 server web2 192.168.1.2:80 cookie server02 check
1056 server web-backup 192.168.2.1:80 cookie server03 check backup
1057 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001058
willy tarreaua41a8b42005-12-17 14:02:24 +01001059# relayage SMTP+TLS avec test du serveur et serveur de backup
1060
1061 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001062 mode tcp
1063 balance roundrobin
1064 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1065 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001066
Willy TARREAU3481c462006-03-01 22:37:57 +01001067# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1068 listen http_proxy 0.0.0.0:80
1069 mode http
1070 balance roundrobin
1071 option httpchk
1072 server inst1 192.168.1.1:80 cookie s1 check
1073 server inst2 192.168.1.2:80 cookie s2 check
1074 server inst3 192.168.1.3:80 cookie s3 check
1075 server back1 192.168.1.10:80 check backup
1076 server back2 192.168.1.11:80 check backup
1077 option allbackups # all backups will be used
1078
willy tarreau0f7af912005-12-17 12:21:26 +01001079
willy tarreauc29948c2005-12-17 13:10:27 +010010803.2) Reconnexion vers un répartiteur en cas d'échec direct
1081----------------------------------------------------------
1082En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1083seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1084définitivement privés de service. La spécification du paramètre 'redispatch'
1085autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1086(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001087
1088Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001089---------
willy tarreau0f7af912005-12-17 12:21:26 +01001090 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001091 mode http
1092 cookie SERVERID
1093 dispatch 192.168.1.100:80
1094 server web1 192.168.1.1:80 cookie server01
1095 server web2 192.168.1.2:80 cookie server02
1096 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001097
willy tarreau64a3cc32005-12-18 01:13:11 +01001098Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1099redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1100version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1101identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1102tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1103tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001104
1105 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001106 mode http
1107 option persist
1108 cookie SERVERID
1109 dispatch 192.168.1.100:80
1110 server web1 192.168.1.1:80 cookie server01
1111 server web2 192.168.1.2:80 cookie server02
1112 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001113
willy tarreauc29948c2005-12-17 13:10:27 +01001114
willy tarreau34f45302006-04-15 21:37:14 +020011153.3) Assignation de poids différents à des serveurs
1116---------------------------------------------------
1117Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1118d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1119que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1120soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1121raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1122plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1123plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1124la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1125une vue des serveurs disponibles la plus homogène possible en se basant sur
1126leur poids de sorte que la charge se distribue de la manière la plus lisse
1127possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
1128serveur par rapport aux autres. De cette manière, si un serveur disparait, les
1129capacités restantes sont toujours respectées.
1130
1131
1132Exemple :
1133---------
1134# distribution équitable sur 2 opteron and un ancien pentium3
1135
1136 listen web_appl 0.0.0.0:80
1137 mode http
1138 cookie SERVERID insert nocache indirect
1139 balance roundrobin
1140 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1141 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1142 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1143 server web-backup1 192.168.2.1:80 cookie server04 check backup
1144 server web-excuse 192.168.3.1:80 check backup
1145
1146Notes :
1147-------
1148 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1149
1150 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1151 est plus propre d'utiliser les poids que de répliquer le même serveur
1152 plusieurs fois.
1153
1154 - les poids s'appliquent également aux serveurs de backup si l'option
1155 'allbackups' est positionnée.
1156
1157 - le poids s'applique aussi à la répartition selon la source
1158 ('balance source').
1159
1160 - quels que soient les poids, le premier serveur sera toujours assigné en
1161 premier. Cette règle facilite les diagnostics.
1162
1163 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1164 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1165 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1166
1167
willy tarreauc29948c2005-12-17 13:10:27 +010011684) Fonctionnalités additionnelles
1169=================================
1170
1171D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
1172principalement du mode transparent, de la journalisation des connexions, et de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001173la réécriture des en-têtes.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001174
willy tarreau0174f312005-12-18 01:02:42 +010011754.1) Fonctionnalités réseau
1176---------------------------
11774.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001178---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001179En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1180routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1181pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001182destination de la session détournée. Le système doit permettre de rediriger les
1183paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001184
1185Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001186---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001187 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001188 mode http
1189 transparent
1190 cookie SERVERID
1191 server server01 192.168.1.1:80
1192 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001193
1194 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1195 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001196
willy tarreaua41a8b42005-12-17 14:02:24 +01001197Remarque :
1198----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001199Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1200adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1201d'une même adresse avec une même instance et sans utiliser directement le mode
1202transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001203
1204Exemple :
1205---------
1206 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001207 mode tcp
1208 server server01 192.168.1.1 check port 60000
1209 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001210
1211 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1212 -j REDIRECT --to-ports 65000
1213
willy tarreau0174f312005-12-18 01:02:42 +01001214
12154.1.2) Choix d'une adresse source par serveur
1216---------------------------------------------------
1217Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1218IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1219backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1220pour joindre le même serveur. C'est également utilisable pour faciliter une
1221répartition de charge selon l'adresse IP source pour des connexions sortantes.
1222Bien entendu, la même adresse est utilisée pour les health-checks.
1223
1224Exemple :
1225---------
1226 # utiliser une adresse particulière pour joindre les 2 serveur
1227 listen http_proxy 0.0.0.0:65000
1228 mode http
1229 balance roundrobin
1230 server server01 192.168.1.1:80 source 192.168.2.13
1231 server server02 192.168.1.2:80 source 192.168.2.13
1232
1233Exemple :
1234---------
1235 # utiliser une adresse particulière pour joindre chaque serveur
1236 listen http_proxy 0.0.0.0:65000
1237 mode http
1238 balance roundrobin
1239 server server01 192.168.1.1:80 source 192.168.1.1
1240 server server02 192.168.2.1:80 source 192.168.2.1
1241
1242Exemple :
1243---------
1244 # faire une répartition d'adresse sources pour joindre le même proxy à
1245 # travers deux liens WAN
1246 listen http_proxy 0.0.0.0:65000
1247 mode http
1248 balance roundrobin
1249 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1250 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1251
1252Exemple :
1253---------
1254 # forcer une connexion TCP à s'attacher à un port particulier
1255 listen http_proxy 0.0.0.0:2000
1256 mode tcp
1257 balance roundrobin
1258 server srv1 192.168.1.1:80 source 192.168.2.1:20
1259 server srv2 192.168.1.2:80 source 192.168.2.1:20
1260
willy tarreaub952e1d2005-12-18 01:31:20 +010012614.1.3) Maintien de session TCP (keep-alive)
1262-------------------------------------------
1263Avec la version 1.2.7, il devient possible d'activer le maintien de session
1264TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1265d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1266externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1267aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1268time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1269positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1270vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1271pour activer le maintien de session TCP :
1272
1273 option tcpka # active le keep-alive côté client et côté serveur
1274 option clitcpka # active le keep-alive côté client
1275 option srvtcpka # active le keep-alive côté serveur
1276
willy tarreau0f7af912005-12-17 12:21:26 +01001277
willy tarreauc29948c2005-12-17 13:10:27 +010012784.2) Journalisation des connexions
1279----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001280
1281L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1282Il fournit probablement le plus fin niveau d'information disponible pour un
1283tel outil, ce qui est très important pour les diagnostics en environnements
1284complexes. En standard, les informations journalisées incluent le port client,
1285les chronométrages des états TCP/HTTP, des états de session précis au moment de
1286la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1287trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1288arbitraires.
1289
1290Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1291transparence sur les problèmes rencontrés, à la fois internes et externes, et
1292il est possible d'envoyer les logs vers des serveurs différents en même temps
1293avec des niveaux de filtrage différents :
1294
1295 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1296 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1297 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1298 - activité par instance (connexions clients), aussi bien lors de leur
1299 établissement qu'à leur terminaison.
1300
1301La possibilité de distribuer différents niveaux de logs à différents serveurs
1302permet à plusieurs équipes de production d'intéragir et de corriger leurs
1303problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1304occasionnellement les erreurs système, pendant que l'équipe application
1305surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1306que l'équipe sécurité analyse l'activité en différé d'une heure.
1307
1308
willy tarreauc1cae632005-12-17 14:12:23 +010013094.2.1) Niveaux de log
1310---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001311Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1312détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1313source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001314la requête HTTP, le code de retour, la quantité de données transmises, et même
1315dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1316Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1317la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001318est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001319
willy tarreau8337c6b2005-12-17 13:41:01 +01001320 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1321 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001322ou
1323 log global
1324
1325Remarque :
1326----------
1327La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1328paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001329
1330Exemple :
1331---------
1332 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001333 mode http
1334 log 192.168.2.200 local3
1335 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001336
willy tarreauc1cae632005-12-17 14:12:23 +010013374.2.2) Format des logs
1338----------------------
1339Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1340de la session entre le client et le relais. En précisant l'option 'tcplog',
1341la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1342sur son état lors de la déconnexion, ainsi que le temps de connexion et la
1343durée totale de la session.
1344
willy tarreauc5f73ed2005-12-18 01:26:38 +01001345Exemple de journalisation TCP :
1346-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001347 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001348 mode tcp
1349 option tcplog
1350 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001351
willy tarreauc5f73ed2005-12-18 01:26:38 +01001352>>> haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 -- 1/1
1353
1354 Champ Format / Description Exemple
1355
1356 1 nom_processus '[' pid ']:' haproxy[18989]:
1357 2 ip_client ':' port_client 127.0.0.1:34550
1358 3 '[' date ']' [15/Oct/2003:15:24:28]
1359 4 nom_instance relais-tcp
1360 5 nom_serveur Srv1
1361 6 temps_connect '/' temps_total 0/5007
1362 7 octets lus 0
1363 8 etat_terminaison --
1364 9 conns_instance '/' conns_processus 1/1
willy tarreau982249e2005-12-18 00:57:06 +01001365
willy tarreauc1cae632005-12-17 14:12:23 +01001366Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1367notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1368surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1369les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1370ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1371(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001372
willy tarreauc5f73ed2005-12-18 01:26:38 +01001373Exemple de journalisation HTTP :
1374--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001375 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001376 mode http
1377 option httplog
1378 option dontlognull
1379 log 192.168.2.200 local3
1380
1381>>> haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 9/7/147/723 200 243 - - ---- 3/3 "HEAD / HTTP/1.0"
1382
1383Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001384
willy tarreauc5f73ed2005-12-18 01:26:38 +01001385 haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/11215 503 0 - - SC-- 202/205 {w.ods.org|Mozilla} {} "HEAD / HTTP/1.0"
1386
1387 Champ Format / Description Exemple
1388
1389 1 nom_processus '[' pid ']:' haproxy[18989]:
1390 2 ip_client ':' port_client 10.0.0.1:34552
1391 3 '[' date ']' [15/Oct/2003:15:26:31]
1392 4 nom_instance relais-http
1393 5 nom_serveur Srv1
1394 6 Tq '/' Tc '/' Tr '/' Tt 3183/-1/-1/11215
1395 7 Code_retour_HTTP 503
1396 8 octets lus 0
1397 9 cookies_requête_capturés -
1398 10 cookies_reponse_capturés -
1399 11 etat_terminaison SC--
1400 12 conns_instance '/' conns_processus 202/205
1401 13 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1402 14 '{' entetes_reponse_capturés '}' {}
1403 15 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
1404
1405Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1406 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001407
1408Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1409de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1410Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001411la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1412tôt possible, c'est à dire juste avant que ne débutent les transferts de
1413données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1414de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001415traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1416représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001417
willy tarreau64a3cc32005-12-18 01:13:11 +01001418Afin d'éviter toute confusion avec les logs normaux, le temps total de
1419transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001420rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001421
1422Exemple :
1423---------
1424
1425 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001426 mode http
1427 option httplog
1428 option dontlognull
1429 option logasap
1430 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001431
willy tarreauc5f73ed2005-12-18 01:26:38 +01001432>>> 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 +01001433
1434
willy tarreauc1cae632005-12-17 14:12:23 +010014354.2.3) Chronométrage des événements
1436-----------------------------------
1437Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1438événements sont d'une très grande utilité. Tous les temps sont mesurés en
1439millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
1440la forme Tq/Tc/Tr/Tt :
1441
1442 - Tq: temps total de réception de la requête HTTP de la part du client.
1443 C'est le temps qui s'est écoulé entre le moment où le client a établi
1444 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1445 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1446 que la requête complète n'a jamais été reçue.
1447
1448 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1449 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1450 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1451 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1452 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1453 vers le serveur.
1454
1455 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001456 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001457 la connexion. Ca représente exactement le temps de traitement de la
1458 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001459 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001460
1461 - Tt: durée de vie totale de la session, entre le moment où la demande de
1462 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001463 refermée aux deux extrémités (client et serveur). La signification change
1464 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
1465 uniquement à (Tq + Tc + Tr), et se trouve préfixé d'un signe '+'. On peut
1466 donc déduire Td, le temps de transfert des données, en excluant les autres
1467 temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001468
1469 Td = Tt - (Tq + Tc + Tr)
1470
1471 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1472
1473En mode TCP ('option tcplog'), seuls les deux indicateurs Tc et Tt sont
1474rapportés.
1475
1476Ces temps fournissent de précieux renseignement sur des causes probables de
1477problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1478de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1479de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1480problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1481valeur de time-out dans la configuration, c'est souvent qu'une session a été
1482abandonnée sur expiration d'un time-out.
1483
1484Cas les plus fréquents :
1485
1486 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1487 le client et le relais.
1488 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1489 le relais et le serveur durant la phase de connexion. Cet indicateur
1490 devrait normalement toujours être très bas (moins de quelques dizaines).
1491 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1492 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1493 de pertes entre le relais et le serveur.
1494 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1495 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1496 session est maintenue après la fin des échanges. Voir plus loin pour
1497 savoir comment désactiver le keep-alive HTTP.
1498
1499Autres cas ('xx' représentant une valeur quelconque à ignorer) :
1500 -1/xx/xx/Tt : le client n'a pas envoyé sa requête dans le temps imparti ou
willy tarreauc5f73ed2005-12-18 01:26:38 +01001501 a refermé sa connexion sans compléter la requête.
willy tarreauc1cae632005-12-17 14:12:23 +01001502 Tq/-1/xx/Tt : la connexion n'a pas pu s'établir vers le serveur (refus ou
1503 time-out au bout de Tt-Tq ms).
1504 Tq/Tc/-1/Tt : le serveur a accepté la connexion mais n'a pas répondu dans
willy tarreauc5f73ed2005-12-18 01:26:38 +01001505 les temps ou bien a refermé sa connexion trop tôt, au bout
1506 de Tt-(Tq+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001507
15084.2.4) Conditions de déconnexion
1509--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001510Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1511le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1512un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1513une signification précise :
1514
1515 - sur le premier caractère, un code précisant le premier événement qui a causé
1516 la terminaison de la session :
1517
1518 C : fermeture inattendue de la session TCP de la part du client.
1519
1520 S : fermeture inattendue de la session TCP de la part du serveur, ou
1521 refus explicite de connexion de la part de ce dernier.
1522
1523 P : terminaison prématurée des sessions par le proxy, pour cause
1524 d'imposition d'une limite sur le nombre de connexions, pour cause
1525 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1526 sécurité a détecté et bloqué une anomalie dans la réponse du
1527 serveur qui aurait pu causer une fuite d'informations (par exemple,
1528 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001529
willy tarreauc5f73ed2005-12-18 01:26:38 +01001530 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1531 source, ...). Généralement, cela arrive au cours de l'établissement
1532 d'une connexion, et les logs système doivent contenir une copie de
1533 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001534
willy tarreauc5f73ed2005-12-18 01:26:38 +01001535 I : une erreur interne a été identifiée par le proxy à la suite d'un
1536 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1537 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001538
willy tarreauc5f73ed2005-12-18 01:26:38 +01001539 c : le délai maximal d'attente du client a expiré (clitimeout).
1540
1541 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1542
1543 - : terminaison normale de session.
1544
1545 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1546 la fermeture :
1547
1548 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1549 été transmis au serveur.
1550
1551 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1552 serveur peut au plus avoir vu la tentative de connexion, mais
1553 aucune donnée n'a été échangée.
1554
1555 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1556
1557 D : transfert des DONNEES du serveur vers le client.
1558
1559 L : transfert des dernières ("LAST") données du proxy vers le client,
1560 alors que le serveur a déjà fini.
1561
1562 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001563
1564 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001565 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001566
willy tarreauc5f73ed2005-12-18 01:26:38 +01001567 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1568 cas sur les NOUVELLES connexions clients.
1569
1570 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1571 serveur connu. Ceci peut être dû à un changement de configuration
1572 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1573 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001574
willy tarreauc5f73ed2005-12-18 01:26:38 +01001575 D : le client a présenté un cookie correspondant à un serveur hors
1576 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1577 un autre serveur ou a tout de même tenté de se connecter sur celui
1578 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001579
willy tarreauc5f73ed2005-12-18 01:26:38 +01001580 V : le client a présenté un cookie VALIDE et a pu se connecter au
1581 serveur correspondant.
1582
1583 - : non appliquable (pas de cookie positionné dans la configuration).
1584
1585 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1586 persistence retrourné par le serveur (uniquement en mode HTTP) :
1587
1588 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1589 n'a été inséré.
1590
1591 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1592 proxy en a INSERE un.
1593
willy tarreau197e8ec2005-12-17 14:10:59 +01001594 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001595 tel quel ("PASSIF").
1596
1597 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1598
1599 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1600 ne pas être retourné au client.
1601
1602 - : non appliquable
1603
1604
1605La combinaison des deux premiers indicateurs fournit une grande quantitié
1606d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1607peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1608des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001609
willy tarreauc5f73ed2005-12-18 01:26:38 +01001610Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1611
1612 Indic Raison
1613 CR Le client a abandonné avant d'émettre une requête complète. Il est
1614 très probable que la requête ait été tapée à la main dans un client
1615 telnet et abortée trop tôt.
1616
1617 cR Le temps imparti au client a expiré avant réception d'une requête
1618 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1619 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1620 transporter des paquets entiers, ou par des clients qui énvoient des
1621 requêtes à la main et ne tapent pas assez vite.
1622
1623 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1624 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1625 être la couche réseau qui indique au proxy que le serveur n'est pas
1626 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1627
1628 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1629
1630 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1631 nombre de connexions a atteint la limite 'maxconn' (global ou de
1632 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1633 augmenté, tout comme le paramètre 'maxconn' global.
1634
1635 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1636 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1637 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1638 consiste à affiner le paramétrage système.
1639
1640 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1641 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1642 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1643 paquets entiers.
1644
1645 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
1646 en-têtes. En général, cela indique qu'il a crashé.
1647
1648 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
1649 des transactions trop longues, probablement causées par un back-end
1650 saturé. Les seules solutions sont de corriger le problème sur
1651 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
1652 des attentes plus longues au risque que les clients abandonnent à
1653 leur tour, ou bien d'ajouter des serveurs.
1654
1655 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
1656 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
1657 soit à cause d'une requête validant un filtre d'interdiction, auquel
1658 cas le proxy a renvoyé une erreur HTTP 403.
1659
1660 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
1661 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
1662 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
1663 renvoyée au client.
1664
1665 cD Le client n'a pas lu de données pendant le temps qui lui était
1666 imparti. Ceci est souvent causé par des problèmes réseau côté client.
1667
1668 CD Le client a aborté sa connection de manière inattendue pendant le
1669 transfert des données. Ceci est provoqué soit par le crash d'un
1670 navigateur, ou par une session en HTTP keep-alive entre le serveur
1671 et le client terminée en premier par le client.
1672
1673 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
1674 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
1675 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
1676 situés entre le proxy et le serveur.
1677
16784.2.5) Caractères non-imprimables
1679---------------------------------
1680Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
1681tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
1682hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
1683dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
1684caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
1685est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
1686les en-têtes.
1687
16884.2.6) Capture d'en-têtes HTTP et de cookies
1689--------------------------------------------
1690La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
1691capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
1692
1693Les captures de cookies facilitent le suivi et la reconstitution d'une session
1694utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01001695
1696 capture cookie <préfixe_cookie> len <longueur_capture>
1697
willy tarreauc5f73ed2005-12-18 01:26:38 +01001698Ceci activera la capture de cookies à la fois dans les requêtes et dans les
1699réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
1700bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
1701nouveau cookie.
1702
willy tarreau8337c6b2005-12-17 13:41:01 +01001703Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1704transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1705caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1706le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
1707place dans les logs.
1708
1709Exemples :
1710----------
1711 # capture du premier cookie dont le nom commence par "ASPSESSION"
1712 capture cookie ASPSESSION len 32
1713
1714 # capture du premier cookie dont le nom est exactement "vgnvisitor"
1715 capture cookie vgnvisitor= len 32
1716
willy tarreau036e1ce2005-12-17 13:46:33 +01001717Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01001718positionné par le serveur, précédé du cookie positionné par le client. Chacun
1719de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01001720par le client ou le serveur, ou lorsque l'option est désactivée..
1721
1722Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
1723pour suivre un identifiant de requête globalement unique positionné par un
1724autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
1725de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
1726peut chercher des informations relatives à la longueur annoncée de la réponse,
1727le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
1728de redirection. Tout comme pour les captures de cookies, il est possible
1729d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
1730la suivante :
1731
1732 capture request header <nom> len <longueur max>
1733 capture response header <nom> len <longueur max>
1734
1735Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01001736
willy tarreauc5f73ed2005-12-18 01:26:38 +01001737Exemples:
1738---------
1739 # conserver le nom du serveur virtuel accédé par le client
1740 capture request header Host len 20
1741 # noter la longueur des données envoyées dans un POST
1742 capture request header Content-Length len 10
1743
1744 # noter le fonctionnement attendu du cache par le serveur
1745 capture response header Cache-Control len 8
1746 # noter l'URL de redirection
1747 capture response header Location len 20
1748
1749Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
1750fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
1751regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
1752chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
1753réponse sont présentés de la même manière, mais après un espace suivant le bloc
1754d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
1755
1756 Config:
1757
1758 capture request header Host len 20
1759 capture request header Content-Length len 10
1760 capture request header Referer len 20
1761 capture response header Server len 20
1762 capture response header Content-Length len 10
1763 capture response header Cache-Control len 8
1764 capture response header Via len 20
1765 capture response header Location len 20
1766
1767 Log :
1768
1769 Aug 9 20:26:09 localhost haproxy[2022]: 127.0.0.1:34014 [09/Aug/2004:20:26:09] relais-http netcache 0/0/162/+162 200 +350 - - ---- {fr.adserver.yahoo.co||http://fr.f416.mail.} {|864|private||} "GET http://fr.adserver.yahoo.com/"
1770 Aug 9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34020 [09/Aug/2004:20:30:46] relais-http netcache 0/0/182/+182 200 +279 - - ---- {w.ods.org||} {Formilux/0.1.8|3495|||} "GET http://w.ods.org/sytadin.html HTTP/1.1"
1771 Aug 9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34028 [09/Aug/2004:20:30:46] relais-http netcache 0/2/126/+128 200 +223 - - ---- {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"
1772
17734.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01001774-----------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001775- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/7/147/6723 200 243 - - ---- 3/5 "HEAD / HTTP/1.0"
willy tarreauc1cae632005-12-17 14:12:23 +01001776 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
1777 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01001778
willy tarreauc5f73ed2005-12-18 01:26:38 +01001779- 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 +01001780 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
1781 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 +01001782 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 +01001783 total entre l'accept() et le premier octet de donnée est de 30 ms.
1784
willy tarreauc5f73ed2005-12-18 01:26:38 +01001785- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/7/14/30 502 243 - - PH-- 2/3 "GET /cgi-bin/bug.cgi? HTTP/1.0"
willy tarreau982249e2005-12-18 00:57:06 +01001786 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
1787 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
1788 d'informations risquant d'être cachées. Dans ce cas, la réponse est
1789 remplacée par '502 bad gateway'.
1790
willy tarreauc5f73ed2005-12-18 01:26:38 +01001791- haproxy[18113]: 127.0.0.1:34548 [15/Oct/2003:15:18:55] relais-http <NOSRV> -1/-1/-1/8490 -1 0 - - CR-- 2/2 ""
willy tarreauc1cae632005-12-17 14:12:23 +01001792 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01001793 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01001794 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01001795
willy tarreauc5f73ed2005-12-18 01:26:38 +01001796- haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06] relais-http <NOSRV> -1/-1/-1/50001 408 0 - - cR-- 2/2 ""
willy tarreauc1cae632005-12-17 14:12:23 +01001797 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01001798 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01001799 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
1800 pu renvoyer un message 408 au client.
1801
willy tarreauc5f73ed2005-12-18 01:26:38 +01001802- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
1803 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
1804 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01001805
willy tarreauc5f73ed2005-12-18 01:26:38 +01001806- haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/11215 503 0 - - SC-- 202/205 "HEAD / HTTP/1.0"
willy tarreauc1cae632005-12-17 14:12:23 +01001807 => La requête client met 3s à entrer (peut-être un problème réseau), et la
1808 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreauc5f73ed2005-12-18 01:26:38 +01001809 secondes (retries 3 dans la conf), puis un code 503 est retourné au client.
1810 Il y avait 202 connexions sur cette instance, et 205 sur l'ensemble des
1811 instances pour ce processus. Il est possible que le serveur ait refusé la
1812 connexion parce qu'il y en avait déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01001813
willy tarreau4302f492005-12-18 01:00:37 +01001814
willy tarreauc5f73ed2005-12-18 01:26:38 +010018154.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01001816----------------------------------
1817En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
1818requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01001819possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
1820de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01001821connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
1822comme faisant partie des échanges de données consécutifs à la première requête.
1823Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01001824
1825La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01001826 reqadd <string> pour ajouter un en-tête dans la requête
1827 reqrep <search> <replace> pour modifier la requête
1828 reqirep <search> <replace> idem sans distinction majuscules/minuscules
1829 reqdel <search> pour supprimer un en-tête dans la requête
1830 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001831 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01001832 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001833 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01001834 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001835 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01001836 reqipass <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001837
willy tarreau036e1ce2005-12-17 13:46:33 +01001838 rspadd <string> pour ajouter un en-tête dans la réponse
1839 rsprep <search> <replace> pour modifier la réponse
1840 rspirep <search> <replace> idem sans distinction majuscules/minuscules
1841 rspdel <search> pour supprimer un en-tête dans la réponse
1842 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01001843 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01001844 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01001845 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001846
willy tarreau0f7af912005-12-17 12:21:26 +01001847
willy tarreau036e1ce2005-12-17 13:46:33 +01001848<search> est une expression régulière compatible POSIX regexp supportant le
1849groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
1850doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
1851chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
1852backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01001853
1854 \t pour une tabulation
1855 \r pour un retour charriot
1856 \n pour un saut de ligne
1857 \ pour différencier un espace d'un séparateur
1858 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01001859 \\ pour utiliser un backslash dans la regex
1860 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01001861 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01001862
willy tarreau0f7af912005-12-17 12:21:26 +01001863
willy tarreau5cbea6f2005-12-17 12:48:26 +01001864<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
1865Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
1866groupe délimité par des parenthèses dans l'expression régulière, par sa
1867position numérale. Les positions vont de 1 à 9, et sont codées par un '\'
1868suivi du chiffre désiré. Il est également possible d'insérer un caractère non
1869imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code
1870hexadécimal de ce caractère (comme en C).
1871
1872<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01001873dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001874
1875Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01001876-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001877 - 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 +01001878 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001879 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
1880 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
1881 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01001882 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
1883 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
1884 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01001885 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01001886 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
1887 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
willy tarreau0f7af912005-12-17 12:21:26 +01001888
1889Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01001890----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001891 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01001892
willy tarreauc5f73ed2005-12-18 01:26:38 +01001893 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
1894 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
1895 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001896
willy tarreauc5f73ed2005-12-18 01:26:38 +01001897 # force proxy connections to close
1898 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
1899 # rewrite locations
1900 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001901
willy tarreauc5f73ed2005-12-18 01:26:38 +01001902 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01001903
willy tarreau197e8ec2005-12-17 14:10:59 +01001904 # Every header should end with a colon followed by one space.
1905 reqideny ^[^:\ ]*[\ ]*$
1906
1907 # block Apache chunk exploit
1908 reqideny ^Transfer-Encoding:[\ ]*chunked
1909 reqideny ^Host:\ apache-
1910
1911 # block annoying worms that fill the logs...
1912 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
1913 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
1914 reqideny ^[^:\ ]*\ .*<script
1915 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
1916
1917 # allow other syntactically valid requests, and block any other method
1918 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
1919 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
1920 reqideny ^[^:\ ]*\
1921
1922 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01001923 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01001924
willy tarreauc5f73ed2005-12-18 01:26:38 +01001925 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01001926 rspidel ^Server:\
1927 rspadd Server:\ Formilux/0.1.8
1928
willy tarreau0f7af912005-12-17 12:21:26 +01001929
willy tarreau982249e2005-12-18 00:57:06 +01001930De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01001931'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
1932connaître l'adresse IP du client initial.
1933
willy tarreau982249e2005-12-18 00:57:06 +01001934Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01001935en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01001936Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
1937méthode impliquant 4 règles.
1938
willy tarreauc1cae632005-12-17 14:12:23 +01001939Exemple :
1940---------
1941 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001942 mode http
1943 log global
1944 option httplog
1945 option dontlognull
1946 option forwardfor
1947 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01001948
Willy TARREAU767ba712006-03-01 22:40:50 +01001949Notons que certains serveurs HTTP ne referment pas nécessairement la session
1950TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
1951ce qui se traduit par des grands nombres de sessions établies et des temps
1952globaux très longs sur les requêtes. Pour contourner ce problème, la version
19531.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
1954vers le serveur dès qu'il commence à répondre et seulement si le tampon de
1955requête est vide. Attention toutefois à ne PAS utiliser cette option si des
1956méthodes CONNECT sont attendues entre le client et le serveur. L'option
1957'forceclose' implique l'option 'httpclose'.
1958
1959Exemple :
1960---------
1961 listen http_proxy 0.0.0.0:80
1962 mode http
1963 log global
1964 option httplog
1965 option dontlognull
1966 option forwardfor
1967 option forceclose
1968
1969
willy tarreauc29948c2005-12-17 13:10:27 +010019704.4) Répartition avec persistence
1971---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001972La combinaison de l'insertion de cookie avec la répartition de charge interne
1973permet d'assurer une persistence dans les sessions HTTP d'une manière
1974pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01001975 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01001976 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01001977 - insérer un cookie dans les réponses issues d'une répartition uniquement,
1978 et faire en sorte que des caches ne mémorisent pas ce cookie.
1979 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001980
1981Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01001982---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001983 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001984 mode http
1985 cookie SERVERID insert nocache indirect
1986 balance roundrobin
1987 server srv1 192.168.1.1:80 cookie server01 check
1988 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01001989
willy tarreau0174f312005-12-18 01:02:42 +01001990L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
1991cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
1992Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
1993client et le serveur de travailler en mode "keep-alive" afin que le proxy
1994puisse corriger le nom du cookie dans toutes les futures requêtes.
1995
1996 listen application 0.0.0.0:80
1997 mode http
1998 cookie JSESSIONID prefix
1999 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002000 server srv1 192.168.1.1:80 cookie srv1 check
2001 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002002 option httpclose
2003
2004
willy tarreau982249e2005-12-18 00:57:06 +010020054.5) Protection contre les fuites d'informations du serveur
2006-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002007Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002008créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002009'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2010un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2011activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002012 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002013 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002014 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002015 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002016 un en-tête 'Cache-control: public' ;
2017 - celles qui ont un en-tête 'Pragma: no-cache' ;
2018 - celles qui ont un en-tête 'Cache-control: private' ;
2019 - celles qui ont un en-tête 'Cache-control: no-store' ;
2020 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2021 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2022 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2023 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2024 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002025 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002026
willy tarreau982249e2005-12-18 00:57:06 +01002027Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2028même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2029message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2030dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002031en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002032l'administrateur sache qu'il y a une action correctrice à entreprendre.
2033
20344.6) Personalisation des erreurs
2035--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002036Certaines situations conduisent à retourner une erreur HTTP au client :
2037 - requête invalide ou trop longue => code HTTP 400
2038 - requête mettant trop de temps à venir => code HTTP 408
2039 - requête interdite (bloquée par un reqideny) => code HTTP 403
2040 - erreur interne du proxy => code HTTP 500
2041 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2042 - aucun serveur disponible pour cette requête => code HTTP 503
2043 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2044
2045Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2046Cependant, en fonction du type de clientèle, on peut préférer retourner des
willy tarreau64a3cc32005-12-18 01:13:11 +01002047pages personnalisées. Ceci est possible par le biais de la commande "errorloc":
willy tarreau8337c6b2005-12-17 13:41:01 +01002048
2049 errorloc <code_HTTP> <location>
2050
2051Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2052le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2053d'une page précisée dans <location>. Cette adresse peut être relative au site,
2054ou absolue. Comme cette réponse est traîtée par le navigateur du client
2055lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2056
2057Exemple :
2058---------
2059 listen application 0.0.0.0:80
2060 errorloc 400 /badrequest.html
2061 errorloc 403 /forbidden.html
2062 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002063 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002064 errorloc 502 http://192.168.114.58/error50x.html
2065 errorloc 503 http://192.168.114.58/error50x.html
2066 errorloc 504 http://192.168.114.58/error50x.html
2067
willy tarreauc1f47532005-12-18 01:08:26 +01002068Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2069accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2070problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2071régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2072dans le champ Location avec la méthode GET uniquement. Seulement, certains
2073navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2074plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2075devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002076l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2077visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002078
2079Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2080utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2081dès que vous savez que vos clients supportent le code de retour HTTP 303.
2082
willy tarreau982249e2005-12-18 00:57:06 +010020834.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002084--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002085Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2086évite de répéter des paramètres communs à toutes les instances, tels que les
2087timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002088
2089Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2090précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2091'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2092section implique une annulation de tous les paramètres par défaut positionnés
2093précédemment, dans le but de les remplacer.
2094
2095La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2096paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2097un commentaire en guise paramètre.
2098
willy tarreau982249e2005-12-18 00:57:06 +01002099Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2100positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002101 - log (le premier et le second)
2102 - mode { tcp, http, health }
2103 - balance { roundrobin }
2104 - disabled (pour désactiver toutes les instances qui suivent)
2105 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2106 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002107 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2108 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002109 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002110 - cookie, capture
2111 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002112
2113Ne sont pas supportés dans cette version, les adresses de dispatch et les
2114configurations de serveurs, ainsi que tous les filtres basés sur les
2115expressions régulières :
2116 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002117 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002118
2119Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2120positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2121défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2122paramètres par défaut avant la déclaration de l'instance.
2123
2124Exemples :
2125----------
2126 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002127 log global
2128 mode tcp
2129 balance roundrobin
2130 clitimeout 180000
2131 srvtimeout 180000
2132 contimeout 4000
2133 retries 3
2134 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002135
2136 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002137 server srv1 192.168.1.1 check port 6000 inter 10000
2138 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002139
2140 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002141 server srv1 192.168.2.1 check port 6000 inter 10000
2142 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002143
2144 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002145 log global
2146 mode http
2147 option httplog
2148 option forwardfor
2149 option dontlognull
2150 balance roundrobin
2151 clitimeout 20000
2152 srvtimeout 20000
2153 contimeout 4000
2154 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002155
2156 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002157 cookie SERVERID postonly insert indirect
2158 capture cookie userid= len 10
2159 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2160 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002161
2162 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002163 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002164
willy tarreaub719f002005-12-17 12:55:07 +01002165=======================
2166| Paramétrage système |
2167=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002168
2169Sous Linux 2.4
2170==============
2171
willy tarreaub719f002005-12-17 12:55:07 +01002172-- cut here --
2173#!/bin/sh
2174# set this to about 256/4M (16384 for 256M machine)
2175MAXFILES=16384
2176echo $MAXFILES > /proc/sys/fs/file-max
2177ulimit -n $MAXFILES
2178
2179if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002180 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002181fi
2182
2183if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002184 # 30 seconds for fin, 15 for time wait
2185 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2186 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2187 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2188 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002189fi
2190
willy tarreau0f7af912005-12-17 12:21:26 +01002191echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002192echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2193echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002194echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002195echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2196echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002197echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2198echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002199echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002200echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002201echo 0 > /proc/sys/net/ipv4/tcp_dsack
2202
2203# auto-tuned on 2.4
2204#echo 262143 > /proc/sys/net/core/rmem_max
2205#echo 262143 > /proc/sys/net/core/rmem_default
2206
2207echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2208echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2209
2210-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002211
willy tarreau197e8ec2005-12-17 14:10:59 +01002212Sous FreeBSD
2213============
2214
2215Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2216Clement Laforet <sheepkiller@cultdeadsheep.org>.
2217
2218Pour plus d'informations :
2219http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2220http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2221http://www.freshports.org/net/haproxy
2222
2223
willy tarreau0f7af912005-12-17 12:21:26 +01002224-- fin --