blob: 8e9bde90d1923670bf0dfb97e258ab84a024b482 [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 Tarreau01732802007-11-01 22:48:15 +0100997La version 1.3.14 a apporté une nouvelle méthode 'balance url_param'. Elle
998consiste à se baser sur un paramètre passé dans l'URL pour effectuer un hachage
999utilisé pour déterminer le serveur à utiliser. Ceci est principalement utile
1000pour des applications n'ayant pas une exigence stricte de persistance, mais
1001pour lesquelles elle procure un gain de performance notable dans des
1002environnements où il n'est pas toujours possible d'utiliser des cookies. En cas
1003d'absence du paramètre dans l'URL, alors une répartition de type 'round robin'
1004est effectuée.
1005
1006Example :
1007---------
1008
1009# hache le paramètre "basket_id" dans l'URL pour déterminer le serveur
1010
1011 listen http_proxy
1012 bind :3128
1013 mode http
1014 balance url_param basket_id
1015 server ebiz1 192.168.1.1
1016 server ebiz2 192.168.1.2
1017
willy tarreau0f7af912005-12-17 12:21:26 +01001018
willy tarreauc29948c2005-12-17 13:10:27 +010010193.1) Surveillance des serveurs
1020------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001021Il est possible de tester l'état des serveurs par établissement de connexion
1022TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
1023utilisé dans le processus de répartition de charge interne. Pour activer la
1024surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
1025Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
1026tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
1027paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
1028Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreau34f45302006-04-15 21:37:14 +02001029
willy tarreaue47c8d72005-12-17 12:55:52 +01001030 - inter : 2000
1031 - rise : 2
1032 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +01001033 - port : port de connexion du serveur
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001034 - addr : adresse de connexion du serveur (par defaut: adresse du serveur)
1035
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001036Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001037certains cas de pannes, des serveurs peuvent continuer à accepter les
1038connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
1039d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
1040et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
1041les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
1042contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
1043RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
10441.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
1045possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
1046l'avantage d'être facilement extractibles des logs, et de ne pas induire
1047d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
1048considérées valides, les autres (y compris non-réponses) aboutissent à un
1049échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
1050deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
1051"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
1052accepte donc 4 formes :
willy tarreau34f45302006-04-15 21:37:14 +02001053
willy tarreaueedaa9f2005-12-17 14:08:03 +01001054 - option httpchk -> OPTIONS / HTTP/1.0
1055 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
1056 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
1057 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreau34f45302006-04-15 21:37:14 +02001058
Willy Tarreauf3c69202006-07-09 16:42:34 +02001059HAProxy est souvent utilisé pour relayer divers protocoles reposant sur TCP,
1060tels que HTTPS, SMTP ou LDAP, le plus commun étant HTTPS. Un problème assez
1061couramment rencontré dans les data centers est le besoin de relayer du trafic
1062vers des serveurs lointains tout en maintenant la possibilité de basculer sur
1063un serveur de secours. Les tests purement TCP ne suffisent pas toujours dans
1064ces situations car l'on trouve souvent, dans la chaîne, des proxies, firewalls
1065ou répartiteurs de charge qui peuvent acquitter la connexion avant qu'elle
1066n'atteigne le serveur. La seule solution à ce problème est d'envoyer des tests
1067applicatifs. Comme la demande pour les tests HTTPS est élevée, ce test a été
1068implémenté en version 1.2.15 sur la base de messages SSLv3 CLIENT HELLO. Pour
1069l'activer, utiliser "option ssl-hello-chk". Ceci enverra des messages SSLv3
1070CLIENT HELLO aux serveurs, en annonçant un support pour la majorité des
1071algorithmes de chiffrement. Si en retour, le serveur envoie ce qui ressemble à
1072une réponse SSLv3 SERVER HELLO ou ALERT (refus des algorithmes), alors la
1073réponse sera considérée comme valide. Noter qu'Apache ne produit pas de log
1074lorsqu'il reçoit des messages HELLO, ce qui en fait un type de message
1075parfaitement adapté à ce besoin.
1076
Willy Tarreau23677902007-05-08 23:50:35 +02001077La version 1.3.10 est accompagnée d'un nouveau test d'état pour le SMTP. Par
1078défaut, il consiste à envoyer "HELO localhost" aux serveurs, et à attendre le
1079message "250" en retour. Notez qu'il peut aussi envoyer une requête plus
1080spécifique :
1081
1082 - option smtpchk -> envoie "HELO localhost"
1083 - option smtpchk EHLO mail.mydomain.com -> envoie ce message ESMTP
1084
willy tarreauc5f73ed2005-12-18 01:26:38 +01001085Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001086
willy tarreau8337c6b2005-12-17 13:41:01 +01001087Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
1088utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
1089ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
1090de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
1091les 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 +01001092de répartition de charge entre des serveurs de secours par défaut. A partir
1093de la version 1.2.9, il est possible de les utiliser simultanément grâce à
1094l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
1095d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
1096de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
1097définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
1098qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +01001099
willy tarreaua41a8b42005-12-17 14:02:24 +01001100Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
1101vers un port différent de celui de service. C'est nécessaire principalement
1102pour les configurations où le serveur n'a pas de port prédéfini, par exemple
1103lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001104le paramètre 'port' suivi du numéro de port devant répondre aux requêtes. Il
1105est possible d'envoyer les tests de fonctionnement vers une adresse différente
1106de celle de service. Cela permet d'utiliser, sur la machine faisant fonctionner
1107HAproxy, un démon permettant des tests specifiques ( REGEX sur un résultat et
1108basculement de plusieurs fermes en cas d'erreur sur l'une d'elles).
willy tarreaua41a8b42005-12-17 14:02:24 +01001109
willy tarreau64a3cc32005-12-18 01:13:11 +01001110Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
1111l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
1112SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
1113envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
1114elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
1115local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +01001116
willy tarreau982249e2005-12-18 00:57:06 +01001117Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
1118logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
1119afin de notifier l'administrateur qu'il faut prendre une action immédiate.
1120
willy tarreau0174f312005-12-18 01:02:42 +01001121Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
1122même valeur de cookie. C'est particulièrement utile en mode backup, pour
1123sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
1124oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
1125temporairement vers une page d'erreur en attendant le redémarrage d'une
1126application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
1127le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
1128chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
1129le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
1130pour plus d'informations.
1131
willy tarreauc29948c2005-12-17 13:10:27 +01001132Exemples :
1133----------
willy tarreaua41a8b42005-12-17 14:02:24 +01001134# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001135 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001136 mode http
1137 cookie SERVERID
1138 balance roundrobin
1139 server web1 192.168.1.1:80 cookie server01 check
1140 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001141
willy tarreau2f6ba652005-12-17 13:57:42 +01001142# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001143 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001144 mode http
1145 cookie SERVERID
1146 balance roundrobin
1147 option httpchk
1148 server web1 192.168.1.1:80 cookie server01 check
1149 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +01001150
willy tarreau2f6ba652005-12-17 13:57:42 +01001151# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
1152 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001153 mode http
1154 cookie SERVERID
1155 balance roundrobin
1156 option httpchk /index.html
1157 server web1 192.168.1.1:80 cookie server01 check
1158 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +01001159
willy tarreaueedaa9f2005-12-17 14:08:03 +01001160# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1161 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001162 mode http
1163 cookie SERVERID
1164 balance roundrobin
1165 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1166 server web1 192.168.1.1:80 cookie server01 check
1167 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001168
willy tarreau0174f312005-12-18 01:02:42 +01001169# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1170# douceur utilisant un second port (81) juste pour les health-checks.
1171 listen http_proxy 0.0.0.0:80
1172 mode http
1173 cookie JSESSIONID prefix
1174 balance roundrobin
1175 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1176 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1177 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1178 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1179 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1180
willy tarreau96d40372005-12-17 13:11:56 +01001181# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001182# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1183# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +01001184 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001185 mode http
1186 cookie SERVERID insert nocache indirect
1187 balance roundrobin
1188 server web1 192.168.1.1:80 cookie server01 check
1189 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +01001190
willy tarreaueedaa9f2005-12-17 14:08:03 +01001191# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001192 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001193 mode http
1194 cookie SERVERID insert nocache indirect
1195 balance roundrobin
1196 server web1 192.168.1.1:80 cookie server01 check
1197 server web2 192.168.1.2:80 cookie server02 check
1198 server web-backup 192.168.2.1:80 cookie server03 check backup
1199 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001200
willy tarreaua41a8b42005-12-17 14:02:24 +01001201# relayage SMTP+TLS avec test du serveur et serveur de backup
1202
1203 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001204 mode tcp
1205 balance roundrobin
1206 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1207 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001208
Willy Tarreauf3c69202006-07-09 16:42:34 +02001209# relayage HTTPS avec test du serveur et serveur de backup
1210
1211 listen http_proxy :443
1212 mode tcp
1213 option ssl-hello-chk
1214 balance roundrobin
1215 server srv1 192.168.1.1 check inter 30000 rise 1 fall 2
1216 server srv2 192.168.1.2 backup
1217
Willy TARREAU3481c462006-03-01 22:37:57 +01001218# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1219 listen http_proxy 0.0.0.0:80
1220 mode http
1221 balance roundrobin
1222 option httpchk
1223 server inst1 192.168.1.1:80 cookie s1 check
1224 server inst2 192.168.1.2:80 cookie s2 check
1225 server inst3 192.168.1.3:80 cookie s3 check
1226 server back1 192.168.1.10:80 check backup
1227 server back2 192.168.1.11:80 check backup
1228 option allbackups # all backups will be used
1229
willy tarreau0f7af912005-12-17 12:21:26 +01001230
willy tarreauc29948c2005-12-17 13:10:27 +010012313.2) Reconnexion vers un répartiteur en cas d'échec direct
1232----------------------------------------------------------
1233En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1234seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1235définitivement privés de service. La spécification du paramètre 'redispatch'
1236autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1237(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001238
1239Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001240---------
willy tarreau0f7af912005-12-17 12:21:26 +01001241 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001242 mode http
1243 cookie SERVERID
1244 dispatch 192.168.1.100:80
1245 server web1 192.168.1.1:80 cookie server01
1246 server web2 192.168.1.2:80 cookie server02
1247 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001248
willy tarreau64a3cc32005-12-18 01:13:11 +01001249Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1250redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1251version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1252identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1253tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1254tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001255
1256 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001257 mode http
1258 option persist
1259 cookie SERVERID
1260 dispatch 192.168.1.100:80
1261 server web1 192.168.1.1:80 cookie server01
1262 server web2 192.168.1.2:80 cookie server02
1263 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001264
willy tarreauc29948c2005-12-17 13:10:27 +01001265
willy tarreau34f45302006-04-15 21:37:14 +020012663.3) Assignation de poids différents à des serveurs
1267---------------------------------------------------
1268Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1269d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1270que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1271soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1272raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1273plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1274plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1275la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1276une vue des serveurs disponibles la plus homogène possible en se basant sur
1277leur poids de sorte que la charge se distribue de la manière la plus lisse
1278possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
willy tarreau532bb552006-05-13 18:40:37 +02001279serveur par rapport aux autres. Le poids de 1 donne la fréquence d'apparition
1280la plus faible, et 256 la fréquence la plus élevée. De cette manière, si un
1281serveur disparait, les capacités restantes sont toujours respectées.
willy tarreau34f45302006-04-15 21:37:14 +02001282
1283
1284Exemple :
1285---------
1286# distribution équitable sur 2 opteron and un ancien pentium3
1287
1288 listen web_appl 0.0.0.0:80
1289 mode http
1290 cookie SERVERID insert nocache indirect
1291 balance roundrobin
1292 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1293 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1294 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1295 server web-backup1 192.168.2.1:80 cookie server04 check backup
1296 server web-excuse 192.168.3.1:80 check backup
1297
1298Notes :
1299-------
1300 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1301
1302 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1303 est plus propre d'utiliser les poids que de répliquer le même serveur
1304 plusieurs fois.
1305
1306 - les poids s'appliquent également aux serveurs de backup si l'option
1307 'allbackups' est positionnée.
1308
1309 - le poids s'applique aussi à la répartition selon la source
1310 ('balance source').
1311
1312 - quels que soient les poids, le premier serveur sera toujours assigné en
1313 premier. Cette règle facilite les diagnostics.
1314
1315 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1316 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1317 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1318
willy tarreau532bb552006-05-13 18:40:37 +02001319La distribution du trafic suivra exactement le séquencement suivant :
1320
1321 Request| 1 1 1 1
1322 number | 1 2 3 4 5 6 7 8 9 0 1 2 3
1323 --------+---------------------------
1324 p3-800 | X . . . . . . X . . . . .
1325 opt-20 | . X . X . X . . . X . X .
1326 opt-24 | . . X . X . X . X . X . X
1327
1328
13293.4) Limitation du nombre de sessions concurrentes par serveur
1330--------------------------------------------------------------
1331Certains serveurs web multi-processus tels qu'Apache souffrent dès qu'il y a
1332trop de sessions concurrentes, parce qu'il est très coûteux de faire
1333fonctionner des centaines ou des milliers de processus sur un système. Une
1334solution consiste à augmenter le nombre de serveurs et de répartir la charge
1335entre eux, mais cela pose un problème lorsque le but est uniquement de résister
1336à des pics de charge occasionnels.
1337
1338Pour résoudre ce problème, une nouvelle fonctionnalité a été implémentée dans
1339HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associée à une
1340file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
1341entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
1342de diminuer la valeur maxconn améliorera notablement les performances des
1343serveurs et diminuera les temps de réponse simplement parce que les serveurs
1344seront moins congestionnés.
1345
1346Quand une requête cherche à joindre n'importe quel serveur, le premier serveur
1347non saturé est utilisé, en respectant l'algorithme de répartition de charge. Si
1348tous les serveurs sont saturés, alors la requête sera mise dans la file
1349d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
1350toutes les requêtes précédentes auront été libérées et qu'un serveur aura été
1351libéré d'une connexion pour la traiter.
1352
1353Si une requête fait référence à un serveur en particulier (p.ex: hachage d'IP
1354source, ou persistance par cookie), et que ce server est saturé, alors la
1355requête sera mise dans la file d'attente dédiée à ce serveur. Cette file
1356d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
1357plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent déjà
1358que pour les nouveaux utilisateurs.
1359
1360Pour cela, les logs ont dû être enrichis pour indiquer le nombre de sessions
1361par serveur, la position de la requête dans les files d'attentes, et le temps
1362passé en file d'attente. Ceci aide considérablement à faire de la prévision de
1363capacité. Voir la section 'logs' plus bas pour plus d'informations.
1364
1365Exemple :
1366---------
1367 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1368 listen web_appl 0.0.0.0:80
1369 maxconn 10000
1370 mode http
1371 cookie SERVERID insert nocache indirect
1372 balance roundrobin
1373 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 maxconn 100 check
1374 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
1375 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
1376 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1377 server web-excuse 192.168.3.1:80 check backup
1378
willy tarreau8f635a42006-05-21 23:05:54 +02001379Cette option se montra si efficace pour réduire les temps de réponse des
1380serveurs que certains utilisateurs voulaient utiliser des valeurs trop basses
1381pour améliorer les performances de leurs serveurs. Seulement, ils n'étaient
1382alors plus en mesure de supporter de très fortes charges parce qu'il n'était
1383plus possible de les saturer. Pour cette raison, la version 1.2.14 a apporté la
1384limitation dynamique de connexions avec l'addition du paramètre "minconn".
1385Lorsque ce paramètre est associé à "maxconn", il active la limitation dynamique
1386basée sur la charge de l'instance. Le nombre maximal de sessions concurrentes
1387sur un serveur devient alors proportionnel au nombre de sessions de l'instance
1388par rapport à son 'maxconn'. Un minimum de <minconn> sessions sera toujours
1389permis quelle que soit la charge. Ceci assurera que les serveurs travailleront
1390au meilleur de leurs performances sous des charges normales, et qu'ils seront
1391tout de même capables de supporter de fortes pointes lorsque nécessaire. La
1392limite dynamique est calculée comme ceci :
1393
1394 srv.dyn_limit = max(srv.minconn, srv.maxconn * inst.sess / inst.maxconn)
1395
1396Exemple :
1397---------
1398 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1399 listen web_appl 0.0.0.0:80
1400 maxconn 10000
1401 mode http
1402 cookie SERVERID insert nocache indirect
1403 balance roundrobin
1404 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check
1405 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check
1406 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1407 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1408 server web-excuse 192.168.3.1:80 check backup
1409
1410Dans l'exemple ci-dessus, le serveur "pentium3-800' recevra au plus 100
1411connexions simultanées lorsque l'instance du proxy en atteindra 10000, et
1412recevra seulement 10 connexions simultanées tant que le proxy sera sous les 1000
1413sessions.
1414
Elijah Epifanovacafc5f2007-10-25 20:15:38 +02001415Il est possible de limiter la taille de la file d'attente dans le but de
1416redistribuer les connexions destinées à un serveur en particulier qui sont trop
1417loin pour avoir une chance d'être servies en un temps raisonnable. Ceci n'est
1418acceptable que dans le cas où l'affinité entre le client et le serveur n'est
1419pas obligatoire, mais motivée uniquement par des raisons de performances, par
1420exemple, par l'utilisation d'un cache local au serveur. L'option 'maxqueue'
1421permet de préciser la limite par serveur, tel que dans l'exemple ci-dessous :
1422
1423... (même exemple que précédemment)
1424 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check maxqueue 50
1425 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check maxqueue 200
1426 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1427
1428En l'absence du paramètre 'maxqueue', la file d'un serveur n'a pas de limite
1429définie. Dans le cas contraire, lorsque la file atteint la limite fixée par
1430'maxqueue', les clients sont déplacés vers la file globale.
1431
willy tarreau532bb552006-05-13 18:40:37 +02001432Notes :
1433-------
1434 - la requête ne restera pas indéfiniment en file d'attente, elle est
1435 assujétie au paramètre 'contimeout', et si une requête ne peut pas
1436 sortir de la file avant ce time-out, soit parce que le serveur est
1437 saturé, soit parce qu'il y a trop de requêtes en file d'attente,
1438 alors elle expirera avec une erreur 503.
1439
willy tarreau8f635a42006-05-21 23:05:54 +02001440 - si seul <minconn> est spécifié, il a le même effet que <maxconn>
1441
willy tarreau532bb552006-05-13 18:40:37 +02001442 - positionner des valeurs trop basses pour 'maxconn' peut améliorer les
1443 performances mais aussi permettre à des utilisateurs trop lents de bloquer
1444 un serveur pour les autres utilisateurs.
1445
willy tarreau34f45302006-04-15 21:37:14 +02001446
willy tarreau8f635a42006-05-21 23:05:54 +020014473.5) Abandon des requêtes abortées
1448----------------------------------
1449En présence de très fortes charges, les serveurs mettront un certain temps à
1450répondre. La file d'attente du proxy se remplira, et les temps de réponse
1451suivront une croissance proportionnelle à la taille de file d'attente fois
1452le temps moyen de réponse par session. Lorsque les clients attendront plus de
1453quelques secondes, ils cliqueront souvent sur le bouton 'STOP' de leur
1454navigateur, laissant des requêtes inutiles en file d'attente et ralentissant
1455donc les autres utilisateurs.
1456
1457Comme il n'y a aucun moyen de distinguer un vrai clic sur STOP d'une simple
1458fermeture du canal de sortie sur le client (shutdown(SHUT_WR)), les agents HTTP
1459doivent être conservateurs et considérer que le client n'a probablement fermé
1460que le canal de sortie en attendant la réponse. Toutefois, ceci introduit des
1461risques de congestion lorsque beaucoup d'utilisateurs font de même, et s'avère
1462aujourd'hui complètement inutile car probablement aucun client ne referme la
1463session en attendant la réponse. Certains agents HTTP supportent ceci (Squid,
1464Apache, HAProxy), et d'autres ne le supportent pas (TUX, et la plupart des
1465répartiteurs de charge matériels). Donc la probabilité pour qu'une notification
1466de fermeture d'un canal d'entrée côté client représente un utilisateur cliquant
1467sur 'STOP' est proche de 100%, et il est vraiment tentant d'abandonner la
1468requête prématurément sans polluer les serveurs.
1469
1470Pour cette raison, une nouvelle option "abortonclose" a été introduite en
1471version 1.2.14. Par défaut (sans l'option), le comportement reste conforme à
1472HTTP. Mais lorsque l'option est spécifiée, une session dont le canal entrant
1473est fermé sera abortée si cela est possible, c'est à dire que la requête est
1474soit en file d'attente, soit en tentative de connexion. Ceci réduit
1475considérablement la longueur des files d'attentes et la charge sur les serveurs
1476saturés lorsque les utilisateurs sont tentés de cliquer sur 'STOP', ce qui à
1477son tour, réduit les temps de réponse pour les autres utilisateurs.
1478
1479Exemple :
1480---------
1481 listen web_appl 0.0.0.0:80
1482 maxconn 10000
1483 mode http
1484 cookie SERVERID insert nocache indirect
1485 balance roundrobin
1486 server web1 192.168.1.1:80 cookie s1 weight 10 maxconn 100 check
1487 server web2 192.168.1.2:80 cookie s2 weight 10 maxconn 100 check
1488 server web3 192.168.1.3:80 cookie s3 weight 10 maxconn 100 check
1489 server bck1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1490 option abortonclose
1491
1492
willy tarreauc29948c2005-12-17 13:10:27 +010014934) Fonctionnalités additionnelles
1494=================================
1495
1496D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
willy tarreau8f635a42006-05-21 23:05:54 +02001497principalement du mode transparent, de la journalisation des connexions, de la
1498réécriture des en-têtes, et du statut sous forme de page HTML.
1499
willy tarreau5cbea6f2005-12-17 12:48:26 +01001500
willy tarreau0174f312005-12-18 01:02:42 +010015014.1) Fonctionnalités réseau
1502---------------------------
15034.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001504---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001505En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1506routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1507pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001508destination de la session détournée. Le système doit permettre de rediriger les
1509paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001510
1511Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001512---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001513 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001514 mode http
1515 transparent
1516 cookie SERVERID
1517 server server01 192.168.1.1:80
1518 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001519
1520 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1521 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001522
willy tarreaua41a8b42005-12-17 14:02:24 +01001523Remarque :
1524----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001525Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1526adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1527d'une même adresse avec une même instance et sans utiliser directement le mode
1528transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001529
1530Exemple :
1531---------
1532 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001533 mode tcp
1534 server server01 192.168.1.1 check port 60000
1535 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001536
1537 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1538 -j REDIRECT --to-ports 65000
1539
willy tarreau0174f312005-12-18 01:02:42 +01001540
15414.1.2) Choix d'une adresse source par serveur
1542---------------------------------------------------
1543Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1544IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1545backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1546pour joindre le même serveur. C'est également utilisable pour faciliter une
1547répartition de charge selon l'adresse IP source pour des connexions sortantes.
1548Bien entendu, la même adresse est utilisée pour les health-checks.
1549
1550Exemple :
1551---------
1552 # utiliser une adresse particulière pour joindre les 2 serveur
1553 listen http_proxy 0.0.0.0:65000
1554 mode http
1555 balance roundrobin
1556 server server01 192.168.1.1:80 source 192.168.2.13
1557 server server02 192.168.1.2:80 source 192.168.2.13
1558
1559Exemple :
1560---------
1561 # utiliser une adresse particulière pour joindre chaque serveur
1562 listen http_proxy 0.0.0.0:65000
1563 mode http
1564 balance roundrobin
1565 server server01 192.168.1.1:80 source 192.168.1.1
1566 server server02 192.168.2.1:80 source 192.168.2.1
1567
1568Exemple :
1569---------
1570 # faire une répartition d'adresse sources pour joindre le même proxy à
1571 # travers deux liens WAN
1572 listen http_proxy 0.0.0.0:65000
1573 mode http
1574 balance roundrobin
1575 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1576 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1577
1578Exemple :
1579---------
1580 # forcer une connexion TCP à s'attacher à un port particulier
1581 listen http_proxy 0.0.0.0:2000
1582 mode tcp
1583 balance roundrobin
1584 server srv1 192.168.1.1:80 source 192.168.2.1:20
1585 server srv2 192.168.1.2:80 source 192.168.2.1:20
1586
willy tarreaub952e1d2005-12-18 01:31:20 +010015874.1.3) Maintien de session TCP (keep-alive)
1588-------------------------------------------
1589Avec la version 1.2.7, il devient possible d'activer le maintien de session
1590TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1591d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1592externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1593aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1594time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1595positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1596vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1597pour activer le maintien de session TCP :
1598
1599 option tcpka # active le keep-alive côté client et côté serveur
1600 option clitcpka # active le keep-alive côté client
1601 option srvtcpka # active le keep-alive côté serveur
1602
Alexandre Cassen87ea5482007-10-11 20:48:58 +020016034.1.4) Rémanence des données TCP (lingering)
1604--------------------------------------------
1605Il est possible de désactiver la conservation de données non acquittées par un
1606client à la fin d'une session. Cela peut parfois s'avérer nécessaire lorsque
1607haproxy est utilisé en face d'un grand nombre de clients non fiables et qu'un
1608nombre élevé de sockets en état FIN_WAIT est observé sur la machine. L'option
1609peut être utilisée dans un frontend pour ajuster les connexions vers les
1610clients, et dans un backend pour ajuster les connexions vers les serveurs :
1611
1612 option nolinger # désactive la conservation de données
1613
willy tarreau0f7af912005-12-17 12:21:26 +01001614
willy tarreauc29948c2005-12-17 13:10:27 +010016154.2) Journalisation des connexions
1616----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001617
1618L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1619Il fournit probablement le plus fin niveau d'information disponible pour un
1620tel outil, ce qui est très important pour les diagnostics en environnements
1621complexes. En standard, les informations journalisées incluent le port client,
1622les chronométrages des états TCP/HTTP, des états de session précis au moment de
1623la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1624trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1625arbitraires.
1626
1627Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1628transparence sur les problèmes rencontrés, à la fois internes et externes, et
1629il est possible d'envoyer les logs vers des serveurs différents en même temps
1630avec des niveaux de filtrage différents :
1631
1632 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1633 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1634 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1635 - activité par instance (connexions clients), aussi bien lors de leur
1636 établissement qu'à leur terminaison.
1637
1638La possibilité de distribuer différents niveaux de logs à différents serveurs
1639permet à plusieurs équipes de production d'intéragir et de corriger leurs
1640problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1641occasionnellement les erreurs système, pendant que l'équipe application
1642surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1643que l'équipe sécurité analyse l'activité en différé d'une heure.
1644
1645
willy tarreauc1cae632005-12-17 14:12:23 +010016464.2.1) Niveaux de log
1647---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001648Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1649détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1650source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001651la requête HTTP, le code de retour, la quantité de données transmises, et même
1652dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1653Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1654la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001655est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001656
willy tarreau8337c6b2005-12-17 13:41:01 +01001657 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1658 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001659ou
1660 log global
1661
1662Remarque :
1663----------
1664La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1665paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001666
1667Exemple :
1668---------
1669 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001670 mode http
1671 log 192.168.2.200 local3
1672 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001673
willy tarreauc1cae632005-12-17 14:12:23 +010016744.2.2) Format des logs
1675----------------------
1676Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1677de la session entre le client et le relais. En précisant l'option 'tcplog',
1678la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1679sur son état lors de la déconnexion, ainsi que le temps de connexion et la
willy tarreau532bb552006-05-13 18:40:37 +02001680durée totale de la session. Le nombre de sessions restantes après la
1681déconnexion est également indiqué (pour le serveur, l'instance et le process).
willy tarreauc1cae632005-12-17 14:12:23 +01001682
willy tarreauc5f73ed2005-12-18 01:26:38 +01001683Exemple de journalisation TCP :
1684-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001685 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001686 mode tcp
1687 option tcplog
1688 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001689
willy tarreau532bb552006-05-13 18:40:37 +02001690>>> 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 +01001691
willy tarreau532bb552006-05-13 18:40:37 +02001692 Champ Format / Description Exemple
1693
1694 1 nom_processus '[' pid ']:' haproxy[18989]:
1695 2 ip_client ':' port_client 127.0.0.1:34550
1696 3 '[' date ']' [15/Oct/2003:15:24:28]
1697 4 nom_instance relais-tcp
1698 5 nom_serveur Srv1
1699 6 temps_file '/' temps_connect '/' temps_total 0/0/5007
1700 7 octets lus 0
1701 8 etat_terminaison --
1702 9 conn_srv '/' conns_inst '/' conns_processus 1/1/1
1703 10 position en file d'attente srv '/' globale 0/0
willy tarreau982249e2005-12-18 00:57:06 +01001704
willy tarreauc1cae632005-12-17 14:12:23 +01001705Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1706notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1707surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1708les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1709ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1710(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001711
willy tarreauc5f73ed2005-12-18 01:26:38 +01001712Exemple de journalisation HTTP :
1713--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001714 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001715 mode http
1716 option httplog
1717 option dontlognull
1718 log 192.168.2.200 local3
1719
willy tarreau532bb552006-05-13 18:40:37 +02001720>>> 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 +01001721
1722Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001723
willy tarreau532bb552006-05-13 18:40:37 +02001724 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 +01001725
willy tarreau532bb552006-05-13 18:40:37 +02001726 Champ Format / Description Exemple
1727
1728 1 nom_processus '[' pid ']:' haproxy[18989]:
1729 2 ip_client ':' port_client 10.0.0.1:34552
1730 3 '[' date ']' [15/Oct/2003:15:26:31]
1731 4 nom_instance relais-http
1732 5 nom_serveur Srv1
1733 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt 3183/-1/-1/-1/11215
1734 7 Code_retour_HTTP 503
1735 8 octets lus 0
1736 9 cookies_requête_capturés -
1737 10 cookies_reponse_capturés -
1738 11 etat_terminaison SC--
1739 12 conns_srv '/' conns_inst '/' conns_processus 137/202/205
1740 13 position file serveur '/' globale 0/0
1741 14 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1742 15 '{' entetes_reponse_capturés '}' {}
1743 16 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001744
1745Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1746 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001747
1748Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1749de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1750Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001751la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1752tôt possible, c'est à dire juste avant que ne débutent les transferts de
1753données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1754de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001755traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1756représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001757
willy tarreau64a3cc32005-12-18 01:13:11 +01001758Afin d'éviter toute confusion avec les logs normaux, le temps total de
1759transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001760rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001761
1762Exemple :
1763---------
1764
1765 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001766 mode http
1767 option httplog
1768 option dontlognull
1769 option logasap
1770 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001771
willy tarreauc5f73ed2005-12-18 01:26:38 +01001772>>> 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 +01001773
1774
willy tarreauc1cae632005-12-17 14:12:23 +010017754.2.3) Chronométrage des événements
1776-----------------------------------
1777Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1778événements sont d'une très grande utilité. Tous les temps sont mesurés en
1779millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
willy tarreau532bb552006-05-13 18:40:37 +02001780la forme Tq/Tw/Tc/Tr/Tt :
willy tarreauc1cae632005-12-17 14:12:23 +01001781
1782 - Tq: temps total de réception de la requête HTTP de la part du client.
1783 C'est le temps qui s'est écoulé entre le moment où le client a établi
1784 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1785 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1786 que la requête complète n'a jamais été reçue.
1787
willy tarreau532bb552006-05-13 18:40:37 +02001788 - Tw: temps total passé dans les files d'attente avant d'obtenir une place
1789 vers un serveur. Ceci tient compte à la fois de la file d'attente globale
1790 et de celle du serveur, et dépend du nombre de requêtes dans la file et du
1791 temps nécessaire au serveur pour compléter les sessions précédentes. La
1792 valeur '-1' indique que la requête a été détruite avant d'atteindre une
1793 file.
1794
willy tarreauc1cae632005-12-17 14:12:23 +01001795 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1796 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1797 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1798 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1799 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1800 vers le serveur.
1801
1802 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001803 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001804 la connexion. Ca représente exactement le temps de traitement de la
1805 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001806 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001807
1808 - Tt: durée de vie totale de la session, entre le moment où la demande de
1809 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001810 refermée aux deux extrémités (client et serveur). La signification change
1811 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
willy tarreau532bb552006-05-13 18:40:37 +02001812 uniquement à (Tq + Tw + Tc + Tr), et se trouve préfixé d'un signe '+'. On
1813 peut donc déduire Td, le temps de transfert des données, en excluant les
1814 autres temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001815
willy tarreau532bb552006-05-13 18:40:37 +02001816 Td = Tt - (Tq + Tw + Tc + Tr)
willy tarreauc1cae632005-12-17 14:12:23 +01001817
1818 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1819
willy tarreau532bb552006-05-13 18:40:37 +02001820En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
willy tarreauc1cae632005-12-17 14:12:23 +01001821rapportés.
1822
1823Ces temps fournissent de précieux renseignement sur des causes probables de
1824problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1825de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1826de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1827problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1828valeur de time-out dans la configuration, c'est souvent qu'une session a été
1829abandonnée sur expiration d'un time-out.
1830
1831Cas les plus fréquents :
1832
1833 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1834 le client et le relais.
1835 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1836 le relais et le serveur durant la phase de connexion. Cet indicateur
1837 devrait normalement toujours être très bas (moins de quelques dizaines).
1838 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1839 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1840 de pertes entre le relais et le serveur.
1841 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1842 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1843 session est maintenue après la fin des échanges. Voir plus loin pour
1844 savoir comment désactiver le keep-alive HTTP.
1845
1846Autres cas ('xx' représentant une valeur quelconque à ignorer) :
willy tarreau532bb552006-05-13 18:40:37 +02001847 -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 +01001848 a refermé sa connexion sans compléter la requête.
willy tarreau532bb552006-05-13 18:40:37 +02001849 Tq/-1/xx/xx/Tt: Il n'était pas possible de traiter la request, probablement
1850 parce que tous les serveurs étaient hors d'usage.
1851 Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'établir vers le serveur (refus ou
1852 time-out au bout de Tt-(Tq+Tw) ms).
1853 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 +01001854 les temps ou bien a refermé sa connexion trop tôt, au bout
willy tarreau532bb552006-05-13 18:40:37 +02001855 de Tt-(Tq+Tw+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001856
18574.2.4) Conditions de déconnexion
1858--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001859Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1860le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1861un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1862une signification précise :
1863
1864 - sur le premier caractère, un code précisant le premier événement qui a causé
1865 la terminaison de la session :
1866
1867 C : fermeture inattendue de la session TCP de la part du client.
1868
1869 S : fermeture inattendue de la session TCP de la part du serveur, ou
1870 refus explicite de connexion de la part de ce dernier.
1871
1872 P : terminaison prématurée des sessions par le proxy, pour cause
1873 d'imposition d'une limite sur le nombre de connexions, pour cause
1874 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1875 sécurité a détecté et bloqué une anomalie dans la réponse du
1876 serveur qui aurait pu causer une fuite d'informations (par exemple,
1877 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001878
willy tarreauc5f73ed2005-12-18 01:26:38 +01001879 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1880 source, ...). Généralement, cela arrive au cours de l'établissement
1881 d'une connexion, et les logs système doivent contenir une copie de
1882 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001883
willy tarreauc5f73ed2005-12-18 01:26:38 +01001884 I : une erreur interne a été identifiée par le proxy à la suite d'un
1885 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1886 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001887
willy tarreauc5f73ed2005-12-18 01:26:38 +01001888 c : le délai maximal d'attente du client a expiré (clitimeout).
1889
1890 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1891
1892 - : terminaison normale de session.
1893
1894 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1895 la fermeture :
1896
1897 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1898 été transmis au serveur.
1899
willy tarreau532bb552006-05-13 18:40:37 +02001900 Q : attente en file d'attente (QUEUE) d'une place pour avoir une
1901 connexion vers un serveur. Ne peut apparaître que sur un serveur
1902 possédant un paramètre 'maxconn'. Aucune connexion n'a été envoyée
1903 au serveur.
1904
willy tarreauc5f73ed2005-12-18 01:26:38 +01001905 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1906 serveur peut au plus avoir vu la tentative de connexion, mais
1907 aucune donnée n'a été échangée.
1908
1909 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1910
1911 D : transfert des DONNEES du serveur vers le client.
1912
1913 L : transfert des dernières ("LAST") données du proxy vers le client,
1914 alors que le serveur a déjà fini.
1915
Willy Tarreau2272dc12006-09-03 10:19:38 +02001916 T : requête bloquée en mode "tarpit" par le proxy. Elle a été maintenue
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001917 ouverte vers le client pendant toute la durée du contimeout ou
1918 jusqu'à l'abandon de la part du client.
Willy Tarreau2272dc12006-09-03 10:19:38 +02001919
willy tarreauc5f73ed2005-12-18 01:26:38 +01001920 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001921
1922 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001923 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001924
willy tarreauc5f73ed2005-12-18 01:26:38 +01001925 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1926 cas sur les NOUVELLES connexions clients.
1927
1928 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1929 serveur connu. Ceci peut être dû à un changement de configuration
1930 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1931 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001932
willy tarreauc5f73ed2005-12-18 01:26:38 +01001933 D : le client a présenté un cookie correspondant à un serveur hors
1934 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1935 un autre serveur ou a tout de même tenté de se connecter sur celui
1936 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001937
willy tarreauc5f73ed2005-12-18 01:26:38 +01001938 V : le client a présenté un cookie VALIDE et a pu se connecter au
1939 serveur correspondant.
1940
1941 - : non appliquable (pas de cookie positionné dans la configuration).
1942
1943 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1944 persistence retrourné par le serveur (uniquement en mode HTTP) :
1945
1946 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1947 n'a été inséré.
1948
1949 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1950 proxy en a INSERE un.
1951
willy tarreau197e8ec2005-12-17 14:10:59 +01001952 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001953 tel quel ("PASSIF").
1954
1955 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1956
1957 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1958 ne pas être retourné au client.
1959
1960 - : non appliquable
1961
1962
1963La combinaison des deux premiers indicateurs fournit une grande quantitié
1964d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1965peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1966des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001967
willy tarreauc5f73ed2005-12-18 01:26:38 +01001968Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1969
1970 Indic Raison
1971 CR Le client a abandonné avant d'émettre une requête complète. Il est
1972 très probable que la requête ait été tapée à la main dans un client
1973 telnet et abortée trop tôt.
1974
1975 cR Le temps imparti au client a expiré avant réception d'une requête
1976 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1977 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1978 transporter des paquets entiers, ou par des clients qui énvoient des
1979 requêtes à la main et ne tapent pas assez vite.
1980
1981 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1982 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1983 être la couche réseau qui indique au proxy que le serveur n'est pas
1984 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1985
1986 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1987
1988 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1989 nombre de connexions a atteint la limite 'maxconn' (global ou de
1990 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1991 augmenté, tout comme le paramètre 'maxconn' global.
1992
1993 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1994 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1995 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1996 consiste à affiner le paramétrage système.
1997
1998 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1999 est parfois causé par un paramètre TCP MSS trop élevé sur le client
2000 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
2001 paquets entiers.
2002
willy tarreau078c79a2006-05-13 12:23:58 +02002003 CH Le client a abandonné alors qu'il attendait un début de réponse de la
2004 part du serveur. Cela peut être causé par le serveur qui mettait trop
2005 de temps à répondre, ou par un client cliquant précipitamment sur le
2006 bouton 'Stop'.
2007
2008 CQ Le client a abandonné alors que sa session était mise en file
2009 d'attente pour obtenir un serveur avec suffisamment de connexions
2010 libres pour l'accepter. Cela signifie soit que l'ensemble des
2011 serveurs étaient saturés, soit que le serveur assigné a mis trop de
2012 temps à répondre.
2013
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002014 CT Le client a abandonné alors que sa session était bloquée en mode
2015 tarpit.
2016
willy tarreau078c79a2006-05-13 12:23:58 +02002017 sQ La session a attendu trop longtemps en file d'attente et a été
2018 expirée.
2019
willy tarreauc5f73ed2005-12-18 01:26:38 +01002020 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
2021 en-têtes. En général, cela indique qu'il a crashé.
2022
2023 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
2024 des transactions trop longues, probablement causées par un back-end
2025 saturé. Les seules solutions sont de corriger le problème sur
2026 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
2027 des attentes plus longues au risque que les clients abandonnent à
2028 leur tour, ou bien d'ajouter des serveurs.
2029
2030 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
2031 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
2032 soit à cause d'une requête validant un filtre d'interdiction, auquel
2033 cas le proxy a renvoyé une erreur HTTP 403.
2034
2035 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
2036 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
2037 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
2038 renvoyée au client.
2039
Willy Tarreau2272dc12006-09-03 10:19:38 +02002040 PT Le proxy a bloqué une requête du client et a maintenu sa connection
2041 ouverte avant de lui retourner une erreur "500 server error". Rien
2042 n'a été envoyé au serveur.
2043
willy tarreauc5f73ed2005-12-18 01:26:38 +01002044 cD Le client n'a pas lu de données pendant le temps qui lui était
2045 imparti. Ceci est souvent causé par des problèmes réseau côté client.
2046
2047 CD Le client a aborté sa connection de manière inattendue pendant le
2048 transfert des données. Ceci est provoqué soit par le crash d'un
2049 navigateur, ou par une session en HTTP keep-alive entre le serveur
2050 et le client terminée en premier par le client.
2051
2052 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
2053 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
2054 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
2055 situés entre le proxy et le serveur.
2056
20574.2.5) Caractères non-imprimables
2058---------------------------------
2059Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
2060tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
2061hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
2062dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
2063caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
2064est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
2065les en-têtes.
2066
20674.2.6) Capture d'en-têtes HTTP et de cookies
2068--------------------------------------------
2069La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
2070capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
2071
2072Les captures de cookies facilitent le suivi et la reconstitution d'une session
2073utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01002074
2075 capture cookie <préfixe_cookie> len <longueur_capture>
2076
willy tarreauc5f73ed2005-12-18 01:26:38 +01002077Ceci activera la capture de cookies à la fois dans les requêtes et dans les
2078réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
2079bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
2080nouveau cookie.
2081
willy tarreau8337c6b2005-12-17 13:41:01 +01002082Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
2083transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
2084caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
2085le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
2086place dans les logs.
2087
2088Exemples :
2089----------
2090 # capture du premier cookie dont le nom commence par "ASPSESSION"
2091 capture cookie ASPSESSION len 32
2092
2093 # capture du premier cookie dont le nom est exactement "vgnvisitor"
2094 capture cookie vgnvisitor= len 32
2095
willy tarreau036e1ce2005-12-17 13:46:33 +01002096Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01002097positionné par le serveur, précédé du cookie positionné par le client. Chacun
2098de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01002099par le client ou le serveur, ou lorsque l'option est désactivée..
2100
2101Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
2102pour suivre un identifiant de requête globalement unique positionné par un
2103autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
2104de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
2105peut chercher des informations relatives à la longueur annoncée de la réponse,
2106le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
2107de redirection. Tout comme pour les captures de cookies, il est possible
2108d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
2109la suivante :
2110
2111 capture request header <nom> len <longueur max>
2112 capture response header <nom> len <longueur max>
2113
2114Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01002115
willy tarreauc5f73ed2005-12-18 01:26:38 +01002116Exemples:
2117---------
2118 # conserver le nom du serveur virtuel accédé par le client
2119 capture request header Host len 20
2120 # noter la longueur des données envoyées dans un POST
2121 capture request header Content-Length len 10
2122
2123 # noter le fonctionnement attendu du cache par le serveur
2124 capture response header Cache-Control len 8
2125 # noter l'URL de redirection
2126 capture response header Location len 20
2127
2128Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
2129fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
2130regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
2131chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
2132réponse sont présentés de la même manière, mais après un espace suivant le bloc
2133d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
2134
2135 Config:
2136
2137 capture request header Host len 20
2138 capture request header Content-Length len 10
2139 capture request header Referer len 20
2140 capture response header Server len 20
2141 capture response header Content-Length len 10
2142 capture response header Cache-Control len 8
2143 capture response header Via len 20
2144 capture response header Location len 20
2145
2146 Log :
2147
willy tarreau532bb552006-05-13 18:40:37 +02002148 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/"
2149 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"
2150 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 +01002151
21524.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01002153-----------------------
willy tarreau532bb552006-05-13 18:40:37 +02002154- 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 +01002155 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
2156 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01002157
willy tarreau532bb552006-05-13 18:40:37 +02002158- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/1230/7/147/6870 200 243 - - ---- 99/239/324 0/9 "HEAD / HTTP/1.0"
2159 => Idem, mais la requête a été mise en attente dans la file globale derrière
2160 9 autres requêtes déjà présentes, et y a attendu 1230 ms.
2161
2162- 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 +01002163 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
2164 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 +01002165 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 +01002166 total entre l'accept() et le premier octet de donnée est de 30 ms.
2167
willy tarreau532bb552006-05-13 18:40:37 +02002168- 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 +01002169 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
2170 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
2171 d'informations risquant d'être cachées. Dans ce cas, la réponse est
2172 remplacée par '502 bad gateway'.
2173
willy tarreau532bb552006-05-13 18:40:37 +02002174- 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 +01002175 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01002176 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01002177 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01002178
willy tarreau532bb552006-05-13 18:40:37 +02002179- 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 +01002180 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01002181 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01002182 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
2183 pu renvoyer un message 408 au client.
2184
willy tarreauc5f73ed2005-12-18 01:26:38 +01002185- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
2186 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
2187 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01002188
willy tarreau532bb552006-05-13 18:40:37 +02002189- 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 +01002190 => La requête client met 3s à entrer (peut-être un problème réseau), et la
2191 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreau532bb552006-05-13 18:40:37 +02002192 secondes (retries 3 dans la conf), puis un code 503 est retourné au
2193 client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
2194 instance, et 205 sur l'ensemble des instances pour ce processus. Il est
2195 possible que le serveur ait refusé la connexion parce qu'il y en avait
2196 déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01002197
willy tarreau4302f492005-12-18 01:00:37 +01002198
willy tarreauc5f73ed2005-12-18 01:26:38 +010021994.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01002200----------------------------------
2201En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
2202requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01002203possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
2204de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01002205connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
2206comme faisant partie des échanges de données consécutifs à la première requête.
2207Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01002208
2209La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01002210 reqadd <string> pour ajouter un en-tête dans la requête
2211 reqrep <search> <replace> pour modifier la requête
2212 reqirep <search> <replace> idem sans distinction majuscules/minuscules
2213 reqdel <search> pour supprimer un en-tête dans la requête
2214 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002215 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01002216 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002217 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01002218 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002219 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01002220 reqipass <search> idem sans distinction majuscules/minuscules
Willy Tarreau2272dc12006-09-03 10:19:38 +02002221 reqtarpit <search> bloquer et maintenir une request validant <search>
2222 reqitarpit <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002223
willy tarreau036e1ce2005-12-17 13:46:33 +01002224 rspadd <string> pour ajouter un en-tête dans la réponse
2225 rsprep <search> <replace> pour modifier la réponse
2226 rspirep <search> <replace> idem sans distinction majuscules/minuscules
2227 rspdel <search> pour supprimer un en-tête dans la réponse
2228 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01002229 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01002230 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01002231 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002232
willy tarreau0f7af912005-12-17 12:21:26 +01002233
willy tarreau036e1ce2005-12-17 13:46:33 +01002234<search> est une expression régulière compatible POSIX regexp supportant le
2235groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
2236doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
2237chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
2238backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01002239
2240 \t pour une tabulation
2241 \r pour un retour charriot
2242 \n pour un saut de ligne
2243 \ pour différencier un espace d'un séparateur
2244 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01002245 \\ pour utiliser un backslash dans la regex
2246 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01002247 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01002248
willy tarreau0f7af912005-12-17 12:21:26 +01002249
willy tarreau5cbea6f2005-12-17 12:48:26 +01002250<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
2251Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
2252groupe délimité par des parenthèses dans l'expression régulière, par sa
Willy Tarreau2272dc12006-09-03 10:19:38 +02002253position numérale. Les positions vont de 0 à 9, et sont codées par un '\'
2254suivi du chiffre désiré (0 désignant la ligne complète). Il est également
2255possible d'insérer un caractère non imprimable (utile pour le saut de ligne)
2256inscrivant '\x' suivi du code hexadécimal de ce caractère (comme en C).
willy tarreau5cbea6f2005-12-17 12:48:26 +01002257
2258<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01002259dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002260
2261Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01002262-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002263 - 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 +01002264 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002265 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
2266 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
2267 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01002268 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
2269 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
2270 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01002271 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01002272 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
2273 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
Willy Tarreau2272dc12006-09-03 10:19:38 +02002274 - une requête bloquée par 'reqtarpit' sera maintenue pendant une durée égale
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002275 au paramètre 'contimeout', ou jusqu'à l'abandon du client. Rien ne sera
2276 envoyé au serveur. Lorsque le temps alloué expire, le proxy répondra avec
2277 une réponse "500 server error" de sorte que l'attaquant ne suspecte pas
2278 qu'il ait été bloqué. Les logs rapporteront aussi ce code 500, mais les
2279 flags de terminaison indiqueront "PT".
willy tarreau0f7af912005-12-17 12:21:26 +01002280
2281Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01002282----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01002283 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01002284
willy tarreauc5f73ed2005-12-18 01:26:38 +01002285 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
2286 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
2287 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002288
willy tarreauc5f73ed2005-12-18 01:26:38 +01002289 # force proxy connections to close
2290 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
2291 # rewrite locations
2292 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002293
willy tarreauc5f73ed2005-12-18 01:26:38 +01002294 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01002295
willy tarreau197e8ec2005-12-17 14:10:59 +01002296 # Every header should end with a colon followed by one space.
2297 reqideny ^[^:\ ]*[\ ]*$
2298
2299 # block Apache chunk exploit
2300 reqideny ^Transfer-Encoding:[\ ]*chunked
2301 reqideny ^Host:\ apache-
2302
2303 # block annoying worms that fill the logs...
2304 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
2305 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
2306 reqideny ^[^:\ ]*\ .*<script
2307 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
2308
Willy Tarreau2272dc12006-09-03 10:19:38 +02002309 # tarpit attacks on the login page.
2310 reqtarpit ^[^:\ ]*\ .*\.php?login=[^0-9]
2311
willy tarreau197e8ec2005-12-17 14:10:59 +01002312 # allow other syntactically valid requests, and block any other method
2313 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
2314 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
2315 reqideny ^[^:\ ]*\
2316
2317 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01002318 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01002319
willy tarreauc5f73ed2005-12-18 01:26:38 +01002320 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01002321 rspidel ^Server:\
2322 rspadd Server:\ Formilux/0.1.8
2323
willy tarreau0f7af912005-12-17 12:21:26 +01002324
willy tarreau982249e2005-12-18 00:57:06 +01002325De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01002326'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002327connaître l'adresse IP du client initial. Depuis la version 1.3.8, il est
2328possible de préciser le mot-clé "except" suivi d'une adresse ou un réseau
2329IP source pour lequel l'entête ne sera pas ajouté. C'est très pratique dans le
2330cas où un autre reverse-proxy ajoutant déjà l'entête est installé sur la même
2331machine ou dans une DMZ connue. Le cas le plus fréquent est lié à l'utilisation
2332de stunnel en local.
willy tarreauc1cae632005-12-17 14:12:23 +01002333
willy tarreau982249e2005-12-18 00:57:06 +01002334Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01002335en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01002336Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
2337méthode impliquant 4 règles.
2338
willy tarreauc1cae632005-12-17 14:12:23 +01002339Exemple :
2340---------
2341 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002342 mode http
2343 log global
2344 option httplog
2345 option dontlognull
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002346 option forwardfor except 127.0.0.1/8
willy tarreauc5f73ed2005-12-18 01:26:38 +01002347 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01002348
Willy TARREAU767ba712006-03-01 22:40:50 +01002349Notons que certains serveurs HTTP ne referment pas nécessairement la session
2350TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
2351ce qui se traduit par des grands nombres de sessions établies et des temps
2352globaux très longs sur les requêtes. Pour contourner ce problème, la version
23531.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
2354vers le serveur dès qu'il commence à répondre et seulement si le tampon de
2355requête est vide. Attention toutefois à ne PAS utiliser cette option si des
2356méthodes CONNECT sont attendues entre le client et le serveur. L'option
2357'forceclose' implique l'option 'httpclose'.
2358
2359Exemple :
2360---------
2361 listen http_proxy 0.0.0.0:80
2362 mode http
2363 log global
2364 option httplog
2365 option dontlognull
2366 option forwardfor
2367 option forceclose
2368
2369
willy tarreauc29948c2005-12-17 13:10:27 +010023704.4) Répartition avec persistence
2371---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002372La combinaison de l'insertion de cookie avec la répartition de charge interne
2373permet d'assurer une persistence dans les sessions HTTP d'une manière
2374pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01002375 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01002376 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01002377 - insérer un cookie dans les réponses issues d'une répartition uniquement,
2378 et faire en sorte que des caches ne mémorisent pas ce cookie.
2379 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002380
2381Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01002382---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002383 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002384 mode http
2385 cookie SERVERID insert nocache indirect
2386 balance roundrobin
2387 server srv1 192.168.1.1:80 cookie server01 check
2388 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01002389
willy tarreau0174f312005-12-18 01:02:42 +01002390L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
2391cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
2392Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
2393client et le serveur de travailler en mode "keep-alive" afin que le proxy
2394puisse corriger le nom du cookie dans toutes les futures requêtes.
2395
2396 listen application 0.0.0.0:80
2397 mode http
2398 cookie JSESSIONID prefix
2399 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002400 server srv1 192.168.1.1:80 cookie srv1 check
2401 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002402 option httpclose
2403
2404
willy tarreau982249e2005-12-18 00:57:06 +010024054.5) Protection contre les fuites d'informations du serveur
2406-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002407Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002408créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002409'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2410un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2411activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002412 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002413 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002414 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002415 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002416 un en-tête 'Cache-control: public' ;
2417 - celles qui ont un en-tête 'Pragma: no-cache' ;
2418 - celles qui ont un en-tête 'Cache-control: private' ;
2419 - celles qui ont un en-tête 'Cache-control: no-store' ;
2420 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2421 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2422 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2423 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2424 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002425 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002426
willy tarreau982249e2005-12-18 00:57:06 +01002427Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2428même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2429message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2430dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002431en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002432l'administrateur sache qu'il y a une action correctrice à entreprendre.
2433
24344.6) Personalisation des erreurs
2435--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002436Certaines situations conduisent à retourner une erreur HTTP au client :
2437 - requête invalide ou trop longue => code HTTP 400
2438 - requête mettant trop de temps à venir => code HTTP 408
2439 - requête interdite (bloquée par un reqideny) => code HTTP 403
2440 - erreur interne du proxy => code HTTP 500
2441 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2442 - aucun serveur disponible pour cette requête => code HTTP 503
2443 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2444
2445Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2446Cependant, en fonction du type de clientèle, on peut préférer retourner des
Willy Tarreau3f49b302007-06-11 00:29:26 +02002447pages personnalisées. Ceci est possible de deux manières, l'une reposant sur
2448une redirection vers un serveur connu, et l'autre consistant à retourner un
2449fichier local.
2450
24514.6.1) Redirection
2452------------------
2453Une redirection d'erreur est assurée par le biais de la commande "errorloc" :
willy tarreau8337c6b2005-12-17 13:41:01 +01002454
2455 errorloc <code_HTTP> <location>
2456
2457Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2458le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2459d'une page précisée dans <location>. Cette adresse peut être relative au site,
2460ou absolue. Comme cette réponse est traîtée par le navigateur du client
2461lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2462
2463Exemple :
2464---------
2465 listen application 0.0.0.0:80
2466 errorloc 400 /badrequest.html
2467 errorloc 403 /forbidden.html
2468 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002469 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002470 errorloc 502 http://192.168.114.58/error50x.html
2471 errorloc 503 http://192.168.114.58/error50x.html
2472 errorloc 504 http://192.168.114.58/error50x.html
2473
willy tarreauc1f47532005-12-18 01:08:26 +01002474Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2475accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2476problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2477régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2478dans le champ Location avec la méthode GET uniquement. Seulement, certains
2479navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2480plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2481devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002482l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2483visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002484
2485Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2486utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2487dès que vous savez que vos clients supportent le code de retour HTTP 303.
2488
Willy Tarreau3f49b302007-06-11 00:29:26 +020024894.6.2) Fichiers locaux
2490----------------------
2491Parfois il est souhaitable de changer l'erreur retournée sans recourir à des
2492redirections. La seconde méthode consiste à charger des fichiers locaux lors
2493du démarrage et à les envoyer en guise de pur contenu HTTP en cas d'erreur.
2494C'est ce que fait le mot clé 'errorfile'.
2495
2496Attention, il y a des pièges à prendre en compte :
2497 - les fichiers sont chargés durant l'analyse de la configuration, avant de
2498 faire le chroot(). Donc ils sont relatifs au système de fichiers réel. Pour
2499 cette raison, il est recommandé de toujours passer un chemin absolu vers ces
2500 fichiers.
2501
2502 - le contenu de ces fichiers n'est pas du HTML mais vraiment du protocole HTTP
2503 avec potentiellement un corps HTML. Donc la première ligne et les en-têtes
2504 sont obligatoires. Idéalement, chaque ligne dans la partie HTTP devrait se
2505 terminer par un CR-LF pour un maximum de compatibilité.
2506
2507 - les réponses sont limitées à une taille de buffer (BUFSIZE), généralement 8
2508 ou 16 ko.
2509
2510 - les réponses ne devraient pas inclure de références aux serveurs locaux,
2511 afin de ne pas risquer de créer des boucles infinies sur le navigateur dans
2512 le cas d'une panne locale.
2513
2514Exemple :
2515---------
2516 errorfile 400 /etc/haproxy/errorfiles/400badreq.http
2517 errorfile 403 /etc/haproxy/errorfiles/403forbid.http
2518 errorfile 503 /etc/haproxy/errorfiles/503sorry.http
2519
2520
willy tarreau982249e2005-12-18 00:57:06 +010025214.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002522--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002523Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2524évite de répéter des paramètres communs à toutes les instances, tels que les
2525timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002526
2527Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2528précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2529'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2530section implique une annulation de tous les paramètres par défaut positionnés
2531précédemment, dans le but de les remplacer.
2532
2533La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2534paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2535un commentaire en guise paramètre.
2536
willy tarreau982249e2005-12-18 00:57:06 +01002537Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2538positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002539 - log (le premier et le second)
2540 - mode { tcp, http, health }
2541 - balance { roundrobin }
2542 - disabled (pour désactiver toutes les instances qui suivent)
2543 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2544 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002545 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2546 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002547 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002548 - cookie, capture
2549 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002550
2551Ne sont pas supportés dans cette version, les adresses de dispatch et les
2552configurations de serveurs, ainsi que tous les filtres basés sur les
2553expressions régulières :
2554 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002555 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002556
2557Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2558positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2559défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2560paramètres par défaut avant la déclaration de l'instance.
2561
2562Exemples :
2563----------
2564 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002565 log global
2566 mode tcp
2567 balance roundrobin
2568 clitimeout 180000
2569 srvtimeout 180000
2570 contimeout 4000
2571 retries 3
2572 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002573
2574 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002575 server srv1 192.168.1.1 check port 6000 inter 10000
2576 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002577
2578 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002579 server srv1 192.168.2.1 check port 6000 inter 10000
2580 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002581
2582 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002583 log global
2584 mode http
2585 option httplog
2586 option forwardfor
2587 option dontlognull
2588 balance roundrobin
2589 clitimeout 20000
2590 srvtimeout 20000
2591 contimeout 4000
2592 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002593
2594 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002595 cookie SERVERID postonly insert indirect
2596 capture cookie userid= len 10
2597 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2598 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002599
2600 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002601 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002602
willy tarreau8f635a42006-05-21 23:05:54 +02002603
26044.8) Rapport d'état sous forme de page HTML
2605-------------------------------------------
2606Avec la version 1.2.14, il devient possible pour haproxy d'interceptre des
2607requêtes pour une URI particulière et de retourner un rapport complet d'état de
2608l'activité du proxy, et des statistiques sur les serveurs. Ceci est disponible
2609via le mot clé "stats" associé à n'importe laquelle de ces options :
2610
2611 - stats enable
2612 - stats uri <uri prefix>
2613 - stats realm <authentication realm>
2614 - stats auth <user:password>
2615 - stats scope <proxy_id> | '.'
2616
2617
2618Par défaut, le rapport est désactivé. Le fait de spécifier une des combinaision
2619ci-dessus active le rapport pour l'instance de proxy qui le référence. La
2620solution la plus simple est d'utiliser "stats enable" qui activera le rapport
2621avec les paramètres par défaut suivant :
2622
2623 - default URI : "/haproxy?stats" (CONFIG_STATS_DEFAULT_URI)
2624 - default auth : non spécifié (pas d'authentication)
2625 - default realm : "HAProxy Statistics" (CONFIG_STATS_DEFAULT_REALM)
2626 - default scope : non specifié (accès à toutes les instances)
2627
2628L'option "stats uri <uri_prefix>" permet d'intercepter un autre préfixe d'URI
2629que celui par défaut. Noter que n'importe quelle URI qui COMMENCE avec cette
2630chaîne sera validée. Par exemple, une instance pourrait être dédiée à la page
2631d'état seulement et répondre à toute URI.
2632
2633Example :
2634---------
2635 # intercepte n'importe quelle URI et retourne la page d'état.
2636 listen stats :8080
2637 mode http
2638 stats uri /
2639
2640
2641L'option "stats auth <user:password>" active l'authentification "Basic" et
2642ajoute un couple "user:password" valide à la liste des comptes autorisés.
2643L'utilisateur <user> et le mot de passe <password> doivent être précisés
2644en clair dans le fichier de configuration, et comme ceci est de
2645l'authentification HTTP "Basic", il faut être conscient qu'ils transitent en
2646clair sur le réseau, donc il ne faut pas utiliser de compte sensible. La liste
2647est illimitée dans le but de pouvoir fournir des accès facilement à des
2648développeurs ou à des clients.
2649
2650L'option "stats realm <realm>" définit le "domaine" ("realm") de validité du
2651mot de passe qui sera présenté dans la boîte de dialogue du navigateur
2652lorsqu'il demandera un compte utilisateur et un mot de passe. Il est important
2653de s'assurer que celui-ci soit différent de ceux utilisés par l'application,
2654autrement le navigateur tentera d'en utiliser un caché depuis l'application.
2655Noter que les espaces dans le nom de "realm" doivent être protégés par un
2656backslash ('\').
2657
2658L'option "stats scope <proxy_id>" limite la portée du rapport d'état. Par
2659défaut, toutes les instances proxy sont listées. Mais dans certaines
2660circonstances, il serait préférable de ne lister que certains proxies ou
2661simplement le proxy courant. C'est ce que fait cette option. Le nom spécial "."
2662(un simple point) référence le proxy courant. Cette option peut être répétée
2663autant de fois que nécessaire pour autoriser d'autres proxies, même pour des
2664noms référencés plus loin dans la configuration ou bien des noms qui n'existent
2665pas encore. Le nom précisé est celui qui apparait après le mot clé "listen".
2666
2667Exemple :
2668---------
2669 # simple application embarquant la page d'état authentifiée
2670 listen app1 192.168.1.100:80
2671 mode http
2672 option httpclose
2673 balance roundrobin
2674 cookie SERVERID postonly insert indirect
2675 server srv1 192.168.1.1:8080 cookie srv1 check inter 1000
2676 server srv1 192.168.1.2:8080 cookie srv2 check inter 1000
2677 stats uri /my_stats
2678 stats realm Statistics\ for\ MyApp1-2
2679 stats auth guest:guest
2680 stats auth admin:AdMiN123
2681 stats scope .
2682 stats scope app2
2683
2684 # simple application embarquant la page d'état sans authentification
2685 listen app2 192.168.2.100:80
2686 mode http
2687 option httpclose
2688 balance roundrobin
2689 cookie SERVERID postonly insert indirect
2690 server srv1 192.168.2.1:8080 cookie srv1 check inter 1000
2691 server srv1 192.168.2.2:8080 cookie srv2 check inter 1000
2692 stats uri /my_stats
2693 stats realm Statistics\ for\ MyApp2
2694 stats scope .
2695
2696 listen admin_page :8080
2697 mode http
2698 stats uri /my_stats
2699 stats realm Global\ statistics
2700 stats auth admin:AdMiN123
2701
2702Notes :
2703-------
2704 - les options "stats" peuvent aussi être spécifiées dans une section
2705 "defaults", auquel cas la même configuration exactement sera fournie à
2706 toutes les instances suivantes, d'où l'utilité du scope ".". Toutefois, si
2707 une instance redéfinit n'importe quel paramètre "stats", alors les défauts
2708 ne lui seront pas appliqués.
2709
2710 - l'authentification "Basic" est très simpliste et non sécurisée contre la
2711 capture réseau. Aucun mot de passe sensible ne doit être utilisé, et il
2712 est bon de savoir qu'il n'existe pas de moyen de le supprimer du navigateur
2713 après usage, donc il sera envoyé tel quel à l'application au cours des
2714 accès successifs.
2715
2716 - Il est très important de préciser l'option "httpclose", sinon le proxy ne
2717 sera pas en mesure de détecter les URI dans les sessions keep-alive
2718 maintenues entre le navigateur et les serveurs, donc les URI de stats
2719 seront transmises telles quelles aux serveurs comme si l'option n'était
2720 pas précisée.
2721
2722
Willy Tarreau726c2bf2007-05-09 01:31:45 +020027235) Listes d'accès
2724=================
2725
2726Avec la version 1.3.10, un nouveau concept de listes d'accès (ACL) a vu le
2727jour. Comme il n'était pas nécessaire de réinventer la roue, et du fait que
2728toutes les réflexions passées aboutissaient à des propositions non
2729satisfaisantes, il a finalement été décidé que quelque chose de proche de ce
2730que Squid offre serait un bon compromis entre une richesse fonctionnelle et une
2731facilité d'utilisation
2732
2733Le principe est très simple : les ACLs sont déclarées avec un nom, un test et
2734une liste de valeurs valides à tester. Des conditions sont appliquées sur
2735diverses actions, et ces conditions effectuent un ET logique entre les ACLs. La
2736condition n'est donc validée que si toutes les ACLs sont vraies.
2737
2738Il est également possible d'utiliser le mot réservé "OR" dans les conditions,
2739et il est possible pour une ACL d'être spécifiée plusieurs fois, même avec des
2740tests différents, auquel cas le premier test réussi validera l'ACL.
2741
Willy Tarreauae8b7962007-06-09 23:10:04 +02002742Au stade de la version 1.3.12, seuls les tests suivants ont été implémentés :
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002743
2744 Niveaux 3/4 :
2745 src <ipv4_address>[/mask] ... : match IPv4 source address
2746 dst <ipv4_address>[/mask] ... : match IPv4 destination address
Willy Tarreauae8b7962007-06-09 23:10:04 +02002747 src_port <range> ... : match source port range
2748 dst_port <range> ... : match destination port range
2749 dst_conn <range> ... : match #connections on frontend
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002750
2751 Niveau 7 :
2752 method <HTTP method> ... : match HTTP method
2753 req_ver <1.0|1.1> ... : match HTTP request version
2754 resp_ver <1.0|1.1> ... : match HTTP response version
Willy Tarreauae8b7962007-06-09 23:10:04 +02002755 status <range> ... : match HTTP response status code in range
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002756 url <string> ... : exact string match on URI
2757 url_reg <regex> ... : regex string match on URI
2758 url_beg <string> ... : true if URI begins with <string>
2759 url_end <string> ... : true if URI ends with <string>
2760 url_sub <string> ... : true if URI contains <string>
2761 url_dir <string> ... : true if URI contains <string> between slashes
2762 url_dom <string> ... : true if URI contains <string> between slashes or dots
2763
Willy Tarreauae8b7962007-06-09 23:10:04 +02002764Une plage ('range') est constituée d'un ou deux entiers qui peuvent être
2765préfixés d'un opérateur. La syntaxe est :
2766
2767 [<op>] <min>[:<max>]
2768
2769Avec <op> pouvant être :
2770 'eq' : la valeur doit égaler <min> ou être comprise entre <min> et <max>
2771 'le' : la valeur doit être inférieure ou égale à <min>
2772 'lt' : la valeur doit être strictement inférieure à <min>
2773 'ge' : la valeur doit être supérieure ou égale à <min>
2774 'gt' : la valeur doit être strictement supérieure à <min>
2775
2776Lorsqu'aucun opérateur n'est défini, 'eq' est employé. Noter que lorsqu'un
2777opérateur est spécifié, il s'applique à toutes les plages de valeurs suivantes
2778jusqu'à la fin de la ligne ou bien jusqu'à ce qu'un nouvel opérateur soit
2779précisé. Exemple :
2780
2781 acl status_error status 400:599
2782 acl saturated_frt dst_conn ge 1000
2783 acl invalid_ports src_port lt 512 ge 65535
2784
Willy Tarreau726c2bf2007-05-09 01:31:45 +02002785D'autres tests arrivent (entêtes, cookies, heure, authentification), c'est
2786juste une question de temps. Il est aussi prévu de permettre de lire les
2787valeurs depuis un fichier, ainsi que d'ignorer la casse pour certains tests.
2788
2789La seule commande supportant les conditions d'ACL à ce jour est la nouvelle
2790commande "block" qui bloque une requête et retourne un statut 403 si sa
2791condition est validée (cas du "if") ou invalidée (cas du "unless").
2792
2793Exemple :
2794---------
2795
2796 acl options_uris url *
2797 acl meth_option method OPTIONS
2798 acl http_1.1 req_ver 1.1
2799 acl allowed_meth method GET HEAD POST OPTIONS CONNECT
2800 acl connect_meth method CONNECT
2801 acl proxy_url url_beg http://
2802
2803 # block if reserved URI "*" used with a method other than "OPTIONS"
2804 block if options_uris !meth_option
2805
2806 # block if the OPTIONS method is used with HTTP 1.0
2807 block if meth_option !http_1.1
2808
2809 # allow non-proxy url with anything but the CONNECT method
2810 block if !connect_meth !proxy_url
2811
2812 # block all unknown methods
2813 block unless allowed_meth
2814
2815Note: Cette documentation est embryonnaire mais doit permettre de démarrer et
2816surtout d'avancer sur le projet sans être trop ralenti par la documentation.
2817
2818
willy tarreaub719f002005-12-17 12:55:07 +01002819=======================
2820| Paramétrage système |
2821=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002822
2823Sous Linux 2.4
2824==============
2825
willy tarreaub719f002005-12-17 12:55:07 +01002826-- cut here --
2827#!/bin/sh
2828# set this to about 256/4M (16384 for 256M machine)
2829MAXFILES=16384
2830echo $MAXFILES > /proc/sys/fs/file-max
2831ulimit -n $MAXFILES
2832
2833if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002834 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002835fi
2836
2837if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002838 # 30 seconds for fin, 15 for time wait
2839 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2840 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2841 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2842 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002843fi
2844
willy tarreau0f7af912005-12-17 12:21:26 +01002845echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002846echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2847echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002848echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002849echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2850echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002851echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2852echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002853echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002854echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002855echo 0 > /proc/sys/net/ipv4/tcp_dsack
2856
2857# auto-tuned on 2.4
2858#echo 262143 > /proc/sys/net/core/rmem_max
2859#echo 262143 > /proc/sys/net/core/rmem_default
2860
2861echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2862echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2863
2864-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002865
willy tarreau197e8ec2005-12-17 14:10:59 +01002866Sous FreeBSD
2867============
2868
2869Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2870Clement Laforet <sheepkiller@cultdeadsheep.org>.
2871
2872Pour plus d'informations :
2873http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2874http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2875http://www.freshports.org/net/haproxy
2876
2877
willy tarreau0f7af912005-12-17 12:21:26 +01002878-- fin --