blob: 8e83eab093fb7cd07db7d04f101237ef9b639d67 [file] [log] [blame]
willy tarreau0174f312005-12-18 01:02:42 +01001 -------------------
Willy Tarreau94b45912006-05-31 06:40:15 +02002 HAProxy
willy tarreau0174f312005-12-18 01:02:42 +01003 Manuel de référence
4 -------------------
Willy Tarreau2272dc12006-09-03 10:19:38 +02005 version 1.3.2
willy tarreauc5f73ed2005-12-18 01:26:38 +01006 willy tarreau
Willy Tarreau2272dc12006-09-03 10:19:38 +02007 2006/09/03
willy tarreau0f7af912005-12-17 12:21:26 +01008
willy tarreaub719f002005-12-17 12:55:07 +01009================
10| Introduction |
11================
willy tarreau0f7af912005-12-17 12:21:26 +010012
Willy Tarreau94b45912006-05-31 06:40:15 +020013HAProxy est un relais TCP/HTTP offrant des facilités d'intégration en
willy tarreau0f7af912005-12-17 12:21:26 +010014environnement 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 tarreau8f635a42006-05-21 23:05:54 +020026 - fournir des rapports d'état en HTML à des utilisateurs authentifiés, à
27 travers des URI de l'application interceptées.
willy tarreau0f7af912005-12-17 12:21:26 +010028
willy tarreau64a3cc32005-12-18 01:13:11 +010029Il requiert peu de ressources, et son architecture événementielle mono-
30processus lui permet facilement de gérer plusieurs milliers de connexions
31simultanées sur plusieurs relais sans effondrer le système.
willy tarreaua1598082005-12-17 13:08:06 +010032
willy tarreau0f7af912005-12-17 12:21:26 +010033
34===========================
35| Paramètres de lancement |
36===========================
37
38Les options de lancement sont peu nombreuses :
39
40 -f <fichier de configuration>
41 -n <nombre maximal total de connexions simultanées>
willy tarreau532bb552006-05-13 18:40:37 +020042 = 'maxconn' dans la section 'global'
43 -N <nombre maximal de connexions simultanées par instance>
44 = 'maxconn' dans les sections 'listen' ou 'default'
willy tarreau0f7af912005-12-17 12:21:26 +010045 -d active le mode debug
46 -D passe en daemon
willy tarreau982249e2005-12-18 00:57:06 +010047 -q désactive l'affichage de messages sur la sortie standard.
48 -V affiche les messages sur la sortie standard, même si -q ou 'quiet' sont
49 spécifiés.
50 -c vérifie le fichier de configuration puis quitte avec un code de retour 0
51 si aucune erreur n'a été trouvée, ou 1 si une erreur de syntaxe a été
52 détectée.
willy tarreaufe2c5c12005-12-17 14:14:34 +010053 -p <fichier> indique au processus père qu'il doit écrire les PIDs de ses
54 fils dans ce fichier en mode démon.
willy tarreau34f45302006-04-15 21:37:14 +020055 -sf specifie une liste de PIDs auxquels envoyer un signal FINISH
56 -st specifie une liste de PIDs auxquels envoyer un signal TERMINATE
willy tarreau0f7af912005-12-17 12:21:26 +010057 -s affiche les statistiques (si option compilée)
58 -l ajoute des informations aux statistiques
Willy Tarreaude99e992007-04-16 00:53:59 +020059 -dk désactive l'utilisation de kqueue()
60 -ds désactive l'utilisation de epoll() speculatif
willy tarreau64a3cc32005-12-18 01:13:11 +010061 -de désactive l'utilisation de epoll()
62 -dp désactive l'utilisation de poll()
willy tarreau34f45302006-04-15 21:37:14 +020063 -db désactive la mise en arrière-plan (utile pour débugger)
64 -m <megs> applique une limitation de <megs> Mo d'utilisation mémoire
willy tarreau0f7af912005-12-17 12:21:26 +010065
willy tarreau64a3cc32005-12-18 01:13:11 +010066Le nombre maximal de connexion simultanées par proxy est le paramètre par
67défaut pour les proxies pour lesquels ce paramètre n'est pas précisé dans le
68fichier de configuration. Il s'agit du paramètre 'maxconn' dans les sections
69'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010070
willy tarreau64a3cc32005-12-18 01:13:11 +010071Le nombre maximal total de connexions simultanées limite le nombre de
72connexions TCP utilisables à un instant donné par le processus, tous proxies
73confondus. Ce paramètre remplace le paramètre 'maxconn' de la section 'global'.
willy tarreaua1598082005-12-17 13:08:06 +010074
willy tarreauc29948c2005-12-17 13:10:27 +010075Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
willy tarreauc5f73ed2005-12-18 01:26:38 +010076mode, toutes les connexions, déconnexions, et tous les échanges d'en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +010077sont affichés.
78
willy tarreau34f45302006-04-15 21:37:14 +020079Pour debugger, l'option '-db' est très pratique car elle désactive
80temporairement le mode daemon et le mode multi-processus. Le service peut alors
81être arrêté par un simple appui sur Ctrl-C, sans avoir à modifier la
82configuration ni à activer le mode debug complet.
83
willy tarreauc29948c2005-12-17 13:10:27 +010084Les statistiques ne sont disponibles que si le programme a été compilé avec
85l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
willy tarreau8f635a42006-05-21 23:05:54 +020086d'utilité que lors de benchmarks par exemple, et sont amenées à disparaitre.
willy tarreauc29948c2005-12-17 13:10:27 +010087
willy tarreau532bb552006-05-13 18:40:37 +020088Les paramètres '-st' et '-sf' sont utilisés pour la reconfiguration à chaud.
89Voir la section à ce sujet.
willy tarreau0f7af912005-12-17 12:21:26 +010090
91============================
92| Fichier de configuration |
93============================
94
willy tarreauc29948c2005-12-17 13:10:27 +010095Structure
96=========
willy tarreau0f7af912005-12-17 12:21:26 +010097
willy tarreaua1598082005-12-17 13:08:06 +010098L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
willy tarreau64a3cc32005-12-18 01:13:11 +010099les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est
100pas précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +0100101
102Le fichier de configuration est découpé en sections répérées par des mots clés
103tels que :
104
105 - 'global'
106 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +0100107 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +0100108
109Tous les paramètres font référence à la section définie par le dernier mot clé
110reconnu.
111
112
willy tarreauc29948c2005-12-17 13:10:27 +01001131) Paramètres globaux
114=====================
willy tarreaua1598082005-12-17 13:08:06 +0100115
116Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
117proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
118supportés sont :
119
willy tarreau8337c6b2005-12-17 13:41:01 +0100120 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100121 - maxconn <nombre>
122 - uid <identifiant>
123 - gid <identifiant>
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200124 - user <nom d'utilisateur>
125 - group <nom de groupe>
willy tarreaua1598082005-12-17 13:08:06 +0100126 - chroot <répertoire>
127 - nbproc <nombre>
128 - daemon
129 - debug
Willy Tarreaude99e992007-04-16 00:53:59 +0200130 - nokqueue
131 - nosepoll
willy tarreau64a3cc32005-12-18 01:13:11 +0100132 - noepoll
133 - nopoll
willy tarreaua1598082005-12-17 13:08:06 +0100134 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100135 - pidfile <fichier>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100136 - ulimit-n <nombre>
137
willy tarreaua1598082005-12-17 13:08:06 +0100138
1391.1) Journalisation des événements
140----------------------------------
141La plupart des événements sont journalisés : démarrages, arrêts, disparition et
142apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
143syslog vers un ou deux serveurs. La syntaxe est la suivante :
144
willy tarreau8337c6b2005-12-17 13:41:01 +0100145 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100146
147Les connexions sont envoyées en niveau "info". Les démarrages de service et de
148serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
149arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau64a3cc32005-12-18 01:13:11 +0100150bien pour les proxies que pour les serveurs testés par les proxies. Le
151paramètre optionnel <niveau_max> définit le niveau maximal de traces émises
152parmi les 8 valeurs suivantes :
willy tarreau8337c6b2005-12-17 13:41:01 +0100153 emerg, alert, crit, err, warning, notice, info, debug
154
willy tarreaueedaa9f2005-12-17 14:08:03 +0100155Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100156est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100157
158Les catégories possibles sont :
159 kern, user, mail, daemon, auth, syslog, lpr, news,
160 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
161 local0, local1, local2, local3, local4, local5, local6, local7
162
willy tarreau036e1ce2005-12-17 13:46:33 +0100163Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
164
willy tarreaua1598082005-12-17 13:08:06 +0100165Exemple :
166---------
167 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100168 log 192.168.2.200 local3
169 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100170
1711.2) limitation du nombre de connexions
172---------------------------------------
173Il est possible et conseillé de limiter le nombre global de connexions par
willy tarreauc5f73ed2005-12-18 01:26:38 +0100174processus à l'aide du mot clé global 'maxconn'. Les connexions sont comprises
175au sens 'acceptation de connexion', donc il faut s'attendre en règle général à
176avoir un peu plus du double de sessions TCP que le maximum de connexions fixé.
177C'est important pour fixer le paramètre 'ulimit -n' avant de lancer le proxy.
178Pour comptabiliser le nombre de sockets nécessaires, il faut prendre en compte
179ces paramètres :
180
willy tarreaua1598082005-12-17 13:08:06 +0100181 - 1 socket par connexion entrante
182 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100183 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100184 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100185 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100186
willy tarreau64a3cc32005-12-18 01:13:11 +0100187Dans le cas où chaque proxy n'écoute que sur un couple adresse/port,
willy tarreauc5f73ed2005-12-18 01:26:38 +0100188positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
189(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
190il est possible de spécifier cette limite dans la configuration à l'aide du
191mot-clé global 'ulimit-n', à condition bien entendu que le proxy ait été
192démarré sous le compte root (ou avec des droits suffisants pour élever le
193nombre de descripteurs de fichiers). Cette solution met un terme au problème
194récurrent d'incertitude de l'adéquation entre les limites systèmes lors de la
195dernière relance du proxessus et les limites en nombre de connexions. Noter que
196cette limite s'applique par processus.
197
198Exemple :
199---------
200 global
201 maxconn 32000
202 ulimit-n 65536
203
willy tarreauc29948c2005-12-17 13:10:27 +0100204
2051.3) Diminution des privilèges
206------------------------------
207Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
208serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100209de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100210
willy tarreauc29948c2005-12-17 13:10:27 +0100211Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
212numérique d'utilisateur. La valeur 0, correspondant normalement au super-
213utilisateur, possède ici une signification particulière car elle indique que
214l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
215C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
216un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200217changer. Dans le cas où il ne serait pas possible de spécifier un identifiant
218numérique pour l'uid, il est possible de spécifier un nom d'utilisateur après
219le mot-clé 'user'. De la même manière, il est possible de préciser un nom de
220groupe après le mot-clé 'group'.
221
222Il est particulièrement déconseillé d'utiliser des comptes génériques tels que
223'nobody' car cette pratique revient à utiliser 'root' si d'autres processus
224utilisent les mêmes identifiants.
willy tarreauc29948c2005-12-17 13:10:27 +0100225
226Le paramètre 'chroot' autorise à changer la racine du processus une fois le
227programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100228puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100229généralement contournable sur certains OS (Linux, Solaris) pour peu que
230l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
231un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
232service pour cet usage, et de ne pas mutualiser un même répertoire pour
233plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
234il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
235l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100236
willy tarreau64a3cc32005-12-18 01:13:11 +0100237Remarque importante :
238---------------------
239Dans le cas où une telle faille serait mise en évidence, il est fort probable
240que les premières tentatives de son exploitation provoquent un arrêt du
willy tarreauc29948c2005-12-17 13:10:27 +0100241programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
willy tarreau64a3cc32005-12-18 01:13:11 +0100242encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur
243en environnement limité réduit les risques d'intrusion, il est parfois bien
244utile dans ces circonstances de connaître les conditions d'apparition du
245problème, via l'obtention d'un fichier 'core'. La plupart des systèmes, pour
246des raisons de sécurité, désactivent la génération du fichier 'core' après un
247changement d'identifiant pour le processus. Il faudra donc soit lancer le
248processus à partir d'un compte utilisateur aux droits réduits (mais ne pouvant
249pas effectuer le chroot), ou bien le faire en root sans réduction des droits
250(uid 0). Dans ce cas, le fichier se trouvera soit dans le répertoire de
251lancement, soit dans le répertoire spécifié après l'option 'chroot'. Ne pas
252oublier la commande suivante pour autoriser la génération du fichier avant de
253lancer le programme :
willy tarreauc29948c2005-12-17 13:10:27 +0100254
255# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100256
willy tarreauc29948c2005-12-17 13:10:27 +0100257Exemple :
258---------
259
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200260 # with uid/gid
willy tarreauc29948c2005-12-17 13:10:27 +0100261 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100262 uid 30000
263 gid 30000
264 chroot /var/chroot/haproxy
willy tarreauc29948c2005-12-17 13:10:27 +0100265
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200266 # with user/group
267 global
268 user haproxy
269 group public
270 chroot /var/chroot/haproxy
271
272
willy tarreaufe2c5c12005-12-17 14:14:34 +01002731.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100274----------------------------
275Le service peut fonctionner dans plusieurs modes :
276 - avant- / arrière-plan
277 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100278
willy tarreau64a3cc32005-12-18 01:13:11 +0100279Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne
280rend pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci
281dans un script de démarrage du système, sinon le système ne finirait pas son
willy tarreauc29948c2005-12-17 13:10:27 +0100282initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
283au processus appelant. C'est ce que fait l'option 'daemon' de la section
284'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100285
willy tarreau34f45302006-04-15 21:37:14 +0200286Le paramètre de ligne de commande '-db' inhibe les options globales 'daemon'
287et 'nbproc' pour faire fonctionner le processus en mode normal, avant-plan.
288
willy tarreauc29948c2005-12-17 13:10:27 +0100289Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
290standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
291logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
292Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100293
willy tarreauc29948c2005-12-17 13:10:27 +0100294Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
295problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
296entre les clients et les serveurs. Ce mode est incompatible avec les options
297'daemon' et 'quiet' pour des raisons de bon sens.
298
willy tarreaufe2c5c12005-12-17 14:14:34 +01002991.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100300-----------------------------------------------
301Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
302processeur pour effectuer les tâches de relayage, même si les charges
303nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
304grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
305programme sait démarrer plusieurs processus se répartissant la charge de
306travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
307section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100308qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
309la limite de nombre de descripteurs de fichiers allouée par processus sous
310Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100311
312Exemple :
313---------
314
315 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100316 daemon
317 quiet
318 nbproc 2
willy tarreauc29948c2005-12-17 13:10:27 +0100319
willy tarreaufe2c5c12005-12-17 14:14:34 +01003201.6) Simplification de la gestion des processus
321-----------------------------------------------
322Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
323paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
324d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
325le numéro de PID des processus fils, à raison d'un par ligne (valable
326uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
327afin de rester compatible avec un répertoire protégé en lecture seule. Il
328appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
3290644.
330
331Exemple :
332---------
333
334 global
335 daemon
336 quiet
337 nbproc 2
338 pidfile /var/run/haproxy-private.pid
339
340 # pour stopper seulement ces processus parmi d'autres :
341 # kill $(</var/run/haproxy-private.pid)
342
willy tarreau34f45302006-04-15 21:37:14 +0200343 # pour recharger une configuration avec un impact minimal sur le service,
344 # et sans casser les sessions existantes :
345 # haproxy -f haproxy.cfg -p $(</var/run/haproxy-private.pid) -st $(</var/run/haproxy-private.pid)
willy tarreauc29948c2005-12-17 13:10:27 +0100346
willy tarreau64a3cc32005-12-18 01:13:11 +01003471.7) Mécanismes de traitements des événements
348---------------------------------------------
349A partir de la version 1.2.5, haproxy supporte les mécanismes poll() et
350epoll(). Sur les systems où select() est limité par FD_SETSIZE (comme Solaris),
351poll() peut être une alternative intéressante. Des tests de performance
352montrent que les performances de poll() ne décroissent pas aussi vite que le
353nombre de sockets augmente, ce qui en fait une solution sûre pour les fortes
354charges. Cela dit, Soalris utilise déjà poll() pour émuler select(), donc tant
355que le nombre de sockets ne dépasse pas FD_SETSIZE, poll() ne devrait pas
356apporter de performances supplémentaires. Sur les systèmes à base Linux
357incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
358qui est extrèmement rapide indépendamment du nombre de sockets. Les tests sur
359haproxy ont montré une performance constante de 1 à 40000 sessions simultanées.
Willy Tarreaude99e992007-04-16 00:53:59 +0200360La version 1.3.9 a introduit le support de kqueue() pour FreeBSD/OpenBSD, ainsi
361qu'une variante appelée "speculative epoll()" consistant à tenter d'effectuer
362les opérations d'entrées/sorties avant de chaîner les événements par les appels
363système.
willy tarreau64a3cc32005-12-18 01:13:11 +0100364
Willy Tarreaude99e992007-04-16 00:53:59 +0200365Haproxy utilisera kqueue() ou speculative epoll() lorsque ce sera disponible,
366puis epoll(), et se repliera sur poll(), puis en dernier lieu sur select().
367Cependant, si pour une raison quelconque il s'avérait nécessaire de désactiver
368epoll() ou poll() (p.ex: à cause d'un bug ou juste pour comparer les
369performances), de nouvelles options globales ont été ajoutées dans ce but :
370'nosepoll', 'nokqueue', 'noepoll' et 'nopoll'.
willy tarreau64a3cc32005-12-18 01:13:11 +0100371
372Exemple :
373---------
374 global
375 # utiliser seulement select()
376 noepoll
377 nopoll
378
379Remarque :
380----------
381Dans le but d'assurer une portabilité maximale des configurations, ces options
382sont acceptées et ignorées si les mécanismes poll() ou epoll() n'ont pas été
383activés lors de la compilation.
384
385Afin de simplifier la résolution de problèmes, le paramètre '-de' en ligne de
Willy Tarreaude99e992007-04-16 00:53:59 +0200386commande désactive epoll(), le paramètre '-dp' désactive poll(), '-dk' kqueue()
387et '-ds' désactive speculative epoll(). Ils sont respectivement équivalents à
388'noepoll', 'nopoll', 'nokqueue' et 'nosepoll'.
willy tarreau64a3cc32005-12-18 01:13:11 +0100389
390
willy tarreauc29948c2005-12-17 13:10:27 +01003912) Définition d'un service en écoute
392====================================
393
394Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100395
willy tarreaua41a8b42005-12-17 14:02:24 +0100396 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100397
willy tarreauc29948c2005-12-17 13:10:27 +0100398- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
willy tarreau64a3cc32005-12-18 01:13:11 +0100399 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé.
400 Aucun test n'est effectué concernant l'unicité de ce nom, qui n'est pas
401 obligatoire, mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100402
willy tarreaua41a8b42005-12-17 14:02:24 +0100403- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
404 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
405 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100406
willy tarreaua41a8b42005-12-17 14:02:24 +0100407- <plage_ports> correspond soit à un port, soit à une plage de ports sur
408 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
409 Cette plage peut être :
410 - soit un port numérique (ex: '80')
411 - soit une plage constituée de deux valeurs séparées par un tiret
412 (ex: '2000-2100') représentant les extrémités incluses dans la
413 plage.
414 Il faut faire attention à l'usage des plages, car chaque combinaison
415 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
416 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
417 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
willy tarreau64a3cc32005-12-18 01:13:11 +0100418 niveau de privilège particulier lors du lancement du programme
419 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100420
willy tarreaua41a8b42005-12-17 14:02:24 +0100421- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
422 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
423 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
424
425Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100426---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100427 listen http_proxy :80
428 listen x11_proxy 127.0.0.1:6000-6009
429 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
430 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100431
willy tarreaua41a8b42005-12-17 14:02:24 +0100432Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
433rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
434de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
435l'écriture de configurations :
436
437 bind [ <adresse_IP>:<plage_ports>[,...] ]
438
439Exemples :
440----------
441 listen http_proxy
442 bind :80,:443
willy tarreauc5f73ed2005-12-18 01:26:38 +0100443 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100444
willy tarreauc29948c2005-12-17 13:10:27 +01004452.1) Inhibition d'un service
446----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100447Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100448commenter toute une partie du fichier. Il suffit de positionner le mot clé
449"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100450
451 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100452 disabled
willy tarreau0f7af912005-12-17 12:21:26 +0100453
willy tarreaueedaa9f2005-12-17 14:08:03 +0100454Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
willy tarreauc5f73ed2005-12-18 01:26:38 +0100455 désactivé par le mot clé 'disabled', par exemple à cause d'une
456 configuration par défaut.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100457
willy tarreauc29948c2005-12-17 13:10:27 +01004582.2) Mode de fonctionnement
459---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100460Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100461 - TCP
462 - HTTP
willy tarreau532bb552006-05-13 18:40:37 +0200463 - état de santé
willy tarreau0f7af912005-12-17 12:21:26 +0100464
465Mode TCP
466--------
willy tarreau64a3cc32005-12-18 01:13:11 +0100467Dans ce mode, le service relaye, dès leur établissement, les connexions TCP
468vers un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il
469s'agit simplement d'une association
470 source<adresse:port> -> destination<adresse:port>.
willy tarreauc29948c2005-12-17 13:10:27 +0100471Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100472
willy tarreauc29948c2005-12-17 13:10:27 +0100473Exemple :
474---------
willy tarreau0f7af912005-12-17 12:21:26 +0100475 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100476 mode tcp
willy tarreau0f7af912005-12-17 12:21:26 +0100477
478Mode HTTP
479---------
willy tarreauc29948c2005-12-17 13:10:27 +0100480Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
481serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
willy tarreauc5f73ed2005-12-18 01:26:38 +0100482décision. Les en-têtes HTTP sont analysés pour y trouver un éventuel cookie, et
willy tarreauc29948c2005-12-17 13:10:27 +0100483certains d'entre-eux peuvent être modifiés par le biais d'expressions
484régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
485relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100486
willy tarreauc29948c2005-12-17 13:10:27 +0100487Exemple :
488---------
willy tarreau0f7af912005-12-17 12:21:26 +0100489 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100490 mode http
willy tarreau0f7af912005-12-17 12:21:26 +0100491
492Mode supervision
493----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100494Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
495santé du service. Il se contente de retourner "OK" à tout client se connectant
496sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100497déterminer quels sont les services utilisables. Si l'option 'httpchk' est
498activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
499attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100500le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100501
willy tarreauc29948c2005-12-17 13:10:27 +0100502Exemple :
503---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100504 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100505 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100506 mode health
willy tarreau0f7af912005-12-17 12:21:26 +0100507
willy tarreau197e8ec2005-12-17 14:10:59 +0100508 # réponse HTTP : 'HTTP/1.0 200 OK'
509 listen http_health_check 0.0.0.0:60001
willy tarreauc5f73ed2005-12-18 01:26:38 +0100510 mode health
511 option httpchk
willy tarreau197e8ec2005-12-17 14:10:59 +0100512
willy tarreau0f7af912005-12-17 12:21:26 +0100513
willy tarreau532bb552006-05-13 18:40:37 +02005142.2.1 Supervision
515-----------------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100516Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
517bon fonctionnement du proxy sans perturber le service. Le mot-clé 'monitor-net'
518a été créé dans le butd de spécifier un réseau d'équipements qui ne PEUVENT PAS
519utiliser le service pour autre chose que des tests de fonctionnement. C'est
520particulièrement adapté aux proxies TCP, car cela empêche le proxy de relayer
521des établissements de connexion émis par un outil de surveillance.
522
523Lorsque c'est utilisé sur un proxy TCP, la connexion est acceptée puis refermée
524et rien n'est logué. C'est suffisant pour qu'un répartiteur de charge en amont
525détecte que le service est disponible.
526
527Lorsque c'est utilisé sur un proxy HTTP, la connexion est acceptée, rien n'est
528logué, puis la réponse suivante est envoyée et la session refermée :
529"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un répartiteur de charge
530HTTP en amont détecte le service comme opérationnel, aussi bien à travers des
531tests TCP que HTTP.
532
533Les proxies utilisant le mot-clé 'monitor-net' peuvent accessoirement se passer
534de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
535émises depuis d'autres adresses que celles du réseau de tests.
536
537Exemple :
538---------
539
540 listen tse-proxy
541 bind :3389,:1494,:5900 # TSE, ICA and VNC at once.
542 mode tcp
543 balance roundrobin
544 server tse-farm 192.168.1.10
545 monitor-net 192.168.1.252/31 # L4 load-balancers on .252 and .253
546
547
Willy Tarreau1c47f852006-07-09 08:22:27 +0200548Lorsque le système effectuant les tests est situé derrière un proxy, le mot-clé
549'monitor-net' n'est pas utilisable du fait que haproxy verra toujours la même
550adresse pour le proxy. Pour pallier à cette limitation, la version 1.2.15 a
551apporté le mot-clé 'monitor-uri'. Il définit une URI qui ne sera ni retransmise
552ni logée, mais pour laquelle haproxy retournera immédiatement une réponse
553"HTTP/1.0 200 OK". Cela rend possibles les tests de validité d'une chaîne
554reverse-proxy->haproxy en une requête HTTP. Cela peut être utilisé pour valider
555une combinaision de stunnel+haproxy à l'aide de tests HTTPS par exemple. Bien
556entendu, ce mot-clé n'est valide qu'en mode HTTP, sinon il n'y a pas de notion
557d'URI. Noter que la méthode et la version HTTP sont simplement ignorées.
558
559Exemple :
560---------
561
562 listen stunnel_backend :8080
563 mode http
564 balance roundrobin
565 server web1 192.168.1.10:80 check
566 server web2 192.168.1.11:80 check
567 monitor-uri /haproxy_test
568
569
willy tarreauc29948c2005-12-17 13:10:27 +01005702.3) Limitation du nombre de connexions simultanées
571---------------------------------------------------
572Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
573connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
574d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
575limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100576
willy tarreauc29948c2005-12-17 13:10:27 +0100577Exemple :
578---------
579 listen tiny_server 0.0.0.0:80
580 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100581
582
willy tarreauc29948c2005-12-17 13:10:27 +01005832.4) Arrêt en douceur
584---------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100585Il est possible d'arrêter les services en douceur en envoyant un signal
willy tarreau22739ef2006-01-20 20:43:32 +0100586SIGUSR1 au processus relais. Tous les services seront alors mis en phase
willy tarreau64a3cc32005-12-18 01:13:11 +0100587d'arrêt, mais pourront continuer d'accepter des connexions pendant un temps
588défini par le paramètre 'grace' (en millisecondes). Cela permet par exemple,
589de faire savoir rapidement à un répartiteur de charge qu'il ne doit plus
590utiliser un relais, tout en continuant d'assurer le service le temps qu'il
591s'en rende compte.
592
593Remarque :
594----------
595Les connexions actives ne sont jamais cassées. Dans le pire des cas, il faudra
willy tarreau22739ef2006-01-20 20:43:32 +0100596attendre en plus leur expiration avant l'arrêt total du processus, ou bien tuer
597manuellement le processus par l'envoi d'un signal SIGTERM. La valeur par défaut
598du paramètre 'grace' est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100599
600Exemple :
601---------
willy tarreauc29948c2005-12-17 13:10:27 +0100602 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100603 # le service tournera encore 10 secondes après la demande d'arrêt
604 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100605 mode http
606 grace 10000
willy tarreau0f7af912005-12-17 12:21:26 +0100607
willy tarreauc29948c2005-12-17 13:10:27 +0100608 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100609 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100610 mode health
611 grace 0
willy tarreau0f7af912005-12-17 12:21:26 +0100612
willy tarreau39df2dc2006-01-29 21:56:05 +0100613A partir de la version 1.2.8, un nouveau mécanisme de reconfiguration à chaud
willy tarreau22739ef2006-01-20 20:43:32 +0100614a été introduit. Il est désormais possible de mettre les proxies en "pause" en
615envoyant un signal SIGTTOU aux processus. Cela désactivera les sockets d'écoute
616sans casser les sessions existantes. Suite à cela, l'envoi d'un signal SIGTTIN
617réactivera les sockets d'écoute. Ceci est très pratique pour tenter de charger
618une nouvelle configuration ou même une nouvelle version de haproxy sans casser
619les connexions existantes. Si le rechargement s'effectue correctement, il ne
620reste plus qu'à envoyer un signal SIGUSR1 aux anciens processus, ce qui
621provoquera leur arrêt immédiat dès que leurs connexions seront terminées ; en
622revanche, si le rechargement échoue, il suffit d'envoyer un signal SIGTTIN pour
623remettre les ports en écoute et rétablir le service immédiatement. Veuillez
624noter que le paramètre 'grace' est ignoré pour le signal SIGTTOU ainsi que le
625signal SIGUSR1 une fois le processus en pause. Aussi, il peut s'avérer très
626utile de sauver le fichier de pid avant de démarrer une nouvelle instance.
627
willy tarreau34f45302006-04-15 21:37:14 +0200628Ce mécanisme est pleinement exploité à partir de la version 1.2.11 avec les
willy tarreau532bb552006-05-13 18:40:37 +0200629options '-st' et '-sf' (voir ci-dessous).
630
6312.4) Reconfiguration à chaud
632----------------------------
633Les paramètres '-st' et '-sf' sont utilisés pour informer des processus
634existants que la configuration va être rechargée. Ils recevront le signal
635SIGTTOU, leur demandant de libérer les ports en écoute afin que le nouveau
636processus puisse les prendre. Si quoi que ce soit se passe mal, le nouveau
637processus leur enverra un signal SIGTTIN pour leur indiquer qu'ils peuvent
638se remettre en écoute et continuer leur travail. En revanche, si la
639configuration se charge correctement, alors ils recevront un signal de demande
640de fin de travail en douceur (-sf), ou de terminaison immédiate (-st) qui
641coupera les sessions en cours. Un usage typique tel que celui-ci permet de
642recharger une configuration sans interruption de service :
643
644 # haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
645
willy tarreau0f7af912005-12-17 12:21:26 +0100646
willy tarreauc29948c2005-12-17 13:10:27 +01006472.5) Temps d'expiration des connexions
648--------------------------------------
649Il est possible de paramétrer certaines durées d'expiration au niveau des
650connexions TCP. Trois temps indépendants sont configurables et acceptent des
651valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
652session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100653
654 - temps d'attente d'une donnée de la part du client, ou de la
655 possibilité de lui envoyer des données : "clitimeout" :
656
willy tarreauc5f73ed2005-12-18 01:26:38 +0100657 # time-out client à 2mn30.
658 clitimeout 150000
willy tarreau0f7af912005-12-17 12:21:26 +0100659
660 - temps d'attente d'une donnée de la part du serveur, ou de la
661 possibilité de lui envoyer des données : "srvtimeout" :
662
willy tarreauc5f73ed2005-12-18 01:26:38 +0100663 # time-out serveur à 30s.
664 srvtimeout 30000
willy tarreau0f7af912005-12-17 12:21:26 +0100665
666 - temps d'attente de l'établissement d'une connexion vers un serveur
667 "contimeout" :
668
willy tarreauc29948c2005-12-17 13:10:27 +0100669 # on abandonne si la connexion n'est pas établie après 4 secondes
willy tarreauc5f73ed2005-12-18 01:26:38 +0100670 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100671
willy tarreauc29948c2005-12-17 13:10:27 +0100672Remarques :
673-----------
674 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
675 type "health".
676 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
willy tarreau64a3cc32005-12-18 01:13:11 +0100677 possible de perdre des paquets. Du fait que la première retransmission
678 TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
679 inférieur à 3 secondes ne permet pas de se rattraper sur la perte
680 de paquets car la session aura été abandonnée avant la première
681 retransmission. Une valeur de 4 secondes réduira considérablement
682 le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100683
willy tarreauc29948c2005-12-17 13:10:27 +01006842.6) Tentatives de reconnexion
685------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100686Lors d'un échec de connexion vers un serveur, il est possible de
687retenter (potentiellement vers un autre serveur, en cas de répartition
688de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100689abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100690
willy tarreauc29948c2005-12-17 13:10:27 +0100691Exemple :
692---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100693 # on essaie encore trois fois maxi
694 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100695
willy tarreau34f45302006-04-15 21:37:14 +0200696Il est à noter que la tentative de reconnexion peut amener à utiliser un autre
697serveur si le premier a disparu entre deux tentatives de connexion.
698
willy tarreau0f7af912005-12-17 12:21:26 +0100699
willy tarreauc29948c2005-12-17 13:10:27 +01007002.7) Adresse du serveur
701-----------------------
702Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
703le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
704serveur d'assignation de cookie dans le cas où le service consiste à assurer
705uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100706le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
707du serveur distant, et il est maintenant recommandé d'utiliser de préférence
708le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100709
willy tarreauc29948c2005-12-17 13:10:27 +0100710Exemple :
711---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100712 # on envoie toutes les nouvelles connexions ici
713 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100714
willy tarreauc29948c2005-12-17 13:10:27 +0100715Remarque :
716----------
717Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
718'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100719
willy tarreau0f7af912005-12-17 12:21:26 +0100720
willy tarreau240afa62005-12-17 13:14:35 +01007212.8) Adresse de sortie
722----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100723Il est possible de forcer l'adresse utilisée pour établir les connexions vers
724les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
725port, bien que cette fonctionnalité se limite à des usages très spécifiques.
726C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100727pour permettre aux serveurs de trouver le chemin de retour dans des contextes
728de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
729choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
730librement par le système. Il est à noter que depuis la version 1.1.18, les
731tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
732source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100733
734Exemples :
735----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100736 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100737 # toutes les connexions prennent l'adresse 192.168.1.200
738 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100739
willy tarreaua41a8b42005-12-17 14:02:24 +0100740 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100741 # utiliser l'adresse 192.168.1.200 et le port réservé 900
742 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100743
744
7452.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100746--------------------------------
747En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
748vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
749par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100750
willy tarreauc29948c2005-12-17 13:10:27 +0100751Exemple :
752---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100753 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100754 mode http
755 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100756
willy tarreauc29948c2005-12-17 13:10:27 +0100757On peut modifier l'utilisation du cookie pour la rendre plus intelligente
758vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
759réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
760cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100761de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
762inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100763
764Exemples :
765----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100766
767Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100768dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
769directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100770
willy tarreauc5f73ed2005-12-18 01:26:38 +0100771 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100772
willy tarreauc29948c2005-12-17 13:10:27 +0100773Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
774lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100775
willy tarreauc5f73ed2005-12-18 01:26:38 +0100776 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100777
willy tarreau64a3cc32005-12-18 01:13:11 +0100778Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
779accès en répartition de charge interne. Dans ce cas, il est souhaitable que
780tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100781retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100782
willy tarreauc5f73ed2005-12-18 01:26:38 +0100783 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100784
willy tarreau0174f312005-12-18 01:02:42 +0100785Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
786puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
787permet d'insérer une instance de haproxy devant une application sans risquer
788d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
789plus d'un cookie :
790
791 cookie JSESSIONID prefix
792
willy tarreau240afa62005-12-17 13:14:35 +0100793Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
794ajouter le mot clé 'nocache' après 'insert' :
795
willy tarreauc5f73ed2005-12-18 01:26:38 +0100796 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100797
willy tarreau64a3cc32005-12-18 01:13:11 +0100798Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
799mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100800
willy tarreauc5f73ed2005-12-18 01:26:38 +0100801 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100802
willy tarreau240afa62005-12-17 13:14:35 +0100803
willy tarreau96d40372005-12-17 13:11:56 +0100804Remarques :
805-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100806- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
807 s'adapter à des applications générant déjà le cookie, avec un contenu
808 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100809
willy tarreau96d40372005-12-17 13:11:56 +0100810- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
811 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
812 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100813
willy tarreau240afa62005-12-17 13:14:35 +0100814- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
815 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
816 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
817 cookie de persistence inséré, donc provoquer des changements de serveurs pour
818 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100819
willy tarreau0174f312005-12-18 01:02:42 +0100820- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
821 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
822 présenté par l'application qui est censée savoir à quel moment il peut
823 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
824 présenté par le client dans chaque requête ultérieure, il est indispensable
825 de s'assurer que le client et le serveur communiqueront sans "keep-alive
826 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
827
willy tarreaucd878942005-12-17 13:27:43 +0100828- lorsque l'application est bien connue, et que les parties nécessitant de la
829 persistence sont systématiquement accédées par un formulaire en mode POST,
830 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
831 et "indirect", car la page d'accueil reste cachable, et c'est l'application
832 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100833
willy tarreau240afa62005-12-17 13:14:35 +01008342.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100835----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100836En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
837par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100838
willy tarreau5cbea6f2005-12-17 12:48:26 +0100839 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100840
willy tarreauc29948c2005-12-17 13:10:27 +0100841- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
842 configuration et les logs.
843- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
844- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100845
846Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100847---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100848 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100849 mode http
850 cookie SERVERID
851 dispatch 192.168.1.100:80
852 server web1 192.168.1.1:80 cookie server01
853 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100854
855Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100856-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100857
willy tarreaua41a8b42005-12-17 14:02:24 +01008583) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100859=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100860
willy tarreauc29948c2005-12-17 13:10:27 +0100861Le relais peut effectuer lui-même la répartition de charge entre les différents
862serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
863cela, on précise le mot clé 'balance' dans la définition du service,
willy tarreau34f45302006-04-15 21:37:14 +0200864éventuellement suivi du nom d'un algorithme de répartition. Jusqu'à la version
8651.2.11, seul 'roundrobin' était géré, et c'est aussi la valeur implicite par
Willy Tarreau2fcb5002007-05-08 13:35:26 +0200866défaut. Avec la version 1.2.12, le nouveau mot clé 'source' est apparu. La
867version 1.3.10 a également apporté le mot clé 'uri'. Il est évident qu'en cas
868d'utilisation du répartiteur interne, il ne faudra pas spécifier d'adresse de
869dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100870
871Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100872---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100873
willy tarreaua41a8b42005-12-17 14:02:24 +0100874 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100875 mode http
876 cookie SERVERID
877 balance roundrobin
878 server web1 192.168.1.1:80 cookie server01
879 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100880
willy tarreaua41a8b42005-12-17 14:02:24 +0100881Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
882du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
883sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
884champ <port> de l'adresse serveur :
885
886 - non spécifié ou nul :
887 la connexion sera envoyée au serveur sur le même port que celui sur
888 lequel le relais a reçu la connexion.
889
890 - valeur numérique (seul cas supporté pour les versions antérieures) :
891 le serveur recevra la connexion sur le port désigné.
892
893 - valeur numérique précédée d'un signe '+' :
894 la connexion sera envoyée au serveur sur le même port que celui sur
895 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
896
897 - valeur numérique précédée d'un signe '-' :
898 la connexion sera envoyée au serveur sur le même port que celui sur
899 lequel le relais a reçu la connexion, duquel on soustrait la valeur
900 désignée.
901
902Exemples :
903----------
904
905# même que précédemment
906
907 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100908 mode http
909 cookie SERVERID
910 balance roundrobin
911 server web1 192.168.1.1 cookie server01
912 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100913
914# relayage simultané des ports 80 et 81 et 8080-8089
915
916 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100917 mode http
918 cookie SERVERID
919 balance roundrobin
920 server web1 192.168.1.1 cookie server01
921 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100922
923# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
924
925 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100926 mode tcp
927 balance roundrobin
928 server srv1 192.168.1.1:+1000
929 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100930
willy tarreau34f45302006-04-15 21:37:14 +0200931Comme indiqué précédemment, la version 1.2.12 apporta le nouveau mot clé
932'source'. Lorsque celui-ci est utilisé, l'adresse IP du client est hachée et
933distribuée de manière homogène parmi les serveurs disponibles, de sorte qu'une
934même adresse IP aille toujours sur le même serveur tant qu'il n'y a aucun
935changement dans le nombre de serveurs disponibles. Ceci peut être utilisé par
936exemple pour attacher le HTTP et le HTTPS sur un même serveur pour un même
937client. Cela peut également être utilisé pour améliorer la persistance
938lorsqu'une partie de la population des clients n'accepte pas les cookies. Dans
939ce cas, seuls ces derniers seront perturbés par la perte d'un serveur.
940
941NOTE: il est important de prendre en compte le fait que beaucoup d'internautes
942 naviguent à travers des fermes de proxies qui assignent des adresses IP
943 différentes à chaque requête. D'autres internautes utilisent des liens à
944 la demande et obtiennent une adresse IP différente à chaque connexion. De
945 ce fait, le paramètre 'source' doit être utilisé avec une extrème
946 précaution.
947
948Exemples :
949----------
950
951# assurer qu'une même adresse IP ira sur le même serveur pour tout service
952
953 listen http_proxy
954 bind :80,:443
955 mode http
956 balance source
957 server web1 192.168.1.1
958 server web2 192.168.1.2
959
960# améliorer la persistance par l'utilisation de la source en plus du cookie :
961
962 listen http_proxy :80
963 mode http
964 cookie SERVERID
965 balance source
966 server web1 192.168.1.1 cookie server01
967 server web2 192.168.1.2 cookie server02
968
Willy Tarreau2fcb5002007-05-08 13:35:26 +0200969De plus, tel qu'indiqué ci-dessus, la version 1.3.10 a introduit le mot clé
970'uri'. Il est très pratique dans le cas de répartition de charge entre des
971reverse-proxy-caches, parce qu'il utilisera le résultat d'un hachage de l'URI
972pour choisir un serveur, ce qui aura pour effet d'optimiser le taux de cache
973du fait que la même URI sera toujours envoyée au même cache. Ce mot-clé n'est
974autorisé qu'en mode HTTP.
975
976Example :
977---------
978
979# Envoie toujours une URI donnée au même serveur
980
981 listen http_proxy
982 bind :3128
983 mode http
984 balance uri
985 server squid1 192.168.1.1
986 server squid2 192.168.1.2
987
willy tarreau0f7af912005-12-17 12:21:26 +0100988
willy tarreauc29948c2005-12-17 13:10:27 +01009893.1) Surveillance des serveurs
990------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100991Il est possible de tester l'état des serveurs par établissement de connexion
992TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
993utilisé dans le processus de répartition de charge interne. Pour activer la
994surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
995Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
996tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
997paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
998Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreau34f45302006-04-15 21:37:14 +0200999
willy tarreaue47c8d72005-12-17 12:55:52 +01001000 - inter : 2000
1001 - rise : 2
1002 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +01001003 - port : port de connexion du serveur
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001004 - addr : adresse de connexion du serveur (par defaut: adresse du serveur)
1005
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001006Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001007certains cas de pannes, des serveurs peuvent continuer à accepter les
1008connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
1009d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
1010et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
1011les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
1012contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
1013RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
10141.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
1015possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
1016l'avantage d'être facilement extractibles des logs, et de ne pas induire
1017d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
1018considérées valides, les autres (y compris non-réponses) aboutissent à un
1019échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
1020deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
1021"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
1022accepte donc 4 formes :
willy tarreau34f45302006-04-15 21:37:14 +02001023
willy tarreaueedaa9f2005-12-17 14:08:03 +01001024 - option httpchk -> OPTIONS / HTTP/1.0
1025 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
1026 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
1027 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreau34f45302006-04-15 21:37:14 +02001028
Willy Tarreauf3c69202006-07-09 16:42:34 +02001029HAProxy est souvent utilisé pour relayer divers protocoles reposant sur TCP,
1030tels que HTTPS, SMTP ou LDAP, le plus commun étant HTTPS. Un problème assez
1031couramment rencontré dans les data centers est le besoin de relayer du trafic
1032vers des serveurs lointains tout en maintenant la possibilité de basculer sur
1033un serveur de secours. Les tests purement TCP ne suffisent pas toujours dans
1034ces situations car l'on trouve souvent, dans la chaîne, des proxies, firewalls
1035ou répartiteurs de charge qui peuvent acquitter la connexion avant qu'elle
1036n'atteigne le serveur. La seule solution à ce problème est d'envoyer des tests
1037applicatifs. Comme la demande pour les tests HTTPS est élevée, ce test a été
1038implémenté en version 1.2.15 sur la base de messages SSLv3 CLIENT HELLO. Pour
1039l'activer, utiliser "option ssl-hello-chk". Ceci enverra des messages SSLv3
1040CLIENT HELLO aux serveurs, en annonçant un support pour la majorité des
1041algorithmes de chiffrement. Si en retour, le serveur envoie ce qui ressemble à
1042une réponse SSLv3 SERVER HELLO ou ALERT (refus des algorithmes), alors la
1043réponse sera considérée comme valide. Noter qu'Apache ne produit pas de log
1044lorsqu'il reçoit des messages HELLO, ce qui en fait un type de message
1045parfaitement adapté à ce besoin.
1046
willy tarreauc5f73ed2005-12-18 01:26:38 +01001047Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001048
willy tarreau8337c6b2005-12-17 13:41:01 +01001049Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
1050utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
1051ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
1052de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
1053les 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 +01001054de répartition de charge entre des serveurs de secours par défaut. A partir
1055de la version 1.2.9, il est possible de les utiliser simultanément grâce à
1056l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
1057d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
1058de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
1059définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
1060qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +01001061
willy tarreaua41a8b42005-12-17 14:02:24 +01001062Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
1063vers un port différent de celui de service. C'est nécessaire principalement
1064pour les configurations où le serveur n'a pas de port prédéfini, par exemple
1065lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001066le paramètre 'port' suivi du numéro de port devant répondre aux requêtes. Il
1067est possible d'envoyer les tests de fonctionnement vers une adresse différente
1068de celle de service. Cela permet d'utiliser, sur la machine faisant fonctionner
1069HAproxy, un démon permettant des tests specifiques ( REGEX sur un résultat et
1070basculement de plusieurs fermes en cas d'erreur sur l'une d'elles).
willy tarreaua41a8b42005-12-17 14:02:24 +01001071
willy tarreau64a3cc32005-12-18 01:13:11 +01001072Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
1073l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
1074SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
1075envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
1076elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
1077local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +01001078
willy tarreau982249e2005-12-18 00:57:06 +01001079Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
1080logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
1081afin de notifier l'administrateur qu'il faut prendre une action immédiate.
1082
willy tarreau0174f312005-12-18 01:02:42 +01001083Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
1084même valeur de cookie. C'est particulièrement utile en mode backup, pour
1085sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
1086oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
1087temporairement vers une page d'erreur en attendant le redémarrage d'une
1088application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
1089le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
1090chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
1091le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
1092pour plus d'informations.
1093
willy tarreauc29948c2005-12-17 13:10:27 +01001094Exemples :
1095----------
willy tarreaua41a8b42005-12-17 14:02:24 +01001096# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001097 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001098 mode http
1099 cookie SERVERID
1100 balance roundrobin
1101 server web1 192.168.1.1:80 cookie server01 check
1102 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001103
willy tarreau2f6ba652005-12-17 13:57:42 +01001104# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001105 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001106 mode http
1107 cookie SERVERID
1108 balance roundrobin
1109 option httpchk
1110 server web1 192.168.1.1:80 cookie server01 check
1111 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +01001112
willy tarreau2f6ba652005-12-17 13:57:42 +01001113# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
1114 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001115 mode http
1116 cookie SERVERID
1117 balance roundrobin
1118 option httpchk /index.html
1119 server web1 192.168.1.1:80 cookie server01 check
1120 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +01001121
willy tarreaueedaa9f2005-12-17 14:08:03 +01001122# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1123 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001124 mode http
1125 cookie SERVERID
1126 balance roundrobin
1127 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1128 server web1 192.168.1.1:80 cookie server01 check
1129 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001130
willy tarreau0174f312005-12-18 01:02:42 +01001131# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1132# douceur utilisant un second port (81) juste pour les health-checks.
1133 listen http_proxy 0.0.0.0:80
1134 mode http
1135 cookie JSESSIONID prefix
1136 balance roundrobin
1137 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1138 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1139 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1140 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1141 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1142
willy tarreau96d40372005-12-17 13:11:56 +01001143# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001144# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1145# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +01001146 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001147 mode http
1148 cookie SERVERID insert nocache indirect
1149 balance roundrobin
1150 server web1 192.168.1.1:80 cookie server01 check
1151 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +01001152
willy tarreaueedaa9f2005-12-17 14:08:03 +01001153# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001154 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001155 mode http
1156 cookie SERVERID insert nocache indirect
1157 balance roundrobin
1158 server web1 192.168.1.1:80 cookie server01 check
1159 server web2 192.168.1.2:80 cookie server02 check
1160 server web-backup 192.168.2.1:80 cookie server03 check backup
1161 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001162
willy tarreaua41a8b42005-12-17 14:02:24 +01001163# relayage SMTP+TLS avec test du serveur et serveur de backup
1164
1165 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001166 mode tcp
1167 balance roundrobin
1168 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1169 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001170
Willy Tarreauf3c69202006-07-09 16:42:34 +02001171# relayage HTTPS avec test du serveur et serveur de backup
1172
1173 listen http_proxy :443
1174 mode tcp
1175 option ssl-hello-chk
1176 balance roundrobin
1177 server srv1 192.168.1.1 check inter 30000 rise 1 fall 2
1178 server srv2 192.168.1.2 backup
1179
Willy TARREAU3481c462006-03-01 22:37:57 +01001180# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1181 listen http_proxy 0.0.0.0:80
1182 mode http
1183 balance roundrobin
1184 option httpchk
1185 server inst1 192.168.1.1:80 cookie s1 check
1186 server inst2 192.168.1.2:80 cookie s2 check
1187 server inst3 192.168.1.3:80 cookie s3 check
1188 server back1 192.168.1.10:80 check backup
1189 server back2 192.168.1.11:80 check backup
1190 option allbackups # all backups will be used
1191
willy tarreau0f7af912005-12-17 12:21:26 +01001192
willy tarreauc29948c2005-12-17 13:10:27 +010011933.2) Reconnexion vers un répartiteur en cas d'échec direct
1194----------------------------------------------------------
1195En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1196seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1197définitivement privés de service. La spécification du paramètre 'redispatch'
1198autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1199(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001200
1201Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001202---------
willy tarreau0f7af912005-12-17 12:21:26 +01001203 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001204 mode http
1205 cookie SERVERID
1206 dispatch 192.168.1.100:80
1207 server web1 192.168.1.1:80 cookie server01
1208 server web2 192.168.1.2:80 cookie server02
1209 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001210
willy tarreau64a3cc32005-12-18 01:13:11 +01001211Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1212redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1213version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1214identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1215tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1216tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001217
1218 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001219 mode http
1220 option persist
1221 cookie SERVERID
1222 dispatch 192.168.1.100:80
1223 server web1 192.168.1.1:80 cookie server01
1224 server web2 192.168.1.2:80 cookie server02
1225 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001226
willy tarreauc29948c2005-12-17 13:10:27 +01001227
willy tarreau34f45302006-04-15 21:37:14 +020012283.3) Assignation de poids différents à des serveurs
1229---------------------------------------------------
1230Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1231d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1232que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1233soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1234raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1235plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1236plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1237la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1238une vue des serveurs disponibles la plus homogène possible en se basant sur
1239leur poids de sorte que la charge se distribue de la manière la plus lisse
1240possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
willy tarreau532bb552006-05-13 18:40:37 +02001241serveur par rapport aux autres. Le poids de 1 donne la fréquence d'apparition
1242la plus faible, et 256 la fréquence la plus élevée. De cette manière, si un
1243serveur disparait, les capacités restantes sont toujours respectées.
willy tarreau34f45302006-04-15 21:37:14 +02001244
1245
1246Exemple :
1247---------
1248# distribution équitable sur 2 opteron and un ancien pentium3
1249
1250 listen web_appl 0.0.0.0:80
1251 mode http
1252 cookie SERVERID insert nocache indirect
1253 balance roundrobin
1254 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1255 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1256 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1257 server web-backup1 192.168.2.1:80 cookie server04 check backup
1258 server web-excuse 192.168.3.1:80 check backup
1259
1260Notes :
1261-------
1262 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1263
1264 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1265 est plus propre d'utiliser les poids que de répliquer le même serveur
1266 plusieurs fois.
1267
1268 - les poids s'appliquent également aux serveurs de backup si l'option
1269 'allbackups' est positionnée.
1270
1271 - le poids s'applique aussi à la répartition selon la source
1272 ('balance source').
1273
1274 - quels que soient les poids, le premier serveur sera toujours assigné en
1275 premier. Cette règle facilite les diagnostics.
1276
1277 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1278 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1279 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1280
willy tarreau532bb552006-05-13 18:40:37 +02001281La distribution du trafic suivra exactement le séquencement suivant :
1282
1283 Request| 1 1 1 1
1284 number | 1 2 3 4 5 6 7 8 9 0 1 2 3
1285 --------+---------------------------
1286 p3-800 | X . . . . . . X . . . . .
1287 opt-20 | . X . X . X . . . X . X .
1288 opt-24 | . . X . X . X . X . X . X
1289
1290
12913.4) Limitation du nombre de sessions concurrentes par serveur
1292--------------------------------------------------------------
1293Certains serveurs web multi-processus tels qu'Apache souffrent dès qu'il y a
1294trop de sessions concurrentes, parce qu'il est très coûteux de faire
1295fonctionner des centaines ou des milliers de processus sur un système. Une
1296solution consiste à augmenter le nombre de serveurs et de répartir la charge
1297entre eux, mais cela pose un problème lorsque le but est uniquement de résister
1298à des pics de charge occasionnels.
1299
1300Pour résoudre ce problème, une nouvelle fonctionnalité a été implémentée dans
1301HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associée à une
1302file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
1303entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
1304de diminuer la valeur maxconn améliorera notablement les performances des
1305serveurs et diminuera les temps de réponse simplement parce que les serveurs
1306seront moins congestionnés.
1307
1308Quand une requête cherche à joindre n'importe quel serveur, le premier serveur
1309non saturé est utilisé, en respectant l'algorithme de répartition de charge. Si
1310tous les serveurs sont saturés, alors la requête sera mise dans la file
1311d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
1312toutes les requêtes précédentes auront été libérées et qu'un serveur aura été
1313libéré d'une connexion pour la traiter.
1314
1315Si une requête fait référence à un serveur en particulier (p.ex: hachage d'IP
1316source, ou persistance par cookie), et que ce server est saturé, alors la
1317requête sera mise dans la file d'attente dédiée à ce serveur. Cette file
1318d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
1319plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent déjà
1320que pour les nouveaux utilisateurs.
1321
1322Pour cela, les logs ont dû être enrichis pour indiquer le nombre de sessions
1323par serveur, la position de la requête dans les files d'attentes, et le temps
1324passé en file d'attente. Ceci aide considérablement à faire de la prévision de
1325capacité. Voir la section 'logs' plus bas pour plus d'informations.
1326
1327Exemple :
1328---------
1329 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1330 listen web_appl 0.0.0.0:80
1331 maxconn 10000
1332 mode http
1333 cookie SERVERID insert nocache indirect
1334 balance roundrobin
1335 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 maxconn 100 check
1336 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
1337 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
1338 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1339 server web-excuse 192.168.3.1:80 check backup
1340
willy tarreau8f635a42006-05-21 23:05:54 +02001341Cette option se montra si efficace pour réduire les temps de réponse des
1342serveurs que certains utilisateurs voulaient utiliser des valeurs trop basses
1343pour améliorer les performances de leurs serveurs. Seulement, ils n'étaient
1344alors plus en mesure de supporter de très fortes charges parce qu'il n'était
1345plus possible de les saturer. Pour cette raison, la version 1.2.14 a apporté la
1346limitation dynamique de connexions avec l'addition du paramètre "minconn".
1347Lorsque ce paramètre est associé à "maxconn", il active la limitation dynamique
1348basée sur la charge de l'instance. Le nombre maximal de sessions concurrentes
1349sur un serveur devient alors proportionnel au nombre de sessions de l'instance
1350par rapport à son 'maxconn'. Un minimum de <minconn> sessions sera toujours
1351permis quelle que soit la charge. Ceci assurera que les serveurs travailleront
1352au meilleur de leurs performances sous des charges normales, et qu'ils seront
1353tout de même capables de supporter de fortes pointes lorsque nécessaire. La
1354limite dynamique est calculée comme ceci :
1355
1356 srv.dyn_limit = max(srv.minconn, srv.maxconn * inst.sess / inst.maxconn)
1357
1358Exemple :
1359---------
1360 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1361 listen web_appl 0.0.0.0:80
1362 maxconn 10000
1363 mode http
1364 cookie SERVERID insert nocache indirect
1365 balance roundrobin
1366 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check
1367 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check
1368 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1369 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1370 server web-excuse 192.168.3.1:80 check backup
1371
1372Dans l'exemple ci-dessus, le serveur "pentium3-800' recevra au plus 100
1373connexions simultanées lorsque l'instance du proxy en atteindra 10000, et
1374recevra seulement 10 connexions simultanées tant que le proxy sera sous les 1000
1375sessions.
1376
willy tarreau532bb552006-05-13 18:40:37 +02001377Notes :
1378-------
1379 - la requête ne restera pas indéfiniment en file d'attente, elle est
1380 assujétie au paramètre 'contimeout', et si une requête ne peut pas
1381 sortir de la file avant ce time-out, soit parce que le serveur est
1382 saturé, soit parce qu'il y a trop de requêtes en file d'attente,
1383 alors elle expirera avec une erreur 503.
1384
willy tarreau8f635a42006-05-21 23:05:54 +02001385 - si seul <minconn> est spécifié, il a le même effet que <maxconn>
1386
willy tarreau532bb552006-05-13 18:40:37 +02001387 - positionner des valeurs trop basses pour 'maxconn' peut améliorer les
1388 performances mais aussi permettre à des utilisateurs trop lents de bloquer
1389 un serveur pour les autres utilisateurs.
1390
willy tarreau34f45302006-04-15 21:37:14 +02001391
willy tarreau8f635a42006-05-21 23:05:54 +020013923.5) Abandon des requêtes abortées
1393----------------------------------
1394En présence de très fortes charges, les serveurs mettront un certain temps à
1395répondre. La file d'attente du proxy se remplira, et les temps de réponse
1396suivront une croissance proportionnelle à la taille de file d'attente fois
1397le temps moyen de réponse par session. Lorsque les clients attendront plus de
1398quelques secondes, ils cliqueront souvent sur le bouton 'STOP' de leur
1399navigateur, laissant des requêtes inutiles en file d'attente et ralentissant
1400donc les autres utilisateurs.
1401
1402Comme il n'y a aucun moyen de distinguer un vrai clic sur STOP d'une simple
1403fermeture du canal de sortie sur le client (shutdown(SHUT_WR)), les agents HTTP
1404doivent être conservateurs et considérer que le client n'a probablement fermé
1405que le canal de sortie en attendant la réponse. Toutefois, ceci introduit des
1406risques de congestion lorsque beaucoup d'utilisateurs font de même, et s'avère
1407aujourd'hui complètement inutile car probablement aucun client ne referme la
1408session en attendant la réponse. Certains agents HTTP supportent ceci (Squid,
1409Apache, HAProxy), et d'autres ne le supportent pas (TUX, et la plupart des
1410répartiteurs de charge matériels). Donc la probabilité pour qu'une notification
1411de fermeture d'un canal d'entrée côté client représente un utilisateur cliquant
1412sur 'STOP' est proche de 100%, et il est vraiment tentant d'abandonner la
1413requête prématurément sans polluer les serveurs.
1414
1415Pour cette raison, une nouvelle option "abortonclose" a été introduite en
1416version 1.2.14. Par défaut (sans l'option), le comportement reste conforme à
1417HTTP. Mais lorsque l'option est spécifiée, une session dont le canal entrant
1418est fermé sera abortée si cela est possible, c'est à dire que la requête est
1419soit en file d'attente, soit en tentative de connexion. Ceci réduit
1420considérablement la longueur des files d'attentes et la charge sur les serveurs
1421saturés lorsque les utilisateurs sont tentés de cliquer sur 'STOP', ce qui à
1422son tour, réduit les temps de réponse pour les autres utilisateurs.
1423
1424Exemple :
1425---------
1426 listen web_appl 0.0.0.0:80
1427 maxconn 10000
1428 mode http
1429 cookie SERVERID insert nocache indirect
1430 balance roundrobin
1431 server web1 192.168.1.1:80 cookie s1 weight 10 maxconn 100 check
1432 server web2 192.168.1.2:80 cookie s2 weight 10 maxconn 100 check
1433 server web3 192.168.1.3:80 cookie s3 weight 10 maxconn 100 check
1434 server bck1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1435 option abortonclose
1436
1437
willy tarreauc29948c2005-12-17 13:10:27 +010014384) Fonctionnalités additionnelles
1439=================================
1440
1441D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
willy tarreau8f635a42006-05-21 23:05:54 +02001442principalement du mode transparent, de la journalisation des connexions, de la
1443réécriture des en-têtes, et du statut sous forme de page HTML.
1444
willy tarreau5cbea6f2005-12-17 12:48:26 +01001445
willy tarreau0174f312005-12-18 01:02:42 +010014464.1) Fonctionnalités réseau
1447---------------------------
14484.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001449---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001450En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1451routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1452pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001453destination de la session détournée. Le système doit permettre de rediriger les
1454paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001455
1456Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001457---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001458 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001459 mode http
1460 transparent
1461 cookie SERVERID
1462 server server01 192.168.1.1:80
1463 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001464
1465 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1466 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001467
willy tarreaua41a8b42005-12-17 14:02:24 +01001468Remarque :
1469----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001470Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1471adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1472d'une même adresse avec une même instance et sans utiliser directement le mode
1473transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001474
1475Exemple :
1476---------
1477 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001478 mode tcp
1479 server server01 192.168.1.1 check port 60000
1480 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001481
1482 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1483 -j REDIRECT --to-ports 65000
1484
willy tarreau0174f312005-12-18 01:02:42 +01001485
14864.1.2) Choix d'une adresse source par serveur
1487---------------------------------------------------
1488Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1489IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1490backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1491pour joindre le même serveur. C'est également utilisable pour faciliter une
1492répartition de charge selon l'adresse IP source pour des connexions sortantes.
1493Bien entendu, la même adresse est utilisée pour les health-checks.
1494
1495Exemple :
1496---------
1497 # utiliser une adresse particulière pour joindre les 2 serveur
1498 listen http_proxy 0.0.0.0:65000
1499 mode http
1500 balance roundrobin
1501 server server01 192.168.1.1:80 source 192.168.2.13
1502 server server02 192.168.1.2:80 source 192.168.2.13
1503
1504Exemple :
1505---------
1506 # utiliser une adresse particulière pour joindre chaque serveur
1507 listen http_proxy 0.0.0.0:65000
1508 mode http
1509 balance roundrobin
1510 server server01 192.168.1.1:80 source 192.168.1.1
1511 server server02 192.168.2.1:80 source 192.168.2.1
1512
1513Exemple :
1514---------
1515 # faire une répartition d'adresse sources pour joindre le même proxy à
1516 # travers deux liens WAN
1517 listen http_proxy 0.0.0.0:65000
1518 mode http
1519 balance roundrobin
1520 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1521 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1522
1523Exemple :
1524---------
1525 # forcer une connexion TCP à s'attacher à un port particulier
1526 listen http_proxy 0.0.0.0:2000
1527 mode tcp
1528 balance roundrobin
1529 server srv1 192.168.1.1:80 source 192.168.2.1:20
1530 server srv2 192.168.1.2:80 source 192.168.2.1:20
1531
willy tarreaub952e1d2005-12-18 01:31:20 +010015324.1.3) Maintien de session TCP (keep-alive)
1533-------------------------------------------
1534Avec la version 1.2.7, il devient possible d'activer le maintien de session
1535TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1536d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1537externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1538aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1539time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1540positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1541vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1542pour activer le maintien de session TCP :
1543
1544 option tcpka # active le keep-alive côté client et côté serveur
1545 option clitcpka # active le keep-alive côté client
1546 option srvtcpka # active le keep-alive côté serveur
1547
willy tarreau0f7af912005-12-17 12:21:26 +01001548
willy tarreauc29948c2005-12-17 13:10:27 +010015494.2) Journalisation des connexions
1550----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001551
1552L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1553Il fournit probablement le plus fin niveau d'information disponible pour un
1554tel outil, ce qui est très important pour les diagnostics en environnements
1555complexes. En standard, les informations journalisées incluent le port client,
1556les chronométrages des états TCP/HTTP, des états de session précis au moment de
1557la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1558trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1559arbitraires.
1560
1561Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1562transparence sur les problèmes rencontrés, à la fois internes et externes, et
1563il est possible d'envoyer les logs vers des serveurs différents en même temps
1564avec des niveaux de filtrage différents :
1565
1566 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1567 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1568 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1569 - activité par instance (connexions clients), aussi bien lors de leur
1570 établissement qu'à leur terminaison.
1571
1572La possibilité de distribuer différents niveaux de logs à différents serveurs
1573permet à plusieurs équipes de production d'intéragir et de corriger leurs
1574problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1575occasionnellement les erreurs système, pendant que l'équipe application
1576surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1577que l'équipe sécurité analyse l'activité en différé d'une heure.
1578
1579
willy tarreauc1cae632005-12-17 14:12:23 +010015804.2.1) Niveaux de log
1581---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001582Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1583détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1584source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001585la requête HTTP, le code de retour, la quantité de données transmises, et même
1586dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1587Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1588la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001589est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001590
willy tarreau8337c6b2005-12-17 13:41:01 +01001591 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1592 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001593ou
1594 log global
1595
1596Remarque :
1597----------
1598La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1599paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001600
1601Exemple :
1602---------
1603 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001604 mode http
1605 log 192.168.2.200 local3
1606 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001607
willy tarreauc1cae632005-12-17 14:12:23 +010016084.2.2) Format des logs
1609----------------------
1610Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1611de la session entre le client et le relais. En précisant l'option 'tcplog',
1612la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1613sur son état lors de la déconnexion, ainsi que le temps de connexion et la
willy tarreau532bb552006-05-13 18:40:37 +02001614durée totale de la session. Le nombre de sessions restantes après la
1615déconnexion est également indiqué (pour le serveur, l'instance et le process).
willy tarreauc1cae632005-12-17 14:12:23 +01001616
willy tarreauc5f73ed2005-12-18 01:26:38 +01001617Exemple de journalisation TCP :
1618-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001619 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001620 mode tcp
1621 option tcplog
1622 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001623
willy tarreau532bb552006-05-13 18:40:37 +02001624>>> 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 +01001625
willy tarreau532bb552006-05-13 18:40:37 +02001626 Champ Format / Description Exemple
1627
1628 1 nom_processus '[' pid ']:' haproxy[18989]:
1629 2 ip_client ':' port_client 127.0.0.1:34550
1630 3 '[' date ']' [15/Oct/2003:15:24:28]
1631 4 nom_instance relais-tcp
1632 5 nom_serveur Srv1
1633 6 temps_file '/' temps_connect '/' temps_total 0/0/5007
1634 7 octets lus 0
1635 8 etat_terminaison --
1636 9 conn_srv '/' conns_inst '/' conns_processus 1/1/1
1637 10 position en file d'attente srv '/' globale 0/0
willy tarreau982249e2005-12-18 00:57:06 +01001638
willy tarreauc1cae632005-12-17 14:12:23 +01001639Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1640notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1641surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1642les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1643ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1644(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001645
willy tarreauc5f73ed2005-12-18 01:26:38 +01001646Exemple de journalisation HTTP :
1647--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001648 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001649 mode http
1650 option httplog
1651 option dontlognull
1652 log 192.168.2.200 local3
1653
willy tarreau532bb552006-05-13 18:40:37 +02001654>>> 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 +01001655
1656Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001657
willy tarreau532bb552006-05-13 18:40:37 +02001658 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 +01001659
willy tarreau532bb552006-05-13 18:40:37 +02001660 Champ Format / Description Exemple
1661
1662 1 nom_processus '[' pid ']:' haproxy[18989]:
1663 2 ip_client ':' port_client 10.0.0.1:34552
1664 3 '[' date ']' [15/Oct/2003:15:26:31]
1665 4 nom_instance relais-http
1666 5 nom_serveur Srv1
1667 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt 3183/-1/-1/-1/11215
1668 7 Code_retour_HTTP 503
1669 8 octets lus 0
1670 9 cookies_requête_capturés -
1671 10 cookies_reponse_capturés -
1672 11 etat_terminaison SC--
1673 12 conns_srv '/' conns_inst '/' conns_processus 137/202/205
1674 13 position file serveur '/' globale 0/0
1675 14 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1676 15 '{' entetes_reponse_capturés '}' {}
1677 16 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001678
1679Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1680 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001681
1682Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1683de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1684Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001685la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1686tôt possible, c'est à dire juste avant que ne débutent les transferts de
1687données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1688de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001689traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1690représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001691
willy tarreau64a3cc32005-12-18 01:13:11 +01001692Afin d'éviter toute confusion avec les logs normaux, le temps total de
1693transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001694rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001695
1696Exemple :
1697---------
1698
1699 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001700 mode http
1701 option httplog
1702 option dontlognull
1703 option logasap
1704 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001705
willy tarreauc5f73ed2005-12-18 01:26:38 +01001706>>> 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 +01001707
1708
willy tarreauc1cae632005-12-17 14:12:23 +010017094.2.3) Chronométrage des événements
1710-----------------------------------
1711Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1712événements sont d'une très grande utilité. Tous les temps sont mesurés en
1713millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
willy tarreau532bb552006-05-13 18:40:37 +02001714la forme Tq/Tw/Tc/Tr/Tt :
willy tarreauc1cae632005-12-17 14:12:23 +01001715
1716 - Tq: temps total de réception de la requête HTTP de la part du client.
1717 C'est le temps qui s'est écoulé entre le moment où le client a établi
1718 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1719 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1720 que la requête complète n'a jamais été reçue.
1721
willy tarreau532bb552006-05-13 18:40:37 +02001722 - Tw: temps total passé dans les files d'attente avant d'obtenir une place
1723 vers un serveur. Ceci tient compte à la fois de la file d'attente globale
1724 et de celle du serveur, et dépend du nombre de requêtes dans la file et du
1725 temps nécessaire au serveur pour compléter les sessions précédentes. La
1726 valeur '-1' indique que la requête a été détruite avant d'atteindre une
1727 file.
1728
willy tarreauc1cae632005-12-17 14:12:23 +01001729 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1730 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1731 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1732 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1733 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1734 vers le serveur.
1735
1736 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001737 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001738 la connexion. Ca représente exactement le temps de traitement de la
1739 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001740 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001741
1742 - Tt: durée de vie totale de la session, entre le moment où la demande de
1743 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001744 refermée aux deux extrémités (client et serveur). La signification change
1745 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
willy tarreau532bb552006-05-13 18:40:37 +02001746 uniquement à (Tq + Tw + Tc + Tr), et se trouve préfixé d'un signe '+'. On
1747 peut donc déduire Td, le temps de transfert des données, en excluant les
1748 autres temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001749
willy tarreau532bb552006-05-13 18:40:37 +02001750 Td = Tt - (Tq + Tw + Tc + Tr)
willy tarreauc1cae632005-12-17 14:12:23 +01001751
1752 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1753
willy tarreau532bb552006-05-13 18:40:37 +02001754En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
willy tarreauc1cae632005-12-17 14:12:23 +01001755rapportés.
1756
1757Ces temps fournissent de précieux renseignement sur des causes probables de
1758problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1759de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1760de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1761problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1762valeur de time-out dans la configuration, c'est souvent qu'une session a été
1763abandonnée sur expiration d'un time-out.
1764
1765Cas les plus fréquents :
1766
1767 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1768 le client et le relais.
1769 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1770 le relais et le serveur durant la phase de connexion. Cet indicateur
1771 devrait normalement toujours être très bas (moins de quelques dizaines).
1772 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1773 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1774 de pertes entre le relais et le serveur.
1775 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1776 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1777 session est maintenue après la fin des échanges. Voir plus loin pour
1778 savoir comment désactiver le keep-alive HTTP.
1779
1780Autres cas ('xx' représentant une valeur quelconque à ignorer) :
willy tarreau532bb552006-05-13 18:40:37 +02001781 -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 +01001782 a refermé sa connexion sans compléter la requête.
willy tarreau532bb552006-05-13 18:40:37 +02001783 Tq/-1/xx/xx/Tt: Il n'était pas possible de traiter la request, probablement
1784 parce que tous les serveurs étaient hors d'usage.
1785 Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'établir vers le serveur (refus ou
1786 time-out au bout de Tt-(Tq+Tw) ms).
1787 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 +01001788 les temps ou bien a refermé sa connexion trop tôt, au bout
willy tarreau532bb552006-05-13 18:40:37 +02001789 de Tt-(Tq+Tw+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001790
17914.2.4) Conditions de déconnexion
1792--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001793Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1794le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1795un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1796une signification précise :
1797
1798 - sur le premier caractère, un code précisant le premier événement qui a causé
1799 la terminaison de la session :
1800
1801 C : fermeture inattendue de la session TCP de la part du client.
1802
1803 S : fermeture inattendue de la session TCP de la part du serveur, ou
1804 refus explicite de connexion de la part de ce dernier.
1805
1806 P : terminaison prématurée des sessions par le proxy, pour cause
1807 d'imposition d'une limite sur le nombre de connexions, pour cause
1808 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1809 sécurité a détecté et bloqué une anomalie dans la réponse du
1810 serveur qui aurait pu causer une fuite d'informations (par exemple,
1811 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001812
willy tarreauc5f73ed2005-12-18 01:26:38 +01001813 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1814 source, ...). Généralement, cela arrive au cours de l'établissement
1815 d'une connexion, et les logs système doivent contenir une copie de
1816 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001817
willy tarreauc5f73ed2005-12-18 01:26:38 +01001818 I : une erreur interne a été identifiée par le proxy à la suite d'un
1819 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1820 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001821
willy tarreauc5f73ed2005-12-18 01:26:38 +01001822 c : le délai maximal d'attente du client a expiré (clitimeout).
1823
1824 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1825
1826 - : terminaison normale de session.
1827
1828 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1829 la fermeture :
1830
1831 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1832 été transmis au serveur.
1833
willy tarreau532bb552006-05-13 18:40:37 +02001834 Q : attente en file d'attente (QUEUE) d'une place pour avoir une
1835 connexion vers un serveur. Ne peut apparaître que sur un serveur
1836 possédant un paramètre 'maxconn'. Aucune connexion n'a été envoyée
1837 au serveur.
1838
willy tarreauc5f73ed2005-12-18 01:26:38 +01001839 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1840 serveur peut au plus avoir vu la tentative de connexion, mais
1841 aucune donnée n'a été échangée.
1842
1843 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1844
1845 D : transfert des DONNEES du serveur vers le client.
1846
1847 L : transfert des dernières ("LAST") données du proxy vers le client,
1848 alors que le serveur a déjà fini.
1849
Willy Tarreau2272dc12006-09-03 10:19:38 +02001850 T : requête bloquée en mode "tarpit" par le proxy. Elle a été maintenue
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001851 ouverte vers le client pendant toute la durée du contimeout ou
1852 jusqu'à l'abandon de la part du client.
Willy Tarreau2272dc12006-09-03 10:19:38 +02001853
willy tarreauc5f73ed2005-12-18 01:26:38 +01001854 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001855
1856 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001857 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001858
willy tarreauc5f73ed2005-12-18 01:26:38 +01001859 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1860 cas sur les NOUVELLES connexions clients.
1861
1862 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1863 serveur connu. Ceci peut être dû à un changement de configuration
1864 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1865 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001866
willy tarreauc5f73ed2005-12-18 01:26:38 +01001867 D : le client a présenté un cookie correspondant à un serveur hors
1868 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1869 un autre serveur ou a tout de même tenté de se connecter sur celui
1870 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001871
willy tarreauc5f73ed2005-12-18 01:26:38 +01001872 V : le client a présenté un cookie VALIDE et a pu se connecter au
1873 serveur correspondant.
1874
1875 - : non appliquable (pas de cookie positionné dans la configuration).
1876
1877 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1878 persistence retrourné par le serveur (uniquement en mode HTTP) :
1879
1880 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1881 n'a été inséré.
1882
1883 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1884 proxy en a INSERE un.
1885
willy tarreau197e8ec2005-12-17 14:10:59 +01001886 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001887 tel quel ("PASSIF").
1888
1889 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1890
1891 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1892 ne pas être retourné au client.
1893
1894 - : non appliquable
1895
1896
1897La combinaison des deux premiers indicateurs fournit une grande quantitié
1898d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1899peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1900des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001901
willy tarreauc5f73ed2005-12-18 01:26:38 +01001902Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1903
1904 Indic Raison
1905 CR Le client a abandonné avant d'émettre une requête complète. Il est
1906 très probable que la requête ait été tapée à la main dans un client
1907 telnet et abortée trop tôt.
1908
1909 cR Le temps imparti au client a expiré avant réception d'une requête
1910 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1911 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1912 transporter des paquets entiers, ou par des clients qui énvoient des
1913 requêtes à la main et ne tapent pas assez vite.
1914
1915 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1916 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1917 être la couche réseau qui indique au proxy que le serveur n'est pas
1918 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1919
1920 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1921
1922 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1923 nombre de connexions a atteint la limite 'maxconn' (global ou de
1924 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1925 augmenté, tout comme le paramètre 'maxconn' global.
1926
1927 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1928 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1929 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1930 consiste à affiner le paramétrage système.
1931
1932 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1933 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1934 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1935 paquets entiers.
1936
willy tarreau078c79a2006-05-13 12:23:58 +02001937 CH Le client a abandonné alors qu'il attendait un début de réponse de la
1938 part du serveur. Cela peut être causé par le serveur qui mettait trop
1939 de temps à répondre, ou par un client cliquant précipitamment sur le
1940 bouton 'Stop'.
1941
1942 CQ Le client a abandonné alors que sa session était mise en file
1943 d'attente pour obtenir un serveur avec suffisamment de connexions
1944 libres pour l'accepter. Cela signifie soit que l'ensemble des
1945 serveurs étaient saturés, soit que le serveur assigné a mis trop de
1946 temps à répondre.
1947
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001948 CT Le client a abandonné alors que sa session était bloquée en mode
1949 tarpit.
1950
willy tarreau078c79a2006-05-13 12:23:58 +02001951 sQ La session a attendu trop longtemps en file d'attente et a été
1952 expirée.
1953
willy tarreauc5f73ed2005-12-18 01:26:38 +01001954 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
1955 en-têtes. En général, cela indique qu'il a crashé.
1956
1957 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
1958 des transactions trop longues, probablement causées par un back-end
1959 saturé. Les seules solutions sont de corriger le problème sur
1960 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
1961 des attentes plus longues au risque que les clients abandonnent à
1962 leur tour, ou bien d'ajouter des serveurs.
1963
1964 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
1965 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
1966 soit à cause d'une requête validant un filtre d'interdiction, auquel
1967 cas le proxy a renvoyé une erreur HTTP 403.
1968
1969 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
1970 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
1971 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
1972 renvoyée au client.
1973
Willy Tarreau2272dc12006-09-03 10:19:38 +02001974 PT Le proxy a bloqué une requête du client et a maintenu sa connection
1975 ouverte avant de lui retourner une erreur "500 server error". Rien
1976 n'a été envoyé au serveur.
1977
willy tarreauc5f73ed2005-12-18 01:26:38 +01001978 cD Le client n'a pas lu de données pendant le temps qui lui était
1979 imparti. Ceci est souvent causé par des problèmes réseau côté client.
1980
1981 CD Le client a aborté sa connection de manière inattendue pendant le
1982 transfert des données. Ceci est provoqué soit par le crash d'un
1983 navigateur, ou par une session en HTTP keep-alive entre le serveur
1984 et le client terminée en premier par le client.
1985
1986 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
1987 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
1988 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
1989 situés entre le proxy et le serveur.
1990
19914.2.5) Caractères non-imprimables
1992---------------------------------
1993Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
1994tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
1995hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
1996dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
1997caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
1998est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
1999les en-têtes.
2000
20014.2.6) Capture d'en-têtes HTTP et de cookies
2002--------------------------------------------
2003La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
2004capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
2005
2006Les captures de cookies facilitent le suivi et la reconstitution d'une session
2007utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01002008
2009 capture cookie <préfixe_cookie> len <longueur_capture>
2010
willy tarreauc5f73ed2005-12-18 01:26:38 +01002011Ceci activera la capture de cookies à la fois dans les requêtes et dans les
2012réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
2013bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
2014nouveau cookie.
2015
willy tarreau8337c6b2005-12-17 13:41:01 +01002016Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
2017transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
2018caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
2019le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
2020place dans les logs.
2021
2022Exemples :
2023----------
2024 # capture du premier cookie dont le nom commence par "ASPSESSION"
2025 capture cookie ASPSESSION len 32
2026
2027 # capture du premier cookie dont le nom est exactement "vgnvisitor"
2028 capture cookie vgnvisitor= len 32
2029
willy tarreau036e1ce2005-12-17 13:46:33 +01002030Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01002031positionné par le serveur, précédé du cookie positionné par le client. Chacun
2032de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01002033par le client ou le serveur, ou lorsque l'option est désactivée..
2034
2035Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
2036pour suivre un identifiant de requête globalement unique positionné par un
2037autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
2038de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
2039peut chercher des informations relatives à la longueur annoncée de la réponse,
2040le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
2041de redirection. Tout comme pour les captures de cookies, il est possible
2042d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
2043la suivante :
2044
2045 capture request header <nom> len <longueur max>
2046 capture response header <nom> len <longueur max>
2047
2048Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01002049
willy tarreauc5f73ed2005-12-18 01:26:38 +01002050Exemples:
2051---------
2052 # conserver le nom du serveur virtuel accédé par le client
2053 capture request header Host len 20
2054 # noter la longueur des données envoyées dans un POST
2055 capture request header Content-Length len 10
2056
2057 # noter le fonctionnement attendu du cache par le serveur
2058 capture response header Cache-Control len 8
2059 # noter l'URL de redirection
2060 capture response header Location len 20
2061
2062Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
2063fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
2064regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
2065chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
2066réponse sont présentés de la même manière, mais après un espace suivant le bloc
2067d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
2068
2069 Config:
2070
2071 capture request header Host len 20
2072 capture request header Content-Length len 10
2073 capture request header Referer len 20
2074 capture response header Server len 20
2075 capture response header Content-Length len 10
2076 capture response header Cache-Control len 8
2077 capture response header Via len 20
2078 capture response header Location len 20
2079
2080 Log :
2081
willy tarreau532bb552006-05-13 18:40:37 +02002082 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/"
2083 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"
2084 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 +01002085
20864.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01002087-----------------------
willy tarreau532bb552006-05-13 18:40:37 +02002088- 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 +01002089 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
2090 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01002091
willy tarreau532bb552006-05-13 18:40:37 +02002092- 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"
2093 => Idem, mais la requête a été mise en attente dans la file globale derrière
2094 9 autres requêtes déjà présentes, et y a attendu 1230 ms.
2095
2096- 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 +01002097 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
2098 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 +01002099 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 +01002100 total entre l'accept() et le premier octet de donnée est de 30 ms.
2101
willy tarreau532bb552006-05-13 18:40:37 +02002102- 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 +01002103 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
2104 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
2105 d'informations risquant d'être cachées. Dans ce cas, la réponse est
2106 remplacée par '502 bad gateway'.
2107
willy tarreau532bb552006-05-13 18:40:37 +02002108- 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 +01002109 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01002110 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01002111 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01002112
willy tarreau532bb552006-05-13 18:40:37 +02002113- 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 +01002114 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01002115 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01002116 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
2117 pu renvoyer un message 408 au client.
2118
willy tarreauc5f73ed2005-12-18 01:26:38 +01002119- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
2120 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
2121 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01002122
willy tarreau532bb552006-05-13 18:40:37 +02002123- 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 +01002124 => La requête client met 3s à entrer (peut-être un problème réseau), et la
2125 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreau532bb552006-05-13 18:40:37 +02002126 secondes (retries 3 dans la conf), puis un code 503 est retourné au
2127 client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
2128 instance, et 205 sur l'ensemble des instances pour ce processus. Il est
2129 possible que le serveur ait refusé la connexion parce qu'il y en avait
2130 déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01002131
willy tarreau4302f492005-12-18 01:00:37 +01002132
willy tarreauc5f73ed2005-12-18 01:26:38 +010021334.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01002134----------------------------------
2135En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
2136requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01002137possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
2138de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01002139connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
2140comme faisant partie des échanges de données consécutifs à la première requête.
2141Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01002142
2143La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01002144 reqadd <string> pour ajouter un en-tête dans la requête
2145 reqrep <search> <replace> pour modifier la requête
2146 reqirep <search> <replace> idem sans distinction majuscules/minuscules
2147 reqdel <search> pour supprimer un en-tête dans la requête
2148 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002149 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01002150 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002151 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01002152 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002153 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01002154 reqipass <search> idem sans distinction majuscules/minuscules
Willy Tarreau2272dc12006-09-03 10:19:38 +02002155 reqtarpit <search> bloquer et maintenir une request validant <search>
2156 reqitarpit <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002157
willy tarreau036e1ce2005-12-17 13:46:33 +01002158 rspadd <string> pour ajouter un en-tête dans la réponse
2159 rsprep <search> <replace> pour modifier la réponse
2160 rspirep <search> <replace> idem sans distinction majuscules/minuscules
2161 rspdel <search> pour supprimer un en-tête dans la réponse
2162 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01002163 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01002164 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01002165 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002166
willy tarreau0f7af912005-12-17 12:21:26 +01002167
willy tarreau036e1ce2005-12-17 13:46:33 +01002168<search> est une expression régulière compatible POSIX regexp supportant le
2169groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
2170doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
2171chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
2172backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01002173
2174 \t pour une tabulation
2175 \r pour un retour charriot
2176 \n pour un saut de ligne
2177 \ pour différencier un espace d'un séparateur
2178 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01002179 \\ pour utiliser un backslash dans la regex
2180 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01002181 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01002182
willy tarreau0f7af912005-12-17 12:21:26 +01002183
willy tarreau5cbea6f2005-12-17 12:48:26 +01002184<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
2185Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
2186groupe délimité par des parenthèses dans l'expression régulière, par sa
Willy Tarreau2272dc12006-09-03 10:19:38 +02002187position numérale. Les positions vont de 0 à 9, et sont codées par un '\'
2188suivi du chiffre désiré (0 désignant la ligne complète). Il est également
2189possible d'insérer un caractère non imprimable (utile pour le saut de ligne)
2190inscrivant '\x' suivi du code hexadécimal de ce caractère (comme en C).
willy tarreau5cbea6f2005-12-17 12:48:26 +01002191
2192<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01002193dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002194
2195Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01002196-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002197 - 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 +01002198 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002199 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
2200 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
2201 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01002202 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
2203 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
2204 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01002205 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01002206 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
2207 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
Willy Tarreau2272dc12006-09-03 10:19:38 +02002208 - une requête bloquée par 'reqtarpit' sera maintenue pendant une durée égale
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002209 au paramètre 'contimeout', ou jusqu'à l'abandon du client. Rien ne sera
2210 envoyé au serveur. Lorsque le temps alloué expire, le proxy répondra avec
2211 une réponse "500 server error" de sorte que l'attaquant ne suspecte pas
2212 qu'il ait été bloqué. Les logs rapporteront aussi ce code 500, mais les
2213 flags de terminaison indiqueront "PT".
willy tarreau0f7af912005-12-17 12:21:26 +01002214
2215Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01002216----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01002217 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01002218
willy tarreauc5f73ed2005-12-18 01:26:38 +01002219 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
2220 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
2221 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002222
willy tarreauc5f73ed2005-12-18 01:26:38 +01002223 # force proxy connections to close
2224 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
2225 # rewrite locations
2226 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002227
willy tarreauc5f73ed2005-12-18 01:26:38 +01002228 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01002229
willy tarreau197e8ec2005-12-17 14:10:59 +01002230 # Every header should end with a colon followed by one space.
2231 reqideny ^[^:\ ]*[\ ]*$
2232
2233 # block Apache chunk exploit
2234 reqideny ^Transfer-Encoding:[\ ]*chunked
2235 reqideny ^Host:\ apache-
2236
2237 # block annoying worms that fill the logs...
2238 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
2239 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
2240 reqideny ^[^:\ ]*\ .*<script
2241 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
2242
Willy Tarreau2272dc12006-09-03 10:19:38 +02002243 # tarpit attacks on the login page.
2244 reqtarpit ^[^:\ ]*\ .*\.php?login=[^0-9]
2245
willy tarreau197e8ec2005-12-17 14:10:59 +01002246 # allow other syntactically valid requests, and block any other method
2247 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
2248 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
2249 reqideny ^[^:\ ]*\
2250
2251 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01002252 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01002253
willy tarreauc5f73ed2005-12-18 01:26:38 +01002254 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01002255 rspidel ^Server:\
2256 rspadd Server:\ Formilux/0.1.8
2257
willy tarreau0f7af912005-12-17 12:21:26 +01002258
willy tarreau982249e2005-12-18 00:57:06 +01002259De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01002260'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002261connaître l'adresse IP du client initial. Depuis la version 1.3.8, il est
2262possible de préciser le mot-clé "except" suivi d'une adresse ou un réseau
2263IP source pour lequel l'entête ne sera pas ajouté. C'est très pratique dans le
2264cas où un autre reverse-proxy ajoutant déjà l'entête est installé sur la même
2265machine ou dans une DMZ connue. Le cas le plus fréquent est lié à l'utilisation
2266de stunnel en local.
willy tarreauc1cae632005-12-17 14:12:23 +01002267
willy tarreau982249e2005-12-18 00:57:06 +01002268Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01002269en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01002270Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
2271méthode impliquant 4 règles.
2272
willy tarreauc1cae632005-12-17 14:12:23 +01002273Exemple :
2274---------
2275 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002276 mode http
2277 log global
2278 option httplog
2279 option dontlognull
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002280 option forwardfor except 127.0.0.1/8
willy tarreauc5f73ed2005-12-18 01:26:38 +01002281 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01002282
Willy TARREAU767ba712006-03-01 22:40:50 +01002283Notons que certains serveurs HTTP ne referment pas nécessairement la session
2284TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
2285ce qui se traduit par des grands nombres de sessions établies et des temps
2286globaux très longs sur les requêtes. Pour contourner ce problème, la version
22871.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
2288vers le serveur dès qu'il commence à répondre et seulement si le tampon de
2289requête est vide. Attention toutefois à ne PAS utiliser cette option si des
2290méthodes CONNECT sont attendues entre le client et le serveur. L'option
2291'forceclose' implique l'option 'httpclose'.
2292
2293Exemple :
2294---------
2295 listen http_proxy 0.0.0.0:80
2296 mode http
2297 log global
2298 option httplog
2299 option dontlognull
2300 option forwardfor
2301 option forceclose
2302
2303
willy tarreauc29948c2005-12-17 13:10:27 +010023044.4) Répartition avec persistence
2305---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002306La combinaison de l'insertion de cookie avec la répartition de charge interne
2307permet d'assurer une persistence dans les sessions HTTP d'une manière
2308pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01002309 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01002310 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01002311 - insérer un cookie dans les réponses issues d'une répartition uniquement,
2312 et faire en sorte que des caches ne mémorisent pas ce cookie.
2313 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002314
2315Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01002316---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002317 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002318 mode http
2319 cookie SERVERID insert nocache indirect
2320 balance roundrobin
2321 server srv1 192.168.1.1:80 cookie server01 check
2322 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01002323
willy tarreau0174f312005-12-18 01:02:42 +01002324L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
2325cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
2326Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
2327client et le serveur de travailler en mode "keep-alive" afin que le proxy
2328puisse corriger le nom du cookie dans toutes les futures requêtes.
2329
2330 listen application 0.0.0.0:80
2331 mode http
2332 cookie JSESSIONID prefix
2333 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002334 server srv1 192.168.1.1:80 cookie srv1 check
2335 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002336 option httpclose
2337
2338
willy tarreau982249e2005-12-18 00:57:06 +010023394.5) Protection contre les fuites d'informations du serveur
2340-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002341Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002342créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002343'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2344un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2345activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002346 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002347 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002348 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002349 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002350 un en-tête 'Cache-control: public' ;
2351 - celles qui ont un en-tête 'Pragma: no-cache' ;
2352 - celles qui ont un en-tête 'Cache-control: private' ;
2353 - celles qui ont un en-tête 'Cache-control: no-store' ;
2354 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2355 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2356 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2357 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2358 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002359 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002360
willy tarreau982249e2005-12-18 00:57:06 +01002361Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2362même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2363message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2364dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002365en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002366l'administrateur sache qu'il y a une action correctrice à entreprendre.
2367
23684.6) Personalisation des erreurs
2369--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002370Certaines situations conduisent à retourner une erreur HTTP au client :
2371 - requête invalide ou trop longue => code HTTP 400
2372 - requête mettant trop de temps à venir => code HTTP 408
2373 - requête interdite (bloquée par un reqideny) => code HTTP 403
2374 - erreur interne du proxy => code HTTP 500
2375 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2376 - aucun serveur disponible pour cette requête => code HTTP 503
2377 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2378
2379Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2380Cependant, en fonction du type de clientèle, on peut préférer retourner des
willy tarreau64a3cc32005-12-18 01:13:11 +01002381pages personnalisées. Ceci est possible par le biais de la commande "errorloc":
willy tarreau8337c6b2005-12-17 13:41:01 +01002382
2383 errorloc <code_HTTP> <location>
2384
2385Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2386le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2387d'une page précisée dans <location>. Cette adresse peut être relative au site,
2388ou absolue. Comme cette réponse est traîtée par le navigateur du client
2389lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2390
2391Exemple :
2392---------
2393 listen application 0.0.0.0:80
2394 errorloc 400 /badrequest.html
2395 errorloc 403 /forbidden.html
2396 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002397 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002398 errorloc 502 http://192.168.114.58/error50x.html
2399 errorloc 503 http://192.168.114.58/error50x.html
2400 errorloc 504 http://192.168.114.58/error50x.html
2401
willy tarreauc1f47532005-12-18 01:08:26 +01002402Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2403accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2404problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2405régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2406dans le champ Location avec la méthode GET uniquement. Seulement, certains
2407navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2408plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2409devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002410l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2411visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002412
2413Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2414utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2415dès que vous savez que vos clients supportent le code de retour HTTP 303.
2416
willy tarreau982249e2005-12-18 00:57:06 +010024174.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002418--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002419Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2420évite de répéter des paramètres communs à toutes les instances, tels que les
2421timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002422
2423Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2424précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2425'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2426section implique une annulation de tous les paramètres par défaut positionnés
2427précédemment, dans le but de les remplacer.
2428
2429La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2430paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2431un commentaire en guise paramètre.
2432
willy tarreau982249e2005-12-18 00:57:06 +01002433Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2434positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002435 - log (le premier et le second)
2436 - mode { tcp, http, health }
2437 - balance { roundrobin }
2438 - disabled (pour désactiver toutes les instances qui suivent)
2439 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2440 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002441 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2442 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002443 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002444 - cookie, capture
2445 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002446
2447Ne sont pas supportés dans cette version, les adresses de dispatch et les
2448configurations de serveurs, ainsi que tous les filtres basés sur les
2449expressions régulières :
2450 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002451 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002452
2453Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2454positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2455défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2456paramètres par défaut avant la déclaration de l'instance.
2457
2458Exemples :
2459----------
2460 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002461 log global
2462 mode tcp
2463 balance roundrobin
2464 clitimeout 180000
2465 srvtimeout 180000
2466 contimeout 4000
2467 retries 3
2468 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002469
2470 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002471 server srv1 192.168.1.1 check port 6000 inter 10000
2472 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002473
2474 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002475 server srv1 192.168.2.1 check port 6000 inter 10000
2476 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002477
2478 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002479 log global
2480 mode http
2481 option httplog
2482 option forwardfor
2483 option dontlognull
2484 balance roundrobin
2485 clitimeout 20000
2486 srvtimeout 20000
2487 contimeout 4000
2488 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002489
2490 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002491 cookie SERVERID postonly insert indirect
2492 capture cookie userid= len 10
2493 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2494 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002495
2496 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002497 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002498
willy tarreau8f635a42006-05-21 23:05:54 +02002499
25004.8) Rapport d'état sous forme de page HTML
2501-------------------------------------------
2502Avec la version 1.2.14, il devient possible pour haproxy d'interceptre des
2503requêtes pour une URI particulière et de retourner un rapport complet d'état de
2504l'activité du proxy, et des statistiques sur les serveurs. Ceci est disponible
2505via le mot clé "stats" associé à n'importe laquelle de ces options :
2506
2507 - stats enable
2508 - stats uri <uri prefix>
2509 - stats realm <authentication realm>
2510 - stats auth <user:password>
2511 - stats scope <proxy_id> | '.'
2512
2513
2514Par défaut, le rapport est désactivé. Le fait de spécifier une des combinaision
2515ci-dessus active le rapport pour l'instance de proxy qui le référence. La
2516solution la plus simple est d'utiliser "stats enable" qui activera le rapport
2517avec les paramètres par défaut suivant :
2518
2519 - default URI : "/haproxy?stats" (CONFIG_STATS_DEFAULT_URI)
2520 - default auth : non spécifié (pas d'authentication)
2521 - default realm : "HAProxy Statistics" (CONFIG_STATS_DEFAULT_REALM)
2522 - default scope : non specifié (accès à toutes les instances)
2523
2524L'option "stats uri <uri_prefix>" permet d'intercepter un autre préfixe d'URI
2525que celui par défaut. Noter que n'importe quelle URI qui COMMENCE avec cette
2526chaîne sera validée. Par exemple, une instance pourrait être dédiée à la page
2527d'état seulement et répondre à toute URI.
2528
2529Example :
2530---------
2531 # intercepte n'importe quelle URI et retourne la page d'état.
2532 listen stats :8080
2533 mode http
2534 stats uri /
2535
2536
2537L'option "stats auth <user:password>" active l'authentification "Basic" et
2538ajoute un couple "user:password" valide à la liste des comptes autorisés.
2539L'utilisateur <user> et le mot de passe <password> doivent être précisés
2540en clair dans le fichier de configuration, et comme ceci est de
2541l'authentification HTTP "Basic", il faut être conscient qu'ils transitent en
2542clair sur le réseau, donc il ne faut pas utiliser de compte sensible. La liste
2543est illimitée dans le but de pouvoir fournir des accès facilement à des
2544développeurs ou à des clients.
2545
2546L'option "stats realm <realm>" définit le "domaine" ("realm") de validité du
2547mot de passe qui sera présenté dans la boîte de dialogue du navigateur
2548lorsqu'il demandera un compte utilisateur et un mot de passe. Il est important
2549de s'assurer que celui-ci soit différent de ceux utilisés par l'application,
2550autrement le navigateur tentera d'en utiliser un caché depuis l'application.
2551Noter que les espaces dans le nom de "realm" doivent être protégés par un
2552backslash ('\').
2553
2554L'option "stats scope <proxy_id>" limite la portée du rapport d'état. Par
2555défaut, toutes les instances proxy sont listées. Mais dans certaines
2556circonstances, il serait préférable de ne lister que certains proxies ou
2557simplement le proxy courant. C'est ce que fait cette option. Le nom spécial "."
2558(un simple point) référence le proxy courant. Cette option peut être répétée
2559autant de fois que nécessaire pour autoriser d'autres proxies, même pour des
2560noms référencés plus loin dans la configuration ou bien des noms qui n'existent
2561pas encore. Le nom précisé est celui qui apparait après le mot clé "listen".
2562
2563Exemple :
2564---------
2565 # simple application embarquant la page d'état authentifiée
2566 listen app1 192.168.1.100:80
2567 mode http
2568 option httpclose
2569 balance roundrobin
2570 cookie SERVERID postonly insert indirect
2571 server srv1 192.168.1.1:8080 cookie srv1 check inter 1000
2572 server srv1 192.168.1.2:8080 cookie srv2 check inter 1000
2573 stats uri /my_stats
2574 stats realm Statistics\ for\ MyApp1-2
2575 stats auth guest:guest
2576 stats auth admin:AdMiN123
2577 stats scope .
2578 stats scope app2
2579
2580 # simple application embarquant la page d'état sans authentification
2581 listen app2 192.168.2.100:80
2582 mode http
2583 option httpclose
2584 balance roundrobin
2585 cookie SERVERID postonly insert indirect
2586 server srv1 192.168.2.1:8080 cookie srv1 check inter 1000
2587 server srv1 192.168.2.2:8080 cookie srv2 check inter 1000
2588 stats uri /my_stats
2589 stats realm Statistics\ for\ MyApp2
2590 stats scope .
2591
2592 listen admin_page :8080
2593 mode http
2594 stats uri /my_stats
2595 stats realm Global\ statistics
2596 stats auth admin:AdMiN123
2597
2598Notes :
2599-------
2600 - les options "stats" peuvent aussi être spécifiées dans une section
2601 "defaults", auquel cas la même configuration exactement sera fournie à
2602 toutes les instances suivantes, d'où l'utilité du scope ".". Toutefois, si
2603 une instance redéfinit n'importe quel paramètre "stats", alors les défauts
2604 ne lui seront pas appliqués.
2605
2606 - l'authentification "Basic" est très simpliste et non sécurisée contre la
2607 capture réseau. Aucun mot de passe sensible ne doit être utilisé, et il
2608 est bon de savoir qu'il n'existe pas de moyen de le supprimer du navigateur
2609 après usage, donc il sera envoyé tel quel à l'application au cours des
2610 accès successifs.
2611
2612 - Il est très important de préciser l'option "httpclose", sinon le proxy ne
2613 sera pas en mesure de détecter les URI dans les sessions keep-alive
2614 maintenues entre le navigateur et les serveurs, donc les URI de stats
2615 seront transmises telles quelles aux serveurs comme si l'option n'était
2616 pas précisée.
2617
2618
willy tarreaub719f002005-12-17 12:55:07 +01002619=======================
2620| Paramétrage système |
2621=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002622
2623Sous Linux 2.4
2624==============
2625
willy tarreaub719f002005-12-17 12:55:07 +01002626-- cut here --
2627#!/bin/sh
2628# set this to about 256/4M (16384 for 256M machine)
2629MAXFILES=16384
2630echo $MAXFILES > /proc/sys/fs/file-max
2631ulimit -n $MAXFILES
2632
2633if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002634 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002635fi
2636
2637if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002638 # 30 seconds for fin, 15 for time wait
2639 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2640 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2641 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2642 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002643fi
2644
willy tarreau0f7af912005-12-17 12:21:26 +01002645echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002646echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2647echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002648echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002649echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2650echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002651echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2652echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002653echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002654echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002655echo 0 > /proc/sys/net/ipv4/tcp_dsack
2656
2657# auto-tuned on 2.4
2658#echo 262143 > /proc/sys/net/core/rmem_max
2659#echo 262143 > /proc/sys/net/core/rmem_default
2660
2661echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2662echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2663
2664-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002665
willy tarreau197e8ec2005-12-17 14:10:59 +01002666Sous FreeBSD
2667============
2668
2669Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2670Clement Laforet <sheepkiller@cultdeadsheep.org>.
2671
2672Pour plus d'informations :
2673http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2674http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2675http://www.freshports.org/net/haproxy
2676
2677
willy tarreau0f7af912005-12-17 12:21:26 +01002678-- fin --