blob: 7974546bf4cd23f2f0b52739be7ad896ec850ca3 [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>
Willy Tarreau1db37712007-06-03 17:16:49 +0200137 - tune.maxpollevents <nombre>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100138
willy tarreaua1598082005-12-17 13:08:06 +0100139
1401.1) Journalisation des événements
141----------------------------------
142La plupart des événements sont journalisés : démarrages, arrêts, disparition et
143apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
144syslog vers un ou deux serveurs. La syntaxe est la suivante :
145
willy tarreau8337c6b2005-12-17 13:41:01 +0100146 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100147
148Les connexions sont envoyées en niveau "info". Les démarrages de service et de
149serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
150arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau64a3cc32005-12-18 01:13:11 +0100151bien pour les proxies que pour les serveurs testés par les proxies. Le
152paramètre optionnel <niveau_max> définit le niveau maximal de traces émises
153parmi les 8 valeurs suivantes :
willy tarreau8337c6b2005-12-17 13:41:01 +0100154 emerg, alert, crit, err, warning, notice, info, debug
155
willy tarreaueedaa9f2005-12-17 14:08:03 +0100156Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100157est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100158
159Les catégories possibles sont :
160 kern, user, mail, daemon, auth, syslog, lpr, news,
161 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
162 local0, local1, local2, local3, local4, local5, local6, local7
163
willy tarreau036e1ce2005-12-17 13:46:33 +0100164Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
165
willy tarreaua1598082005-12-17 13:08:06 +0100166Exemple :
167---------
168 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100169 log 192.168.2.200 local3
170 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100171
1721.2) limitation du nombre de connexions
173---------------------------------------
174Il est possible et conseillé de limiter le nombre global de connexions par
willy tarreauc5f73ed2005-12-18 01:26:38 +0100175processus à l'aide du mot clé global 'maxconn'. Les connexions sont comprises
176au sens 'acceptation de connexion', donc il faut s'attendre en règle général à
177avoir un peu plus du double de sessions TCP que le maximum de connexions fixé.
178C'est important pour fixer le paramètre 'ulimit -n' avant de lancer le proxy.
179Pour comptabiliser le nombre de sockets nécessaires, il faut prendre en compte
180ces paramètres :
181
willy tarreaua1598082005-12-17 13:08:06 +0100182 - 1 socket par connexion entrante
183 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100184 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100185 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100186 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100187
willy tarreau64a3cc32005-12-18 01:13:11 +0100188Dans le cas où chaque proxy n'écoute que sur un couple adresse/port,
willy tarreauc5f73ed2005-12-18 01:26:38 +0100189positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
190(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
191il est possible de spécifier cette limite dans la configuration à l'aide du
192mot-clé global 'ulimit-n', à condition bien entendu que le proxy ait été
193démarré sous le compte root (ou avec des droits suffisants pour élever le
194nombre de descripteurs de fichiers). Cette solution met un terme au problème
195récurrent d'incertitude de l'adéquation entre les limites systèmes lors de la
196dernière relance du proxessus et les limites en nombre de connexions. Noter que
197cette limite s'applique par processus.
198
199Exemple :
200---------
201 global
202 maxconn 32000
203 ulimit-n 65536
204
willy tarreauc29948c2005-12-17 13:10:27 +0100205
2061.3) Diminution des privilèges
207------------------------------
208Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
209serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100210de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100211
willy tarreauc29948c2005-12-17 13:10:27 +0100212Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
213numérique d'utilisateur. La valeur 0, correspondant normalement au super-
214utilisateur, possède ici une signification particulière car elle indique que
215l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
216C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
217un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200218changer. Dans le cas où il ne serait pas possible de spécifier un identifiant
219numérique pour l'uid, il est possible de spécifier un nom d'utilisateur après
220le mot-clé 'user'. De la même manière, il est possible de préciser un nom de
221groupe après le mot-clé 'group'.
222
223Il est particulièrement déconseillé d'utiliser des comptes génériques tels que
224'nobody' car cette pratique revient à utiliser 'root' si d'autres processus
225utilisent les mêmes identifiants.
willy tarreauc29948c2005-12-17 13:10:27 +0100226
227Le paramètre 'chroot' autorise à changer la racine du processus une fois le
228programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100229puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100230généralement contournable sur certains OS (Linux, Solaris) pour peu que
231l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
232un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
233service pour cet usage, et de ne pas mutualiser un même répertoire pour
234plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
235il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
236l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100237
willy tarreau64a3cc32005-12-18 01:13:11 +0100238Remarque importante :
239---------------------
240Dans le cas où une telle faille serait mise en évidence, il est fort probable
241que les premières tentatives de son exploitation provoquent un arrêt du
willy tarreauc29948c2005-12-17 13:10:27 +0100242programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
willy tarreau64a3cc32005-12-18 01:13:11 +0100243encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur
244en environnement limité réduit les risques d'intrusion, il est parfois bien
245utile dans ces circonstances de connaître les conditions d'apparition du
246problème, via l'obtention d'un fichier 'core'. La plupart des systèmes, pour
247des raisons de sécurité, désactivent la génération du fichier 'core' après un
248changement d'identifiant pour le processus. Il faudra donc soit lancer le
249processus à partir d'un compte utilisateur aux droits réduits (mais ne pouvant
250pas effectuer le chroot), ou bien le faire en root sans réduction des droits
251(uid 0). Dans ce cas, le fichier se trouvera soit dans le répertoire de
252lancement, soit dans le répertoire spécifié après l'option 'chroot'. Ne pas
253oublier la commande suivante pour autoriser la génération du fichier avant de
254lancer le programme :
willy tarreauc29948c2005-12-17 13:10:27 +0100255
256# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100257
willy tarreauc29948c2005-12-17 13:10:27 +0100258Exemple :
259---------
260
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200261 # with uid/gid
willy tarreauc29948c2005-12-17 13:10:27 +0100262 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100263 uid 30000
264 gid 30000
265 chroot /var/chroot/haproxy
willy tarreauc29948c2005-12-17 13:10:27 +0100266
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200267 # with user/group
268 global
269 user haproxy
270 group public
271 chroot /var/chroot/haproxy
272
273
willy tarreaufe2c5c12005-12-17 14:14:34 +01002741.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100275----------------------------
276Le service peut fonctionner dans plusieurs modes :
277 - avant- / arrière-plan
278 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100279
willy tarreau64a3cc32005-12-18 01:13:11 +0100280Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne
281rend pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci
282dans un script de démarrage du système, sinon le système ne finirait pas son
willy tarreauc29948c2005-12-17 13:10:27 +0100283initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
284au processus appelant. C'est ce que fait l'option 'daemon' de la section
285'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100286
willy tarreau34f45302006-04-15 21:37:14 +0200287Le paramètre de ligne de commande '-db' inhibe les options globales 'daemon'
288et 'nbproc' pour faire fonctionner le processus en mode normal, avant-plan.
289
willy tarreauc29948c2005-12-17 13:10:27 +0100290Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
291standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
292logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
293Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100294
willy tarreauc29948c2005-12-17 13:10:27 +0100295Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
296problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
297entre les clients et les serveurs. Ce mode est incompatible avec les options
298'daemon' et 'quiet' pour des raisons de bon sens.
299
willy tarreaufe2c5c12005-12-17 14:14:34 +01003001.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100301-----------------------------------------------
302Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
303processeur pour effectuer les tâches de relayage, même si les charges
304nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
305grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
306programme sait démarrer plusieurs processus se répartissant la charge de
307travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
308section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100309qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
310la limite de nombre de descripteurs de fichiers allouée par processus sous
311Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100312
313Exemple :
314---------
315
316 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100317 daemon
318 quiet
319 nbproc 2
willy tarreauc29948c2005-12-17 13:10:27 +0100320
willy tarreaufe2c5c12005-12-17 14:14:34 +01003211.6) Simplification de la gestion des processus
322-----------------------------------------------
323Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
324paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
325d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
326le numéro de PID des processus fils, à raison d'un par ligne (valable
327uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
328afin de rester compatible avec un répertoire protégé en lecture seule. Il
329appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
3300644.
331
332Exemple :
333---------
334
335 global
336 daemon
337 quiet
338 nbproc 2
339 pidfile /var/run/haproxy-private.pid
340
341 # pour stopper seulement ces processus parmi d'autres :
342 # kill $(</var/run/haproxy-private.pid)
343
willy tarreau34f45302006-04-15 21:37:14 +0200344 # pour recharger une configuration avec un impact minimal sur le service,
345 # et sans casser les sessions existantes :
Willy Tarreau10806d52007-09-09 23:49:18 +0200346 # haproxy -f haproxy.cfg -p /var/run/haproxy-private.pid -sf $(</var/run/haproxy-private.pid)
willy tarreauc29948c2005-12-17 13:10:27 +0100347
willy tarreau64a3cc32005-12-18 01:13:11 +01003481.7) Mécanismes de traitements des événements
349---------------------------------------------
350A partir de la version 1.2.5, haproxy supporte les mécanismes poll() et
351epoll(). Sur les systems où select() est limité par FD_SETSIZE (comme Solaris),
352poll() peut être une alternative intéressante. Des tests de performance
353montrent que les performances de poll() ne décroissent pas aussi vite que le
354nombre de sockets augmente, ce qui en fait une solution sûre pour les fortes
355charges. Cela dit, Soalris utilise déjà poll() pour émuler select(), donc tant
356que le nombre de sockets ne dépasse pas FD_SETSIZE, poll() ne devrait pas
357apporter de performances supplémentaires. Sur les systèmes à base Linux
358incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
359qui est extrèmement rapide indépendamment du nombre de sockets. Les tests sur
360haproxy ont montré une performance constante de 1 à 40000 sessions simultanées.
Willy Tarreaude99e992007-04-16 00:53:59 +0200361La version 1.3.9 a introduit le support de kqueue() pour FreeBSD/OpenBSD, ainsi
362qu'une variante appelée "speculative epoll()" consistant à tenter d'effectuer
363les opérations d'entrées/sorties avant de chaîner les événements par les appels
364système.
willy tarreau64a3cc32005-12-18 01:13:11 +0100365
Willy Tarreau1db37712007-06-03 17:16:49 +0200366Afin d'optimiser la latence, il est désormais possible de limiter le nombre
367d'événements remontés à chaque appel. La limite par défaut est fixée à 200. Si
368une latence plus petite est recherchée, il peut être justifié d'abaisser cette
369limite par l'utilisation du paramètre 'tune.maxpollevents' dans la section
370'global'. L'augmenter permettra d'économiser un peu le processeur en présence
371de très grands nombres de connexions simultanées.
372
Willy Tarreaude99e992007-04-16 00:53:59 +0200373Haproxy utilisera kqueue() ou speculative epoll() lorsque ce sera disponible,
374puis epoll(), et se repliera sur poll(), puis en dernier lieu sur select().
375Cependant, si pour une raison quelconque il s'avérait nécessaire de désactiver
376epoll() ou poll() (p.ex: à cause d'un bug ou juste pour comparer les
377performances), de nouvelles options globales ont été ajoutées dans ce but :
378'nosepoll', 'nokqueue', 'noepoll' et 'nopoll'.
willy tarreau64a3cc32005-12-18 01:13:11 +0100379
380Exemple :
381---------
382 global
383 # utiliser seulement select()
384 noepoll
385 nopoll
Willy Tarreau1db37712007-06-03 17:16:49 +0200386 tune.maxpollevents 100
willy tarreau64a3cc32005-12-18 01:13:11 +0100387
388Remarque :
389----------
390Dans le but d'assurer une portabilité maximale des configurations, ces options
391sont acceptées et ignorées si les mécanismes poll() ou epoll() n'ont pas été
392activés lors de la compilation.
393
394Afin de simplifier la résolution de problèmes, le paramètre '-de' en ligne de
Willy Tarreaude99e992007-04-16 00:53:59 +0200395commande désactive epoll(), le paramètre '-dp' désactive poll(), '-dk' kqueue()
396et '-ds' désactive speculative epoll(). Ils sont respectivement équivalents à
397'noepoll', 'nopoll', 'nokqueue' et 'nosepoll'.
willy tarreau64a3cc32005-12-18 01:13:11 +0100398
399
willy tarreauc29948c2005-12-17 13:10:27 +01004002) Définition d'un service en écoute
401====================================
402
403Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100404
willy tarreaua41a8b42005-12-17 14:02:24 +0100405 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100406
willy tarreauc29948c2005-12-17 13:10:27 +0100407- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
willy tarreau64a3cc32005-12-18 01:13:11 +0100408 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé.
409 Aucun test n'est effectué concernant l'unicité de ce nom, qui n'est pas
410 obligatoire, mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100411
willy tarreaua41a8b42005-12-17 14:02:24 +0100412- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
413 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
414 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100415
willy tarreaua41a8b42005-12-17 14:02:24 +0100416- <plage_ports> correspond soit à un port, soit à une plage de ports sur
417 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
418 Cette plage peut être :
419 - soit un port numérique (ex: '80')
420 - soit une plage constituée de deux valeurs séparées par un tiret
421 (ex: '2000-2100') représentant les extrémités incluses dans la
422 plage.
423 Il faut faire attention à l'usage des plages, car chaque combinaison
424 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
425 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
426 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
willy tarreau64a3cc32005-12-18 01:13:11 +0100427 niveau de privilège particulier lors du lancement du programme
428 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100429
willy tarreaua41a8b42005-12-17 14:02:24 +0100430- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
431 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
432 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
433
434Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100435---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100436 listen http_proxy :80
437 listen x11_proxy 127.0.0.1:6000-6009
438 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
439 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100440
willy tarreaua41a8b42005-12-17 14:02:24 +0100441Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
442rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
443de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
444l'écriture de configurations :
445
446 bind [ <adresse_IP>:<plage_ports>[,...] ]
447
448Exemples :
449----------
450 listen http_proxy
451 bind :80,:443
willy tarreauc5f73ed2005-12-18 01:26:38 +0100452 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100453
willy tarreauc29948c2005-12-17 13:10:27 +01004542.1) Inhibition d'un service
455----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100456Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100457commenter toute une partie du fichier. Il suffit de positionner le mot clé
458"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100459
460 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100461 disabled
willy tarreau0f7af912005-12-17 12:21:26 +0100462
willy tarreaueedaa9f2005-12-17 14:08:03 +0100463Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
willy tarreauc5f73ed2005-12-18 01:26:38 +0100464 désactivé par le mot clé 'disabled', par exemple à cause d'une
465 configuration par défaut.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100466
willy tarreauc29948c2005-12-17 13:10:27 +01004672.2) Mode de fonctionnement
468---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100469Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100470 - TCP
471 - HTTP
willy tarreau532bb552006-05-13 18:40:37 +0200472 - état de santé
willy tarreau0f7af912005-12-17 12:21:26 +0100473
474Mode TCP
475--------
willy tarreau64a3cc32005-12-18 01:13:11 +0100476Dans ce mode, le service relaye, dès leur établissement, les connexions TCP
477vers un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il
478s'agit simplement d'une association
479 source<adresse:port> -> destination<adresse:port>.
willy tarreauc29948c2005-12-17 13:10:27 +0100480Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100481
willy tarreauc29948c2005-12-17 13:10:27 +0100482Exemple :
483---------
willy tarreau0f7af912005-12-17 12:21:26 +0100484 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100485 mode tcp
willy tarreau0f7af912005-12-17 12:21:26 +0100486
487Mode HTTP
488---------
willy tarreauc29948c2005-12-17 13:10:27 +0100489Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
490serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
willy tarreauc5f73ed2005-12-18 01:26:38 +0100491décision. Les en-têtes HTTP sont analysés pour y trouver un éventuel cookie, et
willy tarreauc29948c2005-12-17 13:10:27 +0100492certains d'entre-eux peuvent être modifiés par le biais d'expressions
493régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
494relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100495
willy tarreauc29948c2005-12-17 13:10:27 +0100496Exemple :
497---------
willy tarreau0f7af912005-12-17 12:21:26 +0100498 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100499 mode http
willy tarreau0f7af912005-12-17 12:21:26 +0100500
501Mode supervision
502----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100503Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
504santé du service. Il se contente de retourner "OK" à tout client se connectant
505sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100506déterminer quels sont les services utilisables. Si l'option 'httpchk' est
507activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
508attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100509le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100510
willy tarreauc29948c2005-12-17 13:10:27 +0100511Exemple :
512---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100513 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100514 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100515 mode health
willy tarreau0f7af912005-12-17 12:21:26 +0100516
willy tarreau197e8ec2005-12-17 14:10:59 +0100517 # réponse HTTP : 'HTTP/1.0 200 OK'
518 listen http_health_check 0.0.0.0:60001
willy tarreauc5f73ed2005-12-18 01:26:38 +0100519 mode health
520 option httpchk
willy tarreau197e8ec2005-12-17 14:10:59 +0100521
willy tarreau0f7af912005-12-17 12:21:26 +0100522
willy tarreau532bb552006-05-13 18:40:37 +02005232.2.1 Supervision
524-----------------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100525Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
526bon fonctionnement du proxy sans perturber le service. Le mot-clé 'monitor-net'
527a été créé dans le butd de spécifier un réseau d'équipements qui ne PEUVENT PAS
528utiliser le service pour autre chose que des tests de fonctionnement. C'est
529particulièrement adapté aux proxies TCP, car cela empêche le proxy de relayer
530des établissements de connexion émis par un outil de surveillance.
531
532Lorsque c'est utilisé sur un proxy TCP, la connexion est acceptée puis refermée
533et rien n'est logué. C'est suffisant pour qu'un répartiteur de charge en amont
534détecte que le service est disponible.
535
536Lorsque c'est utilisé sur un proxy HTTP, la connexion est acceptée, rien n'est
537logué, puis la réponse suivante est envoyée et la session refermée :
538"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un répartiteur de charge
539HTTP en amont détecte le service comme opérationnel, aussi bien à travers des
540tests TCP que HTTP.
541
542Les proxies utilisant le mot-clé 'monitor-net' peuvent accessoirement se passer
543de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
544émises depuis d'autres adresses que celles du réseau de tests.
545
546Exemple :
547---------
548
549 listen tse-proxy
550 bind :3389,:1494,:5900 # TSE, ICA and VNC at once.
551 mode tcp
552 balance roundrobin
553 server tse-farm 192.168.1.10
554 monitor-net 192.168.1.252/31 # L4 load-balancers on .252 and .253
555
556
Willy Tarreau1c47f852006-07-09 08:22:27 +0200557Lorsque le système effectuant les tests est situé derrière un proxy, le mot-clé
558'monitor-net' n'est pas utilisable du fait que haproxy verra toujours la même
559adresse pour le proxy. Pour pallier à cette limitation, la version 1.2.15 a
560apporté le mot-clé 'monitor-uri'. Il définit une URI qui ne sera ni retransmise
561ni logée, mais pour laquelle haproxy retournera immédiatement une réponse
562"HTTP/1.0 200 OK". Cela rend possibles les tests de validité d'une chaîne
563reverse-proxy->haproxy en une requête HTTP. Cela peut être utilisé pour valider
564une combinaision de stunnel+haproxy à l'aide de tests HTTPS par exemple. Bien
565entendu, ce mot-clé n'est valide qu'en mode HTTP, sinon il n'y a pas de notion
566d'URI. Noter que la méthode et la version HTTP sont simplement ignorées.
567
568Exemple :
569---------
570
571 listen stunnel_backend :8080
572 mode http
573 balance roundrobin
574 server web1 192.168.1.10:80 check
575 server web2 192.168.1.11:80 check
576 monitor-uri /haproxy_test
577
578
willy tarreauc29948c2005-12-17 13:10:27 +01005792.3) Limitation du nombre de connexions simultanées
580---------------------------------------------------
581Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
582connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
583d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
584limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100585
willy tarreauc29948c2005-12-17 13:10:27 +0100586Exemple :
587---------
588 listen tiny_server 0.0.0.0:80
589 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100590
591
willy tarreauc29948c2005-12-17 13:10:27 +01005922.4) Arrêt en douceur
593---------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100594Il est possible d'arrêter les services en douceur en envoyant un signal
willy tarreau22739ef2006-01-20 20:43:32 +0100595SIGUSR1 au processus relais. Tous les services seront alors mis en phase
willy tarreau64a3cc32005-12-18 01:13:11 +0100596d'arrêt, mais pourront continuer d'accepter des connexions pendant un temps
597défini par le paramètre 'grace' (en millisecondes). Cela permet par exemple,
598de faire savoir rapidement à un répartiteur de charge qu'il ne doit plus
599utiliser un relais, tout en continuant d'assurer le service le temps qu'il
600s'en rende compte.
601
602Remarque :
603----------
604Les connexions actives ne sont jamais cassées. Dans le pire des cas, il faudra
willy tarreau22739ef2006-01-20 20:43:32 +0100605attendre en plus leur expiration avant l'arrêt total du processus, ou bien tuer
606manuellement le processus par l'envoi d'un signal SIGTERM. La valeur par défaut
607du paramètre 'grace' est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100608
609Exemple :
610---------
willy tarreauc29948c2005-12-17 13:10:27 +0100611 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100612 # le service tournera encore 10 secondes après la demande d'arrêt
613 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100614 mode http
615 grace 10000
willy tarreau0f7af912005-12-17 12:21:26 +0100616
willy tarreauc29948c2005-12-17 13:10:27 +0100617 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100618 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100619 mode health
620 grace 0
willy tarreau0f7af912005-12-17 12:21:26 +0100621
willy tarreau39df2dc2006-01-29 21:56:05 +0100622A partir de la version 1.2.8, un nouveau mécanisme de reconfiguration à chaud
willy tarreau22739ef2006-01-20 20:43:32 +0100623a été introduit. Il est désormais possible de mettre les proxies en "pause" en
624envoyant un signal SIGTTOU aux processus. Cela désactivera les sockets d'écoute
625sans casser les sessions existantes. Suite à cela, l'envoi d'un signal SIGTTIN
626réactivera les sockets d'écoute. Ceci est très pratique pour tenter de charger
627une nouvelle configuration ou même une nouvelle version de haproxy sans casser
628les connexions existantes. Si le rechargement s'effectue correctement, il ne
629reste plus qu'à envoyer un signal SIGUSR1 aux anciens processus, ce qui
630provoquera leur arrêt immédiat dès que leurs connexions seront terminées ; en
631revanche, si le rechargement échoue, il suffit d'envoyer un signal SIGTTIN pour
632remettre les ports en écoute et rétablir le service immédiatement. Veuillez
633noter que le paramètre 'grace' est ignoré pour le signal SIGTTOU ainsi que le
634signal SIGUSR1 une fois le processus en pause. Aussi, il peut s'avérer très
635utile de sauver le fichier de pid avant de démarrer une nouvelle instance.
636
willy tarreau34f45302006-04-15 21:37:14 +0200637Ce mécanisme est pleinement exploité à partir de la version 1.2.11 avec les
willy tarreau532bb552006-05-13 18:40:37 +0200638options '-st' et '-sf' (voir ci-dessous).
639
6402.4) Reconfiguration à chaud
641----------------------------
642Les paramètres '-st' et '-sf' sont utilisés pour informer des processus
643existants que la configuration va être rechargée. Ils recevront le signal
644SIGTTOU, leur demandant de libérer les ports en écoute afin que le nouveau
645processus puisse les prendre. Si quoi que ce soit se passe mal, le nouveau
646processus leur enverra un signal SIGTTIN pour leur indiquer qu'ils peuvent
647se remettre en écoute et continuer leur travail. En revanche, si la
648configuration se charge correctement, alors ils recevront un signal de demande
649de fin de travail en douceur (-sf), ou de terminaison immédiate (-st) qui
650coupera les sessions en cours. Un usage typique tel que celui-ci permet de
651recharger une configuration sans interruption de service :
652
653 # haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
654
willy tarreau0f7af912005-12-17 12:21:26 +0100655
willy tarreauc29948c2005-12-17 13:10:27 +01006562.5) Temps d'expiration des connexions
657--------------------------------------
658Il est possible de paramétrer certaines durées d'expiration au niveau des
659connexions TCP. Trois temps indépendants sont configurables et acceptent des
660valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
661session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100662
663 - temps d'attente d'une donnée de la part du client, ou de la
664 possibilité de lui envoyer des données : "clitimeout" :
665
willy tarreauc5f73ed2005-12-18 01:26:38 +0100666 # time-out client à 2mn30.
667 clitimeout 150000
willy tarreau0f7af912005-12-17 12:21:26 +0100668
669 - temps d'attente d'une donnée de la part du serveur, ou de la
670 possibilité de lui envoyer des données : "srvtimeout" :
671
willy tarreauc5f73ed2005-12-18 01:26:38 +0100672 # time-out serveur à 30s.
673 srvtimeout 30000
willy tarreau0f7af912005-12-17 12:21:26 +0100674
675 - temps d'attente de l'établissement d'une connexion vers un serveur
676 "contimeout" :
677
willy tarreauc29948c2005-12-17 13:10:27 +0100678 # on abandonne si la connexion n'est pas établie après 4 secondes
willy tarreauc5f73ed2005-12-18 01:26:38 +0100679 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100680
willy tarreauc29948c2005-12-17 13:10:27 +0100681Remarques :
682-----------
683 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
684 type "health".
685 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
willy tarreau64a3cc32005-12-18 01:13:11 +0100686 possible de perdre des paquets. Du fait que la première retransmission
687 TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
688 inférieur à 3 secondes ne permet pas de se rattraper sur la perte
689 de paquets car la session aura été abandonnée avant la première
690 retransmission. Une valeur de 4 secondes réduira considérablement
691 le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100692
willy tarreauc29948c2005-12-17 13:10:27 +01006932.6) Tentatives de reconnexion
694------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100695Lors d'un échec de connexion vers un serveur, il est possible de
696retenter (potentiellement vers un autre serveur, en cas de répartition
697de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100698abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100699
willy tarreauc29948c2005-12-17 13:10:27 +0100700Exemple :
701---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100702 # on essaie encore trois fois maxi
703 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100704
willy tarreau34f45302006-04-15 21:37:14 +0200705Il est à noter que la tentative de reconnexion peut amener à utiliser un autre
706serveur si le premier a disparu entre deux tentatives de connexion.
707
willy tarreau0f7af912005-12-17 12:21:26 +0100708
willy tarreauc29948c2005-12-17 13:10:27 +01007092.7) Adresse du serveur
710-----------------------
711Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
712le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
713serveur d'assignation de cookie dans le cas où le service consiste à assurer
714uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100715le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
716du serveur distant, et il est maintenant recommandé d'utiliser de préférence
717le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100718
willy tarreauc29948c2005-12-17 13:10:27 +0100719Exemple :
720---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100721 # on envoie toutes les nouvelles connexions ici
722 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100723
willy tarreauc29948c2005-12-17 13:10:27 +0100724Remarque :
725----------
726Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
727'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100728
willy tarreau0f7af912005-12-17 12:21:26 +0100729
willy tarreau240afa62005-12-17 13:14:35 +01007302.8) Adresse de sortie
731----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100732Il est possible de forcer l'adresse utilisée pour établir les connexions vers
733les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
734port, bien que cette fonctionnalité se limite à des usages très spécifiques.
735C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100736pour permettre aux serveurs de trouver le chemin de retour dans des contextes
737de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
738choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
739librement par le système. Il est à noter que depuis la version 1.1.18, les
740tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
741source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100742
743Exemples :
744----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100745 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100746 # toutes les connexions prennent l'adresse 192.168.1.200
747 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100748
willy tarreaua41a8b42005-12-17 14:02:24 +0100749 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100750 # utiliser l'adresse 192.168.1.200 et le port réservé 900
751 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100752
753
7542.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100755--------------------------------
756En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
757vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
758par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100759
willy tarreauc29948c2005-12-17 13:10:27 +0100760Exemple :
761---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100762 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100763 mode http
764 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100765
willy tarreauc29948c2005-12-17 13:10:27 +0100766On peut modifier l'utilisation du cookie pour la rendre plus intelligente
767vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
768réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
769cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100770de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
771inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100772
773Exemples :
774----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100775
776Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100777dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
778directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100779
willy tarreauc5f73ed2005-12-18 01:26:38 +0100780 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100781
willy tarreauc29948c2005-12-17 13:10:27 +0100782Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
783lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100784
willy tarreauc5f73ed2005-12-18 01:26:38 +0100785 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100786
willy tarreau64a3cc32005-12-18 01:13:11 +0100787Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
788accès en répartition de charge interne. Dans ce cas, il est souhaitable que
789tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100790retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100791
willy tarreauc5f73ed2005-12-18 01:26:38 +0100792 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100793
willy tarreau0174f312005-12-18 01:02:42 +0100794Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
795puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
796permet d'insérer une instance de haproxy devant une application sans risquer
797d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
798plus d'un cookie :
799
800 cookie JSESSIONID prefix
801
willy tarreau240afa62005-12-17 13:14:35 +0100802Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
803ajouter le mot clé 'nocache' après 'insert' :
804
willy tarreauc5f73ed2005-12-18 01:26:38 +0100805 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100806
willy tarreau64a3cc32005-12-18 01:13:11 +0100807Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
808mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100809
willy tarreauc5f73ed2005-12-18 01:26:38 +0100810 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100811
willy tarreau240afa62005-12-17 13:14:35 +0100812
willy tarreau96d40372005-12-17 13:11:56 +0100813Remarques :
814-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100815- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
816 s'adapter à des applications générant déjà le cookie, avec un contenu
817 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100818
willy tarreau96d40372005-12-17 13:11:56 +0100819- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
820 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
821 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100822
willy tarreau240afa62005-12-17 13:14:35 +0100823- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
824 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
825 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
826 cookie de persistence inséré, donc provoquer des changements de serveurs pour
827 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100828
willy tarreau0174f312005-12-18 01:02:42 +0100829- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
830 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
831 présenté par l'application qui est censée savoir à quel moment il peut
832 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
833 présenté par le client dans chaque requête ultérieure, il est indispensable
834 de s'assurer que le client et le serveur communiqueront sans "keep-alive
835 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
836
willy tarreaucd878942005-12-17 13:27:43 +0100837- lorsque l'application est bien connue, et que les parties nécessitant de la
838 persistence sont systématiquement accédées par un formulaire en mode POST,
839 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
840 et "indirect", car la page d'accueil reste cachable, et c'est l'application
841 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100842
willy tarreau240afa62005-12-17 13:14:35 +01008432.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100844----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100845En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
846par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100847
willy tarreau5cbea6f2005-12-17 12:48:26 +0100848 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100849
willy tarreauc29948c2005-12-17 13:10:27 +0100850- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
851 configuration et les logs.
852- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
853- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100854
855Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100856---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100857 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100858 mode http
859 cookie SERVERID
860 dispatch 192.168.1.100:80
861 server web1 192.168.1.1:80 cookie server01
862 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100863
864Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100865-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100866
willy tarreaua41a8b42005-12-17 14:02:24 +01008673) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100868=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100869
willy tarreauc29948c2005-12-17 13:10:27 +0100870Le relais peut effectuer lui-même la répartition de charge entre les différents
871serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
872cela, on précise le mot clé 'balance' dans la définition du service,
willy tarreau34f45302006-04-15 21:37:14 +0200873éventuellement suivi du nom d'un algorithme de répartition. Jusqu'à la version
8741.2.11, seul 'roundrobin' était géré, et c'est aussi la valeur implicite par
Willy Tarreau2fcb5002007-05-08 13:35:26 +0200875défaut. Avec la version 1.2.12, le nouveau mot clé 'source' est apparu. La
876version 1.3.10 a également apporté le mot clé 'uri'. Il est évident qu'en cas
877d'utilisation du répartiteur interne, il ne faudra pas spécifier d'adresse de
878dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100879
880Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100881---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100882
willy tarreaua41a8b42005-12-17 14:02:24 +0100883 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100884 mode http
885 cookie SERVERID
886 balance roundrobin
887 server web1 192.168.1.1:80 cookie server01
888 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100889
willy tarreaua41a8b42005-12-17 14:02:24 +0100890Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
891du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
892sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
893champ <port> de l'adresse serveur :
894
895 - non spécifié ou nul :
896 la connexion sera envoyée au serveur sur le même port que celui sur
897 lequel le relais a reçu la connexion.
898
899 - valeur numérique (seul cas supporté pour les versions antérieures) :
900 le serveur recevra la connexion sur le port désigné.
901
902 - valeur numérique précédée d'un signe '+' :
903 la connexion sera envoyée au serveur sur le même port que celui sur
904 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
905
906 - valeur numérique précédée d'un signe '-' :
907 la connexion sera envoyée au serveur sur le même port que celui sur
908 lequel le relais a reçu la connexion, duquel on soustrait la valeur
909 désignée.
910
911Exemples :
912----------
913
914# même que précédemment
915
916 listen http_proxy :80
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 simultané des ports 80 et 81 et 8080-8089
924
925 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100926 mode http
927 cookie SERVERID
928 balance roundrobin
929 server web1 192.168.1.1 cookie server01
930 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100931
932# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
933
934 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100935 mode tcp
936 balance roundrobin
937 server srv1 192.168.1.1:+1000
938 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100939
willy tarreau34f45302006-04-15 21:37:14 +0200940Comme indiqué précédemment, la version 1.2.12 apporta le nouveau mot clé
941'source'. Lorsque celui-ci est utilisé, l'adresse IP du client est hachée et
942distribuée de manière homogène parmi les serveurs disponibles, de sorte qu'une
943même adresse IP aille toujours sur le même serveur tant qu'il n'y a aucun
944changement dans le nombre de serveurs disponibles. Ceci peut être utilisé par
945exemple pour attacher le HTTP et le HTTPS sur un même serveur pour un même
946client. Cela peut également être utilisé pour améliorer la persistance
947lorsqu'une partie de la population des clients n'accepte pas les cookies. Dans
948ce cas, seuls ces derniers seront perturbés par la perte d'un serveur.
949
950NOTE: il est important de prendre en compte le fait que beaucoup d'internautes
951 naviguent à travers des fermes de proxies qui assignent des adresses IP
952 différentes à chaque requête. D'autres internautes utilisent des liens à
953 la demande et obtiennent une adresse IP différente à chaque connexion. De
954 ce fait, le paramètre 'source' doit être utilisé avec une extrème
955 précaution.
956
957Exemples :
958----------
959
960# assurer qu'une même adresse IP ira sur le même serveur pour tout service
961
962 listen http_proxy
963 bind :80,:443
964 mode http
965 balance source
966 server web1 192.168.1.1
967 server web2 192.168.1.2
968
969# améliorer la persistance par l'utilisation de la source en plus du cookie :
970
971 listen http_proxy :80
972 mode http
973 cookie SERVERID
974 balance source
975 server web1 192.168.1.1 cookie server01
976 server web2 192.168.1.2 cookie server02
977
Willy Tarreau2fcb5002007-05-08 13:35:26 +0200978De plus, tel qu'indiqué ci-dessus, la version 1.3.10 a introduit le mot clé
979'uri'. Il est très pratique dans le cas de répartition de charge entre des
980reverse-proxy-caches, parce qu'il utilisera le résultat d'un hachage de l'URI
981pour choisir un serveur, ce qui aura pour effet d'optimiser le taux de cache
982du fait que la même URI sera toujours envoyée au même cache. Ce mot-clé n'est
983autorisé qu'en mode HTTP.
984
985Example :
986---------
987
988# Envoie toujours une URI donnée au même serveur
989
990 listen http_proxy
991 bind :3128
992 mode http
993 balance uri
994 server squid1 192.168.1.1
995 server squid2 192.168.1.2
996
willy tarreau0f7af912005-12-17 12:21:26 +0100997
willy tarreauc29948c2005-12-17 13:10:27 +01009983.1) Surveillance des serveurs
999------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001000Il est possible de tester l'état des serveurs par établissement de connexion
1001TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
1002utilisé dans le processus de répartition de charge interne. Pour activer la
1003surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
1004Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
1005tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
1006paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
1007Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreau34f45302006-04-15 21:37:14 +02001008
willy tarreaue47c8d72005-12-17 12:55:52 +01001009 - inter : 2000
1010 - rise : 2
1011 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +01001012 - port : port de connexion du serveur
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001013 - addr : adresse de connexion du serveur (par defaut: adresse du serveur)
1014
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001015Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001016certains cas de pannes, des serveurs peuvent continuer à accepter les
1017connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
1018d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
1019et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
1020les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
1021contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
1022RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
10231.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
1024possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
1025l'avantage d'être facilement extractibles des logs, et de ne pas induire
1026d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
1027considérées valides, les autres (y compris non-réponses) aboutissent à un
1028échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
1029deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
1030"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
1031accepte donc 4 formes :
willy tarreau34f45302006-04-15 21:37:14 +02001032
willy tarreaueedaa9f2005-12-17 14:08:03 +01001033 - option httpchk -> OPTIONS / HTTP/1.0
1034 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
1035 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
1036 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreau34f45302006-04-15 21:37:14 +02001037
Willy Tarreauf3c69202006-07-09 16:42:34 +02001038HAProxy est souvent utilisé pour relayer divers protocoles reposant sur TCP,
1039tels que HTTPS, SMTP ou LDAP, le plus commun étant HTTPS. Un problème assez
1040couramment rencontré dans les data centers est le besoin de relayer du trafic
1041vers des serveurs lointains tout en maintenant la possibilité de basculer sur
1042un serveur de secours. Les tests purement TCP ne suffisent pas toujours dans
1043ces situations car l'on trouve souvent, dans la chaîne, des proxies, firewalls
1044ou répartiteurs de charge qui peuvent acquitter la connexion avant qu'elle
1045n'atteigne le serveur. La seule solution à ce problème est d'envoyer des tests
1046applicatifs. Comme la demande pour les tests HTTPS est élevée, ce test a été
1047implémenté en version 1.2.15 sur la base de messages SSLv3 CLIENT HELLO. Pour
1048l'activer, utiliser "option ssl-hello-chk". Ceci enverra des messages SSLv3
1049CLIENT HELLO aux serveurs, en annonçant un support pour la majorité des
1050algorithmes de chiffrement. Si en retour, le serveur envoie ce qui ressemble à
1051une réponse SSLv3 SERVER HELLO ou ALERT (refus des algorithmes), alors la
1052réponse sera considérée comme valide. Noter qu'Apache ne produit pas de log
1053lorsqu'il reçoit des messages HELLO, ce qui en fait un type de message
1054parfaitement adapté à ce besoin.
1055
Willy Tarreau23677902007-05-08 23:50:35 +02001056La version 1.3.10 est accompagnée d'un nouveau test d'état pour le SMTP. Par
1057défaut, il consiste à envoyer "HELO localhost" aux serveurs, et à attendre le
1058message "250" en retour. Notez qu'il peut aussi envoyer une requête plus
1059spécifique :
1060
1061 - option smtpchk -> envoie "HELO localhost"
1062 - option smtpchk EHLO mail.mydomain.com -> envoie ce message ESMTP
1063
willy tarreauc5f73ed2005-12-18 01:26:38 +01001064Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001065
willy tarreau8337c6b2005-12-17 13:41:01 +01001066Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
1067utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
1068ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
1069de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
1070les 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 +01001071de répartition de charge entre des serveurs de secours par défaut. A partir
1072de la version 1.2.9, il est possible de les utiliser simultanément grâce à
1073l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
1074d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
1075de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
1076définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
1077qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +01001078
willy tarreaua41a8b42005-12-17 14:02:24 +01001079Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
1080vers un port différent de celui de service. C'est nécessaire principalement
1081pour les configurations où le serveur n'a pas de port prédéfini, par exemple
1082lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001083le paramètre 'port' suivi du numéro de port devant répondre aux requêtes. Il
1084est possible d'envoyer les tests de fonctionnement vers une adresse différente
1085de celle de service. Cela permet d'utiliser, sur la machine faisant fonctionner
1086HAproxy, un démon permettant des tests specifiques ( REGEX sur un résultat et
1087basculement de plusieurs fermes en cas d'erreur sur l'une d'elles).
willy tarreaua41a8b42005-12-17 14:02:24 +01001088
willy tarreau64a3cc32005-12-18 01:13:11 +01001089Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
1090l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
1091SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
1092envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
1093elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
1094local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +01001095
willy tarreau982249e2005-12-18 00:57:06 +01001096Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
1097logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
1098afin de notifier l'administrateur qu'il faut prendre une action immédiate.
1099
willy tarreau0174f312005-12-18 01:02:42 +01001100Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
1101même valeur de cookie. C'est particulièrement utile en mode backup, pour
1102sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
1103oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
1104temporairement vers une page d'erreur en attendant le redémarrage d'une
1105application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
1106le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
1107chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
1108le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
1109pour plus d'informations.
1110
willy tarreauc29948c2005-12-17 13:10:27 +01001111Exemples :
1112----------
willy tarreaua41a8b42005-12-17 14:02:24 +01001113# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001114 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001115 mode http
1116 cookie SERVERID
1117 balance roundrobin
1118 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 tarreaubc4e1fb2005-12-17 13:32:07 +01001120
willy tarreau2f6ba652005-12-17 13:57:42 +01001121# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001122 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
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 tarreau5cbea6f2005-12-17 12:48:26 +01001129
willy tarreau2f6ba652005-12-17 13:57:42 +01001130# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
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 /index.html
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 tarreau2f6ba652005-12-17 13:57:42 +01001138
willy tarreaueedaa9f2005-12-17 14:08:03 +01001139# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1140 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001141 mode http
1142 cookie SERVERID
1143 balance roundrobin
1144 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1145 server web1 192.168.1.1:80 cookie server01 check
1146 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001147
willy tarreau0174f312005-12-18 01:02:42 +01001148# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1149# douceur utilisant un second port (81) juste pour les health-checks.
1150 listen http_proxy 0.0.0.0:80
1151 mode http
1152 cookie JSESSIONID prefix
1153 balance roundrobin
1154 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1155 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1156 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1157 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1158 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1159
willy tarreau96d40372005-12-17 13:11:56 +01001160# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001161# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1162# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +01001163 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001164 mode http
1165 cookie SERVERID insert nocache indirect
1166 balance roundrobin
1167 server web1 192.168.1.1:80 cookie server01 check
1168 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +01001169
willy tarreaueedaa9f2005-12-17 14:08:03 +01001170# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001171 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001172 mode http
1173 cookie SERVERID insert nocache indirect
1174 balance roundrobin
1175 server web1 192.168.1.1:80 cookie server01 check
1176 server web2 192.168.1.2:80 cookie server02 check
1177 server web-backup 192.168.2.1:80 cookie server03 check backup
1178 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001179
willy tarreaua41a8b42005-12-17 14:02:24 +01001180# relayage SMTP+TLS avec test du serveur et serveur de backup
1181
1182 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001183 mode tcp
1184 balance roundrobin
1185 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1186 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001187
Willy Tarreauf3c69202006-07-09 16:42:34 +02001188# relayage HTTPS avec test du serveur et serveur de backup
1189
1190 listen http_proxy :443
1191 mode tcp
1192 option ssl-hello-chk
1193 balance roundrobin
1194 server srv1 192.168.1.1 check inter 30000 rise 1 fall 2
1195 server srv2 192.168.1.2 backup
1196
Willy TARREAU3481c462006-03-01 22:37:57 +01001197# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1198 listen http_proxy 0.0.0.0:80
1199 mode http
1200 balance roundrobin
1201 option httpchk
1202 server inst1 192.168.1.1:80 cookie s1 check
1203 server inst2 192.168.1.2:80 cookie s2 check
1204 server inst3 192.168.1.3:80 cookie s3 check
1205 server back1 192.168.1.10:80 check backup
1206 server back2 192.168.1.11:80 check backup
1207 option allbackups # all backups will be used
1208
willy tarreau0f7af912005-12-17 12:21:26 +01001209
willy tarreauc29948c2005-12-17 13:10:27 +010012103.2) Reconnexion vers un répartiteur en cas d'échec direct
1211----------------------------------------------------------
1212En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1213seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1214définitivement privés de service. La spécification du paramètre 'redispatch'
1215autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1216(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001217
1218Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001219---------
willy tarreau0f7af912005-12-17 12:21:26 +01001220 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001221 mode http
1222 cookie SERVERID
1223 dispatch 192.168.1.100:80
1224 server web1 192.168.1.1:80 cookie server01
1225 server web2 192.168.1.2:80 cookie server02
1226 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001227
willy tarreau64a3cc32005-12-18 01:13:11 +01001228Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1229redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1230version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1231identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1232tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1233tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001234
1235 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001236 mode http
1237 option persist
1238 cookie SERVERID
1239 dispatch 192.168.1.100:80
1240 server web1 192.168.1.1:80 cookie server01
1241 server web2 192.168.1.2:80 cookie server02
1242 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001243
willy tarreauc29948c2005-12-17 13:10:27 +01001244
willy tarreau34f45302006-04-15 21:37:14 +020012453.3) Assignation de poids différents à des serveurs
1246---------------------------------------------------
1247Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1248d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1249que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1250soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1251raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1252plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1253plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1254la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1255une vue des serveurs disponibles la plus homogène possible en se basant sur
1256leur poids de sorte que la charge se distribue de la manière la plus lisse
1257possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
willy tarreau532bb552006-05-13 18:40:37 +02001258serveur par rapport aux autres. Le poids de 1 donne la fréquence d'apparition
1259la plus faible, et 256 la fréquence la plus élevée. De cette manière, si un
1260serveur disparait, les capacités restantes sont toujours respectées.
willy tarreau34f45302006-04-15 21:37:14 +02001261
1262
1263Exemple :
1264---------
1265# distribution équitable sur 2 opteron and un ancien pentium3
1266
1267 listen web_appl 0.0.0.0:80
1268 mode http
1269 cookie SERVERID insert nocache indirect
1270 balance roundrobin
1271 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1272 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1273 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1274 server web-backup1 192.168.2.1:80 cookie server04 check backup
1275 server web-excuse 192.168.3.1:80 check backup
1276
1277Notes :
1278-------
1279 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1280
1281 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1282 est plus propre d'utiliser les poids que de répliquer le même serveur
1283 plusieurs fois.
1284
1285 - les poids s'appliquent également aux serveurs de backup si l'option
1286 'allbackups' est positionnée.
1287
1288 - le poids s'applique aussi à la répartition selon la source
1289 ('balance source').
1290
1291 - quels que soient les poids, le premier serveur sera toujours assigné en
1292 premier. Cette règle facilite les diagnostics.
1293
1294 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1295 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1296 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1297
willy tarreau532bb552006-05-13 18:40:37 +02001298La distribution du trafic suivra exactement le séquencement suivant :
1299
1300 Request| 1 1 1 1
1301 number | 1 2 3 4 5 6 7 8 9 0 1 2 3
1302 --------+---------------------------
1303 p3-800 | X . . . . . . X . . . . .
1304 opt-20 | . X . X . X . . . X . X .
1305 opt-24 | . . X . X . X . X . X . X
1306
1307
13083.4) Limitation du nombre de sessions concurrentes par serveur
1309--------------------------------------------------------------
1310Certains serveurs web multi-processus tels qu'Apache souffrent dès qu'il y a
1311trop de sessions concurrentes, parce qu'il est très coûteux de faire
1312fonctionner des centaines ou des milliers de processus sur un système. Une
1313solution consiste à augmenter le nombre de serveurs et de répartir la charge
1314entre eux, mais cela pose un problème lorsque le but est uniquement de résister
1315à des pics de charge occasionnels.
1316
1317Pour résoudre ce problème, une nouvelle fonctionnalité a été implémentée dans
1318HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associée à une
1319file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
1320entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
1321de diminuer la valeur maxconn améliorera notablement les performances des
1322serveurs et diminuera les temps de réponse simplement parce que les serveurs
1323seront moins congestionnés.
1324
1325Quand une requête cherche à joindre n'importe quel serveur, le premier serveur
1326non saturé est utilisé, en respectant l'algorithme de répartition de charge. Si
1327tous les serveurs sont saturés, alors la requête sera mise dans la file
1328d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
1329toutes les requêtes précédentes auront été libérées et qu'un serveur aura été
1330libéré d'une connexion pour la traiter.
1331
1332Si une requête fait référence à un serveur en particulier (p.ex: hachage d'IP
1333source, ou persistance par cookie), et que ce server est saturé, alors la
1334requête sera mise dans la file d'attente dédiée à ce serveur. Cette file
1335d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
1336plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent déjà
1337que pour les nouveaux utilisateurs.
1338
1339Pour cela, les logs ont dû être enrichis pour indiquer le nombre de sessions
1340par serveur, la position de la requête dans les files d'attentes, et le temps
1341passé en file d'attente. Ceci aide considérablement à faire de la prévision de
1342capacité. Voir la section 'logs' plus bas pour plus d'informations.
1343
1344Exemple :
1345---------
1346 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1347 listen web_appl 0.0.0.0:80
1348 maxconn 10000
1349 mode http
1350 cookie SERVERID insert nocache indirect
1351 balance roundrobin
1352 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 maxconn 100 check
1353 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
1354 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
1355 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1356 server web-excuse 192.168.3.1:80 check backup
1357
willy tarreau8f635a42006-05-21 23:05:54 +02001358Cette option se montra si efficace pour réduire les temps de réponse des
1359serveurs que certains utilisateurs voulaient utiliser des valeurs trop basses
1360pour améliorer les performances de leurs serveurs. Seulement, ils n'étaient
1361alors plus en mesure de supporter de très fortes charges parce qu'il n'était
1362plus possible de les saturer. Pour cette raison, la version 1.2.14 a apporté la
1363limitation dynamique de connexions avec l'addition du paramètre "minconn".
1364Lorsque ce paramètre est associé à "maxconn", il active la limitation dynamique
1365basée sur la charge de l'instance. Le nombre maximal de sessions concurrentes
1366sur un serveur devient alors proportionnel au nombre de sessions de l'instance
1367par rapport à son 'maxconn'. Un minimum de <minconn> sessions sera toujours
1368permis quelle que soit la charge. Ceci assurera que les serveurs travailleront
1369au meilleur de leurs performances sous des charges normales, et qu'ils seront
1370tout de même capables de supporter de fortes pointes lorsque nécessaire. La
1371limite dynamique est calculée comme ceci :
1372
1373 srv.dyn_limit = max(srv.minconn, srv.maxconn * inst.sess / inst.maxconn)
1374
1375Exemple :
1376---------
1377 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1378 listen web_appl 0.0.0.0:80
1379 maxconn 10000
1380 mode http
1381 cookie SERVERID insert nocache indirect
1382 balance roundrobin
1383 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check
1384 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check
1385 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1386 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1387 server web-excuse 192.168.3.1:80 check backup
1388
1389Dans l'exemple ci-dessus, le serveur "pentium3-800' recevra au plus 100
1390connexions simultanées lorsque l'instance du proxy en atteindra 10000, et
1391recevra seulement 10 connexions simultanées tant que le proxy sera sous les 1000
1392sessions.
1393
Elijah Epifanovacafc5f2007-10-25 20:15:38 +02001394Il est possible de limiter la taille de la file d'attente dans le but de
1395redistribuer les connexions destinées à un serveur en particulier qui sont trop
1396loin pour avoir une chance d'être servies en un temps raisonnable. Ceci n'est
1397acceptable que dans le cas où l'affinité entre le client et le serveur n'est
1398pas obligatoire, mais motivée uniquement par des raisons de performances, par
1399exemple, par l'utilisation d'un cache local au serveur. L'option 'maxqueue'
1400permet de préciser la limite par serveur, tel que dans l'exemple ci-dessous :
1401
1402... (même exemple que précédemment)
1403 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check maxqueue 50
1404 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check maxqueue 200
1405 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1406
1407En l'absence du paramètre 'maxqueue', la file d'un serveur n'a pas de limite
1408définie. Dans le cas contraire, lorsque la file atteint la limite fixée par
1409'maxqueue', les clients sont déplacés vers la file globale.
1410
willy tarreau532bb552006-05-13 18:40:37 +02001411Notes :
1412-------
1413 - la requête ne restera pas indéfiniment en file d'attente, elle est
1414 assujétie au paramètre 'contimeout', et si une requête ne peut pas
1415 sortir de la file avant ce time-out, soit parce que le serveur est
1416 saturé, soit parce qu'il y a trop de requêtes en file d'attente,
1417 alors elle expirera avec une erreur 503.
1418
willy tarreau8f635a42006-05-21 23:05:54 +02001419 - si seul <minconn> est spécifié, il a le même effet que <maxconn>
1420
willy tarreau532bb552006-05-13 18:40:37 +02001421 - positionner des valeurs trop basses pour 'maxconn' peut améliorer les
1422 performances mais aussi permettre à des utilisateurs trop lents de bloquer
1423 un serveur pour les autres utilisateurs.
1424
willy tarreau34f45302006-04-15 21:37:14 +02001425
willy tarreau8f635a42006-05-21 23:05:54 +020014263.5) Abandon des requêtes abortées
1427----------------------------------
1428En présence de très fortes charges, les serveurs mettront un certain temps à
1429répondre. La file d'attente du proxy se remplira, et les temps de réponse
1430suivront une croissance proportionnelle à la taille de file d'attente fois
1431le temps moyen de réponse par session. Lorsque les clients attendront plus de
1432quelques secondes, ils cliqueront souvent sur le bouton 'STOP' de leur
1433navigateur, laissant des requêtes inutiles en file d'attente et ralentissant
1434donc les autres utilisateurs.
1435
1436Comme il n'y a aucun moyen de distinguer un vrai clic sur STOP d'une simple
1437fermeture du canal de sortie sur le client (shutdown(SHUT_WR)), les agents HTTP
1438doivent être conservateurs et considérer que le client n'a probablement fermé
1439que le canal de sortie en attendant la réponse. Toutefois, ceci introduit des
1440risques de congestion lorsque beaucoup d'utilisateurs font de même, et s'avère
1441aujourd'hui complètement inutile car probablement aucun client ne referme la
1442session en attendant la réponse. Certains agents HTTP supportent ceci (Squid,
1443Apache, HAProxy), et d'autres ne le supportent pas (TUX, et la plupart des
1444répartiteurs de charge matériels). Donc la probabilité pour qu'une notification
1445de fermeture d'un canal d'entrée côté client représente un utilisateur cliquant
1446sur 'STOP' est proche de 100%, et il est vraiment tentant d'abandonner la
1447requête prématurément sans polluer les serveurs.
1448
1449Pour cette raison, une nouvelle option "abortonclose" a été introduite en
1450version 1.2.14. Par défaut (sans l'option), le comportement reste conforme à
1451HTTP. Mais lorsque l'option est spécifiée, une session dont le canal entrant
1452est fermé sera abortée si cela est possible, c'est à dire que la requête est
1453soit en file d'attente, soit en tentative de connexion. Ceci réduit
1454considérablement la longueur des files d'attentes et la charge sur les serveurs
1455saturés lorsque les utilisateurs sont tentés de cliquer sur 'STOP', ce qui à
1456son tour, réduit les temps de réponse pour les autres utilisateurs.
1457
1458Exemple :
1459---------
1460 listen web_appl 0.0.0.0:80
1461 maxconn 10000
1462 mode http
1463 cookie SERVERID insert nocache indirect
1464 balance roundrobin
1465 server web1 192.168.1.1:80 cookie s1 weight 10 maxconn 100 check
1466 server web2 192.168.1.2:80 cookie s2 weight 10 maxconn 100 check
1467 server web3 192.168.1.3:80 cookie s3 weight 10 maxconn 100 check
1468 server bck1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1469 option abortonclose
1470
1471
willy tarreauc29948c2005-12-17 13:10:27 +010014724) Fonctionnalités additionnelles
1473=================================
1474
1475D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
willy tarreau8f635a42006-05-21 23:05:54 +02001476principalement du mode transparent, de la journalisation des connexions, de la
1477réécriture des en-têtes, et du statut sous forme de page HTML.
1478
willy tarreau5cbea6f2005-12-17 12:48:26 +01001479
willy tarreau0174f312005-12-18 01:02:42 +010014804.1) Fonctionnalités réseau
1481---------------------------
14824.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001483---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001484En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1485routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1486pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001487destination de la session détournée. Le système doit permettre de rediriger les
1488paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001489
1490Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001491---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001492 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001493 mode http
1494 transparent
1495 cookie SERVERID
1496 server server01 192.168.1.1:80
1497 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001498
1499 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1500 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001501
willy tarreaua41a8b42005-12-17 14:02:24 +01001502Remarque :
1503----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001504Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1505adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1506d'une même adresse avec une même instance et sans utiliser directement le mode
1507transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001508
1509Exemple :
1510---------
1511 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001512 mode tcp
1513 server server01 192.168.1.1 check port 60000
1514 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001515
1516 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1517 -j REDIRECT --to-ports 65000
1518
willy tarreau0174f312005-12-18 01:02:42 +01001519
15204.1.2) Choix d'une adresse source par serveur
1521---------------------------------------------------
1522Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1523IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1524backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1525pour joindre le même serveur. C'est également utilisable pour faciliter une
1526répartition de charge selon l'adresse IP source pour des connexions sortantes.
1527Bien entendu, la même adresse est utilisée pour les health-checks.
1528
1529Exemple :
1530---------
1531 # utiliser une adresse particulière pour joindre les 2 serveur
1532 listen http_proxy 0.0.0.0:65000
1533 mode http
1534 balance roundrobin
1535 server server01 192.168.1.1:80 source 192.168.2.13
1536 server server02 192.168.1.2:80 source 192.168.2.13
1537
1538Exemple :
1539---------
1540 # utiliser une adresse particulière pour joindre chaque serveur
1541 listen http_proxy 0.0.0.0:65000
1542 mode http
1543 balance roundrobin
1544 server server01 192.168.1.1:80 source 192.168.1.1
1545 server server02 192.168.2.1:80 source 192.168.2.1
1546
1547Exemple :
1548---------
1549 # faire une répartition d'adresse sources pour joindre le même proxy à
1550 # travers deux liens WAN
1551 listen http_proxy 0.0.0.0:65000
1552 mode http
1553 balance roundrobin
1554 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1555 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1556
1557Exemple :
1558---------
1559 # forcer une connexion TCP à s'attacher à un port particulier
1560 listen http_proxy 0.0.0.0:2000
1561 mode tcp
1562 balance roundrobin
1563 server srv1 192.168.1.1:80 source 192.168.2.1:20
1564 server srv2 192.168.1.2:80 source 192.168.2.1:20
1565
willy tarreaub952e1d2005-12-18 01:31:20 +010015664.1.3) Maintien de session TCP (keep-alive)
1567-------------------------------------------
1568Avec la version 1.2.7, il devient possible d'activer le maintien de session
1569TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1570d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1571externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1572aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1573time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1574positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1575vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1576pour activer le maintien de session TCP :
1577
1578 option tcpka # active le keep-alive côté client et côté serveur
1579 option clitcpka # active le keep-alive côté client
1580 option srvtcpka # active le keep-alive côté serveur
1581
Alexandre Cassen87ea5482007-10-11 20:48:58 +020015824.1.4) Rémanence des données TCP (lingering)
1583--------------------------------------------
1584Il est possible de désactiver la conservation de données non acquittées par un
1585client à la fin d'une session. Cela peut parfois s'avérer nécessaire lorsque
1586haproxy est utilisé en face d'un grand nombre de clients non fiables et qu'un
1587nombre élevé de sockets en état FIN_WAIT est observé sur la machine. L'option
1588peut être utilisée dans un frontend pour ajuster les connexions vers les
1589clients, et dans un backend pour ajuster les connexions vers les serveurs :
1590
1591 option nolinger # désactive la conservation de données
1592
willy tarreau0f7af912005-12-17 12:21:26 +01001593
willy tarreauc29948c2005-12-17 13:10:27 +010015944.2) Journalisation des connexions
1595----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001596
1597L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1598Il fournit probablement le plus fin niveau d'information disponible pour un
1599tel outil, ce qui est très important pour les diagnostics en environnements
1600complexes. En standard, les informations journalisées incluent le port client,
1601les chronométrages des états TCP/HTTP, des états de session précis au moment de
1602la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1603trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1604arbitraires.
1605
1606Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1607transparence sur les problèmes rencontrés, à la fois internes et externes, et
1608il est possible d'envoyer les logs vers des serveurs différents en même temps
1609avec des niveaux de filtrage différents :
1610
1611 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1612 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1613 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1614 - activité par instance (connexions clients), aussi bien lors de leur
1615 établissement qu'à leur terminaison.
1616
1617La possibilité de distribuer différents niveaux de logs à différents serveurs
1618permet à plusieurs équipes de production d'intéragir et de corriger leurs
1619problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1620occasionnellement les erreurs système, pendant que l'équipe application
1621surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1622que l'équipe sécurité analyse l'activité en différé d'une heure.
1623
1624
willy tarreauc1cae632005-12-17 14:12:23 +010016254.2.1) Niveaux de log
1626---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001627Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1628détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1629source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001630la requête HTTP, le code de retour, la quantité de données transmises, et même
1631dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1632Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1633la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001634est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001635
willy tarreau8337c6b2005-12-17 13:41:01 +01001636 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1637 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001638ou
1639 log global
1640
1641Remarque :
1642----------
1643La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1644paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001645
1646Exemple :
1647---------
1648 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001649 mode http
1650 log 192.168.2.200 local3
1651 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001652
willy tarreauc1cae632005-12-17 14:12:23 +010016534.2.2) Format des logs
1654----------------------
1655Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1656de la session entre le client et le relais. En précisant l'option 'tcplog',
1657la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1658sur son état lors de la déconnexion, ainsi que le temps de connexion et la
willy tarreau532bb552006-05-13 18:40:37 +02001659durée totale de la session. Le nombre de sessions restantes après la
1660déconnexion est également indiqué (pour le serveur, l'instance et le process).
willy tarreauc1cae632005-12-17 14:12:23 +01001661
willy tarreauc5f73ed2005-12-18 01:26:38 +01001662Exemple de journalisation TCP :
1663-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001664 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001665 mode tcp
1666 option tcplog
1667 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001668
willy tarreau532bb552006-05-13 18:40:37 +02001669>>> 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 +01001670
willy tarreau532bb552006-05-13 18:40:37 +02001671 Champ Format / Description Exemple
1672
1673 1 nom_processus '[' pid ']:' haproxy[18989]:
1674 2 ip_client ':' port_client 127.0.0.1:34550
1675 3 '[' date ']' [15/Oct/2003:15:24:28]
1676 4 nom_instance relais-tcp
1677 5 nom_serveur Srv1
1678 6 temps_file '/' temps_connect '/' temps_total 0/0/5007
1679 7 octets lus 0
1680 8 etat_terminaison --
1681 9 conn_srv '/' conns_inst '/' conns_processus 1/1/1
1682 10 position en file d'attente srv '/' globale 0/0
willy tarreau982249e2005-12-18 00:57:06 +01001683
willy tarreauc1cae632005-12-17 14:12:23 +01001684Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1685notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1686surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1687les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1688ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1689(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001690
willy tarreauc5f73ed2005-12-18 01:26:38 +01001691Exemple de journalisation HTTP :
1692--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001693 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001694 mode http
1695 option httplog
1696 option dontlognull
1697 log 192.168.2.200 local3
1698
willy tarreau532bb552006-05-13 18:40:37 +02001699>>> 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 +01001700
1701Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001702
willy tarreau532bb552006-05-13 18:40:37 +02001703 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 +01001704
willy tarreau532bb552006-05-13 18:40:37 +02001705 Champ Format / Description Exemple
1706
1707 1 nom_processus '[' pid ']:' haproxy[18989]:
1708 2 ip_client ':' port_client 10.0.0.1:34552
1709 3 '[' date ']' [15/Oct/2003:15:26:31]
1710 4 nom_instance relais-http
1711 5 nom_serveur Srv1
1712 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt 3183/-1/-1/-1/11215
1713 7 Code_retour_HTTP 503
1714 8 octets lus 0
1715 9 cookies_requête_capturés -
1716 10 cookies_reponse_capturés -
1717 11 etat_terminaison SC--
1718 12 conns_srv '/' conns_inst '/' conns_processus 137/202/205
1719 13 position file serveur '/' globale 0/0
1720 14 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1721 15 '{' entetes_reponse_capturés '}' {}
1722 16 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001723
1724Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1725 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001726
1727Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1728de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1729Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001730la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1731tôt possible, c'est à dire juste avant que ne débutent les transferts de
1732données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1733de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001734traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1735représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001736
willy tarreau64a3cc32005-12-18 01:13:11 +01001737Afin d'éviter toute confusion avec les logs normaux, le temps total de
1738transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001739rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001740
1741Exemple :
1742---------
1743
1744 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001745 mode http
1746 option httplog
1747 option dontlognull
1748 option logasap
1749 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001750
willy tarreauc5f73ed2005-12-18 01:26:38 +01001751>>> 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 +01001752
1753
willy tarreauc1cae632005-12-17 14:12:23 +010017544.2.3) Chronométrage des événements
1755-----------------------------------
1756Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1757événements sont d'une très grande utilité. Tous les temps sont mesurés en
1758millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
willy tarreau532bb552006-05-13 18:40:37 +02001759la forme Tq/Tw/Tc/Tr/Tt :
willy tarreauc1cae632005-12-17 14:12:23 +01001760
1761 - Tq: temps total de réception de la requête HTTP de la part du client.
1762 C'est le temps qui s'est écoulé entre le moment où le client a établi
1763 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1764 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1765 que la requête complète n'a jamais été reçue.
1766
willy tarreau532bb552006-05-13 18:40:37 +02001767 - Tw: temps total passé dans les files d'attente avant d'obtenir une place
1768 vers un serveur. Ceci tient compte à la fois de la file d'attente globale
1769 et de celle du serveur, et dépend du nombre de requêtes dans la file et du
1770 temps nécessaire au serveur pour compléter les sessions précédentes. La
1771 valeur '-1' indique que la requête a été détruite avant d'atteindre une
1772 file.
1773
willy tarreauc1cae632005-12-17 14:12:23 +01001774 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1775 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1776 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1777 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1778 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1779 vers le serveur.
1780
1781 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001782 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001783 la connexion. Ca représente exactement le temps de traitement de la
1784 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001785 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001786
1787 - Tt: durée de vie totale de la session, entre le moment où la demande de
1788 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001789 refermée aux deux extrémités (client et serveur). La signification change
1790 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
willy tarreau532bb552006-05-13 18:40:37 +02001791 uniquement à (Tq + Tw + Tc + Tr), et se trouve préfixé d'un signe '+'. On
1792 peut donc déduire Td, le temps de transfert des données, en excluant les
1793 autres temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001794
willy tarreau532bb552006-05-13 18:40:37 +02001795 Td = Tt - (Tq + Tw + Tc + Tr)
willy tarreauc1cae632005-12-17 14:12:23 +01001796
1797 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1798
willy tarreau532bb552006-05-13 18:40:37 +02001799En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
willy tarreauc1cae632005-12-17 14:12:23 +01001800rapportés.
1801
1802Ces temps fournissent de précieux renseignement sur des causes probables de
1803problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1804de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1805de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1806problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1807valeur de time-out dans la configuration, c'est souvent qu'une session a été
1808abandonnée sur expiration d'un time-out.
1809
1810Cas les plus fréquents :
1811
1812 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1813 le client et le relais.
1814 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1815 le relais et le serveur durant la phase de connexion. Cet indicateur
1816 devrait normalement toujours être très bas (moins de quelques dizaines).
1817 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1818 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1819 de pertes entre le relais et le serveur.
1820 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1821 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1822 session est maintenue après la fin des échanges. Voir plus loin pour
1823 savoir comment désactiver le keep-alive HTTP.
1824
1825Autres cas ('xx' représentant une valeur quelconque à ignorer) :
willy tarreau532bb552006-05-13 18:40:37 +02001826 -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 +01001827 a refermé sa connexion sans compléter la requête.
willy tarreau532bb552006-05-13 18:40:37 +02001828 Tq/-1/xx/xx/Tt: Il n'était pas possible de traiter la request, probablement
1829 parce que tous les serveurs étaient hors d'usage.
1830 Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'établir vers le serveur (refus ou
1831 time-out au bout de Tt-(Tq+Tw) ms).
1832 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 +01001833 les temps ou bien a refermé sa connexion trop tôt, au bout
willy tarreau532bb552006-05-13 18:40:37 +02001834 de Tt-(Tq+Tw+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001835
18364.2.4) Conditions de déconnexion
1837--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001838Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1839le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1840un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1841une signification précise :
1842
1843 - sur le premier caractère, un code précisant le premier événement qui a causé
1844 la terminaison de la session :
1845
1846 C : fermeture inattendue de la session TCP de la part du client.
1847
1848 S : fermeture inattendue de la session TCP de la part du serveur, ou
1849 refus explicite de connexion de la part de ce dernier.
1850
1851 P : terminaison prématurée des sessions par le proxy, pour cause
1852 d'imposition d'une limite sur le nombre de connexions, pour cause
1853 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1854 sécurité a détecté et bloqué une anomalie dans la réponse du
1855 serveur qui aurait pu causer une fuite d'informations (par exemple,
1856 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001857
willy tarreauc5f73ed2005-12-18 01:26:38 +01001858 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1859 source, ...). Généralement, cela arrive au cours de l'établissement
1860 d'une connexion, et les logs système doivent contenir une copie de
1861 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001862
willy tarreauc5f73ed2005-12-18 01:26:38 +01001863 I : une erreur interne a été identifiée par le proxy à la suite d'un
1864 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1865 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001866
willy tarreauc5f73ed2005-12-18 01:26:38 +01001867 c : le délai maximal d'attente du client a expiré (clitimeout).
1868
1869 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1870
1871 - : terminaison normale de session.
1872
1873 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1874 la fermeture :
1875
1876 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1877 été transmis au serveur.
1878
willy tarreau532bb552006-05-13 18:40:37 +02001879 Q : attente en file d'attente (QUEUE) d'une place pour avoir une
1880 connexion vers un serveur. Ne peut apparaître que sur un serveur
1881 possédant un paramètre 'maxconn'. Aucune connexion n'a été envoyée
1882 au serveur.
1883
willy tarreauc5f73ed2005-12-18 01:26:38 +01001884 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1885 serveur peut au plus avoir vu la tentative de connexion, mais
1886 aucune donnée n'a été échangée.
1887
1888 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1889
1890 D : transfert des DONNEES du serveur vers le client.
1891
1892 L : transfert des dernières ("LAST") données du proxy vers le client,
1893 alors que le serveur a déjà fini.
1894
Willy Tarreau2272dc12006-09-03 10:19:38 +02001895 T : requête bloquée en mode "tarpit" par le proxy. Elle a été maintenue
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001896 ouverte vers le client pendant toute la durée du contimeout ou
1897 jusqu'à l'abandon de la part du client.
Willy Tarreau2272dc12006-09-03 10:19:38 +02001898
willy tarreauc5f73ed2005-12-18 01:26:38 +01001899 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001900
1901 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001902 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001903
willy tarreauc5f73ed2005-12-18 01:26:38 +01001904 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1905 cas sur les NOUVELLES connexions clients.
1906
1907 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1908 serveur connu. Ceci peut être dû à un changement de configuration
1909 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1910 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001911
willy tarreauc5f73ed2005-12-18 01:26:38 +01001912 D : le client a présenté un cookie correspondant à un serveur hors
1913 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1914 un autre serveur ou a tout de même tenté de se connecter sur celui
1915 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001916
willy tarreauc5f73ed2005-12-18 01:26:38 +01001917 V : le client a présenté un cookie VALIDE et a pu se connecter au
1918 serveur correspondant.
1919
1920 - : non appliquable (pas de cookie positionné dans la configuration).
1921
1922 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1923 persistence retrourné par le serveur (uniquement en mode HTTP) :
1924
1925 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1926 n'a été inséré.
1927
1928 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1929 proxy en a INSERE un.
1930
willy tarreau197e8ec2005-12-17 14:10:59 +01001931 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001932 tel quel ("PASSIF").
1933
1934 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1935
1936 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1937 ne pas être retourné au client.
1938
1939 - : non appliquable
1940
1941
1942La combinaison des deux premiers indicateurs fournit une grande quantitié
1943d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1944peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1945des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001946
willy tarreauc5f73ed2005-12-18 01:26:38 +01001947Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1948
1949 Indic Raison
1950 CR Le client a abandonné avant d'émettre une requête complète. Il est
1951 très probable que la requête ait été tapée à la main dans un client
1952 telnet et abortée trop tôt.
1953
1954 cR Le temps imparti au client a expiré avant réception d'une requête
1955 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1956 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1957 transporter des paquets entiers, ou par des clients qui énvoient des
1958 requêtes à la main et ne tapent pas assez vite.
1959
1960 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1961 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1962 être la couche réseau qui indique au proxy que le serveur n'est pas
1963 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1964
1965 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1966
1967 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1968 nombre de connexions a atteint la limite 'maxconn' (global ou de
1969 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1970 augmenté, tout comme le paramètre 'maxconn' global.
1971
1972 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1973 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1974 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1975 consiste à affiner le paramétrage système.
1976
1977 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1978 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1979 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1980 paquets entiers.
1981
willy tarreau078c79a2006-05-13 12:23:58 +02001982 CH Le client a abandonné alors qu'il attendait un début de réponse de la
1983 part du serveur. Cela peut être causé par le serveur qui mettait trop
1984 de temps à répondre, ou par un client cliquant précipitamment sur le
1985 bouton 'Stop'.
1986
1987 CQ Le client a abandonné alors que sa session était mise en file
1988 d'attente pour obtenir un serveur avec suffisamment de connexions
1989 libres pour l'accepter. Cela signifie soit que l'ensemble des
1990 serveurs étaient saturés, soit que le serveur assigné a mis trop de
1991 temps à répondre.
1992
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001993 CT Le client a abandonné alors que sa session était bloquée en mode
1994 tarpit.
1995
willy tarreau078c79a2006-05-13 12:23:58 +02001996 sQ La session a attendu trop longtemps en file d'attente et a été
1997 expirée.
1998
willy tarreauc5f73ed2005-12-18 01:26:38 +01001999 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
2000 en-têtes. En général, cela indique qu'il a crashé.
2001
2002 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
2003 des transactions trop longues, probablement causées par un back-end
2004 saturé. Les seules solutions sont de corriger le problème sur
2005 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
2006 des attentes plus longues au risque que les clients abandonnent à
2007 leur tour, ou bien d'ajouter des serveurs.
2008
2009 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
2010 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
2011 soit à cause d'une requête validant un filtre d'interdiction, auquel
2012 cas le proxy a renvoyé une erreur HTTP 403.
2013
2014 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
2015 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
2016 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
2017 renvoyée au client.
2018
Willy Tarreau2272dc12006-09-03 10:19:38 +02002019 PT Le proxy a bloqué une requête du client et a maintenu sa connection
2020 ouverte avant de lui retourner une erreur "500 server error". Rien
2021 n'a été envoyé au serveur.
2022
willy tarreauc5f73ed2005-12-18 01:26:38 +01002023 cD Le client n'a pas lu de données pendant le temps qui lui était
2024 imparti. Ceci est souvent causé par des problèmes réseau côté client.
2025
2026 CD Le client a aborté sa connection de manière inattendue pendant le
2027 transfert des données. Ceci est provoqué soit par le crash d'un
2028 navigateur, ou par une session en HTTP keep-alive entre le serveur
2029 et le client terminée en premier par le client.
2030
2031 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
2032 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
2033 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
2034 situés entre le proxy et le serveur.
2035
20364.2.5) Caractères non-imprimables
2037---------------------------------
2038Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
2039tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
2040hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
2041dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
2042caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
2043est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
2044les en-têtes.
2045
20464.2.6) Capture d'en-têtes HTTP et de cookies
2047--------------------------------------------
2048La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
2049capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
2050
2051Les captures de cookies facilitent le suivi et la reconstitution d'une session
2052utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01002053
2054 capture cookie <préfixe_cookie> len <longueur_capture>
2055
willy tarreauc5f73ed2005-12-18 01:26:38 +01002056Ceci activera la capture de cookies à la fois dans les requêtes et dans les
2057réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
2058bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
2059nouveau cookie.
2060
willy tarreau8337c6b2005-12-17 13:41:01 +01002061Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
2062transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
2063caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
2064le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
2065place dans les logs.
2066
2067Exemples :
2068----------
2069 # capture du premier cookie dont le nom commence par "ASPSESSION"
2070 capture cookie ASPSESSION len 32
2071
2072 # capture du premier cookie dont le nom est exactement "vgnvisitor"
2073 capture cookie vgnvisitor= len 32
2074
willy tarreau036e1ce2005-12-17 13:46:33 +01002075Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01002076positionné par le serveur, précédé du cookie positionné par le client. Chacun
2077de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01002078par le client ou le serveur, ou lorsque l'option est désactivée..
2079
2080Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
2081pour suivre un identifiant de requête globalement unique positionné par un
2082autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
2083de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
2084peut chercher des informations relatives à la longueur annoncée de la réponse,
2085le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
2086de redirection. Tout comme pour les captures de cookies, il est possible
2087d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
2088la suivante :
2089
2090 capture request header <nom> len <longueur max>
2091 capture response header <nom> len <longueur max>
2092
2093Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01002094
willy tarreauc5f73ed2005-12-18 01:26:38 +01002095Exemples:
2096---------
2097 # conserver le nom du serveur virtuel accédé par le client
2098 capture request header Host len 20
2099 # noter la longueur des données envoyées dans un POST
2100 capture request header Content-Length len 10
2101
2102 # noter le fonctionnement attendu du cache par le serveur
2103 capture response header Cache-Control len 8
2104 # noter l'URL de redirection
2105 capture response header Location len 20
2106
2107Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
2108fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
2109regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
2110chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
2111réponse sont présentés de la même manière, mais après un espace suivant le bloc
2112d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
2113
2114 Config:
2115
2116 capture request header Host len 20
2117 capture request header Content-Length len 10
2118 capture request header Referer len 20
2119 capture response header Server len 20
2120 capture response header Content-Length len 10
2121 capture response header Cache-Control len 8
2122 capture response header Via len 20
2123 capture response header Location len 20
2124
2125 Log :
2126
willy tarreau532bb552006-05-13 18:40:37 +02002127 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/"
2128 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"
2129 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 +01002130
21314.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01002132-----------------------
willy tarreau532bb552006-05-13 18:40:37 +02002133- 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 +01002134 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
2135 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01002136
willy tarreau532bb552006-05-13 18:40:37 +02002137- 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"
2138 => Idem, mais la requête a été mise en attente dans la file globale derrière
2139 9 autres requêtes déjà présentes, et y a attendu 1230 ms.
2140
2141- 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 +01002142 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
2143 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 +01002144 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 +01002145 total entre l'accept() et le premier octet de donnée est de 30 ms.
2146
willy tarreau532bb552006-05-13 18:40:37 +02002147- 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 +01002148 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
2149 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
2150 d'informations risquant d'être cachées. Dans ce cas, la réponse est
2151 remplacée par '502 bad gateway'.
2152
willy tarreau532bb552006-05-13 18:40:37 +02002153- 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 +01002154 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01002155 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01002156 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01002157
willy tarreau532bb552006-05-13 18:40:37 +02002158- 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 +01002159 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01002160 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01002161 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
2162 pu renvoyer un message 408 au client.
2163
willy tarreauc5f73ed2005-12-18 01:26:38 +01002164- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
2165 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
2166 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01002167
willy tarreau532bb552006-05-13 18:40:37 +02002168- 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 +01002169 => La requête client met 3s à entrer (peut-être un problème réseau), et la
2170 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreau532bb552006-05-13 18:40:37 +02002171 secondes (retries 3 dans la conf), puis un code 503 est retourné au
2172 client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
2173 instance, et 205 sur l'ensemble des instances pour ce processus. Il est
2174 possible que le serveur ait refusé la connexion parce qu'il y en avait
2175 déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01002176
willy tarreau4302f492005-12-18 01:00:37 +01002177
willy tarreauc5f73ed2005-12-18 01:26:38 +010021784.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01002179----------------------------------
2180En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
2181requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01002182possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
2183de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01002184connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
2185comme faisant partie des échanges de données consécutifs à la première requête.
2186Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01002187
2188La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01002189 reqadd <string> pour ajouter un en-tête dans la requête
2190 reqrep <search> <replace> pour modifier la requête
2191 reqirep <search> <replace> idem sans distinction majuscules/minuscules
2192 reqdel <search> pour supprimer un en-tête dans la requête
2193 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002194 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01002195 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002196 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01002197 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002198 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01002199 reqipass <search> idem sans distinction majuscules/minuscules
Willy Tarreau2272dc12006-09-03 10:19:38 +02002200 reqtarpit <search> bloquer et maintenir une request validant <search>
2201 reqitarpit <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002202
willy tarreau036e1ce2005-12-17 13:46:33 +01002203 rspadd <string> pour ajouter un en-tête dans la réponse
2204 rsprep <search> <replace> pour modifier la réponse
2205 rspirep <search> <replace> idem sans distinction majuscules/minuscules
2206 rspdel <search> pour supprimer un en-tête dans la réponse
2207 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01002208 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01002209 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01002210 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002211
willy tarreau0f7af912005-12-17 12:21:26 +01002212
willy tarreau036e1ce2005-12-17 13:46:33 +01002213<search> est une expression régulière compatible POSIX regexp supportant le
2214groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
2215doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
2216chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
2217backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01002218
2219 \t pour une tabulation
2220 \r pour un retour charriot
2221 \n pour un saut de ligne
2222 \ pour différencier un espace d'un séparateur
2223 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01002224 \\ pour utiliser un backslash dans la regex
2225 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01002226 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01002227
willy tarreau0f7af912005-12-17 12:21:26 +01002228
willy tarreau5cbea6f2005-12-17 12:48:26 +01002229<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
2230Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
2231groupe délimité par des parenthèses dans l'expression régulière, par sa
Willy Tarreau2272dc12006-09-03 10:19:38 +02002232position numérale. Les positions vont de 0 à 9, et sont codées par un '\'
2233suivi du chiffre désiré (0 désignant la ligne complète). Il est également
2234possible d'insérer un caractère non imprimable (utile pour le saut de ligne)
2235inscrivant '\x' suivi du code hexadécimal de ce caractère (comme en C).
willy tarreau5cbea6f2005-12-17 12:48:26 +01002236
2237<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01002238dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002239
2240Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01002241-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002242 - 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 +01002243 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002244 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
2245 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
2246 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01002247 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
2248 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
2249 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01002250 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01002251 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
2252 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
Willy Tarreau2272dc12006-09-03 10:19:38 +02002253 - une requête bloquée par 'reqtarpit' sera maintenue pendant une durée égale
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002254 au paramètre 'contimeout', ou jusqu'à l'abandon du client. Rien ne sera
2255 envoyé au serveur. Lorsque le temps alloué expire, le proxy répondra avec
2256 une réponse "500 server error" de sorte que l'attaquant ne suspecte pas
2257 qu'il ait été bloqué. Les logs rapporteront aussi ce code 500, mais les
2258 flags de terminaison indiqueront "PT".
willy tarreau0f7af912005-12-17 12:21:26 +01002259
2260Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01002261----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01002262 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01002263
willy tarreauc5f73ed2005-12-18 01:26:38 +01002264 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
2265 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
2266 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002267
willy tarreauc5f73ed2005-12-18 01:26:38 +01002268 # force proxy connections to close
2269 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
2270 # rewrite locations
2271 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002272
willy tarreauc5f73ed2005-12-18 01:26:38 +01002273 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01002274
willy tarreau197e8ec2005-12-17 14:10:59 +01002275 # Every header should end with a colon followed by one space.
2276 reqideny ^[^:\ ]*[\ ]*$
2277
2278 # block Apache chunk exploit
2279 reqideny ^Transfer-Encoding:[\ ]*chunked
2280 reqideny ^Host:\ apache-
2281
2282 # block annoying worms that fill the logs...
2283 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
2284 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
2285 reqideny ^[^:\ ]*\ .*<script
2286 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
2287
Willy Tarreau2272dc12006-09-03 10:19:38 +02002288 # tarpit attacks on the login page.
2289 reqtarpit ^[^:\ ]*\ .*\.php?login=[^0-9]
2290
willy tarreau197e8ec2005-12-17 14:10:59 +01002291 # allow other syntactically valid requests, and block any other method
2292 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
2293 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
2294 reqideny ^[^:\ ]*\
2295
2296 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01002297 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01002298
willy tarreauc5f73ed2005-12-18 01:26:38 +01002299 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01002300 rspidel ^Server:\
2301 rspadd Server:\ Formilux/0.1.8
2302
willy tarreau0f7af912005-12-17 12:21:26 +01002303
willy tarreau982249e2005-12-18 00:57:06 +01002304De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01002305'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002306connaître l'adresse IP du client initial. Depuis la version 1.3.8, il est
2307possible de préciser le mot-clé "except" suivi d'une adresse ou un réseau
2308IP source pour lequel l'entête ne sera pas ajouté. C'est très pratique dans le
2309cas où un autre reverse-proxy ajoutant déjà l'entête est installé sur la même
2310machine ou dans une DMZ connue. Le cas le plus fréquent est lié à l'utilisation
2311de stunnel en local.
willy tarreauc1cae632005-12-17 14:12:23 +01002312
willy tarreau982249e2005-12-18 00:57:06 +01002313Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01002314en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01002315Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
2316méthode impliquant 4 règles.
2317
willy tarreauc1cae632005-12-17 14:12:23 +01002318Exemple :
2319---------
2320 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002321 mode http
2322 log global
2323 option httplog
2324 option dontlognull
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002325 option forwardfor except 127.0.0.1/8
willy tarreauc5f73ed2005-12-18 01:26:38 +01002326 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01002327
Willy TARREAU767ba712006-03-01 22:40:50 +01002328Notons que certains serveurs HTTP ne referment pas nécessairement la session
2329TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
2330ce qui se traduit par des grands nombres de sessions établies et des temps
2331globaux très longs sur les requêtes. Pour contourner ce problème, la version
23321.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
2333vers le serveur dès qu'il commence à répondre et seulement si le tampon de
2334requête est vide. Attention toutefois à ne PAS utiliser cette option si des
2335méthodes CONNECT sont attendues entre le client et le serveur. L'option
2336'forceclose' implique l'option 'httpclose'.
2337
2338Exemple :
2339---------
2340 listen http_proxy 0.0.0.0:80
2341 mode http
2342 log global
2343 option httplog
2344 option dontlognull
2345 option forwardfor
2346 option forceclose
2347
2348
willy tarreauc29948c2005-12-17 13:10:27 +010023494.4) Répartition avec persistence
2350---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002351La combinaison de l'insertion de cookie avec la répartition de charge interne
2352permet d'assurer une persistence dans les sessions HTTP d'une manière
2353pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01002354 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01002355 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01002356 - insérer un cookie dans les réponses issues d'une répartition uniquement,
2357 et faire en sorte que des caches ne mémorisent pas ce cookie.
2358 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002359
2360Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01002361---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002362 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002363 mode http
2364 cookie SERVERID insert nocache indirect
2365 balance roundrobin
2366 server srv1 192.168.1.1:80 cookie server01 check
2367 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01002368
willy tarreau0174f312005-12-18 01:02:42 +01002369L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
2370cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
2371Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
2372client et le serveur de travailler en mode "keep-alive" afin que le proxy
2373puisse corriger le nom du cookie dans toutes les futures requêtes.
2374
2375 listen application 0.0.0.0:80
2376 mode http
2377 cookie JSESSIONID prefix
2378 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002379 server srv1 192.168.1.1:80 cookie srv1 check
2380 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002381 option httpclose
2382
2383
willy tarreau982249e2005-12-18 00:57:06 +010023844.5) Protection contre les fuites d'informations du serveur
2385-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002386Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002387créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002388'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2389un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2390activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002391 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002392 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002393 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002394 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002395 un en-tête 'Cache-control: public' ;
2396 - celles qui ont un en-tête 'Pragma: no-cache' ;
2397 - celles qui ont un en-tête 'Cache-control: private' ;
2398 - celles qui ont un en-tête 'Cache-control: no-store' ;
2399 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2400 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2401 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2402 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2403 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002404 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002405
willy tarreau982249e2005-12-18 00:57:06 +01002406Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2407même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2408message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2409dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002410en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002411l'administrateur sache qu'il y a une action correctrice à entreprendre.
2412
24134.6) Personalisation des erreurs
2414--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002415Certaines situations conduisent à retourner une erreur HTTP au client :
2416 - requête invalide ou trop longue => code HTTP 400
2417 - requête mettant trop de temps à venir => code HTTP 408
2418 - requête interdite (bloquée par un reqideny) => code HTTP 403
2419 - erreur interne du proxy => code HTTP 500
2420 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2421 - aucun serveur disponible pour cette requête => code HTTP 503
2422 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2423
2424Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2425Cependant, en fonction du type de clientèle, on peut préférer retourner des
Willy Tarreau3f49b302007-06-11 00:29:26 +02002426pages personnalisées. Ceci est possible de deux manières, l'une reposant sur
2427une redirection vers un serveur connu, et l'autre consistant à retourner un
2428fichier local.
2429
24304.6.1) Redirection
2431------------------
2432Une redirection d'erreur est assurée par le biais de la commande "errorloc" :
willy tarreau8337c6b2005-12-17 13:41:01 +01002433
2434 errorloc <code_HTTP> <location>
2435
2436Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2437le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2438d'une page précisée dans <location>. Cette adresse peut être relative au site,
2439ou absolue. Comme cette réponse est traîtée par le navigateur du client
2440lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2441
2442Exemple :
2443---------
2444 listen application 0.0.0.0:80
2445 errorloc 400 /badrequest.html
2446 errorloc 403 /forbidden.html
2447 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002448 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002449 errorloc 502 http://192.168.114.58/error50x.html
2450 errorloc 503 http://192.168.114.58/error50x.html
2451 errorloc 504 http://192.168.114.58/error50x.html
2452
willy tarreauc1f47532005-12-18 01:08:26 +01002453Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2454accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2455problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2456régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2457dans le champ Location avec la méthode GET uniquement. Seulement, certains
2458navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2459plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2460devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002461l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2462visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002463
2464Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2465utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2466dès que vous savez que vos clients supportent le code de retour HTTP 303.
2467
Willy Tarreau3f49b302007-06-11 00:29:26 +020024684.6.2) Fichiers locaux
2469----------------------
2470Parfois il est souhaitable de changer l'erreur retournée sans recourir à des
2471redirections. La seconde méthode consiste à charger des fichiers locaux lors
2472du démarrage et à les envoyer en guise de pur contenu HTTP en cas d'erreur.
2473C'est ce que fait le mot clé 'errorfile'.
2474
2475Attention, il y a des pièges à prendre en compte :
2476 - les fichiers sont chargés durant l'analyse de la configuration, avant de
2477 faire le chroot(). Donc ils sont relatifs au système de fichiers réel. Pour
2478 cette raison, il est recommandé de toujours passer un chemin absolu vers ces
2479 fichiers.
2480
2481 - le contenu de ces fichiers n'est pas du HTML mais vraiment du protocole HTTP
2482 avec potentiellement un corps HTML. Donc la première ligne et les en-têtes
2483 sont obligatoires. Idéalement, chaque ligne dans la partie HTTP devrait se
2484 terminer par un CR-LF pour un maximum de compatibilité.
2485
2486 - les réponses sont limitées à une taille de buffer (BUFSIZE), généralement 8
2487 ou 16 ko.
2488
2489 - les réponses ne devraient pas inclure de références aux serveurs locaux,
2490 afin de ne pas risquer de créer des boucles infinies sur le navigateur dans
2491 le cas d'une panne locale.
2492
2493Exemple :
2494---------
2495 errorfile 400 /etc/haproxy/errorfiles/400badreq.http
2496 errorfile 403 /etc/haproxy/errorfiles/403forbid.http
2497 errorfile 503 /etc/haproxy/errorfiles/503sorry.http
2498
2499
willy tarreau982249e2005-12-18 00:57:06 +010025004.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002501--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002502Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2503évite de répéter des paramètres communs à toutes les instances, tels que les
2504timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002505
2506Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2507précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2508'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2509section implique une annulation de tous les paramètres par défaut positionnés
2510précédemment, dans le but de les remplacer.
2511
2512La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2513paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2514un commentaire en guise paramètre.
2515
willy tarreau982249e2005-12-18 00:57:06 +01002516Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2517positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002518 - log (le premier et le second)
2519 - mode { tcp, http, health }
2520 - balance { roundrobin }
2521 - disabled (pour désactiver toutes les instances qui suivent)
2522 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2523 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002524 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2525 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002526 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002527 - cookie, capture
2528 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002529
2530Ne sont pas supportés dans cette version, les adresses de dispatch et les
2531configurations de serveurs, ainsi que tous les filtres basés sur les
2532expressions régulières :
2533 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002534 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002535
2536Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2537positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2538défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2539paramètres par défaut avant la déclaration de l'instance.
2540
2541Exemples :
2542----------
2543 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002544 log global
2545 mode tcp
2546 balance roundrobin
2547 clitimeout 180000
2548 srvtimeout 180000
2549 contimeout 4000
2550 retries 3
2551 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002552
2553 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002554 server srv1 192.168.1.1 check port 6000 inter 10000
2555 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002556
2557 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002558 server srv1 192.168.2.1 check port 6000 inter 10000
2559 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002560
2561 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002562 log global
2563 mode http
2564 option httplog
2565 option forwardfor
2566 option dontlognull
2567 balance roundrobin
2568 clitimeout 20000
2569 srvtimeout 20000
2570 contimeout 4000
2571 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002572
2573 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002574 cookie SERVERID postonly insert indirect
2575 capture cookie userid= len 10
2576 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2577 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002578
2579 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002580 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002581
willy tarreau8f635a42006-05-21 23:05:54 +02002582
25834.8) Rapport d'état sous forme de page HTML
2584-------------------------------------------
2585Avec la version 1.2.14, il devient possible pour haproxy d'interceptre des
2586requêtes pour une URI particulière et de retourner un rapport complet d'état de
2587l'activité du proxy, et des statistiques sur les serveurs. Ceci est disponible
2588via le mot clé "stats" associé à n'importe laquelle de ces options :
2589
2590 - stats enable
2591 - stats uri <uri prefix>
2592 - stats realm <authentication realm>
2593 - stats auth <user:password>
2594 - stats scope <proxy_id> | '.'
2595
2596
2597Par défaut, le rapport est désactivé. Le fait de spécifier une des combinaision
2598ci-dessus active le rapport pour l'instance de proxy qui le référence. La
2599solution la plus simple est d'utiliser "stats enable" qui activera le rapport
2600avec les paramètres par défaut suivant :
2601
2602 - default URI : "/haproxy?stats" (CONFIG_STATS_DEFAULT_URI)
2603 - default auth : non spécifié (pas d'authentication)
2604 - default realm : "HAProxy Statistics" (CONFIG_STATS_DEFAULT_REALM)
2605 - default scope : non specifié (accès à toutes les instances)
2606
2607L'option "stats uri <uri_prefix>" permet d'intercepter un autre préfixe d'URI
2608que celui par défaut. Noter que n'importe quelle URI qui COMMENCE avec cette
2609chaîne sera validée. Par exemple, une instance pourrait être dédiée à la page
2610d'état seulement et répondre à toute URI.
2611
2612Example :
2613---------
2614 # intercepte n'importe quelle URI et retourne la page d'état.
2615 listen stats :8080
2616 mode http
2617 stats uri /
2618
2619
2620L'option "stats auth <user:password>" active l'authentification "Basic" et
2621ajoute un couple "user:password" valide à la liste des comptes autorisés.
2622L'utilisateur <user> et le mot de passe <password> doivent être précisés
2623en clair dans le fichier de configuration, et comme ceci est de
2624l'authentification HTTP "Basic", il faut être conscient qu'ils transitent en
2625clair sur le réseau, donc il ne faut pas utiliser de compte sensible. La liste
2626est illimitée dans le but de pouvoir fournir des accès facilement à des
2627développeurs ou à des clients.
2628
2629L'option "stats realm <realm>" définit le "domaine" ("realm") de validité du
2630mot de passe qui sera présenté dans la boîte de dialogue du navigateur
2631lorsqu'il demandera un compte utilisateur et un mot de passe. Il est important
2632de s'assurer que celui-ci soit différent de ceux utilisés par l'application,
2633autrement le navigateur tentera d'en utiliser un caché depuis l'application.
2634Noter que les espaces dans le nom de "realm" doivent être protégés par un
2635backslash ('\').
2636
2637L'option "stats scope <proxy_id>" limite la portée du rapport d'état. Par
2638défaut, toutes les instances proxy sont listées. Mais dans certaines
2639circonstances, il serait préférable de ne lister que certains proxies ou
2640simplement le proxy courant. C'est ce que fait cette option. Le nom spécial "."
2641(un simple point) référence le proxy courant. Cette option peut être répétée
2642autant de fois que nécessaire pour autoriser d'autres proxies, même pour des
2643noms référencés plus loin dans la configuration ou bien des noms qui n'existent
2644pas encore. Le nom précisé est celui qui apparait après le mot clé "listen".
2645
2646Exemple :
2647---------
2648 # simple application embarquant la page d'état authentifiée
2649 listen app1 192.168.1.100:80
2650 mode http
2651 option httpclose
2652 balance roundrobin
2653 cookie SERVERID postonly insert indirect
2654 server srv1 192.168.1.1:8080 cookie srv1 check inter 1000
2655 server srv1 192.168.1.2:8080 cookie srv2 check inter 1000
2656 stats uri /my_stats
2657 stats realm Statistics\ for\ MyApp1-2
2658 stats auth guest:guest
2659 stats auth admin:AdMiN123
2660 stats scope .
2661 stats scope app2
2662
2663 # simple application embarquant la page d'état sans authentification
2664 listen app2 192.168.2.100:80
2665 mode http
2666 option httpclose
2667 balance roundrobin
2668 cookie SERVERID postonly insert indirect
2669 server srv1 192.168.2.1:8080 cookie srv1 check inter 1000
2670 server srv1 192.168.2.2:8080 cookie srv2 check inter 1000
2671 stats uri /my_stats
2672 stats realm Statistics\ for\ MyApp2
2673 stats scope .
2674
2675 listen admin_page :8080
2676 mode http
2677 stats uri /my_stats
2678 stats realm Global\ statistics
2679 stats auth admin:AdMiN123
2680
2681Notes :
2682-------
2683 - les options "stats" peuvent aussi être spécifiées dans une section
2684 "defaults", auquel cas la même configuration exactement sera fournie à
2685 toutes les instances suivantes, d'où l'utilité du scope ".". Toutefois, si
2686 une instance redéfinit n'importe quel paramètre "stats", alors les défauts
2687 ne lui seront pas appliqués.
2688
2689 - l'authentification "Basic" est très simpliste et non sécurisée contre la
2690 capture réseau. Aucun mot de passe sensible ne doit être utilisé, et il
2691 est bon de savoir qu'il n'existe pas de moyen de le supprimer du navigateur
2692 après usage, donc il sera envoyé tel quel à l'application au cours des
2693 accès successifs.
2694
2695 - Il est très important de préciser l'option "httpclose", sinon le proxy ne
2696 sera pas en mesure de détecter les URI dans les sessions keep-alive
2697 maintenues entre le navigateur et les serveurs, donc les URI de stats
2698 seront transmises telles quelles aux serveurs comme si l'option n'était
2699 pas précisée.
2700
2701
Willy Tarreau726c2bf2007-05-09 01:31:45 +020027025) Listes d'accès
2703=================
2704
2705Avec la version 1.3.10, un nouveau concept de listes d'accès (ACL) a vu le
2706jour. Comme il n'était pas nécessaire de réinventer la roue, et du fait que
2707toutes les réflexions passées aboutissaient à des propositions non
2708satisfaisantes, il a finalement été décidé que quelque chose de proche de ce
2709que Squid offre serait un bon compromis entre une richesse fonctionnelle et une
2710facilité d'utilisation
2711
2712Le principe est très simple : les ACLs sont déclarées avec un nom, un test et
2713une liste de valeurs valides à tester. Des conditions sont appliquées sur
2714diverses actions, et ces conditions effectuent un ET logique entre les ACLs. La
2715condition n'est donc validée que si toutes les ACLs sont vraies.
2716
2717Il est également possible d'utiliser le mot réservé "OR" dans les conditions,
2718et il est possible pour une ACL d'être spécifiée plusieurs fois, même avec des
2719tests différents, auquel cas le premier test réussi validera l'ACL.
2720
Willy Tarreauae8b7962007-06-09 23:10:04 +02002721Au stade de la version 1.3.12, seuls les tests suivants ont été implémentés :
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002722
2723 Niveaux 3/4 :
2724 src <ipv4_address>[/mask] ... : match IPv4 source address
2725 dst <ipv4_address>[/mask] ... : match IPv4 destination address
Willy Tarreauae8b7962007-06-09 23:10:04 +02002726 src_port <range> ... : match source port range
2727 dst_port <range> ... : match destination port range
2728 dst_conn <range> ... : match #connections on frontend
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002729
2730 Niveau 7 :
2731 method <HTTP method> ... : match HTTP method
2732 req_ver <1.0|1.1> ... : match HTTP request version
2733 resp_ver <1.0|1.1> ... : match HTTP response version
Willy Tarreauae8b7962007-06-09 23:10:04 +02002734 status <range> ... : match HTTP response status code in range
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002735 url <string> ... : exact string match on URI
2736 url_reg <regex> ... : regex string match on URI
2737 url_beg <string> ... : true if URI begins with <string>
2738 url_end <string> ... : true if URI ends with <string>
2739 url_sub <string> ... : true if URI contains <string>
2740 url_dir <string> ... : true if URI contains <string> between slashes
2741 url_dom <string> ... : true if URI contains <string> between slashes or dots
2742
Willy Tarreauae8b7962007-06-09 23:10:04 +02002743Une plage ('range') est constituée d'un ou deux entiers qui peuvent être
2744préfixés d'un opérateur. La syntaxe est :
2745
2746 [<op>] <min>[:<max>]
2747
2748Avec <op> pouvant être :
2749 'eq' : la valeur doit égaler <min> ou être comprise entre <min> et <max>
2750 'le' : la valeur doit être inférieure ou égale à <min>
2751 'lt' : la valeur doit être strictement inférieure à <min>
2752 'ge' : la valeur doit être supérieure ou égale à <min>
2753 'gt' : la valeur doit être strictement supérieure à <min>
2754
2755Lorsqu'aucun opérateur n'est défini, 'eq' est employé. Noter que lorsqu'un
2756opérateur est spécifié, il s'applique à toutes les plages de valeurs suivantes
2757jusqu'à la fin de la ligne ou bien jusqu'à ce qu'un nouvel opérateur soit
2758précisé. Exemple :
2759
2760 acl status_error status 400:599
2761 acl saturated_frt dst_conn ge 1000
2762 acl invalid_ports src_port lt 512 ge 65535
2763
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002764D'autres tests arrivent (entêtes, cookies, heure, authentification), c'est
2765juste une question de temps. Il est aussi prévu de permettre de lire les
2766valeurs depuis un fichier, ainsi que d'ignorer la casse pour certains tests.
2767
2768La seule commande supportant les conditions d'ACL à ce jour est la nouvelle
2769commande "block" qui bloque une requête et retourne un statut 403 si sa
2770condition est validée (cas du "if") ou invalidée (cas du "unless").
2771
2772Exemple :
2773---------
2774
2775 acl options_uris url *
2776 acl meth_option method OPTIONS
2777 acl http_1.1 req_ver 1.1
2778 acl allowed_meth method GET HEAD POST OPTIONS CONNECT
2779 acl connect_meth method CONNECT
2780 acl proxy_url url_beg http://
2781
2782 # block if reserved URI "*" used with a method other than "OPTIONS"
2783 block if options_uris !meth_option
2784
2785 # block if the OPTIONS method is used with HTTP 1.0
2786 block if meth_option !http_1.1
2787
2788 # allow non-proxy url with anything but the CONNECT method
2789 block if !connect_meth !proxy_url
2790
2791 # block all unknown methods
2792 block unless allowed_meth
2793
2794Note: Cette documentation est embryonnaire mais doit permettre de démarrer et
2795surtout d'avancer sur le projet sans être trop ralenti par la documentation.
2796
2797
willy tarreaub719f002005-12-17 12:55:07 +01002798=======================
2799| Paramétrage système |
2800=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002801
2802Sous Linux 2.4
2803==============
2804
willy tarreaub719f002005-12-17 12:55:07 +01002805-- cut here --
2806#!/bin/sh
2807# set this to about 256/4M (16384 for 256M machine)
2808MAXFILES=16384
2809echo $MAXFILES > /proc/sys/fs/file-max
2810ulimit -n $MAXFILES
2811
2812if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002813 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002814fi
2815
2816if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002817 # 30 seconds for fin, 15 for time wait
2818 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2819 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2820 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2821 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002822fi
2823
willy tarreau0f7af912005-12-17 12:21:26 +01002824echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002825echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2826echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002827echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002828echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2829echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002830echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2831echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002832echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002833echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002834echo 0 > /proc/sys/net/ipv4/tcp_dsack
2835
2836# auto-tuned on 2.4
2837#echo 262143 > /proc/sys/net/core/rmem_max
2838#echo 262143 > /proc/sys/net/core/rmem_default
2839
2840echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2841echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2842
2843-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002844
willy tarreau197e8ec2005-12-17 14:10:59 +01002845Sous FreeBSD
2846============
2847
2848Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2849Clement Laforet <sheepkiller@cultdeadsheep.org>.
2850
2851Pour plus d'informations :
2852http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2853http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2854http://www.freshports.org/net/haproxy
2855
2856
willy tarreau0f7af912005-12-17 12:21:26 +01002857-- fin --