blob: a70e3c59e13c6de0e4644e8e0d841f70677f8a4d [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 Tarreaubefdff12007-12-02 22:27:38 +0100692 - A compter de la version 1.3.14, il est possible de spécifier les durées
693 d'expiration dans des unités de temps arbitraires à choisir parmi
694 { us, ms, s, m, h, d }. Pour cela, la valeur entière doit être suffixée
695 de l'unité.
willy tarreau0f7af912005-12-17 12:21:26 +0100696
willy tarreauc29948c2005-12-17 13:10:27 +01006972.6) Tentatives de reconnexion
698------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100699Lors d'un échec de connexion vers un serveur, il est possible de
700retenter (potentiellement vers un autre serveur, en cas de répartition
701de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100702abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100703
willy tarreauc29948c2005-12-17 13:10:27 +0100704Exemple :
705---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100706 # on essaie encore trois fois maxi
707 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100708
willy tarreau34f45302006-04-15 21:37:14 +0200709Il est à noter que la tentative de reconnexion peut amener à utiliser un autre
710serveur si le premier a disparu entre deux tentatives de connexion.
711
willy tarreau0f7af912005-12-17 12:21:26 +0100712
willy tarreauc29948c2005-12-17 13:10:27 +01007132.7) Adresse du serveur
714-----------------------
715Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
716le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
717serveur d'assignation de cookie dans le cas où le service consiste à assurer
718uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100719le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
720du serveur distant, et il est maintenant recommandé d'utiliser de préférence
721le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100722
willy tarreauc29948c2005-12-17 13:10:27 +0100723Exemple :
724---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100725 # on envoie toutes les nouvelles connexions ici
726 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100727
willy tarreauc29948c2005-12-17 13:10:27 +0100728Remarque :
729----------
730Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
731'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100732
willy tarreau0f7af912005-12-17 12:21:26 +0100733
willy tarreau240afa62005-12-17 13:14:35 +01007342.8) Adresse de sortie
735----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100736Il est possible de forcer l'adresse utilisée pour établir les connexions vers
737les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
738port, bien que cette fonctionnalité se limite à des usages très spécifiques.
739C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100740pour permettre aux serveurs de trouver le chemin de retour dans des contextes
741de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
742choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
743librement par le système. Il est à noter que depuis la version 1.1.18, les
744tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
745source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100746
747Exemples :
748----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100749 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100750 # toutes les connexions prennent l'adresse 192.168.1.200
751 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100752
willy tarreaua41a8b42005-12-17 14:02:24 +0100753 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100754 # utiliser l'adresse 192.168.1.200 et le port réservé 900
755 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100756
757
7582.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100759--------------------------------
760En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
761vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
762par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100763
willy tarreauc29948c2005-12-17 13:10:27 +0100764Exemple :
765---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100766 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100767 mode http
768 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100769
willy tarreauc29948c2005-12-17 13:10:27 +0100770On peut modifier l'utilisation du cookie pour la rendre plus intelligente
771vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
772réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
773cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100774de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
775inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100776
777Exemples :
778----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100779
780Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100781dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
782directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100783
willy tarreauc5f73ed2005-12-18 01:26:38 +0100784 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100785
willy tarreauc29948c2005-12-17 13:10:27 +0100786Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
787lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100788
willy tarreauc5f73ed2005-12-18 01:26:38 +0100789 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100790
willy tarreau64a3cc32005-12-18 01:13:11 +0100791Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
792accès en répartition de charge interne. Dans ce cas, il est souhaitable que
793tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100794retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100795
willy tarreauc5f73ed2005-12-18 01:26:38 +0100796 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100797
willy tarreau0174f312005-12-18 01:02:42 +0100798Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
799puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
800permet d'insérer une instance de haproxy devant une application sans risquer
801d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
802plus d'un cookie :
803
804 cookie JSESSIONID prefix
805
willy tarreau240afa62005-12-17 13:14:35 +0100806Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
807ajouter le mot clé 'nocache' après 'insert' :
808
willy tarreauc5f73ed2005-12-18 01:26:38 +0100809 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100810
willy tarreau64a3cc32005-12-18 01:13:11 +0100811Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
812mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100813
willy tarreauc5f73ed2005-12-18 01:26:38 +0100814 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100815
willy tarreau240afa62005-12-17 13:14:35 +0100816
willy tarreau96d40372005-12-17 13:11:56 +0100817Remarques :
818-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100819- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
820 s'adapter à des applications générant déjà le cookie, avec un contenu
821 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100822
willy tarreau96d40372005-12-17 13:11:56 +0100823- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
824 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
825 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100826
willy tarreau240afa62005-12-17 13:14:35 +0100827- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
828 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
829 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
830 cookie de persistence inséré, donc provoquer des changements de serveurs pour
831 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100832
willy tarreau0174f312005-12-18 01:02:42 +0100833- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
834 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
835 présenté par l'application qui est censée savoir à quel moment il peut
836 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
837 présenté par le client dans chaque requête ultérieure, il est indispensable
838 de s'assurer que le client et le serveur communiqueront sans "keep-alive
839 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
840
willy tarreaucd878942005-12-17 13:27:43 +0100841- lorsque l'application est bien connue, et que les parties nécessitant de la
842 persistence sont systématiquement accédées par un formulaire en mode POST,
843 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
844 et "indirect", car la page d'accueil reste cachable, et c'est l'application
845 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100846
willy tarreau240afa62005-12-17 13:14:35 +01008472.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100848----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100849En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
850par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100851
willy tarreau5cbea6f2005-12-17 12:48:26 +0100852 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100853
willy tarreauc29948c2005-12-17 13:10:27 +0100854- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
855 configuration et les logs.
856- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
857- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100858
859Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100860---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100861 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100862 mode http
863 cookie SERVERID
864 dispatch 192.168.1.100:80
865 server web1 192.168.1.1:80 cookie server01
866 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100867
868Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100869-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100870
willy tarreaua41a8b42005-12-17 14:02:24 +01008713) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100872=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100873
willy tarreauc29948c2005-12-17 13:10:27 +0100874Le relais peut effectuer lui-même la répartition de charge entre les différents
875serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
876cela, on précise le mot clé 'balance' dans la définition du service,
willy tarreau34f45302006-04-15 21:37:14 +0200877éventuellement suivi du nom d'un algorithme de répartition. Jusqu'à la version
8781.2.11, seul 'roundrobin' était géré, et c'est aussi la valeur implicite par
Willy Tarreau2fcb5002007-05-08 13:35:26 +0200879défaut. Avec la version 1.2.12, le nouveau mot clé 'source' est apparu. La
880version 1.3.10 a également apporté le mot clé 'uri'. Il est évident qu'en cas
881d'utilisation du répartiteur interne, il ne faudra pas spécifier d'adresse de
882dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100883
884Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100885---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100886
willy tarreaua41a8b42005-12-17 14:02:24 +0100887 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100888 mode http
889 cookie SERVERID
890 balance roundrobin
891 server web1 192.168.1.1:80 cookie server01
892 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100893
willy tarreaua41a8b42005-12-17 14:02:24 +0100894Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
895du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
896sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
897champ <port> de l'adresse serveur :
898
899 - non spécifié ou nul :
900 la connexion sera envoyée au serveur sur le même port que celui sur
901 lequel le relais a reçu la connexion.
902
903 - valeur numérique (seul cas supporté pour les versions antérieures) :
904 le serveur recevra la connexion sur le port désigné.
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, auquel on ajoute la valeur désignée.
909
910 - valeur numérique précédée d'un signe '-' :
911 la connexion sera envoyée au serveur sur le même port que celui sur
912 lequel le relais a reçu la connexion, duquel on soustrait la valeur
913 désignée.
914
915Exemples :
916----------
917
918# même que précédemment
919
920 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100921 mode http
922 cookie SERVERID
923 balance roundrobin
924 server web1 192.168.1.1 cookie server01
925 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100926
927# relayage simultané des ports 80 et 81 et 8080-8089
928
929 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100930 mode http
931 cookie SERVERID
932 balance roundrobin
933 server web1 192.168.1.1 cookie server01
934 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100935
936# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
937
938 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100939 mode tcp
940 balance roundrobin
941 server srv1 192.168.1.1:+1000
942 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100943
willy tarreau34f45302006-04-15 21:37:14 +0200944Comme indiqué précédemment, la version 1.2.12 apporta le nouveau mot clé
945'source'. Lorsque celui-ci est utilisé, l'adresse IP du client est hachée et
946distribuée de manière homogène parmi les serveurs disponibles, de sorte qu'une
947même adresse IP aille toujours sur le même serveur tant qu'il n'y a aucun
948changement dans le nombre de serveurs disponibles. Ceci peut être utilisé par
949exemple pour attacher le HTTP et le HTTPS sur un même serveur pour un même
950client. Cela peut également être utilisé pour améliorer la persistance
951lorsqu'une partie de la population des clients n'accepte pas les cookies. Dans
952ce cas, seuls ces derniers seront perturbés par la perte d'un serveur.
953
954NOTE: il est important de prendre en compte le fait que beaucoup d'internautes
955 naviguent à travers des fermes de proxies qui assignent des adresses IP
956 différentes à chaque requête. D'autres internautes utilisent des liens à
957 la demande et obtiennent une adresse IP différente à chaque connexion. De
958 ce fait, le paramètre 'source' doit être utilisé avec une extrème
959 précaution.
960
961Exemples :
962----------
963
964# assurer qu'une même adresse IP ira sur le même serveur pour tout service
965
966 listen http_proxy
967 bind :80,:443
968 mode http
969 balance source
970 server web1 192.168.1.1
971 server web2 192.168.1.2
972
973# améliorer la persistance par l'utilisation de la source en plus du cookie :
974
975 listen http_proxy :80
976 mode http
977 cookie SERVERID
978 balance source
979 server web1 192.168.1.1 cookie server01
980 server web2 192.168.1.2 cookie server02
981
Willy Tarreau2fcb5002007-05-08 13:35:26 +0200982De plus, tel qu'indiqué ci-dessus, la version 1.3.10 a introduit le mot clé
983'uri'. Il est très pratique dans le cas de répartition de charge entre des
984reverse-proxy-caches, parce qu'il utilisera le résultat d'un hachage de l'URI
985pour choisir un serveur, ce qui aura pour effet d'optimiser le taux de cache
986du fait que la même URI sera toujours envoyée au même cache. Ce mot-clé n'est
987autorisé qu'en mode HTTP.
988
989Example :
990---------
991
992# Envoie toujours une URI donnée au même serveur
993
994 listen http_proxy
995 bind :3128
996 mode http
997 balance uri
998 server squid1 192.168.1.1
999 server squid2 192.168.1.2
1000
Willy Tarreau01732802007-11-01 22:48:15 +01001001La version 1.3.14 a apporté une nouvelle méthode 'balance url_param'. Elle
1002consiste à se baser sur un paramètre passé dans l'URL pour effectuer un hachage
1003utilisé pour déterminer le serveur à utiliser. Ceci est principalement utile
1004pour des applications n'ayant pas une exigence stricte de persistance, mais
1005pour lesquelles elle procure un gain de performance notable dans des
1006environnements où il n'est pas toujours possible d'utiliser des cookies. En cas
1007d'absence du paramètre dans l'URL, alors une répartition de type 'round robin'
1008est effectuée.
1009
1010Example :
1011---------
1012
1013# hache le paramètre "basket_id" dans l'URL pour déterminer le serveur
1014
1015 listen http_proxy
1016 bind :3128
1017 mode http
1018 balance url_param basket_id
1019 server ebiz1 192.168.1.1
1020 server ebiz2 192.168.1.2
1021
willy tarreau0f7af912005-12-17 12:21:26 +01001022
willy tarreauc29948c2005-12-17 13:10:27 +010010233.1) Surveillance des serveurs
1024------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001025Il est possible de tester l'état des serveurs par établissement de connexion
1026TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
1027utilisé dans le processus de répartition de charge interne. Pour activer la
1028surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
1029Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
1030tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
1031paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
1032Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreau34f45302006-04-15 21:37:14 +02001033
willy tarreaue47c8d72005-12-17 12:55:52 +01001034 - inter : 2000
1035 - rise : 2
1036 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +01001037 - port : port de connexion du serveur
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001038 - addr : adresse de connexion du serveur (par defaut: adresse du serveur)
1039
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001040Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001041certains cas de pannes, des serveurs peuvent continuer à accepter les
1042connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
1043d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
1044et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
1045les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
1046contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
1047RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
10481.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
1049possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
1050l'avantage d'être facilement extractibles des logs, et de ne pas induire
1051d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
1052considérées valides, les autres (y compris non-réponses) aboutissent à un
1053échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
1054deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
1055"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
1056accepte donc 4 formes :
willy tarreau34f45302006-04-15 21:37:14 +02001057
willy tarreaueedaa9f2005-12-17 14:08:03 +01001058 - option httpchk -> OPTIONS / HTTP/1.0
1059 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
1060 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
1061 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreau34f45302006-04-15 21:37:14 +02001062
Willy Tarreauf3c69202006-07-09 16:42:34 +02001063HAProxy est souvent utilisé pour relayer divers protocoles reposant sur TCP,
1064tels que HTTPS, SMTP ou LDAP, le plus commun étant HTTPS. Un problème assez
1065couramment rencontré dans les data centers est le besoin de relayer du trafic
1066vers des serveurs lointains tout en maintenant la possibilité de basculer sur
1067un serveur de secours. Les tests purement TCP ne suffisent pas toujours dans
1068ces situations car l'on trouve souvent, dans la chaîne, des proxies, firewalls
1069ou répartiteurs de charge qui peuvent acquitter la connexion avant qu'elle
1070n'atteigne le serveur. La seule solution à ce problème est d'envoyer des tests
1071applicatifs. Comme la demande pour les tests HTTPS est élevée, ce test a été
1072implémenté en version 1.2.15 sur la base de messages SSLv3 CLIENT HELLO. Pour
1073l'activer, utiliser "option ssl-hello-chk". Ceci enverra des messages SSLv3
1074CLIENT HELLO aux serveurs, en annonçant un support pour la majorité des
1075algorithmes de chiffrement. Si en retour, le serveur envoie ce qui ressemble à
1076une réponse SSLv3 SERVER HELLO ou ALERT (refus des algorithmes), alors la
1077réponse sera considérée comme valide. Noter qu'Apache ne produit pas de log
1078lorsqu'il reçoit des messages HELLO, ce qui en fait un type de message
1079parfaitement adapté à ce besoin.
1080
Willy Tarreau23677902007-05-08 23:50:35 +02001081La version 1.3.10 est accompagnée d'un nouveau test d'état pour le SMTP. Par
1082défaut, il consiste à envoyer "HELO localhost" aux serveurs, et à attendre le
1083message "250" en retour. Notez qu'il peut aussi envoyer une requête plus
1084spécifique :
1085
1086 - option smtpchk -> envoie "HELO localhost"
1087 - option smtpchk EHLO mail.mydomain.com -> envoie ce message ESMTP
1088
willy tarreauc5f73ed2005-12-18 01:26:38 +01001089Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001090
willy tarreau8337c6b2005-12-17 13:41:01 +01001091Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
1092utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
1093ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
1094de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
1095les 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 +01001096de répartition de charge entre des serveurs de secours par défaut. A partir
1097de la version 1.2.9, il est possible de les utiliser simultanément grâce à
1098l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
1099d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
1100de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
1101définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
1102qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +01001103
willy tarreaua41a8b42005-12-17 14:02:24 +01001104Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
1105vers un port différent de celui de service. C'est nécessaire principalement
1106pour les configurations où le serveur n'a pas de port prédéfini, par exemple
1107lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001108le paramètre 'port' suivi du numéro de port devant répondre aux requêtes. Il
1109est possible d'envoyer les tests de fonctionnement vers une adresse différente
1110de celle de service. Cela permet d'utiliser, sur la machine faisant fonctionner
1111HAproxy, un démon permettant des tests specifiques ( REGEX sur un résultat et
1112basculement de plusieurs fermes en cas d'erreur sur l'une d'elles).
willy tarreaua41a8b42005-12-17 14:02:24 +01001113
willy tarreau64a3cc32005-12-18 01:13:11 +01001114Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
1115l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
1116SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
1117envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
1118elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
1119local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +01001120
willy tarreau982249e2005-12-18 00:57:06 +01001121Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
1122logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
1123afin de notifier l'administrateur qu'il faut prendre une action immédiate.
1124
willy tarreau0174f312005-12-18 01:02:42 +01001125Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
1126même valeur de cookie. C'est particulièrement utile en mode backup, pour
1127sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
1128oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
1129temporairement vers une page d'erreur en attendant le redémarrage d'une
1130application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
1131le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
1132chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
1133le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
1134pour plus d'informations.
1135
willy tarreauc29948c2005-12-17 13:10:27 +01001136Exemples :
1137----------
willy tarreaua41a8b42005-12-17 14:02:24 +01001138# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001139 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001140 mode http
1141 cookie SERVERID
1142 balance roundrobin
1143 server web1 192.168.1.1:80 cookie server01 check
1144 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001145
willy tarreau2f6ba652005-12-17 13:57:42 +01001146# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001147 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001148 mode http
1149 cookie SERVERID
1150 balance roundrobin
1151 option httpchk
1152 server web1 192.168.1.1:80 cookie server01 check
1153 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +01001154
willy tarreau2f6ba652005-12-17 13:57:42 +01001155# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
1156 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001157 mode http
1158 cookie SERVERID
1159 balance roundrobin
1160 option httpchk /index.html
1161 server web1 192.168.1.1:80 cookie server01 check
1162 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +01001163
willy tarreaueedaa9f2005-12-17 14:08:03 +01001164# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1165 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001166 mode http
1167 cookie SERVERID
1168 balance roundrobin
1169 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1170 server web1 192.168.1.1:80 cookie server01 check
1171 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001172
willy tarreau0174f312005-12-18 01:02:42 +01001173# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1174# douceur utilisant un second port (81) juste pour les health-checks.
1175 listen http_proxy 0.0.0.0:80
1176 mode http
1177 cookie JSESSIONID prefix
1178 balance roundrobin
1179 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1180 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1181 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1182 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1183 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1184
willy tarreau96d40372005-12-17 13:11:56 +01001185# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001186# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1187# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +01001188 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001189 mode http
1190 cookie SERVERID insert nocache indirect
1191 balance roundrobin
1192 server web1 192.168.1.1:80 cookie server01 check
1193 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +01001194
willy tarreaueedaa9f2005-12-17 14:08:03 +01001195# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001196 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001197 mode http
1198 cookie SERVERID insert nocache indirect
1199 balance roundrobin
1200 server web1 192.168.1.1:80 cookie server01 check
1201 server web2 192.168.1.2:80 cookie server02 check
1202 server web-backup 192.168.2.1:80 cookie server03 check backup
1203 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001204
willy tarreaua41a8b42005-12-17 14:02:24 +01001205# relayage SMTP+TLS avec test du serveur et serveur de backup
1206
1207 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001208 mode tcp
1209 balance roundrobin
1210 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1211 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001212
Willy Tarreauf3c69202006-07-09 16:42:34 +02001213# relayage HTTPS avec test du serveur et serveur de backup
1214
1215 listen http_proxy :443
1216 mode tcp
1217 option ssl-hello-chk
1218 balance roundrobin
1219 server srv1 192.168.1.1 check inter 30000 rise 1 fall 2
1220 server srv2 192.168.1.2 backup
1221
Willy TARREAU3481c462006-03-01 22:37:57 +01001222# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1223 listen http_proxy 0.0.0.0:80
1224 mode http
1225 balance roundrobin
1226 option httpchk
1227 server inst1 192.168.1.1:80 cookie s1 check
1228 server inst2 192.168.1.2:80 cookie s2 check
1229 server inst3 192.168.1.3:80 cookie s3 check
1230 server back1 192.168.1.10:80 check backup
1231 server back2 192.168.1.11:80 check backup
1232 option allbackups # all backups will be used
1233
willy tarreau0f7af912005-12-17 12:21:26 +01001234
willy tarreauc29948c2005-12-17 13:10:27 +010012353.2) Reconnexion vers un répartiteur en cas d'échec direct
1236----------------------------------------------------------
1237En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1238seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1239définitivement privés de service. La spécification du paramètre 'redispatch'
1240autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1241(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001242
1243Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001244---------
willy tarreau0f7af912005-12-17 12:21:26 +01001245 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001246 mode http
1247 cookie SERVERID
1248 dispatch 192.168.1.100:80
1249 server web1 192.168.1.1:80 cookie server01
1250 server web2 192.168.1.2:80 cookie server02
1251 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001252
willy tarreau64a3cc32005-12-18 01:13:11 +01001253Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1254redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1255version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1256identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1257tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1258tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001259
1260 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001261 mode http
1262 option persist
1263 cookie SERVERID
1264 dispatch 192.168.1.100:80
1265 server web1 192.168.1.1:80 cookie server01
1266 server web2 192.168.1.2:80 cookie server02
1267 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001268
willy tarreauc29948c2005-12-17 13:10:27 +01001269
willy tarreau34f45302006-04-15 21:37:14 +020012703.3) Assignation de poids différents à des serveurs
1271---------------------------------------------------
1272Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1273d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1274que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1275soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1276raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1277plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1278plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1279la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1280une vue des serveurs disponibles la plus homogène possible en se basant sur
1281leur poids de sorte que la charge se distribue de la manière la plus lisse
1282possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
willy tarreau532bb552006-05-13 18:40:37 +02001283serveur par rapport aux autres. Le poids de 1 donne la fréquence d'apparition
1284la plus faible, et 256 la fréquence la plus élevée. De cette manière, si un
1285serveur disparait, les capacités restantes sont toujours respectées.
willy tarreau34f45302006-04-15 21:37:14 +02001286
1287
1288Exemple :
1289---------
1290# distribution équitable sur 2 opteron and un ancien pentium3
1291
1292 listen web_appl 0.0.0.0:80
1293 mode http
1294 cookie SERVERID insert nocache indirect
1295 balance roundrobin
1296 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1297 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1298 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1299 server web-backup1 192.168.2.1:80 cookie server04 check backup
1300 server web-excuse 192.168.3.1:80 check backup
1301
1302Notes :
1303-------
1304 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1305
1306 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1307 est plus propre d'utiliser les poids que de répliquer le même serveur
1308 plusieurs fois.
1309
1310 - les poids s'appliquent également aux serveurs de backup si l'option
1311 'allbackups' est positionnée.
1312
1313 - le poids s'applique aussi à la répartition selon la source
1314 ('balance source').
1315
1316 - quels que soient les poids, le premier serveur sera toujours assigné en
1317 premier. Cette règle facilite les diagnostics.
1318
1319 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1320 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1321 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1322
willy tarreau532bb552006-05-13 18:40:37 +02001323La distribution du trafic suivra exactement le séquencement suivant :
1324
1325 Request| 1 1 1 1
1326 number | 1 2 3 4 5 6 7 8 9 0 1 2 3
1327 --------+---------------------------
1328 p3-800 | X . . . . . . X . . . . .
1329 opt-20 | . X . X . X . . . X . X .
1330 opt-24 | . . X . X . X . X . X . X
1331
1332
13333.4) Limitation du nombre de sessions concurrentes par serveur
1334--------------------------------------------------------------
1335Certains serveurs web multi-processus tels qu'Apache souffrent dès qu'il y a
1336trop de sessions concurrentes, parce qu'il est très coûteux de faire
1337fonctionner des centaines ou des milliers de processus sur un système. Une
1338solution consiste à augmenter le nombre de serveurs et de répartir la charge
1339entre eux, mais cela pose un problème lorsque le but est uniquement de résister
1340à des pics de charge occasionnels.
1341
1342Pour résoudre ce problème, une nouvelle fonctionnalité a été implémentée dans
1343HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associée à une
1344file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
1345entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
1346de diminuer la valeur maxconn améliorera notablement les performances des
1347serveurs et diminuera les temps de réponse simplement parce que les serveurs
1348seront moins congestionnés.
1349
1350Quand une requête cherche à joindre n'importe quel serveur, le premier serveur
1351non saturé est utilisé, en respectant l'algorithme de répartition de charge. Si
1352tous les serveurs sont saturés, alors la requête sera mise dans la file
1353d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
1354toutes les requêtes précédentes auront été libérées et qu'un serveur aura été
1355libéré d'une connexion pour la traiter.
1356
1357Si une requête fait référence à un serveur en particulier (p.ex: hachage d'IP
1358source, ou persistance par cookie), et que ce server est saturé, alors la
1359requête sera mise dans la file d'attente dédiée à ce serveur. Cette file
1360d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
1361plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent déjà
1362que pour les nouveaux utilisateurs.
1363
1364Pour cela, les logs ont dû être enrichis pour indiquer le nombre de sessions
1365par serveur, la position de la requête dans les files d'attentes, et le temps
1366passé en file d'attente. Ceci aide considérablement à faire de la prévision de
1367capacité. Voir la section 'logs' plus bas pour plus d'informations.
1368
1369Exemple :
1370---------
1371 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1372 listen web_appl 0.0.0.0:80
1373 maxconn 10000
1374 mode http
1375 cookie SERVERID insert nocache indirect
1376 balance roundrobin
1377 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 maxconn 100 check
1378 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
1379 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
1380 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1381 server web-excuse 192.168.3.1:80 check backup
1382
willy tarreau8f635a42006-05-21 23:05:54 +02001383Cette option se montra si efficace pour réduire les temps de réponse des
1384serveurs que certains utilisateurs voulaient utiliser des valeurs trop basses
1385pour améliorer les performances de leurs serveurs. Seulement, ils n'étaient
1386alors plus en mesure de supporter de très fortes charges parce qu'il n'était
1387plus possible de les saturer. Pour cette raison, la version 1.2.14 a apporté la
1388limitation dynamique de connexions avec l'addition du paramètre "minconn".
1389Lorsque ce paramètre est associé à "maxconn", il active la limitation dynamique
1390basée sur la charge de l'instance. Le nombre maximal de sessions concurrentes
1391sur un serveur devient alors proportionnel au nombre de sessions de l'instance
1392par rapport à son 'maxconn'. Un minimum de <minconn> sessions sera toujours
1393permis quelle que soit la charge. Ceci assurera que les serveurs travailleront
1394au meilleur de leurs performances sous des charges normales, et qu'ils seront
1395tout de même capables de supporter de fortes pointes lorsque nécessaire. La
1396limite dynamique est calculée comme ceci :
1397
1398 srv.dyn_limit = max(srv.minconn, srv.maxconn * inst.sess / inst.maxconn)
1399
1400Exemple :
1401---------
1402 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1403 listen web_appl 0.0.0.0:80
1404 maxconn 10000
1405 mode http
1406 cookie SERVERID insert nocache indirect
1407 balance roundrobin
1408 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check
1409 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check
1410 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1411 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1412 server web-excuse 192.168.3.1:80 check backup
1413
1414Dans l'exemple ci-dessus, le serveur "pentium3-800' recevra au plus 100
1415connexions simultanées lorsque l'instance du proxy en atteindra 10000, et
1416recevra seulement 10 connexions simultanées tant que le proxy sera sous les 1000
1417sessions.
1418
Elijah Epifanovacafc5f2007-10-25 20:15:38 +02001419Il est possible de limiter la taille de la file d'attente dans le but de
1420redistribuer les connexions destinées à un serveur en particulier qui sont trop
1421loin pour avoir une chance d'être servies en un temps raisonnable. Ceci n'est
1422acceptable que dans le cas où l'affinité entre le client et le serveur n'est
1423pas obligatoire, mais motivée uniquement par des raisons de performances, par
1424exemple, par l'utilisation d'un cache local au serveur. L'option 'maxqueue'
1425permet de préciser la limite par serveur, tel que dans l'exemple ci-dessous :
1426
1427... (même exemple que précédemment)
1428 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check maxqueue 50
1429 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check maxqueue 200
1430 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1431
1432En l'absence du paramètre 'maxqueue', la file d'un serveur n'a pas de limite
1433définie. Dans le cas contraire, lorsque la file atteint la limite fixée par
1434'maxqueue', les clients sont déplacés vers la file globale.
1435
willy tarreau532bb552006-05-13 18:40:37 +02001436Notes :
1437-------
1438 - la requête ne restera pas indéfiniment en file d'attente, elle est
1439 assujétie au paramètre 'contimeout', et si une requête ne peut pas
1440 sortir de la file avant ce time-out, soit parce que le serveur est
1441 saturé, soit parce qu'il y a trop de requêtes en file d'attente,
1442 alors elle expirera avec une erreur 503.
1443
willy tarreau8f635a42006-05-21 23:05:54 +02001444 - si seul <minconn> est spécifié, il a le même effet que <maxconn>
1445
willy tarreau532bb552006-05-13 18:40:37 +02001446 - positionner des valeurs trop basses pour 'maxconn' peut améliorer les
1447 performances mais aussi permettre à des utilisateurs trop lents de bloquer
1448 un serveur pour les autres utilisateurs.
1449
willy tarreau34f45302006-04-15 21:37:14 +02001450
willy tarreau8f635a42006-05-21 23:05:54 +020014513.5) Abandon des requêtes abortées
1452----------------------------------
1453En présence de très fortes charges, les serveurs mettront un certain temps à
1454répondre. La file d'attente du proxy se remplira, et les temps de réponse
1455suivront une croissance proportionnelle à la taille de file d'attente fois
1456le temps moyen de réponse par session. Lorsque les clients attendront plus de
1457quelques secondes, ils cliqueront souvent sur le bouton 'STOP' de leur
1458navigateur, laissant des requêtes inutiles en file d'attente et ralentissant
1459donc les autres utilisateurs.
1460
1461Comme il n'y a aucun moyen de distinguer un vrai clic sur STOP d'une simple
1462fermeture du canal de sortie sur le client (shutdown(SHUT_WR)), les agents HTTP
1463doivent être conservateurs et considérer que le client n'a probablement fermé
1464que le canal de sortie en attendant la réponse. Toutefois, ceci introduit des
1465risques de congestion lorsque beaucoup d'utilisateurs font de même, et s'avère
1466aujourd'hui complètement inutile car probablement aucun client ne referme la
1467session en attendant la réponse. Certains agents HTTP supportent ceci (Squid,
1468Apache, HAProxy), et d'autres ne le supportent pas (TUX, et la plupart des
1469répartiteurs de charge matériels). Donc la probabilité pour qu'une notification
1470de fermeture d'un canal d'entrée côté client représente un utilisateur cliquant
1471sur 'STOP' est proche de 100%, et il est vraiment tentant d'abandonner la
1472requête prématurément sans polluer les serveurs.
1473
1474Pour cette raison, une nouvelle option "abortonclose" a été introduite en
1475version 1.2.14. Par défaut (sans l'option), le comportement reste conforme à
1476HTTP. Mais lorsque l'option est spécifiée, une session dont le canal entrant
1477est fermé sera abortée si cela est possible, c'est à dire que la requête est
1478soit en file d'attente, soit en tentative de connexion. Ceci réduit
1479considérablement la longueur des files d'attentes et la charge sur les serveurs
1480saturés lorsque les utilisateurs sont tentés de cliquer sur 'STOP', ce qui à
1481son tour, réduit les temps de réponse pour les autres utilisateurs.
1482
1483Exemple :
1484---------
1485 listen web_appl 0.0.0.0:80
1486 maxconn 10000
1487 mode http
1488 cookie SERVERID insert nocache indirect
1489 balance roundrobin
1490 server web1 192.168.1.1:80 cookie s1 weight 10 maxconn 100 check
1491 server web2 192.168.1.2:80 cookie s2 weight 10 maxconn 100 check
1492 server web3 192.168.1.3:80 cookie s3 weight 10 maxconn 100 check
1493 server bck1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1494 option abortonclose
1495
1496
willy tarreauc29948c2005-12-17 13:10:27 +010014974) Fonctionnalités additionnelles
1498=================================
1499
1500D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
willy tarreau8f635a42006-05-21 23:05:54 +02001501principalement du mode transparent, de la journalisation des connexions, de la
1502réécriture des en-têtes, et du statut sous forme de page HTML.
1503
willy tarreau5cbea6f2005-12-17 12:48:26 +01001504
willy tarreau0174f312005-12-18 01:02:42 +010015054.1) Fonctionnalités réseau
1506---------------------------
15074.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001508---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001509En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1510routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1511pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001512destination de la session détournée. Le système doit permettre de rediriger les
1513paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001514
1515Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001516---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001517 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001518 mode http
1519 transparent
1520 cookie SERVERID
1521 server server01 192.168.1.1:80
1522 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001523
1524 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1525 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001526
willy tarreaua41a8b42005-12-17 14:02:24 +01001527Remarque :
1528----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001529Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1530adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1531d'une même adresse avec une même instance et sans utiliser directement le mode
1532transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001533
1534Exemple :
1535---------
1536 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001537 mode tcp
1538 server server01 192.168.1.1 check port 60000
1539 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001540
1541 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1542 -j REDIRECT --to-ports 65000
1543
willy tarreau0174f312005-12-18 01:02:42 +01001544
15454.1.2) Choix d'une adresse source par serveur
1546---------------------------------------------------
1547Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1548IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1549backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1550pour joindre le même serveur. C'est également utilisable pour faciliter une
1551répartition de charge selon l'adresse IP source pour des connexions sortantes.
1552Bien entendu, la même adresse est utilisée pour les health-checks.
1553
1554Exemple :
1555---------
1556 # utiliser une adresse particulière pour joindre les 2 serveur
1557 listen http_proxy 0.0.0.0:65000
1558 mode http
1559 balance roundrobin
1560 server server01 192.168.1.1:80 source 192.168.2.13
1561 server server02 192.168.1.2:80 source 192.168.2.13
1562
1563Exemple :
1564---------
1565 # utiliser une adresse particulière pour joindre chaque serveur
1566 listen http_proxy 0.0.0.0:65000
1567 mode http
1568 balance roundrobin
1569 server server01 192.168.1.1:80 source 192.168.1.1
1570 server server02 192.168.2.1:80 source 192.168.2.1
1571
1572Exemple :
1573---------
1574 # faire une répartition d'adresse sources pour joindre le même proxy à
1575 # travers deux liens WAN
1576 listen http_proxy 0.0.0.0:65000
1577 mode http
1578 balance roundrobin
1579 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1580 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1581
1582Exemple :
1583---------
1584 # forcer une connexion TCP à s'attacher à un port particulier
1585 listen http_proxy 0.0.0.0:2000
1586 mode tcp
1587 balance roundrobin
1588 server srv1 192.168.1.1:80 source 192.168.2.1:20
1589 server srv2 192.168.1.2:80 source 192.168.2.1:20
1590
willy tarreaub952e1d2005-12-18 01:31:20 +010015914.1.3) Maintien de session TCP (keep-alive)
1592-------------------------------------------
1593Avec la version 1.2.7, il devient possible d'activer le maintien de session
1594TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1595d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1596externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1597aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1598time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1599positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1600vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1601pour activer le maintien de session TCP :
1602
1603 option tcpka # active le keep-alive côté client et côté serveur
1604 option clitcpka # active le keep-alive côté client
1605 option srvtcpka # active le keep-alive côté serveur
1606
Alexandre Cassen87ea5482007-10-11 20:48:58 +020016074.1.4) Rémanence des données TCP (lingering)
1608--------------------------------------------
1609Il est possible de désactiver la conservation de données non acquittées par un
1610client à la fin d'une session. Cela peut parfois s'avérer nécessaire lorsque
1611haproxy est utilisé en face d'un grand nombre de clients non fiables et qu'un
1612nombre élevé de sockets en état FIN_WAIT est observé sur la machine. L'option
1613peut être utilisée dans un frontend pour ajuster les connexions vers les
1614clients, et dans un backend pour ajuster les connexions vers les serveurs :
1615
1616 option nolinger # désactive la conservation de données
1617
willy tarreau0f7af912005-12-17 12:21:26 +01001618
willy tarreauc29948c2005-12-17 13:10:27 +010016194.2) Journalisation des connexions
1620----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001621
1622L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1623Il fournit probablement le plus fin niveau d'information disponible pour un
1624tel outil, ce qui est très important pour les diagnostics en environnements
1625complexes. En standard, les informations journalisées incluent le port client,
1626les chronométrages des états TCP/HTTP, des états de session précis au moment de
1627la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1628trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1629arbitraires.
1630
1631Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1632transparence sur les problèmes rencontrés, à la fois internes et externes, et
1633il est possible d'envoyer les logs vers des serveurs différents en même temps
1634avec des niveaux de filtrage différents :
1635
1636 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1637 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1638 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1639 - activité par instance (connexions clients), aussi bien lors de leur
1640 établissement qu'à leur terminaison.
1641
1642La possibilité de distribuer différents niveaux de logs à différents serveurs
1643permet à plusieurs équipes de production d'intéragir et de corriger leurs
1644problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1645occasionnellement les erreurs système, pendant que l'équipe application
1646surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1647que l'équipe sécurité analyse l'activité en différé d'une heure.
1648
1649
willy tarreauc1cae632005-12-17 14:12:23 +010016504.2.1) Niveaux de log
1651---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001652Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1653détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1654source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001655la requête HTTP, le code de retour, la quantité de données transmises, et même
1656dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1657Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1658la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001659est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001660
willy tarreau8337c6b2005-12-17 13:41:01 +01001661 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1662 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001663ou
1664 log global
1665
1666Remarque :
1667----------
1668La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1669paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001670
1671Exemple :
1672---------
1673 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001674 mode http
1675 log 192.168.2.200 local3
1676 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001677
willy tarreauc1cae632005-12-17 14:12:23 +010016784.2.2) Format des logs
1679----------------------
1680Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1681de la session entre le client et le relais. En précisant l'option 'tcplog',
1682la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1683sur son état lors de la déconnexion, ainsi que le temps de connexion et la
willy tarreau532bb552006-05-13 18:40:37 +02001684durée totale de la session. Le nombre de sessions restantes après la
1685déconnexion est également indiqué (pour le serveur, l'instance et le process).
willy tarreauc1cae632005-12-17 14:12:23 +01001686
willy tarreauc5f73ed2005-12-18 01:26:38 +01001687Exemple de journalisation TCP :
1688-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001689 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001690 mode tcp
1691 option tcplog
1692 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001693
willy tarreau532bb552006-05-13 18:40:37 +02001694>>> 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 +01001695
willy tarreau532bb552006-05-13 18:40:37 +02001696 Champ Format / Description Exemple
1697
1698 1 nom_processus '[' pid ']:' haproxy[18989]:
1699 2 ip_client ':' port_client 127.0.0.1:34550
1700 3 '[' date ']' [15/Oct/2003:15:24:28]
1701 4 nom_instance relais-tcp
1702 5 nom_serveur Srv1
1703 6 temps_file '/' temps_connect '/' temps_total 0/0/5007
1704 7 octets lus 0
1705 8 etat_terminaison --
1706 9 conn_srv '/' conns_inst '/' conns_processus 1/1/1
1707 10 position en file d'attente srv '/' globale 0/0
willy tarreau982249e2005-12-18 00:57:06 +01001708
willy tarreauc1cae632005-12-17 14:12:23 +01001709Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1710notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1711surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1712les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1713ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1714(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001715
willy tarreauc5f73ed2005-12-18 01:26:38 +01001716Exemple de journalisation HTTP :
1717--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001718 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001719 mode http
1720 option httplog
1721 option dontlognull
1722 log 192.168.2.200 local3
1723
willy tarreau532bb552006-05-13 18:40:37 +02001724>>> 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 +01001725
1726Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001727
willy tarreau532bb552006-05-13 18:40:37 +02001728 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 +01001729
willy tarreau532bb552006-05-13 18:40:37 +02001730 Champ Format / Description Exemple
1731
1732 1 nom_processus '[' pid ']:' haproxy[18989]:
1733 2 ip_client ':' port_client 10.0.0.1:34552
1734 3 '[' date ']' [15/Oct/2003:15:26:31]
1735 4 nom_instance relais-http
1736 5 nom_serveur Srv1
1737 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt 3183/-1/-1/-1/11215
1738 7 Code_retour_HTTP 503
1739 8 octets lus 0
1740 9 cookies_requête_capturés -
1741 10 cookies_reponse_capturés -
1742 11 etat_terminaison SC--
1743 12 conns_srv '/' conns_inst '/' conns_processus 137/202/205
1744 13 position file serveur '/' globale 0/0
1745 14 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1746 15 '{' entetes_reponse_capturés '}' {}
1747 16 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001748
1749Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1750 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001751
1752Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1753de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1754Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001755la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1756tôt possible, c'est à dire juste avant que ne débutent les transferts de
1757données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1758de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001759traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1760représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001761
willy tarreau64a3cc32005-12-18 01:13:11 +01001762Afin d'éviter toute confusion avec les logs normaux, le temps total de
1763transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001764rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001765
1766Exemple :
1767---------
1768
1769 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001770 mode http
1771 option httplog
1772 option dontlognull
1773 option logasap
1774 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001775
willy tarreauc5f73ed2005-12-18 01:26:38 +01001776>>> 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 +01001777
1778
willy tarreauc1cae632005-12-17 14:12:23 +010017794.2.3) Chronométrage des événements
1780-----------------------------------
1781Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1782événements sont d'une très grande utilité. Tous les temps sont mesurés en
1783millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
willy tarreau532bb552006-05-13 18:40:37 +02001784la forme Tq/Tw/Tc/Tr/Tt :
willy tarreauc1cae632005-12-17 14:12:23 +01001785
1786 - Tq: temps total de réception de la requête HTTP de la part du client.
1787 C'est le temps qui s'est écoulé entre le moment où le client a établi
1788 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1789 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1790 que la requête complète n'a jamais été reçue.
1791
willy tarreau532bb552006-05-13 18:40:37 +02001792 - Tw: temps total passé dans les files d'attente avant d'obtenir une place
1793 vers un serveur. Ceci tient compte à la fois de la file d'attente globale
1794 et de celle du serveur, et dépend du nombre de requêtes dans la file et du
1795 temps nécessaire au serveur pour compléter les sessions précédentes. La
1796 valeur '-1' indique que la requête a été détruite avant d'atteindre une
1797 file.
1798
willy tarreauc1cae632005-12-17 14:12:23 +01001799 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1800 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1801 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1802 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1803 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1804 vers le serveur.
1805
1806 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001807 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001808 la connexion. Ca représente exactement le temps de traitement de la
1809 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001810 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001811
1812 - Tt: durée de vie totale de la session, entre le moment où la demande de
1813 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001814 refermée aux deux extrémités (client et serveur). La signification change
1815 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
willy tarreau532bb552006-05-13 18:40:37 +02001816 uniquement à (Tq + Tw + Tc + Tr), et se trouve préfixé d'un signe '+'. On
1817 peut donc déduire Td, le temps de transfert des données, en excluant les
1818 autres temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001819
willy tarreau532bb552006-05-13 18:40:37 +02001820 Td = Tt - (Tq + Tw + Tc + Tr)
willy tarreauc1cae632005-12-17 14:12:23 +01001821
1822 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1823
willy tarreau532bb552006-05-13 18:40:37 +02001824En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
willy tarreauc1cae632005-12-17 14:12:23 +01001825rapportés.
1826
1827Ces temps fournissent de précieux renseignement sur des causes probables de
1828problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1829de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1830de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1831problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1832valeur de time-out dans la configuration, c'est souvent qu'une session a été
1833abandonnée sur expiration d'un time-out.
1834
1835Cas les plus fréquents :
1836
1837 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1838 le client et le relais.
1839 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1840 le relais et le serveur durant la phase de connexion. Cet indicateur
1841 devrait normalement toujours être très bas (moins de quelques dizaines).
1842 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1843 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1844 de pertes entre le relais et le serveur.
1845 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1846 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1847 session est maintenue après la fin des échanges. Voir plus loin pour
1848 savoir comment désactiver le keep-alive HTTP.
1849
1850Autres cas ('xx' représentant une valeur quelconque à ignorer) :
willy tarreau532bb552006-05-13 18:40:37 +02001851 -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 +01001852 a refermé sa connexion sans compléter la requête.
willy tarreau532bb552006-05-13 18:40:37 +02001853 Tq/-1/xx/xx/Tt: Il n'était pas possible de traiter la request, probablement
1854 parce que tous les serveurs étaient hors d'usage.
1855 Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'établir vers le serveur (refus ou
1856 time-out au bout de Tt-(Tq+Tw) ms).
1857 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 +01001858 les temps ou bien a refermé sa connexion trop tôt, au bout
willy tarreau532bb552006-05-13 18:40:37 +02001859 de Tt-(Tq+Tw+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001860
18614.2.4) Conditions de déconnexion
1862--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001863Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1864le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1865un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1866une signification précise :
1867
1868 - sur le premier caractère, un code précisant le premier événement qui a causé
1869 la terminaison de la session :
1870
1871 C : fermeture inattendue de la session TCP de la part du client.
1872
1873 S : fermeture inattendue de la session TCP de la part du serveur, ou
1874 refus explicite de connexion de la part de ce dernier.
1875
1876 P : terminaison prématurée des sessions par le proxy, pour cause
1877 d'imposition d'une limite sur le nombre de connexions, pour cause
1878 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1879 sécurité a détecté et bloqué une anomalie dans la réponse du
1880 serveur qui aurait pu causer une fuite d'informations (par exemple,
1881 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001882
willy tarreauc5f73ed2005-12-18 01:26:38 +01001883 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1884 source, ...). Généralement, cela arrive au cours de l'établissement
1885 d'une connexion, et les logs système doivent contenir une copie de
1886 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001887
willy tarreauc5f73ed2005-12-18 01:26:38 +01001888 I : une erreur interne a été identifiée par le proxy à la suite d'un
1889 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1890 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001891
willy tarreauc5f73ed2005-12-18 01:26:38 +01001892 c : le délai maximal d'attente du client a expiré (clitimeout).
1893
1894 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1895
1896 - : terminaison normale de session.
1897
1898 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1899 la fermeture :
1900
1901 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1902 été transmis au serveur.
1903
willy tarreau532bb552006-05-13 18:40:37 +02001904 Q : attente en file d'attente (QUEUE) d'une place pour avoir une
1905 connexion vers un serveur. Ne peut apparaître que sur un serveur
1906 possédant un paramètre 'maxconn'. Aucune connexion n'a été envoyée
1907 au serveur.
1908
willy tarreauc5f73ed2005-12-18 01:26:38 +01001909 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1910 serveur peut au plus avoir vu la tentative de connexion, mais
1911 aucune donnée n'a été échangée.
1912
1913 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1914
1915 D : transfert des DONNEES du serveur vers le client.
1916
1917 L : transfert des dernières ("LAST") données du proxy vers le client,
1918 alors que le serveur a déjà fini.
1919
Willy Tarreau2272dc12006-09-03 10:19:38 +02001920 T : requête bloquée en mode "tarpit" par le proxy. Elle a été maintenue
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001921 ouverte vers le client pendant toute la durée du contimeout ou
1922 jusqu'à l'abandon de la part du client.
Willy Tarreau2272dc12006-09-03 10:19:38 +02001923
willy tarreauc5f73ed2005-12-18 01:26:38 +01001924 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001925
1926 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001927 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001928
willy tarreauc5f73ed2005-12-18 01:26:38 +01001929 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1930 cas sur les NOUVELLES connexions clients.
1931
1932 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1933 serveur connu. Ceci peut être dû à un changement de configuration
1934 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1935 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001936
willy tarreauc5f73ed2005-12-18 01:26:38 +01001937 D : le client a présenté un cookie correspondant à un serveur hors
1938 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1939 un autre serveur ou a tout de même tenté de se connecter sur celui
1940 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001941
willy tarreauc5f73ed2005-12-18 01:26:38 +01001942 V : le client a présenté un cookie VALIDE et a pu se connecter au
1943 serveur correspondant.
1944
1945 - : non appliquable (pas de cookie positionné dans la configuration).
1946
1947 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1948 persistence retrourné par le serveur (uniquement en mode HTTP) :
1949
1950 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1951 n'a été inséré.
1952
1953 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1954 proxy en a INSERE un.
1955
willy tarreau197e8ec2005-12-17 14:10:59 +01001956 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001957 tel quel ("PASSIF").
1958
1959 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1960
1961 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1962 ne pas être retourné au client.
1963
1964 - : non appliquable
1965
1966
1967La combinaison des deux premiers indicateurs fournit une grande quantitié
1968d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1969peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1970des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001971
willy tarreauc5f73ed2005-12-18 01:26:38 +01001972Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1973
1974 Indic Raison
1975 CR Le client a abandonné avant d'émettre une requête complète. Il est
1976 très probable que la requête ait été tapée à la main dans un client
1977 telnet et abortée trop tôt.
1978
1979 cR Le temps imparti au client a expiré avant réception d'une requête
1980 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1981 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1982 transporter des paquets entiers, ou par des clients qui énvoient des
1983 requêtes à la main et ne tapent pas assez vite.
1984
1985 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1986 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1987 être la couche réseau qui indique au proxy que le serveur n'est pas
1988 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1989
1990 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1991
1992 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1993 nombre de connexions a atteint la limite 'maxconn' (global ou de
1994 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1995 augmenté, tout comme le paramètre 'maxconn' global.
1996
1997 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1998 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1999 diront précisément ce qui manquait. Dans tous les cas, le seul remède
2000 consiste à affiner le paramétrage système.
2001
2002 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
2003 est parfois causé par un paramètre TCP MSS trop élevé sur le client
2004 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
2005 paquets entiers.
2006
willy tarreau078c79a2006-05-13 12:23:58 +02002007 CH Le client a abandonné alors qu'il attendait un début de réponse de la
2008 part du serveur. Cela peut être causé par le serveur qui mettait trop
2009 de temps à répondre, ou par un client cliquant précipitamment sur le
2010 bouton 'Stop'.
2011
2012 CQ Le client a abandonné alors que sa session était mise en file
2013 d'attente pour obtenir un serveur avec suffisamment de connexions
2014 libres pour l'accepter. Cela signifie soit que l'ensemble des
2015 serveurs étaient saturés, soit que le serveur assigné a mis trop de
2016 temps à répondre.
2017
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002018 CT Le client a abandonné alors que sa session était bloquée en mode
2019 tarpit.
2020
willy tarreau078c79a2006-05-13 12:23:58 +02002021 sQ La session a attendu trop longtemps en file d'attente et a été
2022 expirée.
2023
willy tarreauc5f73ed2005-12-18 01:26:38 +01002024 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
2025 en-têtes. En général, cela indique qu'il a crashé.
2026
2027 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
2028 des transactions trop longues, probablement causées par un back-end
2029 saturé. Les seules solutions sont de corriger le problème sur
2030 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
2031 des attentes plus longues au risque que les clients abandonnent à
2032 leur tour, ou bien d'ajouter des serveurs.
2033
2034 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
2035 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
2036 soit à cause d'une requête validant un filtre d'interdiction, auquel
2037 cas le proxy a renvoyé une erreur HTTP 403.
2038
2039 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
2040 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
2041 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
2042 renvoyée au client.
2043
Willy Tarreau2272dc12006-09-03 10:19:38 +02002044 PT Le proxy a bloqué une requête du client et a maintenu sa connection
2045 ouverte avant de lui retourner une erreur "500 server error". Rien
2046 n'a été envoyé au serveur.
2047
willy tarreauc5f73ed2005-12-18 01:26:38 +01002048 cD Le client n'a pas lu de données pendant le temps qui lui était
2049 imparti. Ceci est souvent causé par des problèmes réseau côté client.
2050
2051 CD Le client a aborté sa connection de manière inattendue pendant le
2052 transfert des données. Ceci est provoqué soit par le crash d'un
2053 navigateur, ou par une session en HTTP keep-alive entre le serveur
2054 et le client terminée en premier par le client.
2055
2056 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
2057 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
2058 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
2059 situés entre le proxy et le serveur.
2060
20614.2.5) Caractères non-imprimables
2062---------------------------------
2063Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
2064tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
2065hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
2066dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
2067caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
2068est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
2069les en-têtes.
2070
20714.2.6) Capture d'en-têtes HTTP et de cookies
2072--------------------------------------------
2073La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
2074capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
2075
2076Les captures de cookies facilitent le suivi et la reconstitution d'une session
2077utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01002078
2079 capture cookie <préfixe_cookie> len <longueur_capture>
2080
willy tarreauc5f73ed2005-12-18 01:26:38 +01002081Ceci activera la capture de cookies à la fois dans les requêtes et dans les
2082réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
2083bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
2084nouveau cookie.
2085
willy tarreau8337c6b2005-12-17 13:41:01 +01002086Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
2087transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
2088caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
2089le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
2090place dans les logs.
2091
2092Exemples :
2093----------
2094 # capture du premier cookie dont le nom commence par "ASPSESSION"
2095 capture cookie ASPSESSION len 32
2096
2097 # capture du premier cookie dont le nom est exactement "vgnvisitor"
2098 capture cookie vgnvisitor= len 32
2099
willy tarreau036e1ce2005-12-17 13:46:33 +01002100Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01002101positionné par le serveur, précédé du cookie positionné par le client. Chacun
2102de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01002103par le client ou le serveur, ou lorsque l'option est désactivée..
2104
2105Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
2106pour suivre un identifiant de requête globalement unique positionné par un
2107autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
2108de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
2109peut chercher des informations relatives à la longueur annoncée de la réponse,
2110le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
2111de redirection. Tout comme pour les captures de cookies, il est possible
2112d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
2113la suivante :
2114
2115 capture request header <nom> len <longueur max>
2116 capture response header <nom> len <longueur max>
2117
2118Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01002119
willy tarreauc5f73ed2005-12-18 01:26:38 +01002120Exemples:
2121---------
2122 # conserver le nom du serveur virtuel accédé par le client
2123 capture request header Host len 20
2124 # noter la longueur des données envoyées dans un POST
2125 capture request header Content-Length len 10
2126
2127 # noter le fonctionnement attendu du cache par le serveur
2128 capture response header Cache-Control len 8
2129 # noter l'URL de redirection
2130 capture response header Location len 20
2131
2132Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
2133fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
2134regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
2135chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
2136réponse sont présentés de la même manière, mais après un espace suivant le bloc
2137d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
2138
2139 Config:
2140
2141 capture request header Host len 20
2142 capture request header Content-Length len 10
2143 capture request header Referer len 20
2144 capture response header Server len 20
2145 capture response header Content-Length len 10
2146 capture response header Cache-Control len 8
2147 capture response header Via len 20
2148 capture response header Location len 20
2149
2150 Log :
2151
willy tarreau532bb552006-05-13 18:40:37 +02002152 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/"
2153 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"
2154 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 +01002155
21564.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01002157-----------------------
willy tarreau532bb552006-05-13 18:40:37 +02002158- 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 +01002159 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
2160 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01002161
willy tarreau532bb552006-05-13 18:40:37 +02002162- 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"
2163 => Idem, mais la requête a été mise en attente dans la file globale derrière
2164 9 autres requêtes déjà présentes, et y a attendu 1230 ms.
2165
2166- 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 +01002167 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
2168 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 +01002169 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 +01002170 total entre l'accept() et le premier octet de donnée est de 30 ms.
2171
willy tarreau532bb552006-05-13 18:40:37 +02002172- 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 +01002173 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
2174 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
2175 d'informations risquant d'être cachées. Dans ce cas, la réponse est
2176 remplacée par '502 bad gateway'.
2177
willy tarreau532bb552006-05-13 18:40:37 +02002178- 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 +01002179 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01002180 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01002181 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01002182
willy tarreau532bb552006-05-13 18:40:37 +02002183- 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 +01002184 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01002185 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01002186 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
2187 pu renvoyer un message 408 au client.
2188
willy tarreauc5f73ed2005-12-18 01:26:38 +01002189- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
2190 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
2191 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01002192
willy tarreau532bb552006-05-13 18:40:37 +02002193- 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 +01002194 => La requête client met 3s à entrer (peut-être un problème réseau), et la
2195 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreau532bb552006-05-13 18:40:37 +02002196 secondes (retries 3 dans la conf), puis un code 503 est retourné au
2197 client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
2198 instance, et 205 sur l'ensemble des instances pour ce processus. Il est
2199 possible que le serveur ait refusé la connexion parce qu'il y en avait
2200 déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01002201
willy tarreau4302f492005-12-18 01:00:37 +01002202
willy tarreauc5f73ed2005-12-18 01:26:38 +010022034.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01002204----------------------------------
2205En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
2206requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01002207possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
2208de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01002209connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
2210comme faisant partie des échanges de données consécutifs à la première requête.
2211Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01002212
2213La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01002214 reqadd <string> pour ajouter un en-tête dans la requête
2215 reqrep <search> <replace> pour modifier la requête
2216 reqirep <search> <replace> idem sans distinction majuscules/minuscules
2217 reqdel <search> pour supprimer un en-tête dans la requête
2218 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002219 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01002220 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002221 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01002222 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002223 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01002224 reqipass <search> idem sans distinction majuscules/minuscules
Willy Tarreau2272dc12006-09-03 10:19:38 +02002225 reqtarpit <search> bloquer et maintenir une request validant <search>
2226 reqitarpit <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002227
willy tarreau036e1ce2005-12-17 13:46:33 +01002228 rspadd <string> pour ajouter un en-tête dans la réponse
2229 rsprep <search> <replace> pour modifier la réponse
2230 rspirep <search> <replace> idem sans distinction majuscules/minuscules
2231 rspdel <search> pour supprimer un en-tête dans la réponse
2232 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01002233 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01002234 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01002235 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002236
willy tarreau0f7af912005-12-17 12:21:26 +01002237
willy tarreau036e1ce2005-12-17 13:46:33 +01002238<search> est une expression régulière compatible POSIX regexp supportant le
2239groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
2240doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
2241chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
2242backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01002243
2244 \t pour une tabulation
2245 \r pour un retour charriot
2246 \n pour un saut de ligne
2247 \ pour différencier un espace d'un séparateur
2248 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01002249 \\ pour utiliser un backslash dans la regex
2250 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01002251 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01002252
willy tarreau0f7af912005-12-17 12:21:26 +01002253
willy tarreau5cbea6f2005-12-17 12:48:26 +01002254<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
2255Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
2256groupe délimité par des parenthèses dans l'expression régulière, par sa
Willy Tarreau2272dc12006-09-03 10:19:38 +02002257position numérale. Les positions vont de 0 à 9, et sont codées par un '\'
2258suivi du chiffre désiré (0 désignant la ligne complète). Il est également
2259possible d'insérer un caractère non imprimable (utile pour le saut de ligne)
2260inscrivant '\x' suivi du code hexadécimal de ce caractère (comme en C).
willy tarreau5cbea6f2005-12-17 12:48:26 +01002261
2262<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01002263dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002264
2265Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01002266-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002267 - 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 +01002268 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002269 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
2270 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
2271 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01002272 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
2273 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
2274 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01002275 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01002276 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
2277 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
Willy Tarreau2272dc12006-09-03 10:19:38 +02002278 - une requête bloquée par 'reqtarpit' sera maintenue pendant une durée égale
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002279 au paramètre 'contimeout', ou jusqu'à l'abandon du client. Rien ne sera
2280 envoyé au serveur. Lorsque le temps alloué expire, le proxy répondra avec
2281 une réponse "500 server error" de sorte que l'attaquant ne suspecte pas
2282 qu'il ait été bloqué. Les logs rapporteront aussi ce code 500, mais les
2283 flags de terminaison indiqueront "PT".
willy tarreau0f7af912005-12-17 12:21:26 +01002284
2285Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01002286----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01002287 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01002288
willy tarreauc5f73ed2005-12-18 01:26:38 +01002289 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
2290 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
2291 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002292
willy tarreauc5f73ed2005-12-18 01:26:38 +01002293 # force proxy connections to close
2294 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
2295 # rewrite locations
2296 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002297
willy tarreauc5f73ed2005-12-18 01:26:38 +01002298 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01002299
willy tarreau197e8ec2005-12-17 14:10:59 +01002300 # Every header should end with a colon followed by one space.
2301 reqideny ^[^:\ ]*[\ ]*$
2302
2303 # block Apache chunk exploit
2304 reqideny ^Transfer-Encoding:[\ ]*chunked
2305 reqideny ^Host:\ apache-
2306
2307 # block annoying worms that fill the logs...
2308 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
2309 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
2310 reqideny ^[^:\ ]*\ .*<script
2311 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
2312
Willy Tarreau2272dc12006-09-03 10:19:38 +02002313 # tarpit attacks on the login page.
2314 reqtarpit ^[^:\ ]*\ .*\.php?login=[^0-9]
2315
willy tarreau197e8ec2005-12-17 14:10:59 +01002316 # allow other syntactically valid requests, and block any other method
2317 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
2318 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
2319 reqideny ^[^:\ ]*\
2320
2321 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01002322 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01002323
willy tarreauc5f73ed2005-12-18 01:26:38 +01002324 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01002325 rspidel ^Server:\
2326 rspadd Server:\ Formilux/0.1.8
2327
willy tarreau0f7af912005-12-17 12:21:26 +01002328
willy tarreau982249e2005-12-18 00:57:06 +01002329De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01002330'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002331connaître l'adresse IP du client initial. Depuis la version 1.3.8, il est
2332possible de préciser le mot-clé "except" suivi d'une adresse ou un réseau
2333IP source pour lequel l'entête ne sera pas ajouté. C'est très pratique dans le
2334cas où un autre reverse-proxy ajoutant déjà l'entête est installé sur la même
2335machine ou dans une DMZ connue. Le cas le plus fréquent est lié à l'utilisation
2336de stunnel en local.
willy tarreauc1cae632005-12-17 14:12:23 +01002337
willy tarreau982249e2005-12-18 00:57:06 +01002338Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01002339en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01002340Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
2341méthode impliquant 4 règles.
2342
willy tarreauc1cae632005-12-17 14:12:23 +01002343Exemple :
2344---------
2345 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002346 mode http
2347 log global
2348 option httplog
2349 option dontlognull
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002350 option forwardfor except 127.0.0.1/8
willy tarreauc5f73ed2005-12-18 01:26:38 +01002351 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01002352
Willy TARREAU767ba712006-03-01 22:40:50 +01002353Notons que certains serveurs HTTP ne referment pas nécessairement la session
2354TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
2355ce qui se traduit par des grands nombres de sessions établies et des temps
2356globaux très longs sur les requêtes. Pour contourner ce problème, la version
23571.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
2358vers le serveur dès qu'il commence à répondre et seulement si le tampon de
2359requête est vide. Attention toutefois à ne PAS utiliser cette option si des
2360méthodes CONNECT sont attendues entre le client et le serveur. L'option
2361'forceclose' implique l'option 'httpclose'.
2362
2363Exemple :
2364---------
2365 listen http_proxy 0.0.0.0:80
2366 mode http
2367 log global
2368 option httplog
2369 option dontlognull
2370 option forwardfor
2371 option forceclose
2372
2373
willy tarreauc29948c2005-12-17 13:10:27 +010023744.4) Répartition avec persistence
2375---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002376La combinaison de l'insertion de cookie avec la répartition de charge interne
2377permet d'assurer une persistence dans les sessions HTTP d'une manière
2378pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01002379 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01002380 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01002381 - insérer un cookie dans les réponses issues d'une répartition uniquement,
2382 et faire en sorte que des caches ne mémorisent pas ce cookie.
2383 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002384
2385Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01002386---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002387 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002388 mode http
2389 cookie SERVERID insert nocache indirect
2390 balance roundrobin
2391 server srv1 192.168.1.1:80 cookie server01 check
2392 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01002393
willy tarreau0174f312005-12-18 01:02:42 +01002394L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
2395cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
2396Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
2397client et le serveur de travailler en mode "keep-alive" afin que le proxy
2398puisse corriger le nom du cookie dans toutes les futures requêtes.
2399
2400 listen application 0.0.0.0:80
2401 mode http
2402 cookie JSESSIONID prefix
2403 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002404 server srv1 192.168.1.1:80 cookie srv1 check
2405 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002406 option httpclose
2407
2408
willy tarreau982249e2005-12-18 00:57:06 +010024094.5) Protection contre les fuites d'informations du serveur
2410-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002411Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002412créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002413'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2414un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2415activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002416 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002417 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002418 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002419 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002420 un en-tête 'Cache-control: public' ;
2421 - celles qui ont un en-tête 'Pragma: no-cache' ;
2422 - celles qui ont un en-tête 'Cache-control: private' ;
2423 - celles qui ont un en-tête 'Cache-control: no-store' ;
2424 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2425 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2426 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2427 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2428 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002429 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002430
willy tarreau982249e2005-12-18 00:57:06 +01002431Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2432même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2433message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2434dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002435en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002436l'administrateur sache qu'il y a une action correctrice à entreprendre.
2437
24384.6) Personalisation des erreurs
2439--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002440Certaines situations conduisent à retourner une erreur HTTP au client :
2441 - requête invalide ou trop longue => code HTTP 400
2442 - requête mettant trop de temps à venir => code HTTP 408
2443 - requête interdite (bloquée par un reqideny) => code HTTP 403
2444 - erreur interne du proxy => code HTTP 500
2445 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2446 - aucun serveur disponible pour cette requête => code HTTP 503
2447 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2448
2449Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2450Cependant, en fonction du type de clientèle, on peut préférer retourner des
Willy Tarreau3f49b302007-06-11 00:29:26 +02002451pages personnalisées. Ceci est possible de deux manières, l'une reposant sur
2452une redirection vers un serveur connu, et l'autre consistant à retourner un
2453fichier local.
2454
24554.6.1) Redirection
2456------------------
2457Une redirection d'erreur est assurée par le biais de la commande "errorloc" :
willy tarreau8337c6b2005-12-17 13:41:01 +01002458
2459 errorloc <code_HTTP> <location>
2460
2461Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2462le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2463d'une page précisée dans <location>. Cette adresse peut être relative au site,
2464ou absolue. Comme cette réponse est traîtée par le navigateur du client
2465lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2466
2467Exemple :
2468---------
2469 listen application 0.0.0.0:80
2470 errorloc 400 /badrequest.html
2471 errorloc 403 /forbidden.html
2472 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002473 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002474 errorloc 502 http://192.168.114.58/error50x.html
2475 errorloc 503 http://192.168.114.58/error50x.html
2476 errorloc 504 http://192.168.114.58/error50x.html
2477
willy tarreauc1f47532005-12-18 01:08:26 +01002478Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2479accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2480problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2481régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2482dans le champ Location avec la méthode GET uniquement. Seulement, certains
2483navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2484plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2485devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002486l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2487visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002488
2489Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2490utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2491dès que vous savez que vos clients supportent le code de retour HTTP 303.
2492
Willy Tarreau3f49b302007-06-11 00:29:26 +020024934.6.2) Fichiers locaux
2494----------------------
2495Parfois il est souhaitable de changer l'erreur retournée sans recourir à des
2496redirections. La seconde méthode consiste à charger des fichiers locaux lors
2497du démarrage et à les envoyer en guise de pur contenu HTTP en cas d'erreur.
2498C'est ce que fait le mot clé 'errorfile'.
2499
2500Attention, il y a des pièges à prendre en compte :
2501 - les fichiers sont chargés durant l'analyse de la configuration, avant de
2502 faire le chroot(). Donc ils sont relatifs au système de fichiers réel. Pour
2503 cette raison, il est recommandé de toujours passer un chemin absolu vers ces
2504 fichiers.
2505
2506 - le contenu de ces fichiers n'est pas du HTML mais vraiment du protocole HTTP
2507 avec potentiellement un corps HTML. Donc la première ligne et les en-têtes
2508 sont obligatoires. Idéalement, chaque ligne dans la partie HTTP devrait se
2509 terminer par un CR-LF pour un maximum de compatibilité.
2510
2511 - les réponses sont limitées à une taille de buffer (BUFSIZE), généralement 8
2512 ou 16 ko.
2513
2514 - les réponses ne devraient pas inclure de références aux serveurs locaux,
2515 afin de ne pas risquer de créer des boucles infinies sur le navigateur dans
2516 le cas d'une panne locale.
2517
2518Exemple :
2519---------
2520 errorfile 400 /etc/haproxy/errorfiles/400badreq.http
2521 errorfile 403 /etc/haproxy/errorfiles/403forbid.http
2522 errorfile 503 /etc/haproxy/errorfiles/503sorry.http
2523
2524
willy tarreau982249e2005-12-18 00:57:06 +010025254.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002526--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002527Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2528évite de répéter des paramètres communs à toutes les instances, tels que les
2529timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002530
2531Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2532précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2533'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2534section implique une annulation de tous les paramètres par défaut positionnés
2535précédemment, dans le but de les remplacer.
2536
2537La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2538paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2539un commentaire en guise paramètre.
2540
willy tarreau982249e2005-12-18 00:57:06 +01002541Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2542positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002543 - log (le premier et le second)
2544 - mode { tcp, http, health }
2545 - balance { roundrobin }
2546 - disabled (pour désactiver toutes les instances qui suivent)
2547 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2548 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002549 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2550 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002551 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002552 - cookie, capture
2553 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002554
2555Ne sont pas supportés dans cette version, les adresses de dispatch et les
2556configurations de serveurs, ainsi que tous les filtres basés sur les
2557expressions régulières :
2558 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002559 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002560
2561Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2562positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2563défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2564paramètres par défaut avant la déclaration de l'instance.
2565
2566Exemples :
2567----------
2568 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002569 log global
2570 mode tcp
2571 balance roundrobin
2572 clitimeout 180000
2573 srvtimeout 180000
2574 contimeout 4000
2575 retries 3
2576 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002577
2578 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002579 server srv1 192.168.1.1 check port 6000 inter 10000
2580 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002581
2582 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002583 server srv1 192.168.2.1 check port 6000 inter 10000
2584 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002585
2586 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002587 log global
2588 mode http
2589 option httplog
2590 option forwardfor
2591 option dontlognull
2592 balance roundrobin
2593 clitimeout 20000
2594 srvtimeout 20000
2595 contimeout 4000
2596 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002597
2598 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002599 cookie SERVERID postonly insert indirect
2600 capture cookie userid= len 10
2601 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2602 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002603
2604 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002605 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002606
willy tarreau8f635a42006-05-21 23:05:54 +02002607
26084.8) Rapport d'état sous forme de page HTML
2609-------------------------------------------
2610Avec la version 1.2.14, il devient possible pour haproxy d'interceptre des
2611requêtes pour une URI particulière et de retourner un rapport complet d'état de
2612l'activité du proxy, et des statistiques sur les serveurs. Ceci est disponible
2613via le mot clé "stats" associé à n'importe laquelle de ces options :
2614
2615 - stats enable
2616 - stats uri <uri prefix>
2617 - stats realm <authentication realm>
2618 - stats auth <user:password>
2619 - stats scope <proxy_id> | '.'
2620
2621
2622Par défaut, le rapport est désactivé. Le fait de spécifier une des combinaision
2623ci-dessus active le rapport pour l'instance de proxy qui le référence. La
2624solution la plus simple est d'utiliser "stats enable" qui activera le rapport
2625avec les paramètres par défaut suivant :
2626
2627 - default URI : "/haproxy?stats" (CONFIG_STATS_DEFAULT_URI)
2628 - default auth : non spécifié (pas d'authentication)
2629 - default realm : "HAProxy Statistics" (CONFIG_STATS_DEFAULT_REALM)
2630 - default scope : non specifié (accès à toutes les instances)
2631
2632L'option "stats uri <uri_prefix>" permet d'intercepter un autre préfixe d'URI
2633que celui par défaut. Noter que n'importe quelle URI qui COMMENCE avec cette
2634chaîne sera validée. Par exemple, une instance pourrait être dédiée à la page
2635d'état seulement et répondre à toute URI.
2636
2637Example :
2638---------
2639 # intercepte n'importe quelle URI et retourne la page d'état.
2640 listen stats :8080
2641 mode http
2642 stats uri /
2643
2644
2645L'option "stats auth <user:password>" active l'authentification "Basic" et
2646ajoute un couple "user:password" valide à la liste des comptes autorisés.
2647L'utilisateur <user> et le mot de passe <password> doivent être précisés
2648en clair dans le fichier de configuration, et comme ceci est de
2649l'authentification HTTP "Basic", il faut être conscient qu'ils transitent en
2650clair sur le réseau, donc il ne faut pas utiliser de compte sensible. La liste
2651est illimitée dans le but de pouvoir fournir des accès facilement à des
2652développeurs ou à des clients.
2653
2654L'option "stats realm <realm>" définit le "domaine" ("realm") de validité du
2655mot de passe qui sera présenté dans la boîte de dialogue du navigateur
2656lorsqu'il demandera un compte utilisateur et un mot de passe. Il est important
2657de s'assurer que celui-ci soit différent de ceux utilisés par l'application,
2658autrement le navigateur tentera d'en utiliser un caché depuis l'application.
2659Noter que les espaces dans le nom de "realm" doivent être protégés par un
2660backslash ('\').
2661
2662L'option "stats scope <proxy_id>" limite la portée du rapport d'état. Par
2663défaut, toutes les instances proxy sont listées. Mais dans certaines
2664circonstances, il serait préférable de ne lister que certains proxies ou
2665simplement le proxy courant. C'est ce que fait cette option. Le nom spécial "."
2666(un simple point) référence le proxy courant. Cette option peut être répétée
2667autant de fois que nécessaire pour autoriser d'autres proxies, même pour des
2668noms référencés plus loin dans la configuration ou bien des noms qui n'existent
2669pas encore. Le nom précisé est celui qui apparait après le mot clé "listen".
2670
2671Exemple :
2672---------
2673 # simple application embarquant la page d'état authentifiée
2674 listen app1 192.168.1.100:80
2675 mode http
2676 option httpclose
2677 balance roundrobin
2678 cookie SERVERID postonly insert indirect
2679 server srv1 192.168.1.1:8080 cookie srv1 check inter 1000
2680 server srv1 192.168.1.2:8080 cookie srv2 check inter 1000
2681 stats uri /my_stats
2682 stats realm Statistics\ for\ MyApp1-2
2683 stats auth guest:guest
2684 stats auth admin:AdMiN123
2685 stats scope .
2686 stats scope app2
2687
2688 # simple application embarquant la page d'état sans authentification
2689 listen app2 192.168.2.100:80
2690 mode http
2691 option httpclose
2692 balance roundrobin
2693 cookie SERVERID postonly insert indirect
2694 server srv1 192.168.2.1:8080 cookie srv1 check inter 1000
2695 server srv1 192.168.2.2:8080 cookie srv2 check inter 1000
2696 stats uri /my_stats
2697 stats realm Statistics\ for\ MyApp2
2698 stats scope .
2699
2700 listen admin_page :8080
2701 mode http
2702 stats uri /my_stats
2703 stats realm Global\ statistics
2704 stats auth admin:AdMiN123
2705
2706Notes :
2707-------
2708 - les options "stats" peuvent aussi être spécifiées dans une section
2709 "defaults", auquel cas la même configuration exactement sera fournie à
2710 toutes les instances suivantes, d'où l'utilité du scope ".". Toutefois, si
2711 une instance redéfinit n'importe quel paramètre "stats", alors les défauts
2712 ne lui seront pas appliqués.
2713
2714 - l'authentification "Basic" est très simpliste et non sécurisée contre la
2715 capture réseau. Aucun mot de passe sensible ne doit être utilisé, et il
2716 est bon de savoir qu'il n'existe pas de moyen de le supprimer du navigateur
2717 après usage, donc il sera envoyé tel quel à l'application au cours des
2718 accès successifs.
2719
2720 - Il est très important de préciser l'option "httpclose", sinon le proxy ne
2721 sera pas en mesure de détecter les URI dans les sessions keep-alive
2722 maintenues entre le navigateur et les serveurs, donc les URI de stats
2723 seront transmises telles quelles aux serveurs comme si l'option n'était
2724 pas précisée.
2725
2726
Willy Tarreau726c2bf2007-05-09 01:31:45 +020027275) Listes d'accès
2728=================
2729
2730Avec la version 1.3.10, un nouveau concept de listes d'accès (ACL) a vu le
2731jour. Comme il n'était pas nécessaire de réinventer la roue, et du fait que
2732toutes les réflexions passées aboutissaient à des propositions non
2733satisfaisantes, il a finalement été décidé que quelque chose de proche de ce
2734que Squid offre serait un bon compromis entre une richesse fonctionnelle et une
2735facilité d'utilisation
2736
2737Le principe est très simple : les ACLs sont déclarées avec un nom, un test et
2738une liste de valeurs valides à tester. Des conditions sont appliquées sur
2739diverses actions, et ces conditions effectuent un ET logique entre les ACLs. La
2740condition n'est donc validée que si toutes les ACLs sont vraies.
2741
2742Il est également possible d'utiliser le mot réservé "OR" dans les conditions,
2743et il est possible pour une ACL d'être spécifiée plusieurs fois, même avec des
2744tests différents, auquel cas le premier test réussi validera l'ACL.
2745
Willy Tarreauae8b7962007-06-09 23:10:04 +02002746Au stade de la version 1.3.12, seuls les tests suivants ont été implémentés :
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002747
2748 Niveaux 3/4 :
2749 src <ipv4_address>[/mask] ... : match IPv4 source address
2750 dst <ipv4_address>[/mask] ... : match IPv4 destination address
Willy Tarreauae8b7962007-06-09 23:10:04 +02002751 src_port <range> ... : match source port range
2752 dst_port <range> ... : match destination port range
2753 dst_conn <range> ... : match #connections on frontend
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002754
2755 Niveau 7 :
2756 method <HTTP method> ... : match HTTP method
2757 req_ver <1.0|1.1> ... : match HTTP request version
2758 resp_ver <1.0|1.1> ... : match HTTP response version
Willy Tarreauae8b7962007-06-09 23:10:04 +02002759 status <range> ... : match HTTP response status code in range
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002760 url <string> ... : exact string match on URI
2761 url_reg <regex> ... : regex string match on URI
2762 url_beg <string> ... : true if URI begins with <string>
2763 url_end <string> ... : true if URI ends with <string>
2764 url_sub <string> ... : true if URI contains <string>
2765 url_dir <string> ... : true if URI contains <string> between slashes
2766 url_dom <string> ... : true if URI contains <string> between slashes or dots
2767
Willy Tarreauae8b7962007-06-09 23:10:04 +02002768Une plage ('range') est constituée d'un ou deux entiers qui peuvent être
2769préfixés d'un opérateur. La syntaxe est :
2770
2771 [<op>] <min>[:<max>]
2772
2773Avec <op> pouvant être :
2774 'eq' : la valeur doit égaler <min> ou être comprise entre <min> et <max>
2775 'le' : la valeur doit être inférieure ou égale à <min>
2776 'lt' : la valeur doit être strictement inférieure à <min>
2777 'ge' : la valeur doit être supérieure ou égale à <min>
2778 'gt' : la valeur doit être strictement supérieure à <min>
2779
2780Lorsqu'aucun opérateur n'est défini, 'eq' est employé. Noter que lorsqu'un
2781opérateur est spécifié, il s'applique à toutes les plages de valeurs suivantes
2782jusqu'à la fin de la ligne ou bien jusqu'à ce qu'un nouvel opérateur soit
2783précisé. Exemple :
2784
2785 acl status_error status 400:599
2786 acl saturated_frt dst_conn ge 1000
2787 acl invalid_ports src_port lt 512 ge 65535
2788
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002789D'autres tests arrivent (entêtes, cookies, heure, authentification), c'est
2790juste une question de temps. Il est aussi prévu de permettre de lire les
2791valeurs depuis un fichier, ainsi que d'ignorer la casse pour certains tests.
2792
2793La seule commande supportant les conditions d'ACL à ce jour est la nouvelle
2794commande "block" qui bloque une requête et retourne un statut 403 si sa
2795condition est validée (cas du "if") ou invalidée (cas du "unless").
2796
2797Exemple :
2798---------
2799
2800 acl options_uris url *
2801 acl meth_option method OPTIONS
2802 acl http_1.1 req_ver 1.1
2803 acl allowed_meth method GET HEAD POST OPTIONS CONNECT
2804 acl connect_meth method CONNECT
2805 acl proxy_url url_beg http://
2806
2807 # block if reserved URI "*" used with a method other than "OPTIONS"
2808 block if options_uris !meth_option
2809
2810 # block if the OPTIONS method is used with HTTP 1.0
2811 block if meth_option !http_1.1
2812
2813 # allow non-proxy url with anything but the CONNECT method
2814 block if !connect_meth !proxy_url
2815
2816 # block all unknown methods
2817 block unless allowed_meth
2818
2819Note: Cette documentation est embryonnaire mais doit permettre de démarrer et
2820surtout d'avancer sur le projet sans être trop ralenti par la documentation.
2821
2822
willy tarreaub719f002005-12-17 12:55:07 +01002823=======================
2824| Paramétrage système |
2825=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002826
2827Sous Linux 2.4
2828==============
2829
willy tarreaub719f002005-12-17 12:55:07 +01002830-- cut here --
2831#!/bin/sh
2832# set this to about 256/4M (16384 for 256M machine)
2833MAXFILES=16384
2834echo $MAXFILES > /proc/sys/fs/file-max
2835ulimit -n $MAXFILES
2836
2837if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002838 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002839fi
2840
2841if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002842 # 30 seconds for fin, 15 for time wait
2843 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2844 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2845 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2846 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002847fi
2848
willy tarreau0f7af912005-12-17 12:21:26 +01002849echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002850echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2851echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002852echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002853echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2854echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002855echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2856echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002857echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002858echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002859echo 0 > /proc/sys/net/ipv4/tcp_dsack
2860
2861# auto-tuned on 2.4
2862#echo 262143 > /proc/sys/net/core/rmem_max
2863#echo 262143 > /proc/sys/net/core/rmem_default
2864
2865echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2866echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2867
2868-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002869
willy tarreau197e8ec2005-12-17 14:10:59 +01002870Sous FreeBSD
2871============
2872
2873Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2874Clement Laforet <sheepkiller@cultdeadsheep.org>.
2875
2876Pour plus d'informations :
2877http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2878http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2879http://www.freshports.org/net/haproxy
2880
2881
willy tarreau0f7af912005-12-17 12:21:26 +01002882-- fin --