blob: e10595f630e1507f6b39f1c873bae18ac2246c32 [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 tarreau532bb552006-05-13 18:40:37 +02005 version 1.2.13
willy tarreauc5f73ed2005-12-18 01:26:38 +01006 willy tarreau
willy tarreau532bb552006-05-13 18:40:37 +02007 2006/05/13
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 tarreau532bb552006-05-13 18:40:37 +020024 - maintenir des clients sur le bon serveur serveur d'application en fonction
25 de cookies applicatifs.
willy tarreau0f7af912005-12-17 12:21:26 +010026
willy tarreau64a3cc32005-12-18 01:13:11 +010027Il requiert peu de ressources, et son architecture événementielle mono-
28processus lui permet facilement de gérer plusieurs milliers de connexions
29simultanées sur plusieurs relais sans effondrer le système.
willy tarreaua1598082005-12-17 13:08:06 +010030
willy tarreau0f7af912005-12-17 12:21:26 +010031
32===========================
33| Paramètres de lancement |
34===========================
35
36Les options de lancement sont peu nombreuses :
37
38 -f <fichier de configuration>
39 -n <nombre maximal total de connexions simultanées>
willy tarreau532bb552006-05-13 18:40:37 +020040 = 'maxconn' dans la section 'global'
41 -N <nombre maximal de connexions simultanées par instance>
42 = 'maxconn' dans les sections 'listen' ou 'default'
willy tarreau0f7af912005-12-17 12:21:26 +010043 -d active le mode debug
44 -D passe en daemon
willy tarreau982249e2005-12-18 00:57:06 +010045 -q désactive l'affichage de messages sur la sortie standard.
46 -V affiche les messages sur la sortie standard, même si -q ou 'quiet' sont
47 spécifiés.
48 -c vérifie le fichier de configuration puis quitte avec un code de retour 0
49 si aucune erreur n'a été trouvée, ou 1 si une erreur de syntaxe a été
50 détectée.
willy tarreaufe2c5c12005-12-17 14:14:34 +010051 -p <fichier> indique au processus père qu'il doit écrire les PIDs de ses
52 fils dans ce fichier en mode démon.
willy tarreau34f45302006-04-15 21:37:14 +020053 -sf specifie une liste de PIDs auxquels envoyer un signal FINISH
54 -st specifie une liste de PIDs auxquels envoyer un signal TERMINATE
willy tarreau0f7af912005-12-17 12:21:26 +010055 -s affiche les statistiques (si option compilée)
56 -l ajoute des informations aux statistiques
willy tarreau64a3cc32005-12-18 01:13:11 +010057 -de désactive l'utilisation de epoll()
58 -dp désactive l'utilisation de poll()
willy tarreau34f45302006-04-15 21:37:14 +020059 -db désactive la mise en arrière-plan (utile pour débugger)
60 -m <megs> applique une limitation de <megs> Mo d'utilisation mémoire
willy tarreau0f7af912005-12-17 12:21:26 +010061
willy tarreau64a3cc32005-12-18 01:13:11 +010062Le nombre maximal de connexion simultanées par proxy est le paramètre par
63défaut pour les proxies pour lesquels ce paramètre n'est pas précisé dans le
64fichier de configuration. Il s'agit du paramètre 'maxconn' dans les sections
65'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010066
willy tarreau64a3cc32005-12-18 01:13:11 +010067Le nombre maximal total de connexions simultanées limite le nombre de
68connexions TCP utilisables à un instant donné par le processus, tous proxies
69confondus. Ce paramètre remplace le paramètre 'maxconn' de la section 'global'.
willy tarreaua1598082005-12-17 13:08:06 +010070
willy tarreauc29948c2005-12-17 13:10:27 +010071Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
willy tarreauc5f73ed2005-12-18 01:26:38 +010072mode, toutes les connexions, déconnexions, et tous les échanges d'en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +010073sont affichés.
74
willy tarreau34f45302006-04-15 21:37:14 +020075Pour debugger, l'option '-db' est très pratique car elle désactive
76temporairement le mode daemon et le mode multi-processus. Le service peut alors
77être arrêté par un simple appui sur Ctrl-C, sans avoir à modifier la
78configuration ni à activer le mode debug complet.
79
willy tarreauc29948c2005-12-17 13:10:27 +010080Les statistiques ne sont disponibles que si le programme a été compilé avec
81l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
82d'utilité que lors de benchmarks par exemple.
83
willy tarreau532bb552006-05-13 18:40:37 +020084Les paramètres '-st' et '-sf' sont utilisés pour la reconfiguration à chaud.
85Voir la section à ce sujet.
willy tarreau0f7af912005-12-17 12:21:26 +010086
87============================
88| Fichier de configuration |
89============================
90
willy tarreauc29948c2005-12-17 13:10:27 +010091Structure
92=========
willy tarreau0f7af912005-12-17 12:21:26 +010093
willy tarreaua1598082005-12-17 13:08:06 +010094L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
willy tarreau64a3cc32005-12-18 01:13:11 +010095les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est
96pas précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +010097
98Le fichier de configuration est découpé en sections répérées par des mots clés
99tels que :
100
101 - 'global'
102 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +0100103 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +0100104
105Tous les paramètres font référence à la section définie par le dernier mot clé
106reconnu.
107
108
willy tarreauc29948c2005-12-17 13:10:27 +01001091) Paramètres globaux
110=====================
willy tarreaua1598082005-12-17 13:08:06 +0100111
112Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
113proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
114supportés sont :
115
willy tarreau8337c6b2005-12-17 13:41:01 +0100116 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100117 - maxconn <nombre>
118 - uid <identifiant>
119 - gid <identifiant>
120 - chroot <répertoire>
121 - nbproc <nombre>
122 - daemon
123 - debug
willy tarreau64a3cc32005-12-18 01:13:11 +0100124 - noepoll
125 - nopoll
willy tarreaua1598082005-12-17 13:08:06 +0100126 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100127 - pidfile <fichier>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100128 - ulimit-n <nombre>
129
willy tarreaua1598082005-12-17 13:08:06 +0100130
1311.1) Journalisation des événements
132----------------------------------
133La plupart des événements sont journalisés : démarrages, arrêts, disparition et
134apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
135syslog vers un ou deux serveurs. La syntaxe est la suivante :
136
willy tarreau8337c6b2005-12-17 13:41:01 +0100137 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100138
139Les connexions sont envoyées en niveau "info". Les démarrages de service et de
140serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
141arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau64a3cc32005-12-18 01:13:11 +0100142bien pour les proxies que pour les serveurs testés par les proxies. Le
143paramètre optionnel <niveau_max> définit le niveau maximal de traces émises
144parmi les 8 valeurs suivantes :
willy tarreau8337c6b2005-12-17 13:41:01 +0100145 emerg, alert, crit, err, warning, notice, info, debug
146
willy tarreaueedaa9f2005-12-17 14:08:03 +0100147Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100148est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100149
150Les catégories possibles sont :
151 kern, user, mail, daemon, auth, syslog, lpr, news,
152 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
153 local0, local1, local2, local3, local4, local5, local6, local7
154
willy tarreau036e1ce2005-12-17 13:46:33 +0100155Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
156
willy tarreaua1598082005-12-17 13:08:06 +0100157Exemple :
158---------
159 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100160 log 192.168.2.200 local3
161 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100162
1631.2) limitation du nombre de connexions
164---------------------------------------
165Il est possible et conseillé de limiter le nombre global de connexions par
willy tarreauc5f73ed2005-12-18 01:26:38 +0100166processus à l'aide du mot clé global 'maxconn'. Les connexions sont comprises
167au sens 'acceptation de connexion', donc il faut s'attendre en règle général à
168avoir un peu plus du double de sessions TCP que le maximum de connexions fixé.
169C'est important pour fixer le paramètre 'ulimit -n' avant de lancer le proxy.
170Pour comptabiliser le nombre de sockets nécessaires, il faut prendre en compte
171ces paramètres :
172
willy tarreaua1598082005-12-17 13:08:06 +0100173 - 1 socket par connexion entrante
174 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100175 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100176 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100177 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100178
willy tarreau64a3cc32005-12-18 01:13:11 +0100179Dans le cas où chaque proxy n'écoute que sur un couple adresse/port,
willy tarreauc5f73ed2005-12-18 01:26:38 +0100180positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
181(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
182il est possible de spécifier cette limite dans la configuration à l'aide du
183mot-clé global 'ulimit-n', à condition bien entendu que le proxy ait été
184démarré sous le compte root (ou avec des droits suffisants pour élever le
185nombre de descripteurs de fichiers). Cette solution met un terme au problème
186récurrent d'incertitude de l'adéquation entre les limites systèmes lors de la
187dernière relance du proxessus et les limites en nombre de connexions. Noter que
188cette limite s'applique par processus.
189
190Exemple :
191---------
192 global
193 maxconn 32000
194 ulimit-n 65536
195
willy tarreauc29948c2005-12-17 13:10:27 +0100196
1971.3) Diminution des privilèges
198------------------------------
199Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
200serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100201de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100202
willy tarreauc29948c2005-12-17 13:10:27 +0100203Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
204numérique d'utilisateur. La valeur 0, correspondant normalement au super-
205utilisateur, possède ici une signification particulière car elle indique que
206l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
207C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
208un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
209changer. Il est particulièrement déconseillé d'utiliser des comptes génériques
210tels que 'nobody' car cette pratique revient à utiliser 'root' si d'autres
211processus utilisent les mêmes identifiants.
212
213Le paramètre 'chroot' autorise à changer la racine du processus une fois le
214programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100215puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100216généralement contournable sur certains OS (Linux, Solaris) pour peu que
217l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
218un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
219service pour cet usage, et de ne pas mutualiser un même répertoire pour
220plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
221il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
222l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100223
willy tarreau64a3cc32005-12-18 01:13:11 +0100224Remarque importante :
225---------------------
226Dans le cas où une telle faille serait mise en évidence, il est fort probable
227que les premières tentatives de son exploitation provoquent un arrêt du
willy tarreauc29948c2005-12-17 13:10:27 +0100228programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
willy tarreau64a3cc32005-12-18 01:13:11 +0100229encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur
230en environnement limité réduit les risques d'intrusion, il est parfois bien
231utile dans ces circonstances de connaître les conditions d'apparition du
232problème, via l'obtention d'un fichier 'core'. La plupart des systèmes, pour
233des raisons de sécurité, désactivent la génération du fichier 'core' après un
234changement d'identifiant pour le processus. Il faudra donc soit lancer le
235processus à partir d'un compte utilisateur aux droits réduits (mais ne pouvant
236pas effectuer le chroot), ou bien le faire en root sans réduction des droits
237(uid 0). Dans ce cas, le fichier se trouvera soit dans le répertoire de
238lancement, soit dans le répertoire spécifié après l'option 'chroot'. Ne pas
239oublier la commande suivante pour autoriser la génération du fichier avant de
240lancer le programme :
willy tarreauc29948c2005-12-17 13:10:27 +0100241
242# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100243
willy tarreauc29948c2005-12-17 13:10:27 +0100244Exemple :
245---------
246
247 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100248 uid 30000
249 gid 30000
250 chroot /var/chroot/haproxy
willy tarreauc29948c2005-12-17 13:10:27 +0100251
willy tarreaufe2c5c12005-12-17 14:14:34 +01002521.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100253----------------------------
254Le service peut fonctionner dans plusieurs modes :
255 - avant- / arrière-plan
256 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100257
willy tarreau64a3cc32005-12-18 01:13:11 +0100258Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne
259rend pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci
260dans un script de démarrage du système, sinon le système ne finirait pas son
willy tarreauc29948c2005-12-17 13:10:27 +0100261initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
262au processus appelant. C'est ce que fait l'option 'daemon' de la section
263'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100264
willy tarreau34f45302006-04-15 21:37:14 +0200265Le paramètre de ligne de commande '-db' inhibe les options globales 'daemon'
266et 'nbproc' pour faire fonctionner le processus en mode normal, avant-plan.
267
willy tarreauc29948c2005-12-17 13:10:27 +0100268Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
269standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
270logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
271Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100272
willy tarreauc29948c2005-12-17 13:10:27 +0100273Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
274problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
275entre les clients et les serveurs. Ce mode est incompatible avec les options
276'daemon' et 'quiet' pour des raisons de bon sens.
277
willy tarreaufe2c5c12005-12-17 14:14:34 +01002781.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100279-----------------------------------------------
280Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
281processeur pour effectuer les tâches de relayage, même si les charges
282nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
283grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
284programme sait démarrer plusieurs processus se répartissant la charge de
285travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
286section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100287qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
288la limite de nombre de descripteurs de fichiers allouée par processus sous
289Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100290
291Exemple :
292---------
293
294 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100295 daemon
296 quiet
297 nbproc 2
willy tarreauc29948c2005-12-17 13:10:27 +0100298
willy tarreaufe2c5c12005-12-17 14:14:34 +01002991.6) Simplification de la gestion des processus
300-----------------------------------------------
301Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
302paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
303d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
304le numéro de PID des processus fils, à raison d'un par ligne (valable
305uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
306afin de rester compatible avec un répertoire protégé en lecture seule. Il
307appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
3080644.
309
310Exemple :
311---------
312
313 global
314 daemon
315 quiet
316 nbproc 2
317 pidfile /var/run/haproxy-private.pid
318
319 # pour stopper seulement ces processus parmi d'autres :
320 # kill $(</var/run/haproxy-private.pid)
321
willy tarreau34f45302006-04-15 21:37:14 +0200322 # pour recharger une configuration avec un impact minimal sur le service,
323 # et sans casser les sessions existantes :
324 # haproxy -f haproxy.cfg -p $(</var/run/haproxy-private.pid) -st $(</var/run/haproxy-private.pid)
willy tarreauc29948c2005-12-17 13:10:27 +0100325
willy tarreau64a3cc32005-12-18 01:13:11 +01003261.7) Mécanismes de traitements des événements
327---------------------------------------------
328A partir de la version 1.2.5, haproxy supporte les mécanismes poll() et
329epoll(). Sur les systems où select() est limité par FD_SETSIZE (comme Solaris),
330poll() peut être une alternative intéressante. Des tests de performance
331montrent que les performances de poll() ne décroissent pas aussi vite que le
332nombre de sockets augmente, ce qui en fait une solution sûre pour les fortes
333charges. Cela dit, Soalris utilise déjà poll() pour émuler select(), donc tant
334que le nombre de sockets ne dépasse pas FD_SETSIZE, poll() ne devrait pas
335apporter de performances supplémentaires. Sur les systèmes à base Linux
336incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
337qui est extrèmement rapide indépendamment du nombre de sockets. Les tests sur
338haproxy ont montré une performance constante de 1 à 40000 sessions simultanées.
339
340Haproxy utilisera epoll() lorsqu'il est disponible, et se repliera sur poll(),
341puis en dernier lieu sur select(). Cependant, si pour une raison quelconque il
342s'avérait nécessaire de désactiver epoll() ou poll() (p.ex: à cause d'un bug ou
343juste pour comparer les performances), deux nouvelles options globales ont été
344ajoutées dans ce but : 'noepoll' et 'nopoll'.
345
346Exemple :
347---------
348 global
349 # utiliser seulement select()
350 noepoll
351 nopoll
352
353Remarque :
354----------
355Dans le but d'assurer une portabilité maximale des configurations, ces options
356sont acceptées et ignorées si les mécanismes poll() ou epoll() n'ont pas été
357activés lors de la compilation.
358
359Afin de simplifier la résolution de problèmes, le paramètre '-de' en ligne de
360commande désactive epoll() et le paramètre '-dp' désactive poll(). Ils sont
361respectivement équivalents à 'noepoll' et 'nopoll'.
362
363
willy tarreauc29948c2005-12-17 13:10:27 +01003642) Définition d'un service en écoute
365====================================
366
367Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100368
willy tarreaua41a8b42005-12-17 14:02:24 +0100369 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100370
willy tarreauc29948c2005-12-17 13:10:27 +0100371- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
willy tarreau64a3cc32005-12-18 01:13:11 +0100372 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé.
373 Aucun test n'est effectué concernant l'unicité de ce nom, qui n'est pas
374 obligatoire, mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100375
willy tarreaua41a8b42005-12-17 14:02:24 +0100376- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
377 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
378 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100379
willy tarreaua41a8b42005-12-17 14:02:24 +0100380- <plage_ports> correspond soit à un port, soit à une plage de ports sur
381 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
382 Cette plage peut être :
383 - soit un port numérique (ex: '80')
384 - soit une plage constituée de deux valeurs séparées par un tiret
385 (ex: '2000-2100') représentant les extrémités incluses dans la
386 plage.
387 Il faut faire attention à l'usage des plages, car chaque combinaison
388 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
389 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
390 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
willy tarreau64a3cc32005-12-18 01:13:11 +0100391 niveau de privilège particulier lors du lancement du programme
392 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100393
willy tarreaua41a8b42005-12-17 14:02:24 +0100394- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
395 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
396 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
397
398Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100399---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100400 listen http_proxy :80
401 listen x11_proxy 127.0.0.1:6000-6009
402 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
403 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100404
willy tarreaua41a8b42005-12-17 14:02:24 +0100405Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
406rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
407de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
408l'écriture de configurations :
409
410 bind [ <adresse_IP>:<plage_ports>[,...] ]
411
412Exemples :
413----------
414 listen http_proxy
415 bind :80,:443
willy tarreauc5f73ed2005-12-18 01:26:38 +0100416 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100417
willy tarreauc29948c2005-12-17 13:10:27 +01004182.1) Inhibition d'un service
419----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100420Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100421commenter toute une partie du fichier. Il suffit de positionner le mot clé
422"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100423
424 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100425 disabled
willy tarreau0f7af912005-12-17 12:21:26 +0100426
willy tarreaueedaa9f2005-12-17 14:08:03 +0100427Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
willy tarreauc5f73ed2005-12-18 01:26:38 +0100428 désactivé par le mot clé 'disabled', par exemple à cause d'une
429 configuration par défaut.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100430
willy tarreauc29948c2005-12-17 13:10:27 +01004312.2) Mode de fonctionnement
432---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100433Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100434 - TCP
435 - HTTP
willy tarreau532bb552006-05-13 18:40:37 +0200436 - état de santé
willy tarreau0f7af912005-12-17 12:21:26 +0100437
438Mode TCP
439--------
willy tarreau64a3cc32005-12-18 01:13:11 +0100440Dans ce mode, le service relaye, dès leur établissement, les connexions TCP
441vers un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il
442s'agit simplement d'une association
443 source<adresse:port> -> destination<adresse:port>.
willy tarreauc29948c2005-12-17 13:10:27 +0100444Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100445
willy tarreauc29948c2005-12-17 13:10:27 +0100446Exemple :
447---------
willy tarreau0f7af912005-12-17 12:21:26 +0100448 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100449 mode tcp
willy tarreau0f7af912005-12-17 12:21:26 +0100450
451Mode HTTP
452---------
willy tarreauc29948c2005-12-17 13:10:27 +0100453Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
454serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
willy tarreauc5f73ed2005-12-18 01:26:38 +0100455décision. Les en-têtes HTTP sont analysés pour y trouver un éventuel cookie, et
willy tarreauc29948c2005-12-17 13:10:27 +0100456certains d'entre-eux peuvent être modifiés par le biais d'expressions
457régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
458relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100459
willy tarreauc29948c2005-12-17 13:10:27 +0100460Exemple :
461---------
willy tarreau0f7af912005-12-17 12:21:26 +0100462 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100463 mode http
willy tarreau0f7af912005-12-17 12:21:26 +0100464
465Mode supervision
466----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100467Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
468santé du service. Il se contente de retourner "OK" à tout client se connectant
469sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100470déterminer quels sont les services utilisables. Si l'option 'httpchk' est
471activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
472attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100473le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100474
willy tarreauc29948c2005-12-17 13:10:27 +0100475Exemple :
476---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100477 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100478 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100479 mode health
willy tarreau0f7af912005-12-17 12:21:26 +0100480
willy tarreau197e8ec2005-12-17 14:10:59 +0100481 # réponse HTTP : 'HTTP/1.0 200 OK'
482 listen http_health_check 0.0.0.0:60001
willy tarreauc5f73ed2005-12-18 01:26:38 +0100483 mode health
484 option httpchk
willy tarreau197e8ec2005-12-17 14:10:59 +0100485
willy tarreau0f7af912005-12-17 12:21:26 +0100486
willy tarreau532bb552006-05-13 18:40:37 +02004872.2.1 Supervision
488-----------------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100489Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
490bon fonctionnement du proxy sans perturber le service. Le mot-clé 'monitor-net'
491a été créé dans le butd de spécifier un réseau d'équipements qui ne PEUVENT PAS
492utiliser le service pour autre chose que des tests de fonctionnement. C'est
493particulièrement adapté aux proxies TCP, car cela empêche le proxy de relayer
494des établissements de connexion émis par un outil de surveillance.
495
496Lorsque c'est utilisé sur un proxy TCP, la connexion est acceptée puis refermée
497et rien n'est logué. C'est suffisant pour qu'un répartiteur de charge en amont
498détecte que le service est disponible.
499
500Lorsque c'est utilisé sur un proxy HTTP, la connexion est acceptée, rien n'est
501logué, puis la réponse suivante est envoyée et la session refermée :
502"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un répartiteur de charge
503HTTP en amont détecte le service comme opérationnel, aussi bien à travers des
504tests TCP que HTTP.
505
506Les proxies utilisant le mot-clé 'monitor-net' peuvent accessoirement se passer
507de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
508émises depuis d'autres adresses que celles du réseau de tests.
509
510Exemple :
511---------
512
513 listen tse-proxy
514 bind :3389,:1494,:5900 # TSE, ICA and VNC at once.
515 mode tcp
516 balance roundrobin
517 server tse-farm 192.168.1.10
518 monitor-net 192.168.1.252/31 # L4 load-balancers on .252 and .253
519
520
willy tarreauc29948c2005-12-17 13:10:27 +01005212.3) Limitation du nombre de connexions simultanées
522---------------------------------------------------
523Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
524connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
525d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
526limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100527
willy tarreauc29948c2005-12-17 13:10:27 +0100528Exemple :
529---------
530 listen tiny_server 0.0.0.0:80
531 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100532
533
willy tarreauc29948c2005-12-17 13:10:27 +01005342.4) Arrêt en douceur
535---------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100536Il est possible d'arrêter les services en douceur en envoyant un signal
willy tarreau22739ef2006-01-20 20:43:32 +0100537SIGUSR1 au processus relais. Tous les services seront alors mis en phase
willy tarreau64a3cc32005-12-18 01:13:11 +0100538d'arrêt, mais pourront continuer d'accepter des connexions pendant un temps
539défini par le paramètre 'grace' (en millisecondes). Cela permet par exemple,
540de faire savoir rapidement à un répartiteur de charge qu'il ne doit plus
541utiliser un relais, tout en continuant d'assurer le service le temps qu'il
542s'en rende compte.
543
544Remarque :
545----------
546Les connexions actives ne sont jamais cassées. Dans le pire des cas, il faudra
willy tarreau22739ef2006-01-20 20:43:32 +0100547attendre en plus leur expiration avant l'arrêt total du processus, ou bien tuer
548manuellement le processus par l'envoi d'un signal SIGTERM. La valeur par défaut
549du paramètre 'grace' est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100550
551Exemple :
552---------
willy tarreauc29948c2005-12-17 13:10:27 +0100553 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100554 # le service tournera encore 10 secondes après la demande d'arrêt
555 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100556 mode http
557 grace 10000
willy tarreau0f7af912005-12-17 12:21:26 +0100558
willy tarreauc29948c2005-12-17 13:10:27 +0100559 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100560 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100561 mode health
562 grace 0
willy tarreau0f7af912005-12-17 12:21:26 +0100563
willy tarreau39df2dc2006-01-29 21:56:05 +0100564A partir de la version 1.2.8, un nouveau mécanisme de reconfiguration à chaud
willy tarreau22739ef2006-01-20 20:43:32 +0100565a été introduit. Il est désormais possible de mettre les proxies en "pause" en
566envoyant un signal SIGTTOU aux processus. Cela désactivera les sockets d'écoute
567sans casser les sessions existantes. Suite à cela, l'envoi d'un signal SIGTTIN
568réactivera les sockets d'écoute. Ceci est très pratique pour tenter de charger
569une nouvelle configuration ou même une nouvelle version de haproxy sans casser
570les connexions existantes. Si le rechargement s'effectue correctement, il ne
571reste plus qu'à envoyer un signal SIGUSR1 aux anciens processus, ce qui
572provoquera leur arrêt immédiat dès que leurs connexions seront terminées ; en
573revanche, si le rechargement échoue, il suffit d'envoyer un signal SIGTTIN pour
574remettre les ports en écoute et rétablir le service immédiatement. Veuillez
575noter que le paramètre 'grace' est ignoré pour le signal SIGTTOU ainsi que le
576signal SIGUSR1 une fois le processus en pause. Aussi, il peut s'avérer très
577utile de sauver le fichier de pid avant de démarrer une nouvelle instance.
578
willy tarreau34f45302006-04-15 21:37:14 +0200579Ce mécanisme est pleinement exploité à partir de la version 1.2.11 avec les
willy tarreau532bb552006-05-13 18:40:37 +0200580options '-st' et '-sf' (voir ci-dessous).
581
5822.4) Reconfiguration à chaud
583----------------------------
584Les paramètres '-st' et '-sf' sont utilisés pour informer des processus
585existants que la configuration va être rechargée. Ils recevront le signal
586SIGTTOU, leur demandant de libérer les ports en écoute afin que le nouveau
587processus puisse les prendre. Si quoi que ce soit se passe mal, le nouveau
588processus leur enverra un signal SIGTTIN pour leur indiquer qu'ils peuvent
589se remettre en écoute et continuer leur travail. En revanche, si la
590configuration se charge correctement, alors ils recevront un signal de demande
591de fin de travail en douceur (-sf), ou de terminaison immédiate (-st) qui
592coupera les sessions en cours. Un usage typique tel que celui-ci permet de
593recharger une configuration sans interruption de service :
594
595 # haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
596
willy tarreau0f7af912005-12-17 12:21:26 +0100597
willy tarreauc29948c2005-12-17 13:10:27 +01005982.5) Temps d'expiration des connexions
599--------------------------------------
600Il est possible de paramétrer certaines durées d'expiration au niveau des
601connexions TCP. Trois temps indépendants sont configurables et acceptent des
602valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
603session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100604
605 - temps d'attente d'une donnée de la part du client, ou de la
606 possibilité de lui envoyer des données : "clitimeout" :
607
willy tarreauc5f73ed2005-12-18 01:26:38 +0100608 # time-out client à 2mn30.
609 clitimeout 150000
willy tarreau0f7af912005-12-17 12:21:26 +0100610
611 - temps d'attente d'une donnée de la part du serveur, ou de la
612 possibilité de lui envoyer des données : "srvtimeout" :
613
willy tarreauc5f73ed2005-12-18 01:26:38 +0100614 # time-out serveur à 30s.
615 srvtimeout 30000
willy tarreau0f7af912005-12-17 12:21:26 +0100616
617 - temps d'attente de l'établissement d'une connexion vers un serveur
618 "contimeout" :
619
willy tarreauc29948c2005-12-17 13:10:27 +0100620 # on abandonne si la connexion n'est pas établie après 4 secondes
willy tarreauc5f73ed2005-12-18 01:26:38 +0100621 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100622
willy tarreauc29948c2005-12-17 13:10:27 +0100623Remarques :
624-----------
625 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
626 type "health".
627 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
willy tarreau64a3cc32005-12-18 01:13:11 +0100628 possible de perdre des paquets. Du fait que la première retransmission
629 TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
630 inférieur à 3 secondes ne permet pas de se rattraper sur la perte
631 de paquets car la session aura été abandonnée avant la première
632 retransmission. Une valeur de 4 secondes réduira considérablement
633 le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100634
willy tarreauc29948c2005-12-17 13:10:27 +01006352.6) Tentatives de reconnexion
636------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100637Lors d'un échec de connexion vers un serveur, il est possible de
638retenter (potentiellement vers un autre serveur, en cas de répartition
639de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100640abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100641
willy tarreauc29948c2005-12-17 13:10:27 +0100642Exemple :
643---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100644 # on essaie encore trois fois maxi
645 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100646
willy tarreau34f45302006-04-15 21:37:14 +0200647Il est à noter que la tentative de reconnexion peut amener à utiliser un autre
648serveur si le premier a disparu entre deux tentatives de connexion.
649
willy tarreau0f7af912005-12-17 12:21:26 +0100650
willy tarreauc29948c2005-12-17 13:10:27 +01006512.7) Adresse du serveur
652-----------------------
653Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
654le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
655serveur d'assignation de cookie dans le cas où le service consiste à assurer
656uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100657le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
658du serveur distant, et il est maintenant recommandé d'utiliser de préférence
659le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100660
willy tarreauc29948c2005-12-17 13:10:27 +0100661Exemple :
662---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100663 # on envoie toutes les nouvelles connexions ici
664 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100665
willy tarreauc29948c2005-12-17 13:10:27 +0100666Remarque :
667----------
668Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
669'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100670
willy tarreau0f7af912005-12-17 12:21:26 +0100671
willy tarreau240afa62005-12-17 13:14:35 +01006722.8) Adresse de sortie
673----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100674Il est possible de forcer l'adresse utilisée pour établir les connexions vers
675les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
676port, bien que cette fonctionnalité se limite à des usages très spécifiques.
677C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100678pour permettre aux serveurs de trouver le chemin de retour dans des contextes
679de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
680choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
681librement par le système. Il est à noter que depuis la version 1.1.18, les
682tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
683source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100684
685Exemples :
686----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100687 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100688 # toutes les connexions prennent l'adresse 192.168.1.200
689 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100690
willy tarreaua41a8b42005-12-17 14:02:24 +0100691 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100692 # utiliser l'adresse 192.168.1.200 et le port réservé 900
693 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100694
695
6962.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100697--------------------------------
698En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
699vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
700par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100701
willy tarreauc29948c2005-12-17 13:10:27 +0100702Exemple :
703---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100704 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100705 mode http
706 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100707
willy tarreauc29948c2005-12-17 13:10:27 +0100708On peut modifier l'utilisation du cookie pour la rendre plus intelligente
709vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
710réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
711cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100712de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
713inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100714
715Exemples :
716----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100717
718Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100719dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
720directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100721
willy tarreauc5f73ed2005-12-18 01:26:38 +0100722 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100723
willy tarreauc29948c2005-12-17 13:10:27 +0100724Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
725lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100726
willy tarreauc5f73ed2005-12-18 01:26:38 +0100727 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100728
willy tarreau64a3cc32005-12-18 01:13:11 +0100729Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
730accès en répartition de charge interne. Dans ce cas, il est souhaitable que
731tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100732retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100733
willy tarreauc5f73ed2005-12-18 01:26:38 +0100734 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100735
willy tarreau0174f312005-12-18 01:02:42 +0100736Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
737puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
738permet d'insérer une instance de haproxy devant une application sans risquer
739d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
740plus d'un cookie :
741
742 cookie JSESSIONID prefix
743
willy tarreau240afa62005-12-17 13:14:35 +0100744Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
745ajouter le mot clé 'nocache' après 'insert' :
746
willy tarreauc5f73ed2005-12-18 01:26:38 +0100747 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100748
willy tarreau64a3cc32005-12-18 01:13:11 +0100749Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
750mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100751
willy tarreauc5f73ed2005-12-18 01:26:38 +0100752 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100753
willy tarreau240afa62005-12-17 13:14:35 +0100754
willy tarreau96d40372005-12-17 13:11:56 +0100755Remarques :
756-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100757- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
758 s'adapter à des applications générant déjà le cookie, avec un contenu
759 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100760
willy tarreau96d40372005-12-17 13:11:56 +0100761- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
762 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
763 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100764
willy tarreau240afa62005-12-17 13:14:35 +0100765- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
766 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
767 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
768 cookie de persistence inséré, donc provoquer des changements de serveurs pour
769 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100770
willy tarreau0174f312005-12-18 01:02:42 +0100771- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
772 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
773 présenté par l'application qui est censée savoir à quel moment il peut
774 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
775 présenté par le client dans chaque requête ultérieure, il est indispensable
776 de s'assurer que le client et le serveur communiqueront sans "keep-alive
777 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
778
willy tarreaucd878942005-12-17 13:27:43 +0100779- lorsque l'application est bien connue, et que les parties nécessitant de la
780 persistence sont systématiquement accédées par un formulaire en mode POST,
781 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
782 et "indirect", car la page d'accueil reste cachable, et c'est l'application
783 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100784
willy tarreau240afa62005-12-17 13:14:35 +01007852.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100786----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100787En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
788par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100789
willy tarreau5cbea6f2005-12-17 12:48:26 +0100790 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100791
willy tarreauc29948c2005-12-17 13:10:27 +0100792- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
793 configuration et les logs.
794- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
795- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100796
797Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100798---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100799 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100800 mode http
801 cookie SERVERID
802 dispatch 192.168.1.100:80
803 server web1 192.168.1.1:80 cookie server01
804 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100805
806Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100807-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100808
willy tarreaua41a8b42005-12-17 14:02:24 +01008093) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100810=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100811
willy tarreauc29948c2005-12-17 13:10:27 +0100812Le relais peut effectuer lui-même la répartition de charge entre les différents
813serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
814cela, on précise le mot clé 'balance' dans la définition du service,
willy tarreau34f45302006-04-15 21:37:14 +0200815éventuellement suivi du nom d'un algorithme de répartition. Jusqu'à la version
8161.2.11, seul 'roundrobin' était géré, et c'est aussi la valeur implicite par
817défaut. Avec la version 1.2.12, le nouveau mot clé 'source' est apparu. Il est
818évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
willy tarreauc29948c2005-12-17 13:10:27 +0100819spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100820
821Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100822---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100823
willy tarreaua41a8b42005-12-17 14:02:24 +0100824 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100825 mode http
826 cookie SERVERID
827 balance roundrobin
828 server web1 192.168.1.1:80 cookie server01
829 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100830
willy tarreaua41a8b42005-12-17 14:02:24 +0100831Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
832du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
833sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
834champ <port> de l'adresse serveur :
835
836 - non spécifié ou nul :
837 la connexion sera envoyée au serveur sur le même port que celui sur
838 lequel le relais a reçu la connexion.
839
840 - valeur numérique (seul cas supporté pour les versions antérieures) :
841 le serveur recevra la connexion sur le port désigné.
842
843 - valeur numérique précédée d'un signe '+' :
844 la connexion sera envoyée au serveur sur le même port que celui sur
845 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
846
847 - valeur numérique précédée d'un signe '-' :
848 la connexion sera envoyée au serveur sur le même port que celui sur
849 lequel le relais a reçu la connexion, duquel on soustrait la valeur
850 désignée.
851
852Exemples :
853----------
854
855# même que précédemment
856
857 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100858 mode http
859 cookie SERVERID
860 balance roundrobin
861 server web1 192.168.1.1 cookie server01
862 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100863
864# relayage simultané des ports 80 et 81 et 8080-8089
865
866 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100867 mode http
868 cookie SERVERID
869 balance roundrobin
870 server web1 192.168.1.1 cookie server01
871 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100872
873# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
874
875 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100876 mode tcp
877 balance roundrobin
878 server srv1 192.168.1.1:+1000
879 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100880
willy tarreau34f45302006-04-15 21:37:14 +0200881Comme indiqué précédemment, la version 1.2.12 apporta le nouveau mot clé
882'source'. Lorsque celui-ci est utilisé, l'adresse IP du client est hachée et
883distribuée de manière homogène parmi les serveurs disponibles, de sorte qu'une
884même adresse IP aille toujours sur le même serveur tant qu'il n'y a aucun
885changement dans le nombre de serveurs disponibles. Ceci peut être utilisé par
886exemple pour attacher le HTTP et le HTTPS sur un même serveur pour un même
887client. Cela peut également être utilisé pour améliorer la persistance
888lorsqu'une partie de la population des clients n'accepte pas les cookies. Dans
889ce cas, seuls ces derniers seront perturbés par la perte d'un serveur.
890
891NOTE: il est important de prendre en compte le fait que beaucoup d'internautes
892 naviguent à travers des fermes de proxies qui assignent des adresses IP
893 différentes à chaque requête. D'autres internautes utilisent des liens à
894 la demande et obtiennent une adresse IP différente à chaque connexion. De
895 ce fait, le paramètre 'source' doit être utilisé avec une extrème
896 précaution.
897
898Exemples :
899----------
900
901# assurer qu'une même adresse IP ira sur le même serveur pour tout service
902
903 listen http_proxy
904 bind :80,:443
905 mode http
906 balance source
907 server web1 192.168.1.1
908 server web2 192.168.1.2
909
910# améliorer la persistance par l'utilisation de la source en plus du cookie :
911
912 listen http_proxy :80
913 mode http
914 cookie SERVERID
915 balance source
916 server web1 192.168.1.1 cookie server01
917 server web2 192.168.1.2 cookie server02
918
willy tarreau0f7af912005-12-17 12:21:26 +0100919
willy tarreauc29948c2005-12-17 13:10:27 +01009203.1) Surveillance des serveurs
921------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100922Il est possible de tester l'état des serveurs par établissement de connexion
923TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
924utilisé dans le processus de répartition de charge interne. Pour activer la
925surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
926Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
927tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
928paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
929Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreau34f45302006-04-15 21:37:14 +0200930
willy tarreaue47c8d72005-12-17 12:55:52 +0100931 - inter : 2000
932 - rise : 2
933 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +0100934 - port : port de connexion du serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +0100935
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100936Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +0100937certains cas de pannes, des serveurs peuvent continuer à accepter les
938connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
939d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
940et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
941les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
942contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
943RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
9441.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
945possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
946l'avantage d'être facilement extractibles des logs, et de ne pas induire
947d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
948considérées valides, les autres (y compris non-réponses) aboutissent à un
949échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
950deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
951"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
952accepte donc 4 formes :
willy tarreau34f45302006-04-15 21:37:14 +0200953
willy tarreaueedaa9f2005-12-17 14:08:03 +0100954 - option httpchk -> OPTIONS / HTTP/1.0
955 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
956 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
957 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreau34f45302006-04-15 21:37:14 +0200958
willy tarreauc5f73ed2005-12-18 01:26:38 +0100959Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100960
willy tarreau8337c6b2005-12-17 13:41:01 +0100961Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
962utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
963ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
964de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
965les 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 +0100966de répartition de charge entre des serveurs de secours par défaut. A partir
967de la version 1.2.9, il est possible de les utiliser simultanément grâce à
968l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
969d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
970de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
971définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
972qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +0100973
willy tarreaua41a8b42005-12-17 14:02:24 +0100974Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
975vers un port différent de celui de service. C'est nécessaire principalement
976pour les configurations où le serveur n'a pas de port prédéfini, par exemple
977lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
978le paramètre 'port' suivi du numéro de port devant répondre aux requêtes.
979
willy tarreau64a3cc32005-12-18 01:13:11 +0100980Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
981l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
982SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
983envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
984elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
985local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +0100986
willy tarreau982249e2005-12-18 00:57:06 +0100987Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
988logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
989afin de notifier l'administrateur qu'il faut prendre une action immédiate.
990
willy tarreau0174f312005-12-18 01:02:42 +0100991Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
992même valeur de cookie. C'est particulièrement utile en mode backup, pour
993sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
994oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
995temporairement vers une page d'erreur en attendant le redémarrage d'une
996application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
997le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
998chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
999le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
1000pour plus d'informations.
1001
willy tarreauc29948c2005-12-17 13:10:27 +01001002Exemples :
1003----------
willy tarreaua41a8b42005-12-17 14:02:24 +01001004# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001005 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001006 mode http
1007 cookie SERVERID
1008 balance roundrobin
1009 server web1 192.168.1.1:80 cookie server01 check
1010 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001011
willy tarreau2f6ba652005-12-17 13:57:42 +01001012# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001013 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001014 mode http
1015 cookie SERVERID
1016 balance roundrobin
1017 option httpchk
1018 server web1 192.168.1.1:80 cookie server01 check
1019 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +01001020
willy tarreau2f6ba652005-12-17 13:57:42 +01001021# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
1022 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001023 mode http
1024 cookie SERVERID
1025 balance roundrobin
1026 option httpchk /index.html
1027 server web1 192.168.1.1:80 cookie server01 check
1028 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +01001029
willy tarreaueedaa9f2005-12-17 14:08:03 +01001030# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1031 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001032 mode http
1033 cookie SERVERID
1034 balance roundrobin
1035 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1036 server web1 192.168.1.1:80 cookie server01 check
1037 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001038
willy tarreau0174f312005-12-18 01:02:42 +01001039# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1040# douceur utilisant un second port (81) juste pour les health-checks.
1041 listen http_proxy 0.0.0.0:80
1042 mode http
1043 cookie JSESSIONID prefix
1044 balance roundrobin
1045 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1046 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1047 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1048 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1049 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1050
willy tarreau96d40372005-12-17 13:11:56 +01001051# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001052# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1053# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +01001054 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001055 mode http
1056 cookie SERVERID insert nocache indirect
1057 balance roundrobin
1058 server web1 192.168.1.1:80 cookie server01 check
1059 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +01001060
willy tarreaueedaa9f2005-12-17 14:08:03 +01001061# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001062 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001063 mode http
1064 cookie SERVERID insert nocache indirect
1065 balance roundrobin
1066 server web1 192.168.1.1:80 cookie server01 check
1067 server web2 192.168.1.2:80 cookie server02 check
1068 server web-backup 192.168.2.1:80 cookie server03 check backup
1069 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001070
willy tarreaua41a8b42005-12-17 14:02:24 +01001071# relayage SMTP+TLS avec test du serveur et serveur de backup
1072
1073 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001074 mode tcp
1075 balance roundrobin
1076 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1077 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001078
Willy TARREAU3481c462006-03-01 22:37:57 +01001079# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1080 listen http_proxy 0.0.0.0:80
1081 mode http
1082 balance roundrobin
1083 option httpchk
1084 server inst1 192.168.1.1:80 cookie s1 check
1085 server inst2 192.168.1.2:80 cookie s2 check
1086 server inst3 192.168.1.3:80 cookie s3 check
1087 server back1 192.168.1.10:80 check backup
1088 server back2 192.168.1.11:80 check backup
1089 option allbackups # all backups will be used
1090
willy tarreau0f7af912005-12-17 12:21:26 +01001091
willy tarreauc29948c2005-12-17 13:10:27 +010010923.2) Reconnexion vers un répartiteur en cas d'échec direct
1093----------------------------------------------------------
1094En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1095seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1096définitivement privés de service. La spécification du paramètre 'redispatch'
1097autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1098(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001099
1100Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001101---------
willy tarreau0f7af912005-12-17 12:21:26 +01001102 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001103 mode http
1104 cookie SERVERID
1105 dispatch 192.168.1.100:80
1106 server web1 192.168.1.1:80 cookie server01
1107 server web2 192.168.1.2:80 cookie server02
1108 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001109
willy tarreau64a3cc32005-12-18 01:13:11 +01001110Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1111redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1112version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1113identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1114tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1115tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001116
1117 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001118 mode http
1119 option persist
1120 cookie SERVERID
1121 dispatch 192.168.1.100:80
1122 server web1 192.168.1.1:80 cookie server01
1123 server web2 192.168.1.2:80 cookie server02
1124 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001125
willy tarreauc29948c2005-12-17 13:10:27 +01001126
willy tarreau34f45302006-04-15 21:37:14 +020011273.3) Assignation de poids différents à des serveurs
1128---------------------------------------------------
1129Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1130d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1131que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1132soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1133raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1134plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1135plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1136la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1137une vue des serveurs disponibles la plus homogène possible en se basant sur
1138leur poids de sorte que la charge se distribue de la manière la plus lisse
1139possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
willy tarreau532bb552006-05-13 18:40:37 +02001140serveur par rapport aux autres. Le poids de 1 donne la fréquence d'apparition
1141la plus faible, et 256 la fréquence la plus élevée. De cette manière, si un
1142serveur disparait, les capacités restantes sont toujours respectées.
willy tarreau34f45302006-04-15 21:37:14 +02001143
1144
1145Exemple :
1146---------
1147# distribution équitable sur 2 opteron and un ancien pentium3
1148
1149 listen web_appl 0.0.0.0:80
1150 mode http
1151 cookie SERVERID insert nocache indirect
1152 balance roundrobin
1153 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1154 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1155 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1156 server web-backup1 192.168.2.1:80 cookie server04 check backup
1157 server web-excuse 192.168.3.1:80 check backup
1158
1159Notes :
1160-------
1161 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1162
1163 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1164 est plus propre d'utiliser les poids que de répliquer le même serveur
1165 plusieurs fois.
1166
1167 - les poids s'appliquent également aux serveurs de backup si l'option
1168 'allbackups' est positionnée.
1169
1170 - le poids s'applique aussi à la répartition selon la source
1171 ('balance source').
1172
1173 - quels que soient les poids, le premier serveur sera toujours assigné en
1174 premier. Cette règle facilite les diagnostics.
1175
1176 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1177 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1178 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1179
willy tarreau532bb552006-05-13 18:40:37 +02001180La distribution du trafic suivra exactement le séquencement suivant :
1181
1182 Request| 1 1 1 1
1183 number | 1 2 3 4 5 6 7 8 9 0 1 2 3
1184 --------+---------------------------
1185 p3-800 | X . . . . . . X . . . . .
1186 opt-20 | . X . X . X . . . X . X .
1187 opt-24 | . . X . X . X . X . X . X
1188
1189
11903.4) Limitation du nombre de sessions concurrentes par serveur
1191--------------------------------------------------------------
1192Certains serveurs web multi-processus tels qu'Apache souffrent dès qu'il y a
1193trop de sessions concurrentes, parce qu'il est très coûteux de faire
1194fonctionner des centaines ou des milliers de processus sur un système. Une
1195solution consiste à augmenter le nombre de serveurs et de répartir la charge
1196entre eux, mais cela pose un problème lorsque le but est uniquement de résister
1197à des pics de charge occasionnels.
1198
1199Pour résoudre ce problème, une nouvelle fonctionnalité a été implémentée dans
1200HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associée à une
1201file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
1202entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
1203de diminuer la valeur maxconn améliorera notablement les performances des
1204serveurs et diminuera les temps de réponse simplement parce que les serveurs
1205seront moins congestionnés.
1206
1207Quand une requête cherche à joindre n'importe quel serveur, le premier serveur
1208non saturé est utilisé, en respectant l'algorithme de répartition de charge. Si
1209tous les serveurs sont saturés, alors la requête sera mise dans la file
1210d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
1211toutes les requêtes précédentes auront été libérées et qu'un serveur aura été
1212libéré d'une connexion pour la traiter.
1213
1214Si une requête fait référence à un serveur en particulier (p.ex: hachage d'IP
1215source, ou persistance par cookie), et que ce server est saturé, alors la
1216requête sera mise dans la file d'attente dédiée à ce serveur. Cette file
1217d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
1218plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent déjà
1219que pour les nouveaux utilisateurs.
1220
1221Pour cela, les logs ont dû être enrichis pour indiquer le nombre de sessions
1222par serveur, la position de la requête dans les files d'attentes, et le temps
1223passé en file d'attente. Ceci aide considérablement à faire de la prévision de
1224capacité. Voir la section 'logs' plus bas pour plus d'informations.
1225
1226Exemple :
1227---------
1228 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1229 listen web_appl 0.0.0.0:80
1230 maxconn 10000
1231 mode http
1232 cookie SERVERID insert nocache indirect
1233 balance roundrobin
1234 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 maxconn 100 check
1235 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
1236 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
1237 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1238 server web-excuse 192.168.3.1:80 check backup
1239
1240Notes :
1241-------
1242 - la requête ne restera pas indéfiniment en file d'attente, elle est
1243 assujétie au paramètre 'contimeout', et si une requête ne peut pas
1244 sortir de la file avant ce time-out, soit parce que le serveur est
1245 saturé, soit parce qu'il y a trop de requêtes en file d'attente,
1246 alors elle expirera avec une erreur 503.
1247
1248 - positionner des valeurs trop basses pour 'maxconn' peut améliorer les
1249 performances mais aussi permettre à des utilisateurs trop lents de bloquer
1250 un serveur pour les autres utilisateurs.
1251
willy tarreau34f45302006-04-15 21:37:14 +02001252
willy tarreauc29948c2005-12-17 13:10:27 +010012534) Fonctionnalités additionnelles
1254=================================
1255
1256D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
1257principalement du mode transparent, de la journalisation des connexions, et de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001258la réécriture des en-têtes.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001259
willy tarreau0174f312005-12-18 01:02:42 +010012604.1) Fonctionnalités réseau
1261---------------------------
12624.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001263---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001264En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1265routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1266pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001267destination de la session détournée. Le système doit permettre de rediriger les
1268paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001269
1270Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001271---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001272 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001273 mode http
1274 transparent
1275 cookie SERVERID
1276 server server01 192.168.1.1:80
1277 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001278
1279 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1280 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001281
willy tarreaua41a8b42005-12-17 14:02:24 +01001282Remarque :
1283----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001284Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1285adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1286d'une même adresse avec une même instance et sans utiliser directement le mode
1287transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001288
1289Exemple :
1290---------
1291 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001292 mode tcp
1293 server server01 192.168.1.1 check port 60000
1294 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001295
1296 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1297 -j REDIRECT --to-ports 65000
1298
willy tarreau0174f312005-12-18 01:02:42 +01001299
13004.1.2) Choix d'une adresse source par serveur
1301---------------------------------------------------
1302Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1303IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1304backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1305pour joindre le même serveur. C'est également utilisable pour faciliter une
1306répartition de charge selon l'adresse IP source pour des connexions sortantes.
1307Bien entendu, la même adresse est utilisée pour les health-checks.
1308
1309Exemple :
1310---------
1311 # utiliser une adresse particulière pour joindre les 2 serveur
1312 listen http_proxy 0.0.0.0:65000
1313 mode http
1314 balance roundrobin
1315 server server01 192.168.1.1:80 source 192.168.2.13
1316 server server02 192.168.1.2:80 source 192.168.2.13
1317
1318Exemple :
1319---------
1320 # utiliser une adresse particulière pour joindre chaque serveur
1321 listen http_proxy 0.0.0.0:65000
1322 mode http
1323 balance roundrobin
1324 server server01 192.168.1.1:80 source 192.168.1.1
1325 server server02 192.168.2.1:80 source 192.168.2.1
1326
1327Exemple :
1328---------
1329 # faire une répartition d'adresse sources pour joindre le même proxy à
1330 # travers deux liens WAN
1331 listen http_proxy 0.0.0.0:65000
1332 mode http
1333 balance roundrobin
1334 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1335 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1336
1337Exemple :
1338---------
1339 # forcer une connexion TCP à s'attacher à un port particulier
1340 listen http_proxy 0.0.0.0:2000
1341 mode tcp
1342 balance roundrobin
1343 server srv1 192.168.1.1:80 source 192.168.2.1:20
1344 server srv2 192.168.1.2:80 source 192.168.2.1:20
1345
willy tarreaub952e1d2005-12-18 01:31:20 +010013464.1.3) Maintien de session TCP (keep-alive)
1347-------------------------------------------
1348Avec la version 1.2.7, il devient possible d'activer le maintien de session
1349TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1350d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1351externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1352aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1353time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1354positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1355vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1356pour activer le maintien de session TCP :
1357
1358 option tcpka # active le keep-alive côté client et côté serveur
1359 option clitcpka # active le keep-alive côté client
1360 option srvtcpka # active le keep-alive côté serveur
1361
willy tarreau0f7af912005-12-17 12:21:26 +01001362
willy tarreauc29948c2005-12-17 13:10:27 +010013634.2) Journalisation des connexions
1364----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001365
1366L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1367Il fournit probablement le plus fin niveau d'information disponible pour un
1368tel outil, ce qui est très important pour les diagnostics en environnements
1369complexes. En standard, les informations journalisées incluent le port client,
1370les chronométrages des états TCP/HTTP, des états de session précis au moment de
1371la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1372trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1373arbitraires.
1374
1375Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1376transparence sur les problèmes rencontrés, à la fois internes et externes, et
1377il est possible d'envoyer les logs vers des serveurs différents en même temps
1378avec des niveaux de filtrage différents :
1379
1380 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1381 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1382 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1383 - activité par instance (connexions clients), aussi bien lors de leur
1384 établissement qu'à leur terminaison.
1385
1386La possibilité de distribuer différents niveaux de logs à différents serveurs
1387permet à plusieurs équipes de production d'intéragir et de corriger leurs
1388problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1389occasionnellement les erreurs système, pendant que l'équipe application
1390surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1391que l'équipe sécurité analyse l'activité en différé d'une heure.
1392
1393
willy tarreauc1cae632005-12-17 14:12:23 +010013944.2.1) Niveaux de log
1395---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001396Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1397détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1398source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001399la requête HTTP, le code de retour, la quantité de données transmises, et même
1400dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1401Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1402la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001403est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001404
willy tarreau8337c6b2005-12-17 13:41:01 +01001405 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1406 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001407ou
1408 log global
1409
1410Remarque :
1411----------
1412La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1413paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001414
1415Exemple :
1416---------
1417 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001418 mode http
1419 log 192.168.2.200 local3
1420 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001421
willy tarreauc1cae632005-12-17 14:12:23 +010014224.2.2) Format des logs
1423----------------------
1424Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1425de la session entre le client et le relais. En précisant l'option 'tcplog',
1426la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1427sur son état lors de la déconnexion, ainsi que le temps de connexion et la
willy tarreau532bb552006-05-13 18:40:37 +02001428durée totale de la session. Le nombre de sessions restantes après la
1429déconnexion est également indiqué (pour le serveur, l'instance et le process).
willy tarreauc1cae632005-12-17 14:12:23 +01001430
willy tarreauc5f73ed2005-12-18 01:26:38 +01001431Exemple de journalisation TCP :
1432-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001433 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001434 mode tcp
1435 option tcplog
1436 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001437
willy tarreau532bb552006-05-13 18:40:37 +02001438>>> haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/0/5007 0 -- 1/1/1 0/0
willy tarreauc5f73ed2005-12-18 01:26:38 +01001439
willy tarreau532bb552006-05-13 18:40:37 +02001440 Champ Format / Description Exemple
1441
1442 1 nom_processus '[' pid ']:' haproxy[18989]:
1443 2 ip_client ':' port_client 127.0.0.1:34550
1444 3 '[' date ']' [15/Oct/2003:15:24:28]
1445 4 nom_instance relais-tcp
1446 5 nom_serveur Srv1
1447 6 temps_file '/' temps_connect '/' temps_total 0/0/5007
1448 7 octets lus 0
1449 8 etat_terminaison --
1450 9 conn_srv '/' conns_inst '/' conns_processus 1/1/1
1451 10 position en file d'attente srv '/' globale 0/0
willy tarreau982249e2005-12-18 00:57:06 +01001452
willy tarreauc1cae632005-12-17 14:12:23 +01001453Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1454notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1455surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1456les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1457ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1458(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001459
willy tarreauc5f73ed2005-12-18 01:26:38 +01001460Exemple de journalisation HTTP :
1461--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001462 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001463 mode http
1464 option httplog
1465 option dontlognull
1466 log 192.168.2.200 local3
1467
willy tarreau532bb552006-05-13 18:40:37 +02001468>>> haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 9/0/7/147/723 200 243 - - ---- 2/3/3 0/0 "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001469
1470Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001471
willy tarreau532bb552006-05-13 18:40:37 +02001472 haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/-1/11215 503 0 - - SC-- 137/202/205 0/0 {w.ods.org|Mozilla} {} "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001473
willy tarreau532bb552006-05-13 18:40:37 +02001474 Champ Format / Description Exemple
1475
1476 1 nom_processus '[' pid ']:' haproxy[18989]:
1477 2 ip_client ':' port_client 10.0.0.1:34552
1478 3 '[' date ']' [15/Oct/2003:15:26:31]
1479 4 nom_instance relais-http
1480 5 nom_serveur Srv1
1481 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt 3183/-1/-1/-1/11215
1482 7 Code_retour_HTTP 503
1483 8 octets lus 0
1484 9 cookies_requête_capturés -
1485 10 cookies_reponse_capturés -
1486 11 etat_terminaison SC--
1487 12 conns_srv '/' conns_inst '/' conns_processus 137/202/205
1488 13 position file serveur '/' globale 0/0
1489 14 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1490 15 '{' entetes_reponse_capturés '}' {}
1491 16 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001492
1493Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1494 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001495
1496Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1497de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1498Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001499la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1500tôt possible, c'est à dire juste avant que ne débutent les transferts de
1501données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1502de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001503traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1504représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001505
willy tarreau64a3cc32005-12-18 01:13:11 +01001506Afin d'éviter toute confusion avec les logs normaux, le temps total de
1507transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001508rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001509
1510Exemple :
1511---------
1512
1513 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001514 mode http
1515 option httplog
1516 option dontlognull
1517 option logasap
1518 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001519
willy tarreauc5f73ed2005-12-18 01:26:38 +01001520>>> 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 +01001521
1522
willy tarreauc1cae632005-12-17 14:12:23 +010015234.2.3) Chronométrage des événements
1524-----------------------------------
1525Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1526événements sont d'une très grande utilité. Tous les temps sont mesurés en
1527millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
willy tarreau532bb552006-05-13 18:40:37 +02001528la forme Tq/Tw/Tc/Tr/Tt :
willy tarreauc1cae632005-12-17 14:12:23 +01001529
1530 - Tq: temps total de réception de la requête HTTP de la part du client.
1531 C'est le temps qui s'est écoulé entre le moment où le client a établi
1532 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1533 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1534 que la requête complète n'a jamais été reçue.
1535
willy tarreau532bb552006-05-13 18:40:37 +02001536 - Tw: temps total passé dans les files d'attente avant d'obtenir une place
1537 vers un serveur. Ceci tient compte à la fois de la file d'attente globale
1538 et de celle du serveur, et dépend du nombre de requêtes dans la file et du
1539 temps nécessaire au serveur pour compléter les sessions précédentes. La
1540 valeur '-1' indique que la requête a été détruite avant d'atteindre une
1541 file.
1542
willy tarreauc1cae632005-12-17 14:12:23 +01001543 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1544 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1545 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1546 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1547 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1548 vers le serveur.
1549
1550 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001551 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001552 la connexion. Ca représente exactement le temps de traitement de la
1553 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001554 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001555
1556 - Tt: durée de vie totale de la session, entre le moment où la demande de
1557 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001558 refermée aux deux extrémités (client et serveur). La signification change
1559 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
willy tarreau532bb552006-05-13 18:40:37 +02001560 uniquement à (Tq + Tw + Tc + Tr), et se trouve préfixé d'un signe '+'. On
1561 peut donc déduire Td, le temps de transfert des données, en excluant les
1562 autres temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001563
willy tarreau532bb552006-05-13 18:40:37 +02001564 Td = Tt - (Tq + Tw + Tc + Tr)
willy tarreauc1cae632005-12-17 14:12:23 +01001565
1566 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1567
willy tarreau532bb552006-05-13 18:40:37 +02001568En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
willy tarreauc1cae632005-12-17 14:12:23 +01001569rapportés.
1570
1571Ces temps fournissent de précieux renseignement sur des causes probables de
1572problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1573de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1574de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1575problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1576valeur de time-out dans la configuration, c'est souvent qu'une session a été
1577abandonnée sur expiration d'un time-out.
1578
1579Cas les plus fréquents :
1580
1581 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1582 le client et le relais.
1583 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1584 le relais et le serveur durant la phase de connexion. Cet indicateur
1585 devrait normalement toujours être très bas (moins de quelques dizaines).
1586 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1587 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1588 de pertes entre le relais et le serveur.
1589 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1590 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1591 session est maintenue après la fin des échanges. Voir plus loin pour
1592 savoir comment désactiver le keep-alive HTTP.
1593
1594Autres cas ('xx' représentant une valeur quelconque à ignorer) :
willy tarreau532bb552006-05-13 18:40:37 +02001595 -1/xx/xx/xx/Tt: le client n'a pas envoyé sa requête dans le temps imparti ou
willy tarreauc5f73ed2005-12-18 01:26:38 +01001596 a refermé sa connexion sans compléter la requête.
willy tarreau532bb552006-05-13 18:40:37 +02001597 Tq/-1/xx/xx/Tt: Il n'était pas possible de traiter la request, probablement
1598 parce que tous les serveurs étaient hors d'usage.
1599 Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'établir vers le serveur (refus ou
1600 time-out au bout de Tt-(Tq+Tw) ms).
1601 Tq/Tw/Tc/-1/Tt: le serveur a accepté la connexion mais n'a pas répondu dans
willy tarreauc5f73ed2005-12-18 01:26:38 +01001602 les temps ou bien a refermé sa connexion trop tôt, au bout
willy tarreau532bb552006-05-13 18:40:37 +02001603 de Tt-(Tq+Tw+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001604
16054.2.4) Conditions de déconnexion
1606--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001607Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1608le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1609un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1610une signification précise :
1611
1612 - sur le premier caractère, un code précisant le premier événement qui a causé
1613 la terminaison de la session :
1614
1615 C : fermeture inattendue de la session TCP de la part du client.
1616
1617 S : fermeture inattendue de la session TCP de la part du serveur, ou
1618 refus explicite de connexion de la part de ce dernier.
1619
1620 P : terminaison prématurée des sessions par le proxy, pour cause
1621 d'imposition d'une limite sur le nombre de connexions, pour cause
1622 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1623 sécurité a détecté et bloqué une anomalie dans la réponse du
1624 serveur qui aurait pu causer une fuite d'informations (par exemple,
1625 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001626
willy tarreauc5f73ed2005-12-18 01:26:38 +01001627 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1628 source, ...). Généralement, cela arrive au cours de l'établissement
1629 d'une connexion, et les logs système doivent contenir une copie de
1630 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001631
willy tarreauc5f73ed2005-12-18 01:26:38 +01001632 I : une erreur interne a été identifiée par le proxy à la suite d'un
1633 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1634 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001635
willy tarreauc5f73ed2005-12-18 01:26:38 +01001636 c : le délai maximal d'attente du client a expiré (clitimeout).
1637
1638 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1639
1640 - : terminaison normale de session.
1641
1642 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1643 la fermeture :
1644
1645 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1646 été transmis au serveur.
1647
willy tarreau532bb552006-05-13 18:40:37 +02001648 Q : attente en file d'attente (QUEUE) d'une place pour avoir une
1649 connexion vers un serveur. Ne peut apparaître que sur un serveur
1650 possédant un paramètre 'maxconn'. Aucune connexion n'a été envoyée
1651 au serveur.
1652
willy tarreauc5f73ed2005-12-18 01:26:38 +01001653 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1654 serveur peut au plus avoir vu la tentative de connexion, mais
1655 aucune donnée n'a été échangée.
1656
1657 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1658
1659 D : transfert des DONNEES du serveur vers le client.
1660
1661 L : transfert des dernières ("LAST") données du proxy vers le client,
1662 alors que le serveur a déjà fini.
1663
1664 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001665
1666 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001667 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001668
willy tarreauc5f73ed2005-12-18 01:26:38 +01001669 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1670 cas sur les NOUVELLES connexions clients.
1671
1672 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1673 serveur connu. Ceci peut être dû à un changement de configuration
1674 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1675 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001676
willy tarreauc5f73ed2005-12-18 01:26:38 +01001677 D : le client a présenté un cookie correspondant à un serveur hors
1678 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1679 un autre serveur ou a tout de même tenté de se connecter sur celui
1680 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001681
willy tarreauc5f73ed2005-12-18 01:26:38 +01001682 V : le client a présenté un cookie VALIDE et a pu se connecter au
1683 serveur correspondant.
1684
1685 - : non appliquable (pas de cookie positionné dans la configuration).
1686
1687 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1688 persistence retrourné par le serveur (uniquement en mode HTTP) :
1689
1690 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1691 n'a été inséré.
1692
1693 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1694 proxy en a INSERE un.
1695
willy tarreau197e8ec2005-12-17 14:10:59 +01001696 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001697 tel quel ("PASSIF").
1698
1699 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1700
1701 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1702 ne pas être retourné au client.
1703
1704 - : non appliquable
1705
1706
1707La combinaison des deux premiers indicateurs fournit une grande quantitié
1708d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1709peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1710des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001711
willy tarreauc5f73ed2005-12-18 01:26:38 +01001712Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1713
1714 Indic Raison
1715 CR Le client a abandonné avant d'émettre une requête complète. Il est
1716 très probable que la requête ait été tapée à la main dans un client
1717 telnet et abortée trop tôt.
1718
1719 cR Le temps imparti au client a expiré avant réception d'une requête
1720 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1721 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1722 transporter des paquets entiers, ou par des clients qui énvoient des
1723 requêtes à la main et ne tapent pas assez vite.
1724
1725 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1726 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1727 être la couche réseau qui indique au proxy que le serveur n'est pas
1728 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1729
1730 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1731
1732 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1733 nombre de connexions a atteint la limite 'maxconn' (global ou de
1734 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1735 augmenté, tout comme le paramètre 'maxconn' global.
1736
1737 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1738 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1739 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1740 consiste à affiner le paramétrage système.
1741
1742 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1743 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1744 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1745 paquets entiers.
1746
willy tarreau078c79a2006-05-13 12:23:58 +02001747 CH Le client a abandonné alors qu'il attendait un début de réponse de la
1748 part du serveur. Cela peut être causé par le serveur qui mettait trop
1749 de temps à répondre, ou par un client cliquant précipitamment sur le
1750 bouton 'Stop'.
1751
1752 CQ Le client a abandonné alors que sa session était mise en file
1753 d'attente pour obtenir un serveur avec suffisamment de connexions
1754 libres pour l'accepter. Cela signifie soit que l'ensemble des
1755 serveurs étaient saturés, soit que le serveur assigné a mis trop de
1756 temps à répondre.
1757
1758 sQ La session a attendu trop longtemps en file d'attente et a été
1759 expirée.
1760
willy tarreauc5f73ed2005-12-18 01:26:38 +01001761 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
1762 en-têtes. En général, cela indique qu'il a crashé.
1763
1764 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
1765 des transactions trop longues, probablement causées par un back-end
1766 saturé. Les seules solutions sont de corriger le problème sur
1767 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
1768 des attentes plus longues au risque que les clients abandonnent à
1769 leur tour, ou bien d'ajouter des serveurs.
1770
1771 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
1772 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
1773 soit à cause d'une requête validant un filtre d'interdiction, auquel
1774 cas le proxy a renvoyé une erreur HTTP 403.
1775
1776 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
1777 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
1778 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
1779 renvoyée au client.
1780
1781 cD Le client n'a pas lu de données pendant le temps qui lui était
1782 imparti. Ceci est souvent causé par des problèmes réseau côté client.
1783
1784 CD Le client a aborté sa connection de manière inattendue pendant le
1785 transfert des données. Ceci est provoqué soit par le crash d'un
1786 navigateur, ou par une session en HTTP keep-alive entre le serveur
1787 et le client terminée en premier par le client.
1788
1789 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
1790 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
1791 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
1792 situés entre le proxy et le serveur.
1793
17944.2.5) Caractères non-imprimables
1795---------------------------------
1796Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
1797tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
1798hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
1799dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
1800caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
1801est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
1802les en-têtes.
1803
18044.2.6) Capture d'en-têtes HTTP et de cookies
1805--------------------------------------------
1806La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
1807capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
1808
1809Les captures de cookies facilitent le suivi et la reconstitution d'une session
1810utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01001811
1812 capture cookie <préfixe_cookie> len <longueur_capture>
1813
willy tarreauc5f73ed2005-12-18 01:26:38 +01001814Ceci activera la capture de cookies à la fois dans les requêtes et dans les
1815réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
1816bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
1817nouveau cookie.
1818
willy tarreau8337c6b2005-12-17 13:41:01 +01001819Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1820transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1821caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1822le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
1823place dans les logs.
1824
1825Exemples :
1826----------
1827 # capture du premier cookie dont le nom commence par "ASPSESSION"
1828 capture cookie ASPSESSION len 32
1829
1830 # capture du premier cookie dont le nom est exactement "vgnvisitor"
1831 capture cookie vgnvisitor= len 32
1832
willy tarreau036e1ce2005-12-17 13:46:33 +01001833Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01001834positionné par le serveur, précédé du cookie positionné par le client. Chacun
1835de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01001836par le client ou le serveur, ou lorsque l'option est désactivée..
1837
1838Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
1839pour suivre un identifiant de requête globalement unique positionné par un
1840autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
1841de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
1842peut chercher des informations relatives à la longueur annoncée de la réponse,
1843le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
1844de redirection. Tout comme pour les captures de cookies, il est possible
1845d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
1846la suivante :
1847
1848 capture request header <nom> len <longueur max>
1849 capture response header <nom> len <longueur max>
1850
1851Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01001852
willy tarreauc5f73ed2005-12-18 01:26:38 +01001853Exemples:
1854---------
1855 # conserver le nom du serveur virtuel accédé par le client
1856 capture request header Host len 20
1857 # noter la longueur des données envoyées dans un POST
1858 capture request header Content-Length len 10
1859
1860 # noter le fonctionnement attendu du cache par le serveur
1861 capture response header Cache-Control len 8
1862 # noter l'URL de redirection
1863 capture response header Location len 20
1864
1865Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
1866fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
1867regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
1868chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
1869réponse sont présentés de la même manière, mais après un espace suivant le bloc
1870d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
1871
1872 Config:
1873
1874 capture request header Host len 20
1875 capture request header Content-Length len 10
1876 capture request header Referer len 20
1877 capture response header Server len 20
1878 capture response header Content-Length len 10
1879 capture response header Cache-Control len 8
1880 capture response header Via len 20
1881 capture response header Location len 20
1882
1883 Log :
1884
willy tarreau532bb552006-05-13 18:40:37 +02001885 Aug 9 20:26:09 localhost haproxy[2022]: 127.0.0.1:34014 [09/Aug/2004:20:26:09] relais-http netcache 0/0/0/162/+162 200 +350 - - ---- 0/0/0 0/0 {fr.adserver.yahoo.co||http://fr.f416.mail.} {|864|private||} "GET http://fr.adserver.yahoo.com/"
1886 Aug 9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34020 [09/Aug/2004:20:30:46] relais-http netcache 0/0/0/182/+182 200 +279 - - ---- 0/0/0 0/0 {w.ods.org||} {Formilux/0.1.8|3495|||} "GET http://w.ods.org/sytadin.html HTTP/1.1"
1887 Aug 9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34028 [09/Aug/2004:20:30:46] relais-http netcache 0/0/2/126/+128 200 +223 - - ---- 0/0/0 0/0 {www.infotrafic.com||http://w.ods.org/syt} {Apache/2.0.40 (Red H|9068|||} "GET http://www.infotrafic.com/images/live/cartesidf/grandes/idf_ne.png HTTP/1.1"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001888
18894.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01001890-----------------------
willy tarreau532bb552006-05-13 18:40:37 +02001891- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/0/7/147/6723 200 243 - - ---- 1/3/5 0/0"HEAD / HTTP/1.0"
willy tarreauc1cae632005-12-17 14:12:23 +01001892 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
1893 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01001894
willy tarreau532bb552006-05-13 18:40:37 +02001895- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/1230/7/147/6870 200 243 - - ---- 99/239/324 0/9 "HEAD / HTTP/1.0"
1896 => Idem, mais la requête a été mise en attente dans la file globale derrière
1897 9 autres requêtes déjà présentes, et y a attendu 1230 ms.
1898
1899- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/0/7/14/+30 200 +243 - - ---- 1/3/3 0/0 "GET /image.iso HTTP/1.0"
willy tarreau982249e2005-12-18 00:57:06 +01001900 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
1901 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 +01001902 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 +01001903 total entre l'accept() et le premier octet de donnée est de 30 ms.
1904
willy tarreau532bb552006-05-13 18:40:37 +02001905- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/0/7/14/30 502 243 - - PH-- 0/2/3 0/0 "GET /cgi-bin/bug.cgi? HTTP/1.0"
willy tarreau982249e2005-12-18 00:57:06 +01001906 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
1907 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
1908 d'informations risquant d'être cachées. Dans ce cas, la réponse est
1909 remplacée par '502 bad gateway'.
1910
willy tarreau532bb552006-05-13 18:40:37 +02001911- haproxy[18113]: 127.0.0.1:34548 [15/Oct/2003:15:18:55] relais-http <NOSRV> -1/-1/-1/-1/8490 -1 0 - - CR-- 0/2/2 0/0 ""
willy tarreauc1cae632005-12-17 14:12:23 +01001912 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01001913 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01001914 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01001915
willy tarreau532bb552006-05-13 18:40:37 +02001916- haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06] relais-http <NOSRV> -1/-1/-1/-1/50001 408 0 - - cR-- 0/2/2 0/0 ""
willy tarreauc1cae632005-12-17 14:12:23 +01001917 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01001918 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01001919 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
1920 pu renvoyer un message 408 au client.
1921
willy tarreauc5f73ed2005-12-18 01:26:38 +01001922- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
1923 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
1924 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01001925
willy tarreau532bb552006-05-13 18:40:37 +02001926- haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/-1/11215 503 0 - - SC-- 115/202/205 0/0 "HEAD / HTTP/1.0"
willy tarreauc1cae632005-12-17 14:12:23 +01001927 => La requête client met 3s à entrer (peut-être un problème réseau), et la
1928 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreau532bb552006-05-13 18:40:37 +02001929 secondes (retries 3 dans la conf), puis un code 503 est retourné au
1930 client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
1931 instance, et 205 sur l'ensemble des instances pour ce processus. Il est
1932 possible que le serveur ait refusé la connexion parce qu'il y en avait
1933 déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01001934
willy tarreau4302f492005-12-18 01:00:37 +01001935
willy tarreauc5f73ed2005-12-18 01:26:38 +010019364.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01001937----------------------------------
1938En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
1939requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01001940possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
1941de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01001942connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
1943comme faisant partie des échanges de données consécutifs à la première requête.
1944Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01001945
1946La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01001947 reqadd <string> pour ajouter un en-tête dans la requête
1948 reqrep <search> <replace> pour modifier la requête
1949 reqirep <search> <replace> idem sans distinction majuscules/minuscules
1950 reqdel <search> pour supprimer un en-tête dans la requête
1951 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001952 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01001953 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001954 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01001955 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001956 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01001957 reqipass <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001958
willy tarreau036e1ce2005-12-17 13:46:33 +01001959 rspadd <string> pour ajouter un en-tête dans la réponse
1960 rsprep <search> <replace> pour modifier la réponse
1961 rspirep <search> <replace> idem sans distinction majuscules/minuscules
1962 rspdel <search> pour supprimer un en-tête dans la réponse
1963 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01001964 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01001965 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01001966 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001967
willy tarreau0f7af912005-12-17 12:21:26 +01001968
willy tarreau036e1ce2005-12-17 13:46:33 +01001969<search> est une expression régulière compatible POSIX regexp supportant le
1970groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
1971doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
1972chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
1973backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01001974
1975 \t pour une tabulation
1976 \r pour un retour charriot
1977 \n pour un saut de ligne
1978 \ pour différencier un espace d'un séparateur
1979 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01001980 \\ pour utiliser un backslash dans la regex
1981 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01001982 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01001983
willy tarreau0f7af912005-12-17 12:21:26 +01001984
willy tarreau5cbea6f2005-12-17 12:48:26 +01001985<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
1986Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
1987groupe délimité par des parenthèses dans l'expression régulière, par sa
1988position numérale. Les positions vont de 1 à 9, et sont codées par un '\'
1989suivi du chiffre désiré. Il est également possible d'insérer un caractère non
1990imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code
1991hexadécimal de ce caractère (comme en C).
1992
1993<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01001994dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001995
1996Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01001997-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001998 - 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 +01001999 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002000 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
2001 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
2002 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01002003 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
2004 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
2005 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01002006 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01002007 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
2008 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
willy tarreau0f7af912005-12-17 12:21:26 +01002009
2010Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01002011----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01002012 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01002013
willy tarreauc5f73ed2005-12-18 01:26:38 +01002014 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
2015 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
2016 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002017
willy tarreauc5f73ed2005-12-18 01:26:38 +01002018 # force proxy connections to close
2019 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
2020 # rewrite locations
2021 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002022
willy tarreauc5f73ed2005-12-18 01:26:38 +01002023 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01002024
willy tarreau197e8ec2005-12-17 14:10:59 +01002025 # Every header should end with a colon followed by one space.
2026 reqideny ^[^:\ ]*[\ ]*$
2027
2028 # block Apache chunk exploit
2029 reqideny ^Transfer-Encoding:[\ ]*chunked
2030 reqideny ^Host:\ apache-
2031
2032 # block annoying worms that fill the logs...
2033 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
2034 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
2035 reqideny ^[^:\ ]*\ .*<script
2036 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
2037
2038 # allow other syntactically valid requests, and block any other method
2039 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
2040 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
2041 reqideny ^[^:\ ]*\
2042
2043 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01002044 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01002045
willy tarreauc5f73ed2005-12-18 01:26:38 +01002046 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01002047 rspidel ^Server:\
2048 rspadd Server:\ Formilux/0.1.8
2049
willy tarreau0f7af912005-12-17 12:21:26 +01002050
willy tarreau982249e2005-12-18 00:57:06 +01002051De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01002052'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
2053connaître l'adresse IP du client initial.
2054
willy tarreau982249e2005-12-18 00:57:06 +01002055Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01002056en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01002057Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
2058méthode impliquant 4 règles.
2059
willy tarreauc1cae632005-12-17 14:12:23 +01002060Exemple :
2061---------
2062 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002063 mode http
2064 log global
2065 option httplog
2066 option dontlognull
2067 option forwardfor
2068 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01002069
Willy TARREAU767ba712006-03-01 22:40:50 +01002070Notons que certains serveurs HTTP ne referment pas nécessairement la session
2071TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
2072ce qui se traduit par des grands nombres de sessions établies et des temps
2073globaux très longs sur les requêtes. Pour contourner ce problème, la version
20741.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
2075vers le serveur dès qu'il commence à répondre et seulement si le tampon de
2076requête est vide. Attention toutefois à ne PAS utiliser cette option si des
2077méthodes CONNECT sont attendues entre le client et le serveur. L'option
2078'forceclose' implique l'option 'httpclose'.
2079
2080Exemple :
2081---------
2082 listen http_proxy 0.0.0.0:80
2083 mode http
2084 log global
2085 option httplog
2086 option dontlognull
2087 option forwardfor
2088 option forceclose
2089
2090
willy tarreauc29948c2005-12-17 13:10:27 +010020914.4) Répartition avec persistence
2092---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002093La combinaison de l'insertion de cookie avec la répartition de charge interne
2094permet d'assurer une persistence dans les sessions HTTP d'une manière
2095pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01002096 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01002097 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01002098 - insérer un cookie dans les réponses issues d'une répartition uniquement,
2099 et faire en sorte que des caches ne mémorisent pas ce cookie.
2100 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002101
2102Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01002103---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002104 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002105 mode http
2106 cookie SERVERID insert nocache indirect
2107 balance roundrobin
2108 server srv1 192.168.1.1:80 cookie server01 check
2109 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01002110
willy tarreau0174f312005-12-18 01:02:42 +01002111L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
2112cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
2113Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
2114client et le serveur de travailler en mode "keep-alive" afin que le proxy
2115puisse corriger le nom du cookie dans toutes les futures requêtes.
2116
2117 listen application 0.0.0.0:80
2118 mode http
2119 cookie JSESSIONID prefix
2120 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002121 server srv1 192.168.1.1:80 cookie srv1 check
2122 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002123 option httpclose
2124
2125
willy tarreau982249e2005-12-18 00:57:06 +010021264.5) Protection contre les fuites d'informations du serveur
2127-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002128Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002129créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002130'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2131un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2132activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002133 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002134 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002135 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002136 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002137 un en-tête 'Cache-control: public' ;
2138 - celles qui ont un en-tête 'Pragma: no-cache' ;
2139 - celles qui ont un en-tête 'Cache-control: private' ;
2140 - celles qui ont un en-tête 'Cache-control: no-store' ;
2141 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2142 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2143 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2144 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2145 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002146 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002147
willy tarreau982249e2005-12-18 00:57:06 +01002148Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2149même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2150message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2151dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002152en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002153l'administrateur sache qu'il y a une action correctrice à entreprendre.
2154
21554.6) Personalisation des erreurs
2156--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002157Certaines situations conduisent à retourner une erreur HTTP au client :
2158 - requête invalide ou trop longue => code HTTP 400
2159 - requête mettant trop de temps à venir => code HTTP 408
2160 - requête interdite (bloquée par un reqideny) => code HTTP 403
2161 - erreur interne du proxy => code HTTP 500
2162 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2163 - aucun serveur disponible pour cette requête => code HTTP 503
2164 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2165
2166Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2167Cependant, en fonction du type de clientèle, on peut préférer retourner des
willy tarreau64a3cc32005-12-18 01:13:11 +01002168pages personnalisées. Ceci est possible par le biais de la commande "errorloc":
willy tarreau8337c6b2005-12-17 13:41:01 +01002169
2170 errorloc <code_HTTP> <location>
2171
2172Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2173le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2174d'une page précisée dans <location>. Cette adresse peut être relative au site,
2175ou absolue. Comme cette réponse est traîtée par le navigateur du client
2176lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2177
2178Exemple :
2179---------
2180 listen application 0.0.0.0:80
2181 errorloc 400 /badrequest.html
2182 errorloc 403 /forbidden.html
2183 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002184 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002185 errorloc 502 http://192.168.114.58/error50x.html
2186 errorloc 503 http://192.168.114.58/error50x.html
2187 errorloc 504 http://192.168.114.58/error50x.html
2188
willy tarreauc1f47532005-12-18 01:08:26 +01002189Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2190accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2191problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2192régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2193dans le champ Location avec la méthode GET uniquement. Seulement, certains
2194navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2195plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2196devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002197l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2198visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002199
2200Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2201utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2202dès que vous savez que vos clients supportent le code de retour HTTP 303.
2203
willy tarreau982249e2005-12-18 00:57:06 +010022044.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002205--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002206Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2207évite de répéter des paramètres communs à toutes les instances, tels que les
2208timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002209
2210Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2211précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2212'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2213section implique une annulation de tous les paramètres par défaut positionnés
2214précédemment, dans le but de les remplacer.
2215
2216La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2217paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2218un commentaire en guise paramètre.
2219
willy tarreau982249e2005-12-18 00:57:06 +01002220Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2221positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002222 - log (le premier et le second)
2223 - mode { tcp, http, health }
2224 - balance { roundrobin }
2225 - disabled (pour désactiver toutes les instances qui suivent)
2226 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2227 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002228 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2229 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002230 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002231 - cookie, capture
2232 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002233
2234Ne sont pas supportés dans cette version, les adresses de dispatch et les
2235configurations de serveurs, ainsi que tous les filtres basés sur les
2236expressions régulières :
2237 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002238 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002239
2240Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2241positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2242défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2243paramètres par défaut avant la déclaration de l'instance.
2244
2245Exemples :
2246----------
2247 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002248 log global
2249 mode tcp
2250 balance roundrobin
2251 clitimeout 180000
2252 srvtimeout 180000
2253 contimeout 4000
2254 retries 3
2255 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002256
2257 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002258 server srv1 192.168.1.1 check port 6000 inter 10000
2259 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002260
2261 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002262 server srv1 192.168.2.1 check port 6000 inter 10000
2263 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002264
2265 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002266 log global
2267 mode http
2268 option httplog
2269 option forwardfor
2270 option dontlognull
2271 balance roundrobin
2272 clitimeout 20000
2273 srvtimeout 20000
2274 contimeout 4000
2275 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002276
2277 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002278 cookie SERVERID postonly insert indirect
2279 capture cookie userid= len 10
2280 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2281 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002282
2283 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002284 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002285
willy tarreaub719f002005-12-17 12:55:07 +01002286=======================
2287| Paramétrage système |
2288=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002289
2290Sous Linux 2.4
2291==============
2292
willy tarreaub719f002005-12-17 12:55:07 +01002293-- cut here --
2294#!/bin/sh
2295# set this to about 256/4M (16384 for 256M machine)
2296MAXFILES=16384
2297echo $MAXFILES > /proc/sys/fs/file-max
2298ulimit -n $MAXFILES
2299
2300if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002301 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002302fi
2303
2304if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002305 # 30 seconds for fin, 15 for time wait
2306 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2307 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2308 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2309 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002310fi
2311
willy tarreau0f7af912005-12-17 12:21:26 +01002312echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002313echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2314echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002315echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002316echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2317echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002318echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2319echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002320echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002321echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002322echo 0 > /proc/sys/net/ipv4/tcp_dsack
2323
2324# auto-tuned on 2.4
2325#echo 262143 > /proc/sys/net/core/rmem_max
2326#echo 262143 > /proc/sys/net/core/rmem_default
2327
2328echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2329echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2330
2331-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002332
willy tarreau197e8ec2005-12-17 14:10:59 +01002333Sous FreeBSD
2334============
2335
2336Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2337Clement Laforet <sheepkiller@cultdeadsheep.org>.
2338
2339Pour plus d'informations :
2340http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2341http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2342http://www.freshports.org/net/haproxy
2343
2344
willy tarreau0f7af912005-12-17 12:21:26 +01002345-- fin --