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