blob: 63ac9a4514f6e695ea0b39d6335170e7303d2cc2 [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 Tarreau23677902007-05-08 23:50:35 +02001047La version 1.3.10 est accompagnée d'un nouveau test d'état pour le SMTP. Par
1048défaut, il consiste à envoyer "HELO localhost" aux serveurs, et à attendre le
1049message "250" en retour. Notez qu'il peut aussi envoyer une requête plus
1050spécifique :
1051
1052 - option smtpchk -> envoie "HELO localhost"
1053 - option smtpchk EHLO mail.mydomain.com -> envoie ce message ESMTP
1054
willy tarreauc5f73ed2005-12-18 01:26:38 +01001055Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001056
willy tarreau8337c6b2005-12-17 13:41:01 +01001057Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
1058utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
1059ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
1060de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
1061les 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 +01001062de répartition de charge entre des serveurs de secours par défaut. A partir
1063de la version 1.2.9, il est possible de les utiliser simultanément grâce à
1064l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
1065d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
1066de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
1067définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
1068qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +01001069
willy tarreaua41a8b42005-12-17 14:02:24 +01001070Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
1071vers un port différent de celui de service. C'est nécessaire principalement
1072pour les configurations où le serveur n'a pas de port prédéfini, par exemple
1073lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001074le paramètre 'port' suivi du numéro de port devant répondre aux requêtes. Il
1075est possible d'envoyer les tests de fonctionnement vers une adresse différente
1076de celle de service. Cela permet d'utiliser, sur la machine faisant fonctionner
1077HAproxy, un démon permettant des tests specifiques ( REGEX sur un résultat et
1078basculement de plusieurs fermes en cas d'erreur sur l'une d'elles).
willy tarreaua41a8b42005-12-17 14:02:24 +01001079
willy tarreau64a3cc32005-12-18 01:13:11 +01001080Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
1081l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
1082SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
1083envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
1084elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
1085local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +01001086
willy tarreau982249e2005-12-18 00:57:06 +01001087Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
1088logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
1089afin de notifier l'administrateur qu'il faut prendre une action immédiate.
1090
willy tarreau0174f312005-12-18 01:02:42 +01001091Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
1092même valeur de cookie. C'est particulièrement utile en mode backup, pour
1093sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
1094oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
1095temporairement vers une page d'erreur en attendant le redémarrage d'une
1096application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
1097le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
1098chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
1099le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
1100pour plus d'informations.
1101
willy tarreauc29948c2005-12-17 13:10:27 +01001102Exemples :
1103----------
willy tarreaua41a8b42005-12-17 14:02:24 +01001104# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +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 server web1 192.168.1.1:80 cookie server01 check
1110 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001111
willy tarreau2f6ba652005-12-17 13:57:42 +01001112# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001113 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001114 mode http
1115 cookie SERVERID
1116 balance roundrobin
1117 option httpchk
1118 server web1 192.168.1.1:80 cookie server01 check
1119 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +01001120
willy tarreau2f6ba652005-12-17 13:57:42 +01001121# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
1122 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001123 mode http
1124 cookie SERVERID
1125 balance roundrobin
1126 option httpchk /index.html
1127 server web1 192.168.1.1:80 cookie server01 check
1128 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +01001129
willy tarreaueedaa9f2005-12-17 14:08:03 +01001130# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1131 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001132 mode http
1133 cookie SERVERID
1134 balance roundrobin
1135 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1136 server web1 192.168.1.1:80 cookie server01 check
1137 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001138
willy tarreau0174f312005-12-18 01:02:42 +01001139# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1140# douceur utilisant un second port (81) juste pour les health-checks.
1141 listen http_proxy 0.0.0.0:80
1142 mode http
1143 cookie JSESSIONID prefix
1144 balance roundrobin
1145 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1146 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1147 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1148 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1149 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1150
willy tarreau96d40372005-12-17 13:11:56 +01001151# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001152# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1153# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +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
willy tarreau8337c6b2005-12-17 13:41:01 +01001160
willy tarreaueedaa9f2005-12-17 14:08:03 +01001161# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001162 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001163 mode http
1164 cookie SERVERID insert nocache indirect
1165 balance roundrobin
1166 server web1 192.168.1.1:80 cookie server01 check
1167 server web2 192.168.1.2:80 cookie server02 check
1168 server web-backup 192.168.2.1:80 cookie server03 check backup
1169 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001170
willy tarreaua41a8b42005-12-17 14:02:24 +01001171# relayage SMTP+TLS avec test du serveur et serveur de backup
1172
1173 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001174 mode tcp
1175 balance roundrobin
1176 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1177 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001178
Willy Tarreauf3c69202006-07-09 16:42:34 +02001179# relayage HTTPS avec test du serveur et serveur de backup
1180
1181 listen http_proxy :443
1182 mode tcp
1183 option ssl-hello-chk
1184 balance roundrobin
1185 server srv1 192.168.1.1 check inter 30000 rise 1 fall 2
1186 server srv2 192.168.1.2 backup
1187
Willy TARREAU3481c462006-03-01 22:37:57 +01001188# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1189 listen http_proxy 0.0.0.0:80
1190 mode http
1191 balance roundrobin
1192 option httpchk
1193 server inst1 192.168.1.1:80 cookie s1 check
1194 server inst2 192.168.1.2:80 cookie s2 check
1195 server inst3 192.168.1.3:80 cookie s3 check
1196 server back1 192.168.1.10:80 check backup
1197 server back2 192.168.1.11:80 check backup
1198 option allbackups # all backups will be used
1199
willy tarreau0f7af912005-12-17 12:21:26 +01001200
willy tarreauc29948c2005-12-17 13:10:27 +010012013.2) Reconnexion vers un répartiteur en cas d'échec direct
1202----------------------------------------------------------
1203En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1204seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1205définitivement privés de service. La spécification du paramètre 'redispatch'
1206autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1207(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001208
1209Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001210---------
willy tarreau0f7af912005-12-17 12:21:26 +01001211 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001212 mode http
1213 cookie SERVERID
1214 dispatch 192.168.1.100:80
1215 server web1 192.168.1.1:80 cookie server01
1216 server web2 192.168.1.2:80 cookie server02
1217 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001218
willy tarreau64a3cc32005-12-18 01:13:11 +01001219Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1220redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1221version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1222identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1223tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1224tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001225
1226 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001227 mode http
1228 option persist
1229 cookie SERVERID
1230 dispatch 192.168.1.100:80
1231 server web1 192.168.1.1:80 cookie server01
1232 server web2 192.168.1.2:80 cookie server02
1233 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001234
willy tarreauc29948c2005-12-17 13:10:27 +01001235
willy tarreau34f45302006-04-15 21:37:14 +020012363.3) Assignation de poids différents à des serveurs
1237---------------------------------------------------
1238Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1239d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1240que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1241soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1242raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1243plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1244plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1245la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1246une vue des serveurs disponibles la plus homogène possible en se basant sur
1247leur poids de sorte que la charge se distribue de la manière la plus lisse
1248possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
willy tarreau532bb552006-05-13 18:40:37 +02001249serveur par rapport aux autres. Le poids de 1 donne la fréquence d'apparition
1250la plus faible, et 256 la fréquence la plus élevée. De cette manière, si un
1251serveur disparait, les capacités restantes sont toujours respectées.
willy tarreau34f45302006-04-15 21:37:14 +02001252
1253
1254Exemple :
1255---------
1256# distribution équitable sur 2 opteron and un ancien pentium3
1257
1258 listen web_appl 0.0.0.0:80
1259 mode http
1260 cookie SERVERID insert nocache indirect
1261 balance roundrobin
1262 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1263 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1264 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1265 server web-backup1 192.168.2.1:80 cookie server04 check backup
1266 server web-excuse 192.168.3.1:80 check backup
1267
1268Notes :
1269-------
1270 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1271
1272 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1273 est plus propre d'utiliser les poids que de répliquer le même serveur
1274 plusieurs fois.
1275
1276 - les poids s'appliquent également aux serveurs de backup si l'option
1277 'allbackups' est positionnée.
1278
1279 - le poids s'applique aussi à la répartition selon la source
1280 ('balance source').
1281
1282 - quels que soient les poids, le premier serveur sera toujours assigné en
1283 premier. Cette règle facilite les diagnostics.
1284
1285 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1286 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1287 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1288
willy tarreau532bb552006-05-13 18:40:37 +02001289La distribution du trafic suivra exactement le séquencement suivant :
1290
1291 Request| 1 1 1 1
1292 number | 1 2 3 4 5 6 7 8 9 0 1 2 3
1293 --------+---------------------------
1294 p3-800 | X . . . . . . X . . . . .
1295 opt-20 | . X . X . X . . . X . X .
1296 opt-24 | . . X . X . X . X . X . X
1297
1298
12993.4) Limitation du nombre de sessions concurrentes par serveur
1300--------------------------------------------------------------
1301Certains serveurs web multi-processus tels qu'Apache souffrent dès qu'il y a
1302trop de sessions concurrentes, parce qu'il est très coûteux de faire
1303fonctionner des centaines ou des milliers de processus sur un système. Une
1304solution consiste à augmenter le nombre de serveurs et de répartir la charge
1305entre eux, mais cela pose un problème lorsque le but est uniquement de résister
1306à des pics de charge occasionnels.
1307
1308Pour résoudre ce problème, une nouvelle fonctionnalité a été implémentée dans
1309HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associée à une
1310file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
1311entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
1312de diminuer la valeur maxconn améliorera notablement les performances des
1313serveurs et diminuera les temps de réponse simplement parce que les serveurs
1314seront moins congestionnés.
1315
1316Quand une requête cherche à joindre n'importe quel serveur, le premier serveur
1317non saturé est utilisé, en respectant l'algorithme de répartition de charge. Si
1318tous les serveurs sont saturés, alors la requête sera mise dans la file
1319d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
1320toutes les requêtes précédentes auront été libérées et qu'un serveur aura été
1321libéré d'une connexion pour la traiter.
1322
1323Si une requête fait référence à un serveur en particulier (p.ex: hachage d'IP
1324source, ou persistance par cookie), et que ce server est saturé, alors la
1325requête sera mise dans la file d'attente dédiée à ce serveur. Cette file
1326d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
1327plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent déjà
1328que pour les nouveaux utilisateurs.
1329
1330Pour cela, les logs ont dû être enrichis pour indiquer le nombre de sessions
1331par serveur, la position de la requête dans les files d'attentes, et le temps
1332passé en file d'attente. Ceci aide considérablement à faire de la prévision de
1333capacité. Voir la section 'logs' plus bas pour plus d'informations.
1334
1335Exemple :
1336---------
1337 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1338 listen web_appl 0.0.0.0:80
1339 maxconn 10000
1340 mode http
1341 cookie SERVERID insert nocache indirect
1342 balance roundrobin
1343 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 maxconn 100 check
1344 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
1345 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
1346 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1347 server web-excuse 192.168.3.1:80 check backup
1348
willy tarreau8f635a42006-05-21 23:05:54 +02001349Cette option se montra si efficace pour réduire les temps de réponse des
1350serveurs que certains utilisateurs voulaient utiliser des valeurs trop basses
1351pour améliorer les performances de leurs serveurs. Seulement, ils n'étaient
1352alors plus en mesure de supporter de très fortes charges parce qu'il n'était
1353plus possible de les saturer. Pour cette raison, la version 1.2.14 a apporté la
1354limitation dynamique de connexions avec l'addition du paramètre "minconn".
1355Lorsque ce paramètre est associé à "maxconn", il active la limitation dynamique
1356basée sur la charge de l'instance. Le nombre maximal de sessions concurrentes
1357sur un serveur devient alors proportionnel au nombre de sessions de l'instance
1358par rapport à son 'maxconn'. Un minimum de <minconn> sessions sera toujours
1359permis quelle que soit la charge. Ceci assurera que les serveurs travailleront
1360au meilleur de leurs performances sous des charges normales, et qu'ils seront
1361tout de même capables de supporter de fortes pointes lorsque nécessaire. La
1362limite dynamique est calculée comme ceci :
1363
1364 srv.dyn_limit = max(srv.minconn, srv.maxconn * inst.sess / inst.maxconn)
1365
1366Exemple :
1367---------
1368 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1369 listen web_appl 0.0.0.0:80
1370 maxconn 10000
1371 mode http
1372 cookie SERVERID insert nocache indirect
1373 balance roundrobin
1374 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check
1375 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check
1376 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1377 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1378 server web-excuse 192.168.3.1:80 check backup
1379
1380Dans l'exemple ci-dessus, le serveur "pentium3-800' recevra au plus 100
1381connexions simultanées lorsque l'instance du proxy en atteindra 10000, et
1382recevra seulement 10 connexions simultanées tant que le proxy sera sous les 1000
1383sessions.
1384
willy tarreau532bb552006-05-13 18:40:37 +02001385Notes :
1386-------
1387 - la requête ne restera pas indéfiniment en file d'attente, elle est
1388 assujétie au paramètre 'contimeout', et si une requête ne peut pas
1389 sortir de la file avant ce time-out, soit parce que le serveur est
1390 saturé, soit parce qu'il y a trop de requêtes en file d'attente,
1391 alors elle expirera avec une erreur 503.
1392
willy tarreau8f635a42006-05-21 23:05:54 +02001393 - si seul <minconn> est spécifié, il a le même effet que <maxconn>
1394
willy tarreau532bb552006-05-13 18:40:37 +02001395 - positionner des valeurs trop basses pour 'maxconn' peut améliorer les
1396 performances mais aussi permettre à des utilisateurs trop lents de bloquer
1397 un serveur pour les autres utilisateurs.
1398
willy tarreau34f45302006-04-15 21:37:14 +02001399
willy tarreau8f635a42006-05-21 23:05:54 +020014003.5) Abandon des requêtes abortées
1401----------------------------------
1402En présence de très fortes charges, les serveurs mettront un certain temps à
1403répondre. La file d'attente du proxy se remplira, et les temps de réponse
1404suivront une croissance proportionnelle à la taille de file d'attente fois
1405le temps moyen de réponse par session. Lorsque les clients attendront plus de
1406quelques secondes, ils cliqueront souvent sur le bouton 'STOP' de leur
1407navigateur, laissant des requêtes inutiles en file d'attente et ralentissant
1408donc les autres utilisateurs.
1409
1410Comme il n'y a aucun moyen de distinguer un vrai clic sur STOP d'une simple
1411fermeture du canal de sortie sur le client (shutdown(SHUT_WR)), les agents HTTP
1412doivent être conservateurs et considérer que le client n'a probablement fermé
1413que le canal de sortie en attendant la réponse. Toutefois, ceci introduit des
1414risques de congestion lorsque beaucoup d'utilisateurs font de même, et s'avère
1415aujourd'hui complètement inutile car probablement aucun client ne referme la
1416session en attendant la réponse. Certains agents HTTP supportent ceci (Squid,
1417Apache, HAProxy), et d'autres ne le supportent pas (TUX, et la plupart des
1418répartiteurs de charge matériels). Donc la probabilité pour qu'une notification
1419de fermeture d'un canal d'entrée côté client représente un utilisateur cliquant
1420sur 'STOP' est proche de 100%, et il est vraiment tentant d'abandonner la
1421requête prématurément sans polluer les serveurs.
1422
1423Pour cette raison, une nouvelle option "abortonclose" a été introduite en
1424version 1.2.14. Par défaut (sans l'option), le comportement reste conforme à
1425HTTP. Mais lorsque l'option est spécifiée, une session dont le canal entrant
1426est fermé sera abortée si cela est possible, c'est à dire que la requête est
1427soit en file d'attente, soit en tentative de connexion. Ceci réduit
1428considérablement la longueur des files d'attentes et la charge sur les serveurs
1429saturés lorsque les utilisateurs sont tentés de cliquer sur 'STOP', ce qui à
1430son tour, réduit les temps de réponse pour les autres utilisateurs.
1431
1432Exemple :
1433---------
1434 listen web_appl 0.0.0.0:80
1435 maxconn 10000
1436 mode http
1437 cookie SERVERID insert nocache indirect
1438 balance roundrobin
1439 server web1 192.168.1.1:80 cookie s1 weight 10 maxconn 100 check
1440 server web2 192.168.1.2:80 cookie s2 weight 10 maxconn 100 check
1441 server web3 192.168.1.3:80 cookie s3 weight 10 maxconn 100 check
1442 server bck1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1443 option abortonclose
1444
1445
willy tarreauc29948c2005-12-17 13:10:27 +010014464) Fonctionnalités additionnelles
1447=================================
1448
1449D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
willy tarreau8f635a42006-05-21 23:05:54 +02001450principalement du mode transparent, de la journalisation des connexions, de la
1451réécriture des en-têtes, et du statut sous forme de page HTML.
1452
willy tarreau5cbea6f2005-12-17 12:48:26 +01001453
willy tarreau0174f312005-12-18 01:02:42 +010014544.1) Fonctionnalités réseau
1455---------------------------
14564.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001457---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001458En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1459routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1460pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001461destination de la session détournée. Le système doit permettre de rediriger les
1462paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001463
1464Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001465---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001466 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001467 mode http
1468 transparent
1469 cookie SERVERID
1470 server server01 192.168.1.1:80
1471 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001472
1473 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1474 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001475
willy tarreaua41a8b42005-12-17 14:02:24 +01001476Remarque :
1477----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001478Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1479adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1480d'une même adresse avec une même instance et sans utiliser directement le mode
1481transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001482
1483Exemple :
1484---------
1485 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001486 mode tcp
1487 server server01 192.168.1.1 check port 60000
1488 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001489
1490 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1491 -j REDIRECT --to-ports 65000
1492
willy tarreau0174f312005-12-18 01:02:42 +01001493
14944.1.2) Choix d'une adresse source par serveur
1495---------------------------------------------------
1496Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1497IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1498backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1499pour joindre le même serveur. C'est également utilisable pour faciliter une
1500répartition de charge selon l'adresse IP source pour des connexions sortantes.
1501Bien entendu, la même adresse est utilisée pour les health-checks.
1502
1503Exemple :
1504---------
1505 # utiliser une adresse particulière pour joindre les 2 serveur
1506 listen http_proxy 0.0.0.0:65000
1507 mode http
1508 balance roundrobin
1509 server server01 192.168.1.1:80 source 192.168.2.13
1510 server server02 192.168.1.2:80 source 192.168.2.13
1511
1512Exemple :
1513---------
1514 # utiliser une adresse particulière pour joindre chaque serveur
1515 listen http_proxy 0.0.0.0:65000
1516 mode http
1517 balance roundrobin
1518 server server01 192.168.1.1:80 source 192.168.1.1
1519 server server02 192.168.2.1:80 source 192.168.2.1
1520
1521Exemple :
1522---------
1523 # faire une répartition d'adresse sources pour joindre le même proxy à
1524 # travers deux liens WAN
1525 listen http_proxy 0.0.0.0:65000
1526 mode http
1527 balance roundrobin
1528 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1529 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1530
1531Exemple :
1532---------
1533 # forcer une connexion TCP à s'attacher à un port particulier
1534 listen http_proxy 0.0.0.0:2000
1535 mode tcp
1536 balance roundrobin
1537 server srv1 192.168.1.1:80 source 192.168.2.1:20
1538 server srv2 192.168.1.2:80 source 192.168.2.1:20
1539
willy tarreaub952e1d2005-12-18 01:31:20 +010015404.1.3) Maintien de session TCP (keep-alive)
1541-------------------------------------------
1542Avec la version 1.2.7, il devient possible d'activer le maintien de session
1543TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1544d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1545externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1546aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1547time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1548positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1549vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1550pour activer le maintien de session TCP :
1551
1552 option tcpka # active le keep-alive côté client et côté serveur
1553 option clitcpka # active le keep-alive côté client
1554 option srvtcpka # active le keep-alive côté serveur
1555
willy tarreau0f7af912005-12-17 12:21:26 +01001556
willy tarreauc29948c2005-12-17 13:10:27 +010015574.2) Journalisation des connexions
1558----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001559
1560L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1561Il fournit probablement le plus fin niveau d'information disponible pour un
1562tel outil, ce qui est très important pour les diagnostics en environnements
1563complexes. En standard, les informations journalisées incluent le port client,
1564les chronométrages des états TCP/HTTP, des états de session précis au moment de
1565la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1566trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1567arbitraires.
1568
1569Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1570transparence sur les problèmes rencontrés, à la fois internes et externes, et
1571il est possible d'envoyer les logs vers des serveurs différents en même temps
1572avec des niveaux de filtrage différents :
1573
1574 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1575 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1576 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1577 - activité par instance (connexions clients), aussi bien lors de leur
1578 établissement qu'à leur terminaison.
1579
1580La possibilité de distribuer différents niveaux de logs à différents serveurs
1581permet à plusieurs équipes de production d'intéragir et de corriger leurs
1582problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1583occasionnellement les erreurs système, pendant que l'équipe application
1584surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1585que l'équipe sécurité analyse l'activité en différé d'une heure.
1586
1587
willy tarreauc1cae632005-12-17 14:12:23 +010015884.2.1) Niveaux de log
1589---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001590Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1591détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1592source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001593la requête HTTP, le code de retour, la quantité de données transmises, et même
1594dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1595Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1596la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001597est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001598
willy tarreau8337c6b2005-12-17 13:41:01 +01001599 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1600 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001601ou
1602 log global
1603
1604Remarque :
1605----------
1606La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1607paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001608
1609Exemple :
1610---------
1611 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001612 mode http
1613 log 192.168.2.200 local3
1614 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001615
willy tarreauc1cae632005-12-17 14:12:23 +010016164.2.2) Format des logs
1617----------------------
1618Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1619de la session entre le client et le relais. En précisant l'option 'tcplog',
1620la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1621sur son état lors de la déconnexion, ainsi que le temps de connexion et la
willy tarreau532bb552006-05-13 18:40:37 +02001622durée totale de la session. Le nombre de sessions restantes après la
1623déconnexion est également indiqué (pour le serveur, l'instance et le process).
willy tarreauc1cae632005-12-17 14:12:23 +01001624
willy tarreauc5f73ed2005-12-18 01:26:38 +01001625Exemple de journalisation TCP :
1626-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001627 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001628 mode tcp
1629 option tcplog
1630 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001631
willy tarreau532bb552006-05-13 18:40:37 +02001632>>> 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 +01001633
willy tarreau532bb552006-05-13 18:40:37 +02001634 Champ Format / Description Exemple
1635
1636 1 nom_processus '[' pid ']:' haproxy[18989]:
1637 2 ip_client ':' port_client 127.0.0.1:34550
1638 3 '[' date ']' [15/Oct/2003:15:24:28]
1639 4 nom_instance relais-tcp
1640 5 nom_serveur Srv1
1641 6 temps_file '/' temps_connect '/' temps_total 0/0/5007
1642 7 octets lus 0
1643 8 etat_terminaison --
1644 9 conn_srv '/' conns_inst '/' conns_processus 1/1/1
1645 10 position en file d'attente srv '/' globale 0/0
willy tarreau982249e2005-12-18 00:57:06 +01001646
willy tarreauc1cae632005-12-17 14:12:23 +01001647Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1648notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1649surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1650les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1651ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1652(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001653
willy tarreauc5f73ed2005-12-18 01:26:38 +01001654Exemple de journalisation HTTP :
1655--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001656 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001657 mode http
1658 option httplog
1659 option dontlognull
1660 log 192.168.2.200 local3
1661
willy tarreau532bb552006-05-13 18:40:37 +02001662>>> 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 +01001663
1664Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001665
willy tarreau532bb552006-05-13 18:40:37 +02001666 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 +01001667
willy tarreau532bb552006-05-13 18:40:37 +02001668 Champ Format / Description Exemple
1669
1670 1 nom_processus '[' pid ']:' haproxy[18989]:
1671 2 ip_client ':' port_client 10.0.0.1:34552
1672 3 '[' date ']' [15/Oct/2003:15:26:31]
1673 4 nom_instance relais-http
1674 5 nom_serveur Srv1
1675 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt 3183/-1/-1/-1/11215
1676 7 Code_retour_HTTP 503
1677 8 octets lus 0
1678 9 cookies_requête_capturés -
1679 10 cookies_reponse_capturés -
1680 11 etat_terminaison SC--
1681 12 conns_srv '/' conns_inst '/' conns_processus 137/202/205
1682 13 position file serveur '/' globale 0/0
1683 14 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1684 15 '{' entetes_reponse_capturés '}' {}
1685 16 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001686
1687Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1688 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001689
1690Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1691de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1692Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001693la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1694tôt possible, c'est à dire juste avant que ne débutent les transferts de
1695données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1696de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001697traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1698représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001699
willy tarreau64a3cc32005-12-18 01:13:11 +01001700Afin d'éviter toute confusion avec les logs normaux, le temps total de
1701transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001702rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001703
1704Exemple :
1705---------
1706
1707 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001708 mode http
1709 option httplog
1710 option dontlognull
1711 option logasap
1712 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001713
willy tarreauc5f73ed2005-12-18 01:26:38 +01001714>>> 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 +01001715
1716
willy tarreauc1cae632005-12-17 14:12:23 +010017174.2.3) Chronométrage des événements
1718-----------------------------------
1719Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1720événements sont d'une très grande utilité. Tous les temps sont mesurés en
1721millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
willy tarreau532bb552006-05-13 18:40:37 +02001722la forme Tq/Tw/Tc/Tr/Tt :
willy tarreauc1cae632005-12-17 14:12:23 +01001723
1724 - Tq: temps total de réception de la requête HTTP de la part du client.
1725 C'est le temps qui s'est écoulé entre le moment où le client a établi
1726 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1727 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1728 que la requête complète n'a jamais été reçue.
1729
willy tarreau532bb552006-05-13 18:40:37 +02001730 - Tw: temps total passé dans les files d'attente avant d'obtenir une place
1731 vers un serveur. Ceci tient compte à la fois de la file d'attente globale
1732 et de celle du serveur, et dépend du nombre de requêtes dans la file et du
1733 temps nécessaire au serveur pour compléter les sessions précédentes. La
1734 valeur '-1' indique que la requête a été détruite avant d'atteindre une
1735 file.
1736
willy tarreauc1cae632005-12-17 14:12:23 +01001737 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1738 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1739 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1740 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1741 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1742 vers le serveur.
1743
1744 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001745 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001746 la connexion. Ca représente exactement le temps de traitement de la
1747 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001748 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001749
1750 - Tt: durée de vie totale de la session, entre le moment où la demande de
1751 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001752 refermée aux deux extrémités (client et serveur). La signification change
1753 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
willy tarreau532bb552006-05-13 18:40:37 +02001754 uniquement à (Tq + Tw + Tc + Tr), et se trouve préfixé d'un signe '+'. On
1755 peut donc déduire Td, le temps de transfert des données, en excluant les
1756 autres temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001757
willy tarreau532bb552006-05-13 18:40:37 +02001758 Td = Tt - (Tq + Tw + Tc + Tr)
willy tarreauc1cae632005-12-17 14:12:23 +01001759
1760 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1761
willy tarreau532bb552006-05-13 18:40:37 +02001762En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
willy tarreauc1cae632005-12-17 14:12:23 +01001763rapportés.
1764
1765Ces temps fournissent de précieux renseignement sur des causes probables de
1766problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1767de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1768de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1769problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1770valeur de time-out dans la configuration, c'est souvent qu'une session a été
1771abandonnée sur expiration d'un time-out.
1772
1773Cas les plus fréquents :
1774
1775 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1776 le client et le relais.
1777 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1778 le relais et le serveur durant la phase de connexion. Cet indicateur
1779 devrait normalement toujours être très bas (moins de quelques dizaines).
1780 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1781 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1782 de pertes entre le relais et le serveur.
1783 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1784 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1785 session est maintenue après la fin des échanges. Voir plus loin pour
1786 savoir comment désactiver le keep-alive HTTP.
1787
1788Autres cas ('xx' représentant une valeur quelconque à ignorer) :
willy tarreau532bb552006-05-13 18:40:37 +02001789 -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 +01001790 a refermé sa connexion sans compléter la requête.
willy tarreau532bb552006-05-13 18:40:37 +02001791 Tq/-1/xx/xx/Tt: Il n'était pas possible de traiter la request, probablement
1792 parce que tous les serveurs étaient hors d'usage.
1793 Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'établir vers le serveur (refus ou
1794 time-out au bout de Tt-(Tq+Tw) ms).
1795 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 +01001796 les temps ou bien a refermé sa connexion trop tôt, au bout
willy tarreau532bb552006-05-13 18:40:37 +02001797 de Tt-(Tq+Tw+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001798
17994.2.4) Conditions de déconnexion
1800--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001801Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1802le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1803un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1804une signification précise :
1805
1806 - sur le premier caractère, un code précisant le premier événement qui a causé
1807 la terminaison de la session :
1808
1809 C : fermeture inattendue de la session TCP de la part du client.
1810
1811 S : fermeture inattendue de la session TCP de la part du serveur, ou
1812 refus explicite de connexion de la part de ce dernier.
1813
1814 P : terminaison prématurée des sessions par le proxy, pour cause
1815 d'imposition d'une limite sur le nombre de connexions, pour cause
1816 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1817 sécurité a détecté et bloqué une anomalie dans la réponse du
1818 serveur qui aurait pu causer une fuite d'informations (par exemple,
1819 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001820
willy tarreauc5f73ed2005-12-18 01:26:38 +01001821 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1822 source, ...). Généralement, cela arrive au cours de l'établissement
1823 d'une connexion, et les logs système doivent contenir une copie de
1824 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001825
willy tarreauc5f73ed2005-12-18 01:26:38 +01001826 I : une erreur interne a été identifiée par le proxy à la suite d'un
1827 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1828 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001829
willy tarreauc5f73ed2005-12-18 01:26:38 +01001830 c : le délai maximal d'attente du client a expiré (clitimeout).
1831
1832 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1833
1834 - : terminaison normale de session.
1835
1836 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1837 la fermeture :
1838
1839 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1840 été transmis au serveur.
1841
willy tarreau532bb552006-05-13 18:40:37 +02001842 Q : attente en file d'attente (QUEUE) d'une place pour avoir une
1843 connexion vers un serveur. Ne peut apparaître que sur un serveur
1844 possédant un paramètre 'maxconn'. Aucune connexion n'a été envoyée
1845 au serveur.
1846
willy tarreauc5f73ed2005-12-18 01:26:38 +01001847 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1848 serveur peut au plus avoir vu la tentative de connexion, mais
1849 aucune donnée n'a été échangée.
1850
1851 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1852
1853 D : transfert des DONNEES du serveur vers le client.
1854
1855 L : transfert des dernières ("LAST") données du proxy vers le client,
1856 alors que le serveur a déjà fini.
1857
Willy Tarreau2272dc12006-09-03 10:19:38 +02001858 T : requête bloquée en mode "tarpit" par le proxy. Elle a été maintenue
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001859 ouverte vers le client pendant toute la durée du contimeout ou
1860 jusqu'à l'abandon de la part du client.
Willy Tarreau2272dc12006-09-03 10:19:38 +02001861
willy tarreauc5f73ed2005-12-18 01:26:38 +01001862 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001863
1864 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001865 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001866
willy tarreauc5f73ed2005-12-18 01:26:38 +01001867 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1868 cas sur les NOUVELLES connexions clients.
1869
1870 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1871 serveur connu. Ceci peut être dû à un changement de configuration
1872 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1873 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001874
willy tarreauc5f73ed2005-12-18 01:26:38 +01001875 D : le client a présenté un cookie correspondant à un serveur hors
1876 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1877 un autre serveur ou a tout de même tenté de se connecter sur celui
1878 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001879
willy tarreauc5f73ed2005-12-18 01:26:38 +01001880 V : le client a présenté un cookie VALIDE et a pu se connecter au
1881 serveur correspondant.
1882
1883 - : non appliquable (pas de cookie positionné dans la configuration).
1884
1885 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1886 persistence retrourné par le serveur (uniquement en mode HTTP) :
1887
1888 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1889 n'a été inséré.
1890
1891 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1892 proxy en a INSERE un.
1893
willy tarreau197e8ec2005-12-17 14:10:59 +01001894 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001895 tel quel ("PASSIF").
1896
1897 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1898
1899 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1900 ne pas être retourné au client.
1901
1902 - : non appliquable
1903
1904
1905La combinaison des deux premiers indicateurs fournit une grande quantitié
1906d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1907peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1908des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001909
willy tarreauc5f73ed2005-12-18 01:26:38 +01001910Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1911
1912 Indic Raison
1913 CR Le client a abandonné avant d'émettre une requête complète. Il est
1914 très probable que la requête ait été tapée à la main dans un client
1915 telnet et abortée trop tôt.
1916
1917 cR Le temps imparti au client a expiré avant réception d'une requête
1918 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1919 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1920 transporter des paquets entiers, ou par des clients qui énvoient des
1921 requêtes à la main et ne tapent pas assez vite.
1922
1923 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1924 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1925 être la couche réseau qui indique au proxy que le serveur n'est pas
1926 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1927
1928 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1929
1930 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1931 nombre de connexions a atteint la limite 'maxconn' (global ou de
1932 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1933 augmenté, tout comme le paramètre 'maxconn' global.
1934
1935 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1936 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1937 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1938 consiste à affiner le paramétrage système.
1939
1940 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1941 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1942 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1943 paquets entiers.
1944
willy tarreau078c79a2006-05-13 12:23:58 +02001945 CH Le client a abandonné alors qu'il attendait un début de réponse de la
1946 part du serveur. Cela peut être causé par le serveur qui mettait trop
1947 de temps à répondre, ou par un client cliquant précipitamment sur le
1948 bouton 'Stop'.
1949
1950 CQ Le client a abandonné alors que sa session était mise en file
1951 d'attente pour obtenir un serveur avec suffisamment de connexions
1952 libres pour l'accepter. Cela signifie soit que l'ensemble des
1953 serveurs étaient saturés, soit que le serveur assigné a mis trop de
1954 temps à répondre.
1955
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001956 CT Le client a abandonné alors que sa session était bloquée en mode
1957 tarpit.
1958
willy tarreau078c79a2006-05-13 12:23:58 +02001959 sQ La session a attendu trop longtemps en file d'attente et a été
1960 expirée.
1961
willy tarreauc5f73ed2005-12-18 01:26:38 +01001962 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
1963 en-têtes. En général, cela indique qu'il a crashé.
1964
1965 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
1966 des transactions trop longues, probablement causées par un back-end
1967 saturé. Les seules solutions sont de corriger le problème sur
1968 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
1969 des attentes plus longues au risque que les clients abandonnent à
1970 leur tour, ou bien d'ajouter des serveurs.
1971
1972 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
1973 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
1974 soit à cause d'une requête validant un filtre d'interdiction, auquel
1975 cas le proxy a renvoyé une erreur HTTP 403.
1976
1977 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
1978 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
1979 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
1980 renvoyée au client.
1981
Willy Tarreau2272dc12006-09-03 10:19:38 +02001982 PT Le proxy a bloqué une requête du client et a maintenu sa connection
1983 ouverte avant de lui retourner une erreur "500 server error". Rien
1984 n'a été envoyé au serveur.
1985
willy tarreauc5f73ed2005-12-18 01:26:38 +01001986 cD Le client n'a pas lu de données pendant le temps qui lui était
1987 imparti. Ceci est souvent causé par des problèmes réseau côté client.
1988
1989 CD Le client a aborté sa connection de manière inattendue pendant le
1990 transfert des données. Ceci est provoqué soit par le crash d'un
1991 navigateur, ou par une session en HTTP keep-alive entre le serveur
1992 et le client terminée en premier par le client.
1993
1994 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
1995 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
1996 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
1997 situés entre le proxy et le serveur.
1998
19994.2.5) Caractères non-imprimables
2000---------------------------------
2001Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
2002tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
2003hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
2004dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
2005caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
2006est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
2007les en-têtes.
2008
20094.2.6) Capture d'en-têtes HTTP et de cookies
2010--------------------------------------------
2011La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
2012capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
2013
2014Les captures de cookies facilitent le suivi et la reconstitution d'une session
2015utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01002016
2017 capture cookie <préfixe_cookie> len <longueur_capture>
2018
willy tarreauc5f73ed2005-12-18 01:26:38 +01002019Ceci activera la capture de cookies à la fois dans les requêtes et dans les
2020réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
2021bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
2022nouveau cookie.
2023
willy tarreau8337c6b2005-12-17 13:41:01 +01002024Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
2025transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
2026caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
2027le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
2028place dans les logs.
2029
2030Exemples :
2031----------
2032 # capture du premier cookie dont le nom commence par "ASPSESSION"
2033 capture cookie ASPSESSION len 32
2034
2035 # capture du premier cookie dont le nom est exactement "vgnvisitor"
2036 capture cookie vgnvisitor= len 32
2037
willy tarreau036e1ce2005-12-17 13:46:33 +01002038Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01002039positionné par le serveur, précédé du cookie positionné par le client. Chacun
2040de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01002041par le client ou le serveur, ou lorsque l'option est désactivée..
2042
2043Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
2044pour suivre un identifiant de requête globalement unique positionné par un
2045autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
2046de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
2047peut chercher des informations relatives à la longueur annoncée de la réponse,
2048le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
2049de redirection. Tout comme pour les captures de cookies, il est possible
2050d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
2051la suivante :
2052
2053 capture request header <nom> len <longueur max>
2054 capture response header <nom> len <longueur max>
2055
2056Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01002057
willy tarreauc5f73ed2005-12-18 01:26:38 +01002058Exemples:
2059---------
2060 # conserver le nom du serveur virtuel accédé par le client
2061 capture request header Host len 20
2062 # noter la longueur des données envoyées dans un POST
2063 capture request header Content-Length len 10
2064
2065 # noter le fonctionnement attendu du cache par le serveur
2066 capture response header Cache-Control len 8
2067 # noter l'URL de redirection
2068 capture response header Location len 20
2069
2070Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
2071fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
2072regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
2073chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
2074réponse sont présentés de la même manière, mais après un espace suivant le bloc
2075d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
2076
2077 Config:
2078
2079 capture request header Host len 20
2080 capture request header Content-Length len 10
2081 capture request header Referer len 20
2082 capture response header Server len 20
2083 capture response header Content-Length len 10
2084 capture response header Cache-Control len 8
2085 capture response header Via len 20
2086 capture response header Location len 20
2087
2088 Log :
2089
willy tarreau532bb552006-05-13 18:40:37 +02002090 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/"
2091 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"
2092 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 +01002093
20944.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01002095-----------------------
willy tarreau532bb552006-05-13 18:40:37 +02002096- 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 +01002097 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
2098 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01002099
willy tarreau532bb552006-05-13 18:40:37 +02002100- 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"
2101 => Idem, mais la requête a été mise en attente dans la file globale derrière
2102 9 autres requêtes déjà présentes, et y a attendu 1230 ms.
2103
2104- 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 +01002105 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
2106 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 +01002107 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 +01002108 total entre l'accept() et le premier octet de donnée est de 30 ms.
2109
willy tarreau532bb552006-05-13 18:40:37 +02002110- 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 +01002111 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
2112 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
2113 d'informations risquant d'être cachées. Dans ce cas, la réponse est
2114 remplacée par '502 bad gateway'.
2115
willy tarreau532bb552006-05-13 18:40:37 +02002116- 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 +01002117 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01002118 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01002119 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01002120
willy tarreau532bb552006-05-13 18:40:37 +02002121- 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 +01002122 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01002123 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01002124 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
2125 pu renvoyer un message 408 au client.
2126
willy tarreauc5f73ed2005-12-18 01:26:38 +01002127- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
2128 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
2129 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01002130
willy tarreau532bb552006-05-13 18:40:37 +02002131- 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 +01002132 => La requête client met 3s à entrer (peut-être un problème réseau), et la
2133 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreau532bb552006-05-13 18:40:37 +02002134 secondes (retries 3 dans la conf), puis un code 503 est retourné au
2135 client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
2136 instance, et 205 sur l'ensemble des instances pour ce processus. Il est
2137 possible que le serveur ait refusé la connexion parce qu'il y en avait
2138 déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01002139
willy tarreau4302f492005-12-18 01:00:37 +01002140
willy tarreauc5f73ed2005-12-18 01:26:38 +010021414.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01002142----------------------------------
2143En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
2144requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01002145possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
2146de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01002147connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
2148comme faisant partie des échanges de données consécutifs à la première requête.
2149Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01002150
2151La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01002152 reqadd <string> pour ajouter un en-tête dans la requête
2153 reqrep <search> <replace> pour modifier la requête
2154 reqirep <search> <replace> idem sans distinction majuscules/minuscules
2155 reqdel <search> pour supprimer un en-tête dans la requête
2156 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002157 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01002158 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002159 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01002160 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002161 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01002162 reqipass <search> idem sans distinction majuscules/minuscules
Willy Tarreau2272dc12006-09-03 10:19:38 +02002163 reqtarpit <search> bloquer et maintenir une request validant <search>
2164 reqitarpit <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002165
willy tarreau036e1ce2005-12-17 13:46:33 +01002166 rspadd <string> pour ajouter un en-tête dans la réponse
2167 rsprep <search> <replace> pour modifier la réponse
2168 rspirep <search> <replace> idem sans distinction majuscules/minuscules
2169 rspdel <search> pour supprimer un en-tête dans la réponse
2170 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01002171 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01002172 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01002173 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002174
willy tarreau0f7af912005-12-17 12:21:26 +01002175
willy tarreau036e1ce2005-12-17 13:46:33 +01002176<search> est une expression régulière compatible POSIX regexp supportant le
2177groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
2178doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
2179chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
2180backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01002181
2182 \t pour une tabulation
2183 \r pour un retour charriot
2184 \n pour un saut de ligne
2185 \ pour différencier un espace d'un séparateur
2186 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01002187 \\ pour utiliser un backslash dans la regex
2188 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01002189 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01002190
willy tarreau0f7af912005-12-17 12:21:26 +01002191
willy tarreau5cbea6f2005-12-17 12:48:26 +01002192<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
2193Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
2194groupe délimité par des parenthèses dans l'expression régulière, par sa
Willy Tarreau2272dc12006-09-03 10:19:38 +02002195position numérale. Les positions vont de 0 à 9, et sont codées par un '\'
2196suivi du chiffre désiré (0 désignant la ligne complète). Il est également
2197possible d'insérer un caractère non imprimable (utile pour le saut de ligne)
2198inscrivant '\x' suivi du code hexadécimal de ce caractère (comme en C).
willy tarreau5cbea6f2005-12-17 12:48:26 +01002199
2200<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01002201dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002202
2203Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01002204-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002205 - 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 +01002206 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002207 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
2208 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
2209 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01002210 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
2211 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
2212 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01002213 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01002214 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
2215 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
Willy Tarreau2272dc12006-09-03 10:19:38 +02002216 - une requête bloquée par 'reqtarpit' sera maintenue pendant une durée égale
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002217 au paramètre 'contimeout', ou jusqu'à l'abandon du client. Rien ne sera
2218 envoyé au serveur. Lorsque le temps alloué expire, le proxy répondra avec
2219 une réponse "500 server error" de sorte que l'attaquant ne suspecte pas
2220 qu'il ait été bloqué. Les logs rapporteront aussi ce code 500, mais les
2221 flags de terminaison indiqueront "PT".
willy tarreau0f7af912005-12-17 12:21:26 +01002222
2223Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01002224----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01002225 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01002226
willy tarreauc5f73ed2005-12-18 01:26:38 +01002227 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
2228 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
2229 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002230
willy tarreauc5f73ed2005-12-18 01:26:38 +01002231 # force proxy connections to close
2232 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
2233 # rewrite locations
2234 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002235
willy tarreauc5f73ed2005-12-18 01:26:38 +01002236 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01002237
willy tarreau197e8ec2005-12-17 14:10:59 +01002238 # Every header should end with a colon followed by one space.
2239 reqideny ^[^:\ ]*[\ ]*$
2240
2241 # block Apache chunk exploit
2242 reqideny ^Transfer-Encoding:[\ ]*chunked
2243 reqideny ^Host:\ apache-
2244
2245 # block annoying worms that fill the logs...
2246 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
2247 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
2248 reqideny ^[^:\ ]*\ .*<script
2249 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
2250
Willy Tarreau2272dc12006-09-03 10:19:38 +02002251 # tarpit attacks on the login page.
2252 reqtarpit ^[^:\ ]*\ .*\.php?login=[^0-9]
2253
willy tarreau197e8ec2005-12-17 14:10:59 +01002254 # allow other syntactically valid requests, and block any other method
2255 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
2256 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
2257 reqideny ^[^:\ ]*\
2258
2259 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01002260 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01002261
willy tarreauc5f73ed2005-12-18 01:26:38 +01002262 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01002263 rspidel ^Server:\
2264 rspadd Server:\ Formilux/0.1.8
2265
willy tarreau0f7af912005-12-17 12:21:26 +01002266
willy tarreau982249e2005-12-18 00:57:06 +01002267De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01002268'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002269connaître l'adresse IP du client initial. Depuis la version 1.3.8, il est
2270possible de préciser le mot-clé "except" suivi d'une adresse ou un réseau
2271IP source pour lequel l'entête ne sera pas ajouté. C'est très pratique dans le
2272cas où un autre reverse-proxy ajoutant déjà l'entête est installé sur la même
2273machine ou dans une DMZ connue. Le cas le plus fréquent est lié à l'utilisation
2274de stunnel en local.
willy tarreauc1cae632005-12-17 14:12:23 +01002275
willy tarreau982249e2005-12-18 00:57:06 +01002276Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01002277en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01002278Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
2279méthode impliquant 4 règles.
2280
willy tarreauc1cae632005-12-17 14:12:23 +01002281Exemple :
2282---------
2283 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002284 mode http
2285 log global
2286 option httplog
2287 option dontlognull
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002288 option forwardfor except 127.0.0.1/8
willy tarreauc5f73ed2005-12-18 01:26:38 +01002289 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01002290
Willy TARREAU767ba712006-03-01 22:40:50 +01002291Notons que certains serveurs HTTP ne referment pas nécessairement la session
2292TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
2293ce qui se traduit par des grands nombres de sessions établies et des temps
2294globaux très longs sur les requêtes. Pour contourner ce problème, la version
22951.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
2296vers le serveur dès qu'il commence à répondre et seulement si le tampon de
2297requête est vide. Attention toutefois à ne PAS utiliser cette option si des
2298méthodes CONNECT sont attendues entre le client et le serveur. L'option
2299'forceclose' implique l'option 'httpclose'.
2300
2301Exemple :
2302---------
2303 listen http_proxy 0.0.0.0:80
2304 mode http
2305 log global
2306 option httplog
2307 option dontlognull
2308 option forwardfor
2309 option forceclose
2310
2311
willy tarreauc29948c2005-12-17 13:10:27 +010023124.4) Répartition avec persistence
2313---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002314La combinaison de l'insertion de cookie avec la répartition de charge interne
2315permet d'assurer une persistence dans les sessions HTTP d'une manière
2316pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01002317 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01002318 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01002319 - insérer un cookie dans les réponses issues d'une répartition uniquement,
2320 et faire en sorte que des caches ne mémorisent pas ce cookie.
2321 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002322
2323Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01002324---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002325 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002326 mode http
2327 cookie SERVERID insert nocache indirect
2328 balance roundrobin
2329 server srv1 192.168.1.1:80 cookie server01 check
2330 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01002331
willy tarreau0174f312005-12-18 01:02:42 +01002332L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
2333cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
2334Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
2335client et le serveur de travailler en mode "keep-alive" afin que le proxy
2336puisse corriger le nom du cookie dans toutes les futures requêtes.
2337
2338 listen application 0.0.0.0:80
2339 mode http
2340 cookie JSESSIONID prefix
2341 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002342 server srv1 192.168.1.1:80 cookie srv1 check
2343 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002344 option httpclose
2345
2346
willy tarreau982249e2005-12-18 00:57:06 +010023474.5) Protection contre les fuites d'informations du serveur
2348-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002349Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002350créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002351'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2352un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2353activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002354 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002355 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002356 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002357 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002358 un en-tête 'Cache-control: public' ;
2359 - celles qui ont un en-tête 'Pragma: no-cache' ;
2360 - celles qui ont un en-tête 'Cache-control: private' ;
2361 - celles qui ont un en-tête 'Cache-control: no-store' ;
2362 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2363 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2364 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2365 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2366 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002367 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002368
willy tarreau982249e2005-12-18 00:57:06 +01002369Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2370même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2371message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2372dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002373en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002374l'administrateur sache qu'il y a une action correctrice à entreprendre.
2375
23764.6) Personalisation des erreurs
2377--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002378Certaines situations conduisent à retourner une erreur HTTP au client :
2379 - requête invalide ou trop longue => code HTTP 400
2380 - requête mettant trop de temps à venir => code HTTP 408
2381 - requête interdite (bloquée par un reqideny) => code HTTP 403
2382 - erreur interne du proxy => code HTTP 500
2383 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2384 - aucun serveur disponible pour cette requête => code HTTP 503
2385 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2386
2387Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2388Cependant, en fonction du type de clientèle, on peut préférer retourner des
willy tarreau64a3cc32005-12-18 01:13:11 +01002389pages personnalisées. Ceci est possible par le biais de la commande "errorloc":
willy tarreau8337c6b2005-12-17 13:41:01 +01002390
2391 errorloc <code_HTTP> <location>
2392
2393Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2394le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2395d'une page précisée dans <location>. Cette adresse peut être relative au site,
2396ou absolue. Comme cette réponse est traîtée par le navigateur du client
2397lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2398
2399Exemple :
2400---------
2401 listen application 0.0.0.0:80
2402 errorloc 400 /badrequest.html
2403 errorloc 403 /forbidden.html
2404 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002405 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002406 errorloc 502 http://192.168.114.58/error50x.html
2407 errorloc 503 http://192.168.114.58/error50x.html
2408 errorloc 504 http://192.168.114.58/error50x.html
2409
willy tarreauc1f47532005-12-18 01:08:26 +01002410Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2411accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2412problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2413régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2414dans le champ Location avec la méthode GET uniquement. Seulement, certains
2415navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2416plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2417devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002418l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2419visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002420
2421Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2422utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2423dès que vous savez que vos clients supportent le code de retour HTTP 303.
2424
willy tarreau982249e2005-12-18 00:57:06 +010024254.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002426--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002427Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2428évite de répéter des paramètres communs à toutes les instances, tels que les
2429timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002430
2431Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2432précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2433'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2434section implique une annulation de tous les paramètres par défaut positionnés
2435précédemment, dans le but de les remplacer.
2436
2437La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2438paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2439un commentaire en guise paramètre.
2440
willy tarreau982249e2005-12-18 00:57:06 +01002441Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2442positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002443 - log (le premier et le second)
2444 - mode { tcp, http, health }
2445 - balance { roundrobin }
2446 - disabled (pour désactiver toutes les instances qui suivent)
2447 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2448 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002449 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2450 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002451 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002452 - cookie, capture
2453 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002454
2455Ne sont pas supportés dans cette version, les adresses de dispatch et les
2456configurations de serveurs, ainsi que tous les filtres basés sur les
2457expressions régulières :
2458 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002459 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002460
2461Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2462positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2463défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2464paramètres par défaut avant la déclaration de l'instance.
2465
2466Exemples :
2467----------
2468 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002469 log global
2470 mode tcp
2471 balance roundrobin
2472 clitimeout 180000
2473 srvtimeout 180000
2474 contimeout 4000
2475 retries 3
2476 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002477
2478 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002479 server srv1 192.168.1.1 check port 6000 inter 10000
2480 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002481
2482 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002483 server srv1 192.168.2.1 check port 6000 inter 10000
2484 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002485
2486 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002487 log global
2488 mode http
2489 option httplog
2490 option forwardfor
2491 option dontlognull
2492 balance roundrobin
2493 clitimeout 20000
2494 srvtimeout 20000
2495 contimeout 4000
2496 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002497
2498 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002499 cookie SERVERID postonly insert indirect
2500 capture cookie userid= len 10
2501 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2502 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002503
2504 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002505 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002506
willy tarreau8f635a42006-05-21 23:05:54 +02002507
25084.8) Rapport d'état sous forme de page HTML
2509-------------------------------------------
2510Avec la version 1.2.14, il devient possible pour haproxy d'interceptre des
2511requêtes pour une URI particulière et de retourner un rapport complet d'état de
2512l'activité du proxy, et des statistiques sur les serveurs. Ceci est disponible
2513via le mot clé "stats" associé à n'importe laquelle de ces options :
2514
2515 - stats enable
2516 - stats uri <uri prefix>
2517 - stats realm <authentication realm>
2518 - stats auth <user:password>
2519 - stats scope <proxy_id> | '.'
2520
2521
2522Par défaut, le rapport est désactivé. Le fait de spécifier une des combinaision
2523ci-dessus active le rapport pour l'instance de proxy qui le référence. La
2524solution la plus simple est d'utiliser "stats enable" qui activera le rapport
2525avec les paramètres par défaut suivant :
2526
2527 - default URI : "/haproxy?stats" (CONFIG_STATS_DEFAULT_URI)
2528 - default auth : non spécifié (pas d'authentication)
2529 - default realm : "HAProxy Statistics" (CONFIG_STATS_DEFAULT_REALM)
2530 - default scope : non specifié (accès à toutes les instances)
2531
2532L'option "stats uri <uri_prefix>" permet d'intercepter un autre préfixe d'URI
2533que celui par défaut. Noter que n'importe quelle URI qui COMMENCE avec cette
2534chaîne sera validée. Par exemple, une instance pourrait être dédiée à la page
2535d'état seulement et répondre à toute URI.
2536
2537Example :
2538---------
2539 # intercepte n'importe quelle URI et retourne la page d'état.
2540 listen stats :8080
2541 mode http
2542 stats uri /
2543
2544
2545L'option "stats auth <user:password>" active l'authentification "Basic" et
2546ajoute un couple "user:password" valide à la liste des comptes autorisés.
2547L'utilisateur <user> et le mot de passe <password> doivent être précisés
2548en clair dans le fichier de configuration, et comme ceci est de
2549l'authentification HTTP "Basic", il faut être conscient qu'ils transitent en
2550clair sur le réseau, donc il ne faut pas utiliser de compte sensible. La liste
2551est illimitée dans le but de pouvoir fournir des accès facilement à des
2552développeurs ou à des clients.
2553
2554L'option "stats realm <realm>" définit le "domaine" ("realm") de validité du
2555mot de passe qui sera présenté dans la boîte de dialogue du navigateur
2556lorsqu'il demandera un compte utilisateur et un mot de passe. Il est important
2557de s'assurer que celui-ci soit différent de ceux utilisés par l'application,
2558autrement le navigateur tentera d'en utiliser un caché depuis l'application.
2559Noter que les espaces dans le nom de "realm" doivent être protégés par un
2560backslash ('\').
2561
2562L'option "stats scope <proxy_id>" limite la portée du rapport d'état. Par
2563défaut, toutes les instances proxy sont listées. Mais dans certaines
2564circonstances, il serait préférable de ne lister que certains proxies ou
2565simplement le proxy courant. C'est ce que fait cette option. Le nom spécial "."
2566(un simple point) référence le proxy courant. Cette option peut être répétée
2567autant de fois que nécessaire pour autoriser d'autres proxies, même pour des
2568noms référencés plus loin dans la configuration ou bien des noms qui n'existent
2569pas encore. Le nom précisé est celui qui apparait après le mot clé "listen".
2570
2571Exemple :
2572---------
2573 # simple application embarquant la page d'état authentifiée
2574 listen app1 192.168.1.100:80
2575 mode http
2576 option httpclose
2577 balance roundrobin
2578 cookie SERVERID postonly insert indirect
2579 server srv1 192.168.1.1:8080 cookie srv1 check inter 1000
2580 server srv1 192.168.1.2:8080 cookie srv2 check inter 1000
2581 stats uri /my_stats
2582 stats realm Statistics\ for\ MyApp1-2
2583 stats auth guest:guest
2584 stats auth admin:AdMiN123
2585 stats scope .
2586 stats scope app2
2587
2588 # simple application embarquant la page d'état sans authentification
2589 listen app2 192.168.2.100:80
2590 mode http
2591 option httpclose
2592 balance roundrobin
2593 cookie SERVERID postonly insert indirect
2594 server srv1 192.168.2.1:8080 cookie srv1 check inter 1000
2595 server srv1 192.168.2.2:8080 cookie srv2 check inter 1000
2596 stats uri /my_stats
2597 stats realm Statistics\ for\ MyApp2
2598 stats scope .
2599
2600 listen admin_page :8080
2601 mode http
2602 stats uri /my_stats
2603 stats realm Global\ statistics
2604 stats auth admin:AdMiN123
2605
2606Notes :
2607-------
2608 - les options "stats" peuvent aussi être spécifiées dans une section
2609 "defaults", auquel cas la même configuration exactement sera fournie à
2610 toutes les instances suivantes, d'où l'utilité du scope ".". Toutefois, si
2611 une instance redéfinit n'importe quel paramètre "stats", alors les défauts
2612 ne lui seront pas appliqués.
2613
2614 - l'authentification "Basic" est très simpliste et non sécurisée contre la
2615 capture réseau. Aucun mot de passe sensible ne doit être utilisé, et il
2616 est bon de savoir qu'il n'existe pas de moyen de le supprimer du navigateur
2617 après usage, donc il sera envoyé tel quel à l'application au cours des
2618 accès successifs.
2619
2620 - Il est très important de préciser l'option "httpclose", sinon le proxy ne
2621 sera pas en mesure de détecter les URI dans les sessions keep-alive
2622 maintenues entre le navigateur et les serveurs, donc les URI de stats
2623 seront transmises telles quelles aux serveurs comme si l'option n'était
2624 pas précisée.
2625
2626
Willy Tarreau726c2bf2007-05-09 01:31:45 +020026275) Listes d'accès
2628=================
2629
2630Avec la version 1.3.10, un nouveau concept de listes d'accès (ACL) a vu le
2631jour. Comme il n'était pas nécessaire de réinventer la roue, et du fait que
2632toutes les réflexions passées aboutissaient à des propositions non
2633satisfaisantes, il a finalement été décidé que quelque chose de proche de ce
2634que Squid offre serait un bon compromis entre une richesse fonctionnelle et une
2635facilité d'utilisation
2636
2637Le principe est très simple : les ACLs sont déclarées avec un nom, un test et
2638une liste de valeurs valides à tester. Des conditions sont appliquées sur
2639diverses actions, et ces conditions effectuent un ET logique entre les ACLs. La
2640condition n'est donc validée que si toutes les ACLs sont vraies.
2641
2642Il est également possible d'utiliser le mot réservé "OR" dans les conditions,
2643et il est possible pour une ACL d'être spécifiée plusieurs fois, même avec des
2644tests différents, auquel cas le premier test réussi validera l'ACL.
2645
2646Au stade de la version 1.3.10, seuls les tests suivants ont été implémentés :
2647
2648 Niveaux 3/4 :
2649 src <ipv4_address>[/mask] ... : match IPv4 source address
2650 dst <ipv4_address>[/mask] ... : match IPv4 destination address
2651 src_port <low>[:<high>] ... : match source port range
2652 dst_port <low>[:<high>] ... : match destination port range
2653 dst_limit <max> : true if frontend has less than <max> connections
2654
2655 Niveau 7 :
2656 method <HTTP method> ... : match HTTP method
2657 req_ver <1.0|1.1> ... : match HTTP request version
2658 resp_ver <1.0|1.1> ... : match HTTP response version
2659 status <low>[:<high>] ... : match HTTP response status code in range
2660 url <string> ... : exact string match on URI
2661 url_reg <regex> ... : regex string match on URI
2662 url_beg <string> ... : true if URI begins with <string>
2663 url_end <string> ... : true if URI ends with <string>
2664 url_sub <string> ... : true if URI contains <string>
2665 url_dir <string> ... : true if URI contains <string> between slashes
2666 url_dom <string> ... : true if URI contains <string> between slashes or dots
2667
2668D'autres tests arrivent (entêtes, cookies, heure, authentification), c'est
2669juste une question de temps. Il est aussi prévu de permettre de lire les
2670valeurs depuis un fichier, ainsi que d'ignorer la casse pour certains tests.
2671
2672La seule commande supportant les conditions d'ACL à ce jour est la nouvelle
2673commande "block" qui bloque une requête et retourne un statut 403 si sa
2674condition est validée (cas du "if") ou invalidée (cas du "unless").
2675
2676Exemple :
2677---------
2678
2679 acl options_uris url *
2680 acl meth_option method OPTIONS
2681 acl http_1.1 req_ver 1.1
2682 acl allowed_meth method GET HEAD POST OPTIONS CONNECT
2683 acl connect_meth method CONNECT
2684 acl proxy_url url_beg http://
2685
2686 # block if reserved URI "*" used with a method other than "OPTIONS"
2687 block if options_uris !meth_option
2688
2689 # block if the OPTIONS method is used with HTTP 1.0
2690 block if meth_option !http_1.1
2691
2692 # allow non-proxy url with anything but the CONNECT method
2693 block if !connect_meth !proxy_url
2694
2695 # block all unknown methods
2696 block unless allowed_meth
2697
2698Note: Cette documentation est embryonnaire mais doit permettre de démarrer et
2699surtout d'avancer sur le projet sans être trop ralenti par la documentation.
2700
2701
willy tarreaub719f002005-12-17 12:55:07 +01002702=======================
2703| Paramétrage système |
2704=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002705
2706Sous Linux 2.4
2707==============
2708
willy tarreaub719f002005-12-17 12:55:07 +01002709-- cut here --
2710#!/bin/sh
2711# set this to about 256/4M (16384 for 256M machine)
2712MAXFILES=16384
2713echo $MAXFILES > /proc/sys/fs/file-max
2714ulimit -n $MAXFILES
2715
2716if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002717 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002718fi
2719
2720if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002721 # 30 seconds for fin, 15 for time wait
2722 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2723 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2724 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2725 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002726fi
2727
willy tarreau0f7af912005-12-17 12:21:26 +01002728echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002729echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2730echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002731echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002732echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2733echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002734echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2735echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002736echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002737echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002738echo 0 > /proc/sys/net/ipv4/tcp_dsack
2739
2740# auto-tuned on 2.4
2741#echo 262143 > /proc/sys/net/core/rmem_max
2742#echo 262143 > /proc/sys/net/core/rmem_default
2743
2744echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2745echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2746
2747-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002748
willy tarreau197e8ec2005-12-17 14:10:59 +01002749Sous FreeBSD
2750============
2751
2752Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2753Clement Laforet <sheepkiller@cultdeadsheep.org>.
2754
2755Pour plus d'informations :
2756http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2757http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2758http://www.freshports.org/net/haproxy
2759
2760
willy tarreau0f7af912005-12-17 12:21:26 +01002761-- fin --