blob: 6da1e03bdf4b67bc7615b881ac0776cbc5ed85e9 [file] [log] [blame]
willy tarreau0174f312005-12-18 01:02:42 +01001 -------------------
Willy Tarreau94b45912006-05-31 06:40:15 +02002 HAProxy
willy tarreau0174f312005-12-18 01:02:42 +01003 Manuel de référence
4 -------------------
Willy Tarreau2272dc12006-09-03 10:19:38 +02005 version 1.3.2
willy tarreauc5f73ed2005-12-18 01:26:38 +01006 willy tarreau
Willy Tarreau2272dc12006-09-03 10:19:38 +02007 2006/09/03
willy tarreau0f7af912005-12-17 12:21:26 +01008
willy tarreaub719f002005-12-17 12:55:07 +01009================
10| Introduction |
11================
willy tarreau0f7af912005-12-17 12:21:26 +010012
Willy Tarreau94b45912006-05-31 06:40:15 +020013HAProxy est un relais TCP/HTTP offrant des facilités d'intégration en
willy tarreau0f7af912005-12-17 12:21:26 +010014environnement hautement disponible. En effet, il est capable de :
willy tarreauc29948c2005-12-17 13:10:27 +010015 - effectuer un aiguillage statique défini par des cookies ;
willy tarreau64a3cc32005-12-18 01:13:11 +010016 - effectuer une répartition de charge avec création de cookies pour assurer
17 la persistence de session ;
willy tarreau0f7af912005-12-17 12:21:26 +010018 - fournir une visibilité externe de son état de santé ;
willy tarreau8337c6b2005-12-17 13:41:01 +010019 - s'arrêter en douceur sans perte brutale de service ;
willy tarreauc5f73ed2005-12-18 01:26:38 +010020 - modifier/ajouter/supprimer des en-têtes dans la requête et la réponse ;
willy tarreau8337c6b2005-12-17 13:41:01 +010021 - interdire des requêtes qui vérifient certaines conditions ;
22 - utiliser des serveurs de secours lorsque les serveurs principaux sont hors
23 d'usage.
willy tarreau532bb552006-05-13 18:40:37 +020024 - maintenir des clients sur le bon serveur serveur d'application en fonction
25 de cookies applicatifs.
willy tarreau8f635a42006-05-21 23:05:54 +020026 - fournir des rapports d'état en HTML à des utilisateurs authentifiés, à
27 travers des URI de l'application interceptées.
willy tarreau0f7af912005-12-17 12:21:26 +010028
willy tarreau64a3cc32005-12-18 01:13:11 +010029Il requiert peu de ressources, et son architecture événementielle mono-
30processus lui permet facilement de gérer plusieurs milliers de connexions
31simultanées sur plusieurs relais sans effondrer le système.
willy tarreaua1598082005-12-17 13:08:06 +010032
willy tarreau0f7af912005-12-17 12:21:26 +010033
34===========================
35| Paramètres de lancement |
36===========================
37
38Les options de lancement sont peu nombreuses :
39
40 -f <fichier de configuration>
41 -n <nombre maximal total de connexions simultanées>
willy tarreau532bb552006-05-13 18:40:37 +020042 = 'maxconn' dans la section 'global'
43 -N <nombre maximal de connexions simultanées par instance>
44 = 'maxconn' dans les sections 'listen' ou 'default'
willy tarreau0f7af912005-12-17 12:21:26 +010045 -d active le mode debug
46 -D passe en daemon
willy tarreau982249e2005-12-18 00:57:06 +010047 -q désactive l'affichage de messages sur la sortie standard.
48 -V affiche les messages sur la sortie standard, même si -q ou 'quiet' sont
49 spécifiés.
50 -c vérifie le fichier de configuration puis quitte avec un code de retour 0
51 si aucune erreur n'a été trouvée, ou 1 si une erreur de syntaxe a été
52 détectée.
willy tarreaufe2c5c12005-12-17 14:14:34 +010053 -p <fichier> indique au processus père qu'il doit écrire les PIDs de ses
54 fils dans ce fichier en mode démon.
willy tarreau34f45302006-04-15 21:37:14 +020055 -sf specifie une liste de PIDs auxquels envoyer un signal FINISH
56 -st specifie une liste de PIDs auxquels envoyer un signal TERMINATE
willy tarreau0f7af912005-12-17 12:21:26 +010057 -s affiche les statistiques (si option compilée)
58 -l ajoute des informations aux statistiques
Willy Tarreaude99e992007-04-16 00:53:59 +020059 -dk désactive l'utilisation de kqueue()
60 -ds désactive l'utilisation de epoll() speculatif
willy tarreau64a3cc32005-12-18 01:13:11 +010061 -de désactive l'utilisation de epoll()
62 -dp désactive l'utilisation de poll()
willy tarreau34f45302006-04-15 21:37:14 +020063 -db désactive la mise en arrière-plan (utile pour débugger)
64 -m <megs> applique une limitation de <megs> Mo d'utilisation mémoire
willy tarreau0f7af912005-12-17 12:21:26 +010065
willy tarreau64a3cc32005-12-18 01:13:11 +010066Le nombre maximal de connexion simultanées par proxy est le paramètre par
67défaut pour les proxies pour lesquels ce paramètre n'est pas précisé dans le
68fichier de configuration. Il s'agit du paramètre 'maxconn' dans les sections
69'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010070
willy tarreau64a3cc32005-12-18 01:13:11 +010071Le nombre maximal total de connexions simultanées limite le nombre de
72connexions TCP utilisables à un instant donné par le processus, tous proxies
73confondus. Ce paramètre remplace le paramètre 'maxconn' de la section 'global'.
willy tarreaua1598082005-12-17 13:08:06 +010074
willy tarreauc29948c2005-12-17 13:10:27 +010075Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
willy tarreauc5f73ed2005-12-18 01:26:38 +010076mode, toutes les connexions, déconnexions, et tous les échanges d'en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +010077sont affichés.
78
willy tarreau34f45302006-04-15 21:37:14 +020079Pour debugger, l'option '-db' est très pratique car elle désactive
80temporairement le mode daemon et le mode multi-processus. Le service peut alors
81être arrêté par un simple appui sur Ctrl-C, sans avoir à modifier la
82configuration ni à activer le mode debug complet.
83
willy tarreauc29948c2005-12-17 13:10:27 +010084Les statistiques ne sont disponibles que si le programme a été compilé avec
85l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
willy tarreau8f635a42006-05-21 23:05:54 +020086d'utilité que lors de benchmarks par exemple, et sont amenées à disparaitre.
willy tarreauc29948c2005-12-17 13:10:27 +010087
willy tarreau532bb552006-05-13 18:40:37 +020088Les paramètres '-st' et '-sf' sont utilisés pour la reconfiguration à chaud.
89Voir la section à ce sujet.
willy tarreau0f7af912005-12-17 12:21:26 +010090
91============================
92| Fichier de configuration |
93============================
94
willy tarreauc29948c2005-12-17 13:10:27 +010095Structure
96=========
willy tarreau0f7af912005-12-17 12:21:26 +010097
willy tarreaua1598082005-12-17 13:08:06 +010098L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
willy tarreau64a3cc32005-12-18 01:13:11 +010099les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est
100pas précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +0100101
102Le fichier de configuration est découpé en sections répérées par des mots clés
103tels que :
104
105 - 'global'
106 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +0100107 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +0100108
109Tous les paramètres font référence à la section définie par le dernier mot clé
110reconnu.
111
112
willy tarreauc29948c2005-12-17 13:10:27 +01001131) Paramètres globaux
114=====================
willy tarreaua1598082005-12-17 13:08:06 +0100115
116Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
117proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
118supportés sont :
119
willy tarreau8337c6b2005-12-17 13:41:01 +0100120 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100121 - maxconn <nombre>
122 - uid <identifiant>
123 - gid <identifiant>
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200124 - user <nom d'utilisateur>
125 - group <nom de groupe>
willy tarreaua1598082005-12-17 13:08:06 +0100126 - chroot <répertoire>
127 - nbproc <nombre>
128 - daemon
129 - debug
Willy Tarreaude99e992007-04-16 00:53:59 +0200130 - nokqueue
131 - nosepoll
willy tarreau64a3cc32005-12-18 01:13:11 +0100132 - noepoll
133 - nopoll
willy tarreaua1598082005-12-17 13:08:06 +0100134 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100135 - pidfile <fichier>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100136 - ulimit-n <nombre>
137
willy tarreaua1598082005-12-17 13:08:06 +0100138
1391.1) Journalisation des événements
140----------------------------------
141La plupart des événements sont journalisés : démarrages, arrêts, disparition et
142apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
143syslog vers un ou deux serveurs. La syntaxe est la suivante :
144
willy tarreau8337c6b2005-12-17 13:41:01 +0100145 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100146
147Les connexions sont envoyées en niveau "info". Les démarrages de service et de
148serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
149arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau64a3cc32005-12-18 01:13:11 +0100150bien pour les proxies que pour les serveurs testés par les proxies. Le
151paramètre optionnel <niveau_max> définit le niveau maximal de traces émises
152parmi les 8 valeurs suivantes :
willy tarreau8337c6b2005-12-17 13:41:01 +0100153 emerg, alert, crit, err, warning, notice, info, debug
154
willy tarreaueedaa9f2005-12-17 14:08:03 +0100155Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100156est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100157
158Les catégories possibles sont :
159 kern, user, mail, daemon, auth, syslog, lpr, news,
160 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
161 local0, local1, local2, local3, local4, local5, local6, local7
162
willy tarreau036e1ce2005-12-17 13:46:33 +0100163Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
164
willy tarreaua1598082005-12-17 13:08:06 +0100165Exemple :
166---------
167 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100168 log 192.168.2.200 local3
169 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100170
1711.2) limitation du nombre de connexions
172---------------------------------------
173Il est possible et conseillé de limiter le nombre global de connexions par
willy tarreauc5f73ed2005-12-18 01:26:38 +0100174processus à l'aide du mot clé global 'maxconn'. Les connexions sont comprises
175au sens 'acceptation de connexion', donc il faut s'attendre en règle général à
176avoir un peu plus du double de sessions TCP que le maximum de connexions fixé.
177C'est important pour fixer le paramètre 'ulimit -n' avant de lancer le proxy.
178Pour comptabiliser le nombre de sockets nécessaires, il faut prendre en compte
179ces paramètres :
180
willy tarreaua1598082005-12-17 13:08:06 +0100181 - 1 socket par connexion entrante
182 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100183 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100184 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100185 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100186
willy tarreau64a3cc32005-12-18 01:13:11 +0100187Dans le cas où chaque proxy n'écoute que sur un couple adresse/port,
willy tarreauc5f73ed2005-12-18 01:26:38 +0100188positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
189(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
190il est possible de spécifier cette limite dans la configuration à l'aide du
191mot-clé global 'ulimit-n', à condition bien entendu que le proxy ait été
192démarré sous le compte root (ou avec des droits suffisants pour élever le
193nombre de descripteurs de fichiers). Cette solution met un terme au problème
194récurrent d'incertitude de l'adéquation entre les limites systèmes lors de la
195dernière relance du proxessus et les limites en nombre de connexions. Noter que
196cette limite s'applique par processus.
197
198Exemple :
199---------
200 global
201 maxconn 32000
202 ulimit-n 65536
203
willy tarreauc29948c2005-12-17 13:10:27 +0100204
2051.3) Diminution des privilèges
206------------------------------
207Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
208serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100209de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100210
willy tarreauc29948c2005-12-17 13:10:27 +0100211Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
212numérique d'utilisateur. La valeur 0, correspondant normalement au super-
213utilisateur, possède ici une signification particulière car elle indique que
214l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
215C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
216un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200217changer. Dans le cas où il ne serait pas possible de spécifier un identifiant
218numérique pour l'uid, il est possible de spécifier un nom d'utilisateur après
219le mot-clé 'user'. De la même manière, il est possible de préciser un nom de
220groupe après le mot-clé 'group'.
221
222Il est particulièrement déconseillé d'utiliser des comptes génériques tels que
223'nobody' car cette pratique revient à utiliser 'root' si d'autres processus
224utilisent les mêmes identifiants.
willy tarreauc29948c2005-12-17 13:10:27 +0100225
226Le paramètre 'chroot' autorise à changer la racine du processus une fois le
227programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100228puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100229généralement contournable sur certains OS (Linux, Solaris) pour peu que
230l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
231un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
232service pour cet usage, et de ne pas mutualiser un même répertoire pour
233plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
234il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
235l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100236
willy tarreau64a3cc32005-12-18 01:13:11 +0100237Remarque importante :
238---------------------
239Dans le cas où une telle faille serait mise en évidence, il est fort probable
240que les premières tentatives de son exploitation provoquent un arrêt du
willy tarreauc29948c2005-12-17 13:10:27 +0100241programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
willy tarreau64a3cc32005-12-18 01:13:11 +0100242encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur
243en environnement limité réduit les risques d'intrusion, il est parfois bien
244utile dans ces circonstances de connaître les conditions d'apparition du
245problème, via l'obtention d'un fichier 'core'. La plupart des systèmes, pour
246des raisons de sécurité, désactivent la génération du fichier 'core' après un
247changement d'identifiant pour le processus. Il faudra donc soit lancer le
248processus à partir d'un compte utilisateur aux droits réduits (mais ne pouvant
249pas effectuer le chroot), ou bien le faire en root sans réduction des droits
250(uid 0). Dans ce cas, le fichier se trouvera soit dans le répertoire de
251lancement, soit dans le répertoire spécifié après l'option 'chroot'. Ne pas
252oublier la commande suivante pour autoriser la génération du fichier avant de
253lancer le programme :
willy tarreauc29948c2005-12-17 13:10:27 +0100254
255# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100256
willy tarreauc29948c2005-12-17 13:10:27 +0100257Exemple :
258---------
259
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200260 # with uid/gid
willy tarreauc29948c2005-12-17 13:10:27 +0100261 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100262 uid 30000
263 gid 30000
264 chroot /var/chroot/haproxy
willy tarreauc29948c2005-12-17 13:10:27 +0100265
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200266 # with user/group
267 global
268 user haproxy
269 group public
270 chroot /var/chroot/haproxy
271
272
willy tarreaufe2c5c12005-12-17 14:14:34 +01002731.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100274----------------------------
275Le service peut fonctionner dans plusieurs modes :
276 - avant- / arrière-plan
277 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100278
willy tarreau64a3cc32005-12-18 01:13:11 +0100279Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne
280rend pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci
281dans un script de démarrage du système, sinon le système ne finirait pas son
willy tarreauc29948c2005-12-17 13:10:27 +0100282initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
283au processus appelant. C'est ce que fait l'option 'daemon' de la section
284'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100285
willy tarreau34f45302006-04-15 21:37:14 +0200286Le paramètre de ligne de commande '-db' inhibe les options globales 'daemon'
287et 'nbproc' pour faire fonctionner le processus en mode normal, avant-plan.
288
willy tarreauc29948c2005-12-17 13:10:27 +0100289Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
290standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
291logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
292Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100293
willy tarreauc29948c2005-12-17 13:10:27 +0100294Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
295problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
296entre les clients et les serveurs. Ce mode est incompatible avec les options
297'daemon' et 'quiet' pour des raisons de bon sens.
298
willy tarreaufe2c5c12005-12-17 14:14:34 +01002991.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100300-----------------------------------------------
301Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
302processeur pour effectuer les tâches de relayage, même si les charges
303nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
304grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
305programme sait démarrer plusieurs processus se répartissant la charge de
306travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
307section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100308qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
309la limite de nombre de descripteurs de fichiers allouée par processus sous
310Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100311
312Exemple :
313---------
314
315 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100316 daemon
317 quiet
318 nbproc 2
willy tarreauc29948c2005-12-17 13:10:27 +0100319
willy tarreaufe2c5c12005-12-17 14:14:34 +01003201.6) Simplification de la gestion des processus
321-----------------------------------------------
322Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
323paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
324d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
325le numéro de PID des processus fils, à raison d'un par ligne (valable
326uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
327afin de rester compatible avec un répertoire protégé en lecture seule. Il
328appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
3290644.
330
331Exemple :
332---------
333
334 global
335 daemon
336 quiet
337 nbproc 2
338 pidfile /var/run/haproxy-private.pid
339
340 # pour stopper seulement ces processus parmi d'autres :
341 # kill $(</var/run/haproxy-private.pid)
342
willy tarreau34f45302006-04-15 21:37:14 +0200343 # pour recharger une configuration avec un impact minimal sur le service,
344 # et sans casser les sessions existantes :
345 # haproxy -f haproxy.cfg -p $(</var/run/haproxy-private.pid) -st $(</var/run/haproxy-private.pid)
willy tarreauc29948c2005-12-17 13:10:27 +0100346
willy tarreau64a3cc32005-12-18 01:13:11 +01003471.7) Mécanismes de traitements des événements
348---------------------------------------------
349A partir de la version 1.2.5, haproxy supporte les mécanismes poll() et
350epoll(). Sur les systems où select() est limité par FD_SETSIZE (comme Solaris),
351poll() peut être une alternative intéressante. Des tests de performance
352montrent que les performances de poll() ne décroissent pas aussi vite que le
353nombre de sockets augmente, ce qui en fait une solution sûre pour les fortes
354charges. Cela dit, Soalris utilise déjà poll() pour émuler select(), donc tant
355que le nombre de sockets ne dépasse pas FD_SETSIZE, poll() ne devrait pas
356apporter de performances supplémentaires. Sur les systèmes à base Linux
357incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
358qui est extrèmement rapide indépendamment du nombre de sockets. Les tests sur
359haproxy ont montré une performance constante de 1 à 40000 sessions simultanées.
Willy Tarreaude99e992007-04-16 00:53:59 +0200360La version 1.3.9 a introduit le support de kqueue() pour FreeBSD/OpenBSD, ainsi
361qu'une variante appelée "speculative epoll()" consistant à tenter d'effectuer
362les opérations d'entrées/sorties avant de chaîner les événements par les appels
363système.
willy tarreau64a3cc32005-12-18 01:13:11 +0100364
Willy Tarreaude99e992007-04-16 00:53:59 +0200365Haproxy utilisera kqueue() ou speculative epoll() lorsque ce sera disponible,
366puis epoll(), et se repliera sur poll(), puis en dernier lieu sur select().
367Cependant, si pour une raison quelconque il s'avérait nécessaire de désactiver
368epoll() ou poll() (p.ex: à cause d'un bug ou juste pour comparer les
369performances), de nouvelles options globales ont été ajoutées dans ce but :
370'nosepoll', 'nokqueue', 'noepoll' et 'nopoll'.
willy tarreau64a3cc32005-12-18 01:13:11 +0100371
372Exemple :
373---------
374 global
375 # utiliser seulement select()
376 noepoll
377 nopoll
378
379Remarque :
380----------
381Dans le but d'assurer une portabilité maximale des configurations, ces options
382sont acceptées et ignorées si les mécanismes poll() ou epoll() n'ont pas été
383activés lors de la compilation.
384
385Afin de simplifier la résolution de problèmes, le paramètre '-de' en ligne de
Willy Tarreaude99e992007-04-16 00:53:59 +0200386commande désactive epoll(), le paramètre '-dp' désactive poll(), '-dk' kqueue()
387et '-ds' désactive speculative epoll(). Ils sont respectivement équivalents à
388'noepoll', 'nopoll', 'nokqueue' et 'nosepoll'.
willy tarreau64a3cc32005-12-18 01:13:11 +0100389
390
willy tarreauc29948c2005-12-17 13:10:27 +01003912) Définition d'un service en écoute
392====================================
393
394Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100395
willy tarreaua41a8b42005-12-17 14:02:24 +0100396 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100397
willy tarreauc29948c2005-12-17 13:10:27 +0100398- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
willy tarreau64a3cc32005-12-18 01:13:11 +0100399 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé.
400 Aucun test n'est effectué concernant l'unicité de ce nom, qui n'est pas
401 obligatoire, mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100402
willy tarreaua41a8b42005-12-17 14:02:24 +0100403- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
404 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
405 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100406
willy tarreaua41a8b42005-12-17 14:02:24 +0100407- <plage_ports> correspond soit à un port, soit à une plage de ports sur
408 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
409 Cette plage peut être :
410 - soit un port numérique (ex: '80')
411 - soit une plage constituée de deux valeurs séparées par un tiret
412 (ex: '2000-2100') représentant les extrémités incluses dans la
413 plage.
414 Il faut faire attention à l'usage des plages, car chaque combinaison
415 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
416 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
417 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
willy tarreau64a3cc32005-12-18 01:13:11 +0100418 niveau de privilège particulier lors du lancement du programme
419 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100420
willy tarreaua41a8b42005-12-17 14:02:24 +0100421- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
422 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
423 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
424
425Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100426---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100427 listen http_proxy :80
428 listen x11_proxy 127.0.0.1:6000-6009
429 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
430 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100431
willy tarreaua41a8b42005-12-17 14:02:24 +0100432Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
433rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
434de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
435l'écriture de configurations :
436
437 bind [ <adresse_IP>:<plage_ports>[,...] ]
438
439Exemples :
440----------
441 listen http_proxy
442 bind :80,:443
willy tarreauc5f73ed2005-12-18 01:26:38 +0100443 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100444
willy tarreauc29948c2005-12-17 13:10:27 +01004452.1) Inhibition d'un service
446----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100447Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100448commenter toute une partie du fichier. Il suffit de positionner le mot clé
449"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100450
451 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100452 disabled
willy tarreau0f7af912005-12-17 12:21:26 +0100453
willy tarreaueedaa9f2005-12-17 14:08:03 +0100454Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
willy tarreauc5f73ed2005-12-18 01:26:38 +0100455 désactivé par le mot clé 'disabled', par exemple à cause d'une
456 configuration par défaut.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100457
willy tarreauc29948c2005-12-17 13:10:27 +01004582.2) Mode de fonctionnement
459---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100460Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100461 - TCP
462 - HTTP
willy tarreau532bb552006-05-13 18:40:37 +0200463 - état de santé
willy tarreau0f7af912005-12-17 12:21:26 +0100464
465Mode TCP
466--------
willy tarreau64a3cc32005-12-18 01:13:11 +0100467Dans ce mode, le service relaye, dès leur établissement, les connexions TCP
468vers un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il
469s'agit simplement d'une association
470 source<adresse:port> -> destination<adresse:port>.
willy tarreauc29948c2005-12-17 13:10:27 +0100471Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100472
willy tarreauc29948c2005-12-17 13:10:27 +0100473Exemple :
474---------
willy tarreau0f7af912005-12-17 12:21:26 +0100475 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100476 mode tcp
willy tarreau0f7af912005-12-17 12:21:26 +0100477
478Mode HTTP
479---------
willy tarreauc29948c2005-12-17 13:10:27 +0100480Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
481serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
willy tarreauc5f73ed2005-12-18 01:26:38 +0100482décision. Les en-têtes HTTP sont analysés pour y trouver un éventuel cookie, et
willy tarreauc29948c2005-12-17 13:10:27 +0100483certains d'entre-eux peuvent être modifiés par le biais d'expressions
484régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
485relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100486
willy tarreauc29948c2005-12-17 13:10:27 +0100487Exemple :
488---------
willy tarreau0f7af912005-12-17 12:21:26 +0100489 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100490 mode http
willy tarreau0f7af912005-12-17 12:21:26 +0100491
492Mode supervision
493----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100494Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
495santé du service. Il se contente de retourner "OK" à tout client se connectant
496sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100497déterminer quels sont les services utilisables. Si l'option 'httpchk' est
498activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
499attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100500le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100501
willy tarreauc29948c2005-12-17 13:10:27 +0100502Exemple :
503---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100504 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100505 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100506 mode health
willy tarreau0f7af912005-12-17 12:21:26 +0100507
willy tarreau197e8ec2005-12-17 14:10:59 +0100508 # réponse HTTP : 'HTTP/1.0 200 OK'
509 listen http_health_check 0.0.0.0:60001
willy tarreauc5f73ed2005-12-18 01:26:38 +0100510 mode health
511 option httpchk
willy tarreau197e8ec2005-12-17 14:10:59 +0100512
willy tarreau0f7af912005-12-17 12:21:26 +0100513
willy tarreau532bb552006-05-13 18:40:37 +02005142.2.1 Supervision
515-----------------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100516Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
517bon fonctionnement du proxy sans perturber le service. Le mot-clé 'monitor-net'
518a été créé dans le butd de spécifier un réseau d'équipements qui ne PEUVENT PAS
519utiliser le service pour autre chose que des tests de fonctionnement. C'est
520particulièrement adapté aux proxies TCP, car cela empêche le proxy de relayer
521des établissements de connexion émis par un outil de surveillance.
522
523Lorsque c'est utilisé sur un proxy TCP, la connexion est acceptée puis refermée
524et rien n'est logué. C'est suffisant pour qu'un répartiteur de charge en amont
525détecte que le service est disponible.
526
527Lorsque c'est utilisé sur un proxy HTTP, la connexion est acceptée, rien n'est
528logué, puis la réponse suivante est envoyée et la session refermée :
529"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un répartiteur de charge
530HTTP en amont détecte le service comme opérationnel, aussi bien à travers des
531tests TCP que HTTP.
532
533Les proxies utilisant le mot-clé 'monitor-net' peuvent accessoirement se passer
534de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
535émises depuis d'autres adresses que celles du réseau de tests.
536
537Exemple :
538---------
539
540 listen tse-proxy
541 bind :3389,:1494,:5900 # TSE, ICA and VNC at once.
542 mode tcp
543 balance roundrobin
544 server tse-farm 192.168.1.10
545 monitor-net 192.168.1.252/31 # L4 load-balancers on .252 and .253
546
547
Willy Tarreau1c47f852006-07-09 08:22:27 +0200548Lorsque le système effectuant les tests est situé derrière un proxy, le mot-clé
549'monitor-net' n'est pas utilisable du fait que haproxy verra toujours la même
550adresse pour le proxy. Pour pallier à cette limitation, la version 1.2.15 a
551apporté le mot-clé 'monitor-uri'. Il définit une URI qui ne sera ni retransmise
552ni logée, mais pour laquelle haproxy retournera immédiatement une réponse
553"HTTP/1.0 200 OK". Cela rend possibles les tests de validité d'une chaîne
554reverse-proxy->haproxy en une requête HTTP. Cela peut être utilisé pour valider
555une combinaision de stunnel+haproxy à l'aide de tests HTTPS par exemple. Bien
556entendu, ce mot-clé n'est valide qu'en mode HTTP, sinon il n'y a pas de notion
557d'URI. Noter que la méthode et la version HTTP sont simplement ignorées.
558
559Exemple :
560---------
561
562 listen stunnel_backend :8080
563 mode http
564 balance roundrobin
565 server web1 192.168.1.10:80 check
566 server web2 192.168.1.11:80 check
567 monitor-uri /haproxy_test
568
569
willy tarreauc29948c2005-12-17 13:10:27 +01005702.3) Limitation du nombre de connexions simultanées
571---------------------------------------------------
572Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
573connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
574d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
575limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100576
willy tarreauc29948c2005-12-17 13:10:27 +0100577Exemple :
578---------
579 listen tiny_server 0.0.0.0:80
580 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100581
582
willy tarreauc29948c2005-12-17 13:10:27 +01005832.4) Arrêt en douceur
584---------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100585Il est possible d'arrêter les services en douceur en envoyant un signal
willy tarreau22739ef2006-01-20 20:43:32 +0100586SIGUSR1 au processus relais. Tous les services seront alors mis en phase
willy tarreau64a3cc32005-12-18 01:13:11 +0100587d'arrêt, mais pourront continuer d'accepter des connexions pendant un temps
588défini par le paramètre 'grace' (en millisecondes). Cela permet par exemple,
589de faire savoir rapidement à un répartiteur de charge qu'il ne doit plus
590utiliser un relais, tout en continuant d'assurer le service le temps qu'il
591s'en rende compte.
592
593Remarque :
594----------
595Les connexions actives ne sont jamais cassées. Dans le pire des cas, il faudra
willy tarreau22739ef2006-01-20 20:43:32 +0100596attendre en plus leur expiration avant l'arrêt total du processus, ou bien tuer
597manuellement le processus par l'envoi d'un signal SIGTERM. La valeur par défaut
598du paramètre 'grace' est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100599
600Exemple :
601---------
willy tarreauc29948c2005-12-17 13:10:27 +0100602 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100603 # le service tournera encore 10 secondes après la demande d'arrêt
604 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100605 mode http
606 grace 10000
willy tarreau0f7af912005-12-17 12:21:26 +0100607
willy tarreauc29948c2005-12-17 13:10:27 +0100608 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100609 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100610 mode health
611 grace 0
willy tarreau0f7af912005-12-17 12:21:26 +0100612
willy tarreau39df2dc2006-01-29 21:56:05 +0100613A partir de la version 1.2.8, un nouveau mécanisme de reconfiguration à chaud
willy tarreau22739ef2006-01-20 20:43:32 +0100614a été introduit. Il est désormais possible de mettre les proxies en "pause" en
615envoyant un signal SIGTTOU aux processus. Cela désactivera les sockets d'écoute
616sans casser les sessions existantes. Suite à cela, l'envoi d'un signal SIGTTIN
617réactivera les sockets d'écoute. Ceci est très pratique pour tenter de charger
618une nouvelle configuration ou même une nouvelle version de haproxy sans casser
619les connexions existantes. Si le rechargement s'effectue correctement, il ne
620reste plus qu'à envoyer un signal SIGUSR1 aux anciens processus, ce qui
621provoquera leur arrêt immédiat dès que leurs connexions seront terminées ; en
622revanche, si le rechargement échoue, il suffit d'envoyer un signal SIGTTIN pour
623remettre les ports en écoute et rétablir le service immédiatement. Veuillez
624noter que le paramètre 'grace' est ignoré pour le signal SIGTTOU ainsi que le
625signal SIGUSR1 une fois le processus en pause. Aussi, il peut s'avérer très
626utile de sauver le fichier de pid avant de démarrer une nouvelle instance.
627
willy tarreau34f45302006-04-15 21:37:14 +0200628Ce mécanisme est pleinement exploité à partir de la version 1.2.11 avec les
willy tarreau532bb552006-05-13 18:40:37 +0200629options '-st' et '-sf' (voir ci-dessous).
630
6312.4) Reconfiguration à chaud
632----------------------------
633Les paramètres '-st' et '-sf' sont utilisés pour informer des processus
634existants que la configuration va être rechargée. Ils recevront le signal
635SIGTTOU, leur demandant de libérer les ports en écoute afin que le nouveau
636processus puisse les prendre. Si quoi que ce soit se passe mal, le nouveau
637processus leur enverra un signal SIGTTIN pour leur indiquer qu'ils peuvent
638se remettre en écoute et continuer leur travail. En revanche, si la
639configuration se charge correctement, alors ils recevront un signal de demande
640de fin de travail en douceur (-sf), ou de terminaison immédiate (-st) qui
641coupera les sessions en cours. Un usage typique tel que celui-ci permet de
642recharger une configuration sans interruption de service :
643
644 # haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
645
willy tarreau0f7af912005-12-17 12:21:26 +0100646
willy tarreauc29948c2005-12-17 13:10:27 +01006472.5) Temps d'expiration des connexions
648--------------------------------------
649Il est possible de paramétrer certaines durées d'expiration au niveau des
650connexions TCP. Trois temps indépendants sont configurables et acceptent des
651valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
652session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100653
654 - temps d'attente d'une donnée de la part du client, ou de la
655 possibilité de lui envoyer des données : "clitimeout" :
656
willy tarreauc5f73ed2005-12-18 01:26:38 +0100657 # time-out client à 2mn30.
658 clitimeout 150000
willy tarreau0f7af912005-12-17 12:21:26 +0100659
660 - temps d'attente d'une donnée de la part du serveur, ou de la
661 possibilité de lui envoyer des données : "srvtimeout" :
662
willy tarreauc5f73ed2005-12-18 01:26:38 +0100663 # time-out serveur à 30s.
664 srvtimeout 30000
willy tarreau0f7af912005-12-17 12:21:26 +0100665
666 - temps d'attente de l'établissement d'une connexion vers un serveur
667 "contimeout" :
668
willy tarreauc29948c2005-12-17 13:10:27 +0100669 # on abandonne si la connexion n'est pas établie après 4 secondes
willy tarreauc5f73ed2005-12-18 01:26:38 +0100670 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100671
willy tarreauc29948c2005-12-17 13:10:27 +0100672Remarques :
673-----------
674 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
675 type "health".
676 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
willy tarreau64a3cc32005-12-18 01:13:11 +0100677 possible de perdre des paquets. Du fait que la première retransmission
678 TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
679 inférieur à 3 secondes ne permet pas de se rattraper sur la perte
680 de paquets car la session aura été abandonnée avant la première
681 retransmission. Une valeur de 4 secondes réduira considérablement
682 le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100683
willy tarreauc29948c2005-12-17 13:10:27 +01006842.6) Tentatives de reconnexion
685------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100686Lors d'un échec de connexion vers un serveur, il est possible de
687retenter (potentiellement vers un autre serveur, en cas de répartition
688de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100689abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100690
willy tarreauc29948c2005-12-17 13:10:27 +0100691Exemple :
692---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100693 # on essaie encore trois fois maxi
694 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100695
willy tarreau34f45302006-04-15 21:37:14 +0200696Il est à noter que la tentative de reconnexion peut amener à utiliser un autre
697serveur si le premier a disparu entre deux tentatives de connexion.
698
willy tarreau0f7af912005-12-17 12:21:26 +0100699
willy tarreauc29948c2005-12-17 13:10:27 +01007002.7) Adresse du serveur
701-----------------------
702Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
703le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
704serveur d'assignation de cookie dans le cas où le service consiste à assurer
705uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100706le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
707du serveur distant, et il est maintenant recommandé d'utiliser de préférence
708le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100709
willy tarreauc29948c2005-12-17 13:10:27 +0100710Exemple :
711---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100712 # on envoie toutes les nouvelles connexions ici
713 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100714
willy tarreauc29948c2005-12-17 13:10:27 +0100715Remarque :
716----------
717Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
718'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100719
willy tarreau0f7af912005-12-17 12:21:26 +0100720
willy tarreau240afa62005-12-17 13:14:35 +01007212.8) Adresse de sortie
722----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100723Il est possible de forcer l'adresse utilisée pour établir les connexions vers
724les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
725port, bien que cette fonctionnalité se limite à des usages très spécifiques.
726C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100727pour permettre aux serveurs de trouver le chemin de retour dans des contextes
728de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
729choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
730librement par le système. Il est à noter que depuis la version 1.1.18, les
731tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
732source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100733
734Exemples :
735----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100736 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100737 # toutes les connexions prennent l'adresse 192.168.1.200
738 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100739
willy tarreaua41a8b42005-12-17 14:02:24 +0100740 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100741 # utiliser l'adresse 192.168.1.200 et le port réservé 900
742 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100743
744
7452.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100746--------------------------------
747En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
748vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
749par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100750
willy tarreauc29948c2005-12-17 13:10:27 +0100751Exemple :
752---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100753 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100754 mode http
755 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100756
willy tarreauc29948c2005-12-17 13:10:27 +0100757On peut modifier l'utilisation du cookie pour la rendre plus intelligente
758vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
759réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
760cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100761de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
762inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100763
764Exemples :
765----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100766
767Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100768dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
769directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100770
willy tarreauc5f73ed2005-12-18 01:26:38 +0100771 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100772
willy tarreauc29948c2005-12-17 13:10:27 +0100773Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
774lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100775
willy tarreauc5f73ed2005-12-18 01:26:38 +0100776 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100777
willy tarreau64a3cc32005-12-18 01:13:11 +0100778Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
779accès en répartition de charge interne. Dans ce cas, il est souhaitable que
780tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100781retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100782
willy tarreauc5f73ed2005-12-18 01:26:38 +0100783 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100784
willy tarreau0174f312005-12-18 01:02:42 +0100785Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
786puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
787permet d'insérer une instance de haproxy devant une application sans risquer
788d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
789plus d'un cookie :
790
791 cookie JSESSIONID prefix
792
willy tarreau240afa62005-12-17 13:14:35 +0100793Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
794ajouter le mot clé 'nocache' après 'insert' :
795
willy tarreauc5f73ed2005-12-18 01:26:38 +0100796 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100797
willy tarreau64a3cc32005-12-18 01:13:11 +0100798Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
799mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100800
willy tarreauc5f73ed2005-12-18 01:26:38 +0100801 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100802
willy tarreau240afa62005-12-17 13:14:35 +0100803
willy tarreau96d40372005-12-17 13:11:56 +0100804Remarques :
805-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100806- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
807 s'adapter à des applications générant déjà le cookie, avec un contenu
808 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100809
willy tarreau96d40372005-12-17 13:11:56 +0100810- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
811 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
812 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100813
willy tarreau240afa62005-12-17 13:14:35 +0100814- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
815 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
816 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
817 cookie de persistence inséré, donc provoquer des changements de serveurs pour
818 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100819
willy tarreau0174f312005-12-18 01:02:42 +0100820- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
821 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
822 présenté par l'application qui est censée savoir à quel moment il peut
823 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
824 présenté par le client dans chaque requête ultérieure, il est indispensable
825 de s'assurer que le client et le serveur communiqueront sans "keep-alive
826 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
827
willy tarreaucd878942005-12-17 13:27:43 +0100828- lorsque l'application est bien connue, et que les parties nécessitant de la
829 persistence sont systématiquement accédées par un formulaire en mode POST,
830 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
831 et "indirect", car la page d'accueil reste cachable, et c'est l'application
832 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100833
willy tarreau240afa62005-12-17 13:14:35 +01008342.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100835----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100836En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
837par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100838
willy tarreau5cbea6f2005-12-17 12:48:26 +0100839 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100840
willy tarreauc29948c2005-12-17 13:10:27 +0100841- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
842 configuration et les logs.
843- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
844- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100845
846Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100847---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100848 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100849 mode http
850 cookie SERVERID
851 dispatch 192.168.1.100:80
852 server web1 192.168.1.1:80 cookie server01
853 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100854
855Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100856-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100857
willy tarreaua41a8b42005-12-17 14:02:24 +01008583) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100859=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100860
willy tarreauc29948c2005-12-17 13:10:27 +0100861Le relais peut effectuer lui-même la répartition de charge entre les différents
862serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
863cela, on précise le mot clé 'balance' dans la définition du service,
willy tarreau34f45302006-04-15 21:37:14 +0200864éventuellement suivi du nom d'un algorithme de répartition. Jusqu'à la version
8651.2.11, seul 'roundrobin' était géré, et c'est aussi la valeur implicite par
866défaut. Avec la version 1.2.12, le nouveau mot clé 'source' est apparu. Il est
867évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
willy tarreauc29948c2005-12-17 13:10:27 +0100868spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100869
870Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100871---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100872
willy tarreaua41a8b42005-12-17 14:02:24 +0100873 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100874 mode http
875 cookie SERVERID
876 balance roundrobin
877 server web1 192.168.1.1:80 cookie server01
878 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100879
willy tarreaua41a8b42005-12-17 14:02:24 +0100880Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
881du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
882sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
883champ <port> de l'adresse serveur :
884
885 - non spécifié ou nul :
886 la connexion sera envoyée au serveur sur le même port que celui sur
887 lequel le relais a reçu la connexion.
888
889 - valeur numérique (seul cas supporté pour les versions antérieures) :
890 le serveur recevra la connexion sur le port désigné.
891
892 - valeur numérique précédée d'un signe '+' :
893 la connexion sera envoyée au serveur sur le même port que celui sur
894 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
895
896 - valeur numérique précédée d'un signe '-' :
897 la connexion sera envoyée au serveur sur le même port que celui sur
898 lequel le relais a reçu la connexion, duquel on soustrait la valeur
899 désignée.
900
901Exemples :
902----------
903
904# même que précédemment
905
906 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100907 mode http
908 cookie SERVERID
909 balance roundrobin
910 server web1 192.168.1.1 cookie server01
911 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100912
913# relayage simultané des ports 80 et 81 et 8080-8089
914
915 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100916 mode http
917 cookie SERVERID
918 balance roundrobin
919 server web1 192.168.1.1 cookie server01
920 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100921
922# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
923
924 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100925 mode tcp
926 balance roundrobin
927 server srv1 192.168.1.1:+1000
928 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100929
willy tarreau34f45302006-04-15 21:37:14 +0200930Comme indiqué précédemment, la version 1.2.12 apporta le nouveau mot clé
931'source'. Lorsque celui-ci est utilisé, l'adresse IP du client est hachée et
932distribuée de manière homogène parmi les serveurs disponibles, de sorte qu'une
933même adresse IP aille toujours sur le même serveur tant qu'il n'y a aucun
934changement dans le nombre de serveurs disponibles. Ceci peut être utilisé par
935exemple pour attacher le HTTP et le HTTPS sur un même serveur pour un même
936client. Cela peut également être utilisé pour améliorer la persistance
937lorsqu'une partie de la population des clients n'accepte pas les cookies. Dans
938ce cas, seuls ces derniers seront perturbés par la perte d'un serveur.
939
940NOTE: il est important de prendre en compte le fait que beaucoup d'internautes
941 naviguent à travers des fermes de proxies qui assignent des adresses IP
942 différentes à chaque requête. D'autres internautes utilisent des liens à
943 la demande et obtiennent une adresse IP différente à chaque connexion. De
944 ce fait, le paramètre 'source' doit être utilisé avec une extrème
945 précaution.
946
947Exemples :
948----------
949
950# assurer qu'une même adresse IP ira sur le même serveur pour tout service
951
952 listen http_proxy
953 bind :80,:443
954 mode http
955 balance source
956 server web1 192.168.1.1
957 server web2 192.168.1.2
958
959# améliorer la persistance par l'utilisation de la source en plus du cookie :
960
961 listen http_proxy :80
962 mode http
963 cookie SERVERID
964 balance source
965 server web1 192.168.1.1 cookie server01
966 server web2 192.168.1.2 cookie server02
967
willy tarreau0f7af912005-12-17 12:21:26 +0100968
willy tarreauc29948c2005-12-17 13:10:27 +01009693.1) Surveillance des serveurs
970------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100971Il est possible de tester l'état des serveurs par établissement de connexion
972TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
973utilisé dans le processus de répartition de charge interne. Pour activer la
974surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
975Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
976tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
977paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
978Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreau34f45302006-04-15 21:37:14 +0200979
willy tarreaue47c8d72005-12-17 12:55:52 +0100980 - inter : 2000
981 - rise : 2
982 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +0100983 - port : port de connexion du serveur
Willy Tarreau2ea3abb2007-03-25 16:45:16 +0200984 - addr : adresse de connexion du serveur (par defaut: adresse du serveur)
985
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100986Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +0100987certains cas de pannes, des serveurs peuvent continuer à accepter les
988connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
989d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
990et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
991les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
992contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
993RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
9941.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
995possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
996l'avantage d'être facilement extractibles des logs, et de ne pas induire
997d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
998considérées valides, les autres (y compris non-réponses) aboutissent à un
999échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
1000deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
1001"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
1002accepte donc 4 formes :
willy tarreau34f45302006-04-15 21:37:14 +02001003
willy tarreaueedaa9f2005-12-17 14:08:03 +01001004 - option httpchk -> OPTIONS / HTTP/1.0
1005 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
1006 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
1007 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreau34f45302006-04-15 21:37:14 +02001008
Willy Tarreauf3c69202006-07-09 16:42:34 +02001009HAProxy est souvent utilisé pour relayer divers protocoles reposant sur TCP,
1010tels que HTTPS, SMTP ou LDAP, le plus commun étant HTTPS. Un problème assez
1011couramment rencontré dans les data centers est le besoin de relayer du trafic
1012vers des serveurs lointains tout en maintenant la possibilité de basculer sur
1013un serveur de secours. Les tests purement TCP ne suffisent pas toujours dans
1014ces situations car l'on trouve souvent, dans la chaîne, des proxies, firewalls
1015ou répartiteurs de charge qui peuvent acquitter la connexion avant qu'elle
1016n'atteigne le serveur. La seule solution à ce problème est d'envoyer des tests
1017applicatifs. Comme la demande pour les tests HTTPS est élevée, ce test a été
1018implémenté en version 1.2.15 sur la base de messages SSLv3 CLIENT HELLO. Pour
1019l'activer, utiliser "option ssl-hello-chk". Ceci enverra des messages SSLv3
1020CLIENT HELLO aux serveurs, en annonçant un support pour la majorité des
1021algorithmes de chiffrement. Si en retour, le serveur envoie ce qui ressemble à
1022une réponse SSLv3 SERVER HELLO ou ALERT (refus des algorithmes), alors la
1023réponse sera considérée comme valide. Noter qu'Apache ne produit pas de log
1024lorsqu'il reçoit des messages HELLO, ce qui en fait un type de message
1025parfaitement adapté à ce besoin.
1026
willy tarreauc5f73ed2005-12-18 01:26:38 +01001027Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001028
willy tarreau8337c6b2005-12-17 13:41:01 +01001029Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
1030utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
1031ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
1032de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
1033les 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 +01001034de répartition de charge entre des serveurs de secours par défaut. A partir
1035de la version 1.2.9, il est possible de les utiliser simultanément grâce à
1036l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
1037d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
1038de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
1039définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
1040qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +01001041
willy tarreaua41a8b42005-12-17 14:02:24 +01001042Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
1043vers un port différent de celui de service. C'est nécessaire principalement
1044pour les configurations où le serveur n'a pas de port prédéfini, par exemple
1045lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001046le paramètre 'port' suivi du numéro de port devant répondre aux requêtes. Il
1047est possible d'envoyer les tests de fonctionnement vers une adresse différente
1048de celle de service. Cela permet d'utiliser, sur la machine faisant fonctionner
1049HAproxy, un démon permettant des tests specifiques ( REGEX sur un résultat et
1050basculement de plusieurs fermes en cas d'erreur sur l'une d'elles).
willy tarreaua41a8b42005-12-17 14:02:24 +01001051
willy tarreau64a3cc32005-12-18 01:13:11 +01001052Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
1053l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
1054SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
1055envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
1056elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
1057local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +01001058
willy tarreau982249e2005-12-18 00:57:06 +01001059Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
1060logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
1061afin de notifier l'administrateur qu'il faut prendre une action immédiate.
1062
willy tarreau0174f312005-12-18 01:02:42 +01001063Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
1064même valeur de cookie. C'est particulièrement utile en mode backup, pour
1065sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
1066oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
1067temporairement vers une page d'erreur en attendant le redémarrage d'une
1068application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
1069le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
1070chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
1071le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
1072pour plus d'informations.
1073
willy tarreauc29948c2005-12-17 13:10:27 +01001074Exemples :
1075----------
willy tarreaua41a8b42005-12-17 14:02:24 +01001076# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001077 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001078 mode http
1079 cookie SERVERID
1080 balance roundrobin
1081 server web1 192.168.1.1:80 cookie server01 check
1082 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001083
willy tarreau2f6ba652005-12-17 13:57:42 +01001084# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001085 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001086 mode http
1087 cookie SERVERID
1088 balance roundrobin
1089 option httpchk
1090 server web1 192.168.1.1:80 cookie server01 check
1091 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +01001092
willy tarreau2f6ba652005-12-17 13:57:42 +01001093# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
1094 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001095 mode http
1096 cookie SERVERID
1097 balance roundrobin
1098 option httpchk /index.html
1099 server web1 192.168.1.1:80 cookie server01 check
1100 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +01001101
willy tarreaueedaa9f2005-12-17 14:08:03 +01001102# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1103 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001104 mode http
1105 cookie SERVERID
1106 balance roundrobin
1107 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1108 server web1 192.168.1.1:80 cookie server01 check
1109 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001110
willy tarreau0174f312005-12-18 01:02:42 +01001111# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1112# douceur utilisant un second port (81) juste pour les health-checks.
1113 listen http_proxy 0.0.0.0:80
1114 mode http
1115 cookie JSESSIONID prefix
1116 balance roundrobin
1117 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1118 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1119 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1120 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1121 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1122
willy tarreau96d40372005-12-17 13:11:56 +01001123# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001124# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1125# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +01001126 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001127 mode http
1128 cookie SERVERID insert nocache indirect
1129 balance roundrobin
1130 server web1 192.168.1.1:80 cookie server01 check
1131 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +01001132
willy tarreaueedaa9f2005-12-17 14:08:03 +01001133# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001134 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001135 mode http
1136 cookie SERVERID insert nocache indirect
1137 balance roundrobin
1138 server web1 192.168.1.1:80 cookie server01 check
1139 server web2 192.168.1.2:80 cookie server02 check
1140 server web-backup 192.168.2.1:80 cookie server03 check backup
1141 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001142
willy tarreaua41a8b42005-12-17 14:02:24 +01001143# relayage SMTP+TLS avec test du serveur et serveur de backup
1144
1145 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001146 mode tcp
1147 balance roundrobin
1148 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1149 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001150
Willy Tarreauf3c69202006-07-09 16:42:34 +02001151# relayage HTTPS avec test du serveur et serveur de backup
1152
1153 listen http_proxy :443
1154 mode tcp
1155 option ssl-hello-chk
1156 balance roundrobin
1157 server srv1 192.168.1.1 check inter 30000 rise 1 fall 2
1158 server srv2 192.168.1.2 backup
1159
Willy TARREAU3481c462006-03-01 22:37:57 +01001160# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1161 listen http_proxy 0.0.0.0:80
1162 mode http
1163 balance roundrobin
1164 option httpchk
1165 server inst1 192.168.1.1:80 cookie s1 check
1166 server inst2 192.168.1.2:80 cookie s2 check
1167 server inst3 192.168.1.3:80 cookie s3 check
1168 server back1 192.168.1.10:80 check backup
1169 server back2 192.168.1.11:80 check backup
1170 option allbackups # all backups will be used
1171
willy tarreau0f7af912005-12-17 12:21:26 +01001172
willy tarreauc29948c2005-12-17 13:10:27 +010011733.2) Reconnexion vers un répartiteur en cas d'échec direct
1174----------------------------------------------------------
1175En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1176seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1177définitivement privés de service. La spécification du paramètre 'redispatch'
1178autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1179(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001180
1181Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001182---------
willy tarreau0f7af912005-12-17 12:21:26 +01001183 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001184 mode http
1185 cookie SERVERID
1186 dispatch 192.168.1.100:80
1187 server web1 192.168.1.1:80 cookie server01
1188 server web2 192.168.1.2:80 cookie server02
1189 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001190
willy tarreau64a3cc32005-12-18 01:13:11 +01001191Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1192redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1193version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1194identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1195tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1196tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001197
1198 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001199 mode http
1200 option persist
1201 cookie SERVERID
1202 dispatch 192.168.1.100:80
1203 server web1 192.168.1.1:80 cookie server01
1204 server web2 192.168.1.2:80 cookie server02
1205 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001206
willy tarreauc29948c2005-12-17 13:10:27 +01001207
willy tarreau34f45302006-04-15 21:37:14 +020012083.3) Assignation de poids différents à des serveurs
1209---------------------------------------------------
1210Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1211d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1212que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1213soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1214raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1215plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1216plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1217la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1218une vue des serveurs disponibles la plus homogène possible en se basant sur
1219leur poids de sorte que la charge se distribue de la manière la plus lisse
1220possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
willy tarreau532bb552006-05-13 18:40:37 +02001221serveur par rapport aux autres. Le poids de 1 donne la fréquence d'apparition
1222la plus faible, et 256 la fréquence la plus élevée. De cette manière, si un
1223serveur disparait, les capacités restantes sont toujours respectées.
willy tarreau34f45302006-04-15 21:37:14 +02001224
1225
1226Exemple :
1227---------
1228# distribution équitable sur 2 opteron and un ancien pentium3
1229
1230 listen web_appl 0.0.0.0:80
1231 mode http
1232 cookie SERVERID insert nocache indirect
1233 balance roundrobin
1234 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1235 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1236 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1237 server web-backup1 192.168.2.1:80 cookie server04 check backup
1238 server web-excuse 192.168.3.1:80 check backup
1239
1240Notes :
1241-------
1242 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1243
1244 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1245 est plus propre d'utiliser les poids que de répliquer le même serveur
1246 plusieurs fois.
1247
1248 - les poids s'appliquent également aux serveurs de backup si l'option
1249 'allbackups' est positionnée.
1250
1251 - le poids s'applique aussi à la répartition selon la source
1252 ('balance source').
1253
1254 - quels que soient les poids, le premier serveur sera toujours assigné en
1255 premier. Cette règle facilite les diagnostics.
1256
1257 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1258 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1259 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1260
willy tarreau532bb552006-05-13 18:40:37 +02001261La distribution du trafic suivra exactement le séquencement suivant :
1262
1263 Request| 1 1 1 1
1264 number | 1 2 3 4 5 6 7 8 9 0 1 2 3
1265 --------+---------------------------
1266 p3-800 | X . . . . . . X . . . . .
1267 opt-20 | . X . X . X . . . X . X .
1268 opt-24 | . . X . X . X . X . X . X
1269
1270
12713.4) Limitation du nombre de sessions concurrentes par serveur
1272--------------------------------------------------------------
1273Certains serveurs web multi-processus tels qu'Apache souffrent dès qu'il y a
1274trop de sessions concurrentes, parce qu'il est très coûteux de faire
1275fonctionner des centaines ou des milliers de processus sur un système. Une
1276solution consiste à augmenter le nombre de serveurs et de répartir la charge
1277entre eux, mais cela pose un problème lorsque le but est uniquement de résister
1278à des pics de charge occasionnels.
1279
1280Pour résoudre ce problème, une nouvelle fonctionnalité a été implémentée dans
1281HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associée à une
1282file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
1283entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
1284de diminuer la valeur maxconn améliorera notablement les performances des
1285serveurs et diminuera les temps de réponse simplement parce que les serveurs
1286seront moins congestionnés.
1287
1288Quand une requête cherche à joindre n'importe quel serveur, le premier serveur
1289non saturé est utilisé, en respectant l'algorithme de répartition de charge. Si
1290tous les serveurs sont saturés, alors la requête sera mise dans la file
1291d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
1292toutes les requêtes précédentes auront été libérées et qu'un serveur aura été
1293libéré d'une connexion pour la traiter.
1294
1295Si une requête fait référence à un serveur en particulier (p.ex: hachage d'IP
1296source, ou persistance par cookie), et que ce server est saturé, alors la
1297requête sera mise dans la file d'attente dédiée à ce serveur. Cette file
1298d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
1299plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent déjà
1300que pour les nouveaux utilisateurs.
1301
1302Pour cela, les logs ont dû être enrichis pour indiquer le nombre de sessions
1303par serveur, la position de la requête dans les files d'attentes, et le temps
1304passé en file d'attente. Ceci aide considérablement à faire de la prévision de
1305capacité. Voir la section 'logs' plus bas pour plus d'informations.
1306
1307Exemple :
1308---------
1309 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1310 listen web_appl 0.0.0.0:80
1311 maxconn 10000
1312 mode http
1313 cookie SERVERID insert nocache indirect
1314 balance roundrobin
1315 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 maxconn 100 check
1316 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
1317 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
1318 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1319 server web-excuse 192.168.3.1:80 check backup
1320
willy tarreau8f635a42006-05-21 23:05:54 +02001321Cette option se montra si efficace pour réduire les temps de réponse des
1322serveurs que certains utilisateurs voulaient utiliser des valeurs trop basses
1323pour améliorer les performances de leurs serveurs. Seulement, ils n'étaient
1324alors plus en mesure de supporter de très fortes charges parce qu'il n'était
1325plus possible de les saturer. Pour cette raison, la version 1.2.14 a apporté la
1326limitation dynamique de connexions avec l'addition du paramètre "minconn".
1327Lorsque ce paramètre est associé à "maxconn", il active la limitation dynamique
1328basée sur la charge de l'instance. Le nombre maximal de sessions concurrentes
1329sur un serveur devient alors proportionnel au nombre de sessions de l'instance
1330par rapport à son 'maxconn'. Un minimum de <minconn> sessions sera toujours
1331permis quelle que soit la charge. Ceci assurera que les serveurs travailleront
1332au meilleur de leurs performances sous des charges normales, et qu'ils seront
1333tout de même capables de supporter de fortes pointes lorsque nécessaire. La
1334limite dynamique est calculée comme ceci :
1335
1336 srv.dyn_limit = max(srv.minconn, srv.maxconn * inst.sess / inst.maxconn)
1337
1338Exemple :
1339---------
1340 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1341 listen web_appl 0.0.0.0:80
1342 maxconn 10000
1343 mode http
1344 cookie SERVERID insert nocache indirect
1345 balance roundrobin
1346 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check
1347 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check
1348 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1349 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1350 server web-excuse 192.168.3.1:80 check backup
1351
1352Dans l'exemple ci-dessus, le serveur "pentium3-800' recevra au plus 100
1353connexions simultanées lorsque l'instance du proxy en atteindra 10000, et
1354recevra seulement 10 connexions simultanées tant que le proxy sera sous les 1000
1355sessions.
1356
willy tarreau532bb552006-05-13 18:40:37 +02001357Notes :
1358-------
1359 - la requête ne restera pas indéfiniment en file d'attente, elle est
1360 assujétie au paramètre 'contimeout', et si une requête ne peut pas
1361 sortir de la file avant ce time-out, soit parce que le serveur est
1362 saturé, soit parce qu'il y a trop de requêtes en file d'attente,
1363 alors elle expirera avec une erreur 503.
1364
willy tarreau8f635a42006-05-21 23:05:54 +02001365 - si seul <minconn> est spécifié, il a le même effet que <maxconn>
1366
willy tarreau532bb552006-05-13 18:40:37 +02001367 - positionner des valeurs trop basses pour 'maxconn' peut améliorer les
1368 performances mais aussi permettre à des utilisateurs trop lents de bloquer
1369 un serveur pour les autres utilisateurs.
1370
willy tarreau34f45302006-04-15 21:37:14 +02001371
willy tarreau8f635a42006-05-21 23:05:54 +020013723.5) Abandon des requêtes abortées
1373----------------------------------
1374En présence de très fortes charges, les serveurs mettront un certain temps à
1375répondre. La file d'attente du proxy se remplira, et les temps de réponse
1376suivront une croissance proportionnelle à la taille de file d'attente fois
1377le temps moyen de réponse par session. Lorsque les clients attendront plus de
1378quelques secondes, ils cliqueront souvent sur le bouton 'STOP' de leur
1379navigateur, laissant des requêtes inutiles en file d'attente et ralentissant
1380donc les autres utilisateurs.
1381
1382Comme il n'y a aucun moyen de distinguer un vrai clic sur STOP d'une simple
1383fermeture du canal de sortie sur le client (shutdown(SHUT_WR)), les agents HTTP
1384doivent être conservateurs et considérer que le client n'a probablement fermé
1385que le canal de sortie en attendant la réponse. Toutefois, ceci introduit des
1386risques de congestion lorsque beaucoup d'utilisateurs font de même, et s'avère
1387aujourd'hui complètement inutile car probablement aucun client ne referme la
1388session en attendant la réponse. Certains agents HTTP supportent ceci (Squid,
1389Apache, HAProxy), et d'autres ne le supportent pas (TUX, et la plupart des
1390répartiteurs de charge matériels). Donc la probabilité pour qu'une notification
1391de fermeture d'un canal d'entrée côté client représente un utilisateur cliquant
1392sur 'STOP' est proche de 100%, et il est vraiment tentant d'abandonner la
1393requête prématurément sans polluer les serveurs.
1394
1395Pour cette raison, une nouvelle option "abortonclose" a été introduite en
1396version 1.2.14. Par défaut (sans l'option), le comportement reste conforme à
1397HTTP. Mais lorsque l'option est spécifiée, une session dont le canal entrant
1398est fermé sera abortée si cela est possible, c'est à dire que la requête est
1399soit en file d'attente, soit en tentative de connexion. Ceci réduit
1400considérablement la longueur des files d'attentes et la charge sur les serveurs
1401saturés lorsque les utilisateurs sont tentés de cliquer sur 'STOP', ce qui à
1402son tour, réduit les temps de réponse pour les autres utilisateurs.
1403
1404Exemple :
1405---------
1406 listen web_appl 0.0.0.0:80
1407 maxconn 10000
1408 mode http
1409 cookie SERVERID insert nocache indirect
1410 balance roundrobin
1411 server web1 192.168.1.1:80 cookie s1 weight 10 maxconn 100 check
1412 server web2 192.168.1.2:80 cookie s2 weight 10 maxconn 100 check
1413 server web3 192.168.1.3:80 cookie s3 weight 10 maxconn 100 check
1414 server bck1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1415 option abortonclose
1416
1417
willy tarreauc29948c2005-12-17 13:10:27 +010014184) Fonctionnalités additionnelles
1419=================================
1420
1421D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
willy tarreau8f635a42006-05-21 23:05:54 +02001422principalement du mode transparent, de la journalisation des connexions, de la
1423réécriture des en-têtes, et du statut sous forme de page HTML.
1424
willy tarreau5cbea6f2005-12-17 12:48:26 +01001425
willy tarreau0174f312005-12-18 01:02:42 +010014264.1) Fonctionnalités réseau
1427---------------------------
14284.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001429---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001430En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1431routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1432pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001433destination de la session détournée. Le système doit permettre de rediriger les
1434paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001435
1436Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001437---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001438 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001439 mode http
1440 transparent
1441 cookie SERVERID
1442 server server01 192.168.1.1:80
1443 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001444
1445 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1446 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001447
willy tarreaua41a8b42005-12-17 14:02:24 +01001448Remarque :
1449----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001450Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1451adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1452d'une même adresse avec une même instance et sans utiliser directement le mode
1453transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001454
1455Exemple :
1456---------
1457 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001458 mode tcp
1459 server server01 192.168.1.1 check port 60000
1460 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001461
1462 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1463 -j REDIRECT --to-ports 65000
1464
willy tarreau0174f312005-12-18 01:02:42 +01001465
14664.1.2) Choix d'une adresse source par serveur
1467---------------------------------------------------
1468Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1469IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1470backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1471pour joindre le même serveur. C'est également utilisable pour faciliter une
1472répartition de charge selon l'adresse IP source pour des connexions sortantes.
1473Bien entendu, la même adresse est utilisée pour les health-checks.
1474
1475Exemple :
1476---------
1477 # utiliser une adresse particulière pour joindre les 2 serveur
1478 listen http_proxy 0.0.0.0:65000
1479 mode http
1480 balance roundrobin
1481 server server01 192.168.1.1:80 source 192.168.2.13
1482 server server02 192.168.1.2:80 source 192.168.2.13
1483
1484Exemple :
1485---------
1486 # utiliser une adresse particulière pour joindre chaque serveur
1487 listen http_proxy 0.0.0.0:65000
1488 mode http
1489 balance roundrobin
1490 server server01 192.168.1.1:80 source 192.168.1.1
1491 server server02 192.168.2.1:80 source 192.168.2.1
1492
1493Exemple :
1494---------
1495 # faire une répartition d'adresse sources pour joindre le même proxy à
1496 # travers deux liens WAN
1497 listen http_proxy 0.0.0.0:65000
1498 mode http
1499 balance roundrobin
1500 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1501 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1502
1503Exemple :
1504---------
1505 # forcer une connexion TCP à s'attacher à un port particulier
1506 listen http_proxy 0.0.0.0:2000
1507 mode tcp
1508 balance roundrobin
1509 server srv1 192.168.1.1:80 source 192.168.2.1:20
1510 server srv2 192.168.1.2:80 source 192.168.2.1:20
1511
willy tarreaub952e1d2005-12-18 01:31:20 +010015124.1.3) Maintien de session TCP (keep-alive)
1513-------------------------------------------
1514Avec la version 1.2.7, il devient possible d'activer le maintien de session
1515TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1516d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1517externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1518aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1519time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1520positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1521vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1522pour activer le maintien de session TCP :
1523
1524 option tcpka # active le keep-alive côté client et côté serveur
1525 option clitcpka # active le keep-alive côté client
1526 option srvtcpka # active le keep-alive côté serveur
1527
willy tarreau0f7af912005-12-17 12:21:26 +01001528
willy tarreauc29948c2005-12-17 13:10:27 +010015294.2) Journalisation des connexions
1530----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001531
1532L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1533Il fournit probablement le plus fin niveau d'information disponible pour un
1534tel outil, ce qui est très important pour les diagnostics en environnements
1535complexes. En standard, les informations journalisées incluent le port client,
1536les chronométrages des états TCP/HTTP, des états de session précis au moment de
1537la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1538trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1539arbitraires.
1540
1541Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1542transparence sur les problèmes rencontrés, à la fois internes et externes, et
1543il est possible d'envoyer les logs vers des serveurs différents en même temps
1544avec des niveaux de filtrage différents :
1545
1546 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1547 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1548 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1549 - activité par instance (connexions clients), aussi bien lors de leur
1550 établissement qu'à leur terminaison.
1551
1552La possibilité de distribuer différents niveaux de logs à différents serveurs
1553permet à plusieurs équipes de production d'intéragir et de corriger leurs
1554problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1555occasionnellement les erreurs système, pendant que l'équipe application
1556surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1557que l'équipe sécurité analyse l'activité en différé d'une heure.
1558
1559
willy tarreauc1cae632005-12-17 14:12:23 +010015604.2.1) Niveaux de log
1561---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001562Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1563détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1564source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001565la requête HTTP, le code de retour, la quantité de données transmises, et même
1566dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1567Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1568la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001569est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001570
willy tarreau8337c6b2005-12-17 13:41:01 +01001571 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1572 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001573ou
1574 log global
1575
1576Remarque :
1577----------
1578La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1579paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001580
1581Exemple :
1582---------
1583 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001584 mode http
1585 log 192.168.2.200 local3
1586 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001587
willy tarreauc1cae632005-12-17 14:12:23 +010015884.2.2) Format des logs
1589----------------------
1590Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1591de la session entre le client et le relais. En précisant l'option 'tcplog',
1592la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1593sur son état lors de la déconnexion, ainsi que le temps de connexion et la
willy tarreau532bb552006-05-13 18:40:37 +02001594durée totale de la session. Le nombre de sessions restantes après la
1595déconnexion est également indiqué (pour le serveur, l'instance et le process).
willy tarreauc1cae632005-12-17 14:12:23 +01001596
willy tarreauc5f73ed2005-12-18 01:26:38 +01001597Exemple de journalisation TCP :
1598-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001599 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001600 mode tcp
1601 option tcplog
1602 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001603
willy tarreau532bb552006-05-13 18:40:37 +02001604>>> 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 +01001605
willy tarreau532bb552006-05-13 18:40:37 +02001606 Champ Format / Description Exemple
1607
1608 1 nom_processus '[' pid ']:' haproxy[18989]:
1609 2 ip_client ':' port_client 127.0.0.1:34550
1610 3 '[' date ']' [15/Oct/2003:15:24:28]
1611 4 nom_instance relais-tcp
1612 5 nom_serveur Srv1
1613 6 temps_file '/' temps_connect '/' temps_total 0/0/5007
1614 7 octets lus 0
1615 8 etat_terminaison --
1616 9 conn_srv '/' conns_inst '/' conns_processus 1/1/1
1617 10 position en file d'attente srv '/' globale 0/0
willy tarreau982249e2005-12-18 00:57:06 +01001618
willy tarreauc1cae632005-12-17 14:12:23 +01001619Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1620notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1621surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1622les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1623ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1624(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001625
willy tarreauc5f73ed2005-12-18 01:26:38 +01001626Exemple de journalisation HTTP :
1627--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001628 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001629 mode http
1630 option httplog
1631 option dontlognull
1632 log 192.168.2.200 local3
1633
willy tarreau532bb552006-05-13 18:40:37 +02001634>>> 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 +01001635
1636Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001637
willy tarreau532bb552006-05-13 18:40:37 +02001638 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 +01001639
willy tarreau532bb552006-05-13 18:40:37 +02001640 Champ Format / Description Exemple
1641
1642 1 nom_processus '[' pid ']:' haproxy[18989]:
1643 2 ip_client ':' port_client 10.0.0.1:34552
1644 3 '[' date ']' [15/Oct/2003:15:26:31]
1645 4 nom_instance relais-http
1646 5 nom_serveur Srv1
1647 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt 3183/-1/-1/-1/11215
1648 7 Code_retour_HTTP 503
1649 8 octets lus 0
1650 9 cookies_requête_capturés -
1651 10 cookies_reponse_capturés -
1652 11 etat_terminaison SC--
1653 12 conns_srv '/' conns_inst '/' conns_processus 137/202/205
1654 13 position file serveur '/' globale 0/0
1655 14 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1656 15 '{' entetes_reponse_capturés '}' {}
1657 16 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001658
1659Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1660 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001661
1662Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1663de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1664Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001665la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1666tôt possible, c'est à dire juste avant que ne débutent les transferts de
1667données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1668de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001669traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1670représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001671
willy tarreau64a3cc32005-12-18 01:13:11 +01001672Afin d'éviter toute confusion avec les logs normaux, le temps total de
1673transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001674rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001675
1676Exemple :
1677---------
1678
1679 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001680 mode http
1681 option httplog
1682 option dontlognull
1683 option logasap
1684 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001685
willy tarreauc5f73ed2005-12-18 01:26:38 +01001686>>> 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 +01001687
1688
willy tarreauc1cae632005-12-17 14:12:23 +010016894.2.3) Chronométrage des événements
1690-----------------------------------
1691Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1692événements sont d'une très grande utilité. Tous les temps sont mesurés en
1693millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
willy tarreau532bb552006-05-13 18:40:37 +02001694la forme Tq/Tw/Tc/Tr/Tt :
willy tarreauc1cae632005-12-17 14:12:23 +01001695
1696 - Tq: temps total de réception de la requête HTTP de la part du client.
1697 C'est le temps qui s'est écoulé entre le moment où le client a établi
1698 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1699 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1700 que la requête complète n'a jamais été reçue.
1701
willy tarreau532bb552006-05-13 18:40:37 +02001702 - Tw: temps total passé dans les files d'attente avant d'obtenir une place
1703 vers un serveur. Ceci tient compte à la fois de la file d'attente globale
1704 et de celle du serveur, et dépend du nombre de requêtes dans la file et du
1705 temps nécessaire au serveur pour compléter les sessions précédentes. La
1706 valeur '-1' indique que la requête a été détruite avant d'atteindre une
1707 file.
1708
willy tarreauc1cae632005-12-17 14:12:23 +01001709 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1710 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1711 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1712 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1713 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1714 vers le serveur.
1715
1716 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001717 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001718 la connexion. Ca représente exactement le temps de traitement de la
1719 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001720 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001721
1722 - Tt: durée de vie totale de la session, entre le moment où la demande de
1723 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001724 refermée aux deux extrémités (client et serveur). La signification change
1725 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
willy tarreau532bb552006-05-13 18:40:37 +02001726 uniquement à (Tq + Tw + Tc + Tr), et se trouve préfixé d'un signe '+'. On
1727 peut donc déduire Td, le temps de transfert des données, en excluant les
1728 autres temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001729
willy tarreau532bb552006-05-13 18:40:37 +02001730 Td = Tt - (Tq + Tw + Tc + Tr)
willy tarreauc1cae632005-12-17 14:12:23 +01001731
1732 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1733
willy tarreau532bb552006-05-13 18:40:37 +02001734En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
willy tarreauc1cae632005-12-17 14:12:23 +01001735rapportés.
1736
1737Ces temps fournissent de précieux renseignement sur des causes probables de
1738problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1739de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1740de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1741problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1742valeur de time-out dans la configuration, c'est souvent qu'une session a été
1743abandonnée sur expiration d'un time-out.
1744
1745Cas les plus fréquents :
1746
1747 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1748 le client et le relais.
1749 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1750 le relais et le serveur durant la phase de connexion. Cet indicateur
1751 devrait normalement toujours être très bas (moins de quelques dizaines).
1752 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1753 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1754 de pertes entre le relais et le serveur.
1755 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1756 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1757 session est maintenue après la fin des échanges. Voir plus loin pour
1758 savoir comment désactiver le keep-alive HTTP.
1759
1760Autres cas ('xx' représentant une valeur quelconque à ignorer) :
willy tarreau532bb552006-05-13 18:40:37 +02001761 -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 +01001762 a refermé sa connexion sans compléter la requête.
willy tarreau532bb552006-05-13 18:40:37 +02001763 Tq/-1/xx/xx/Tt: Il n'était pas possible de traiter la request, probablement
1764 parce que tous les serveurs étaient hors d'usage.
1765 Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'établir vers le serveur (refus ou
1766 time-out au bout de Tt-(Tq+Tw) ms).
1767 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 +01001768 les temps ou bien a refermé sa connexion trop tôt, au bout
willy tarreau532bb552006-05-13 18:40:37 +02001769 de Tt-(Tq+Tw+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001770
17714.2.4) Conditions de déconnexion
1772--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001773Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1774le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1775un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1776une signification précise :
1777
1778 - sur le premier caractère, un code précisant le premier événement qui a causé
1779 la terminaison de la session :
1780
1781 C : fermeture inattendue de la session TCP de la part du client.
1782
1783 S : fermeture inattendue de la session TCP de la part du serveur, ou
1784 refus explicite de connexion de la part de ce dernier.
1785
1786 P : terminaison prématurée des sessions par le proxy, pour cause
1787 d'imposition d'une limite sur le nombre de connexions, pour cause
1788 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1789 sécurité a détecté et bloqué une anomalie dans la réponse du
1790 serveur qui aurait pu causer une fuite d'informations (par exemple,
1791 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001792
willy tarreauc5f73ed2005-12-18 01:26:38 +01001793 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1794 source, ...). Généralement, cela arrive au cours de l'établissement
1795 d'une connexion, et les logs système doivent contenir une copie de
1796 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001797
willy tarreauc5f73ed2005-12-18 01:26:38 +01001798 I : une erreur interne a été identifiée par le proxy à la suite d'un
1799 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1800 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001801
willy tarreauc5f73ed2005-12-18 01:26:38 +01001802 c : le délai maximal d'attente du client a expiré (clitimeout).
1803
1804 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1805
1806 - : terminaison normale de session.
1807
1808 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1809 la fermeture :
1810
1811 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1812 été transmis au serveur.
1813
willy tarreau532bb552006-05-13 18:40:37 +02001814 Q : attente en file d'attente (QUEUE) d'une place pour avoir une
1815 connexion vers un serveur. Ne peut apparaître que sur un serveur
1816 possédant un paramètre 'maxconn'. Aucune connexion n'a été envoyée
1817 au serveur.
1818
willy tarreauc5f73ed2005-12-18 01:26:38 +01001819 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1820 serveur peut au plus avoir vu la tentative de connexion, mais
1821 aucune donnée n'a été échangée.
1822
1823 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1824
1825 D : transfert des DONNEES du serveur vers le client.
1826
1827 L : transfert des dernières ("LAST") données du proxy vers le client,
1828 alors que le serveur a déjà fini.
1829
Willy Tarreau2272dc12006-09-03 10:19:38 +02001830 T : requête bloquée en mode "tarpit" par le proxy. Elle a été maintenue
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001831 ouverte vers le client pendant toute la durée du contimeout ou
1832 jusqu'à l'abandon de la part du client.
Willy Tarreau2272dc12006-09-03 10:19:38 +02001833
willy tarreauc5f73ed2005-12-18 01:26:38 +01001834 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001835
1836 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001837 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001838
willy tarreauc5f73ed2005-12-18 01:26:38 +01001839 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1840 cas sur les NOUVELLES connexions clients.
1841
1842 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1843 serveur connu. Ceci peut être dû à un changement de configuration
1844 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1845 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001846
willy tarreauc5f73ed2005-12-18 01:26:38 +01001847 D : le client a présenté un cookie correspondant à un serveur hors
1848 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1849 un autre serveur ou a tout de même tenté de se connecter sur celui
1850 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001851
willy tarreauc5f73ed2005-12-18 01:26:38 +01001852 V : le client a présenté un cookie VALIDE et a pu se connecter au
1853 serveur correspondant.
1854
1855 - : non appliquable (pas de cookie positionné dans la configuration).
1856
1857 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1858 persistence retrourné par le serveur (uniquement en mode HTTP) :
1859
1860 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1861 n'a été inséré.
1862
1863 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1864 proxy en a INSERE un.
1865
willy tarreau197e8ec2005-12-17 14:10:59 +01001866 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001867 tel quel ("PASSIF").
1868
1869 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1870
1871 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1872 ne pas être retourné au client.
1873
1874 - : non appliquable
1875
1876
1877La combinaison des deux premiers indicateurs fournit une grande quantitié
1878d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1879peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1880des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001881
willy tarreauc5f73ed2005-12-18 01:26:38 +01001882Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1883
1884 Indic Raison
1885 CR Le client a abandonné avant d'émettre une requête complète. Il est
1886 très probable que la requête ait été tapée à la main dans un client
1887 telnet et abortée trop tôt.
1888
1889 cR Le temps imparti au client a expiré avant réception d'une requête
1890 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1891 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1892 transporter des paquets entiers, ou par des clients qui énvoient des
1893 requêtes à la main et ne tapent pas assez vite.
1894
1895 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1896 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1897 être la couche réseau qui indique au proxy que le serveur n'est pas
1898 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1899
1900 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1901
1902 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1903 nombre de connexions a atteint la limite 'maxconn' (global ou de
1904 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1905 augmenté, tout comme le paramètre 'maxconn' global.
1906
1907 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1908 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1909 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1910 consiste à affiner le paramétrage système.
1911
1912 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1913 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1914 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1915 paquets entiers.
1916
willy tarreau078c79a2006-05-13 12:23:58 +02001917 CH Le client a abandonné alors qu'il attendait un début de réponse de la
1918 part du serveur. Cela peut être causé par le serveur qui mettait trop
1919 de temps à répondre, ou par un client cliquant précipitamment sur le
1920 bouton 'Stop'.
1921
1922 CQ Le client a abandonné alors que sa session était mise en file
1923 d'attente pour obtenir un serveur avec suffisamment de connexions
1924 libres pour l'accepter. Cela signifie soit que l'ensemble des
1925 serveurs étaient saturés, soit que le serveur assigné a mis trop de
1926 temps à répondre.
1927
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001928 CT Le client a abandonné alors que sa session était bloquée en mode
1929 tarpit.
1930
willy tarreau078c79a2006-05-13 12:23:58 +02001931 sQ La session a attendu trop longtemps en file d'attente et a été
1932 expirée.
1933
willy tarreauc5f73ed2005-12-18 01:26:38 +01001934 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
1935 en-têtes. En général, cela indique qu'il a crashé.
1936
1937 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
1938 des transactions trop longues, probablement causées par un back-end
1939 saturé. Les seules solutions sont de corriger le problème sur
1940 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
1941 des attentes plus longues au risque que les clients abandonnent à
1942 leur tour, ou bien d'ajouter des serveurs.
1943
1944 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
1945 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
1946 soit à cause d'une requête validant un filtre d'interdiction, auquel
1947 cas le proxy a renvoyé une erreur HTTP 403.
1948
1949 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
1950 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
1951 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
1952 renvoyée au client.
1953
Willy Tarreau2272dc12006-09-03 10:19:38 +02001954 PT Le proxy a bloqué une requête du client et a maintenu sa connection
1955 ouverte avant de lui retourner une erreur "500 server error". Rien
1956 n'a été envoyé au serveur.
1957
willy tarreauc5f73ed2005-12-18 01:26:38 +01001958 cD Le client n'a pas lu de données pendant le temps qui lui était
1959 imparti. Ceci est souvent causé par des problèmes réseau côté client.
1960
1961 CD Le client a aborté sa connection de manière inattendue pendant le
1962 transfert des données. Ceci est provoqué soit par le crash d'un
1963 navigateur, ou par une session en HTTP keep-alive entre le serveur
1964 et le client terminée en premier par le client.
1965
1966 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
1967 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
1968 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
1969 situés entre le proxy et le serveur.
1970
19714.2.5) Caractères non-imprimables
1972---------------------------------
1973Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
1974tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
1975hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
1976dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
1977caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
1978est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
1979les en-têtes.
1980
19814.2.6) Capture d'en-têtes HTTP et de cookies
1982--------------------------------------------
1983La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
1984capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
1985
1986Les captures de cookies facilitent le suivi et la reconstitution d'une session
1987utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01001988
1989 capture cookie <préfixe_cookie> len <longueur_capture>
1990
willy tarreauc5f73ed2005-12-18 01:26:38 +01001991Ceci activera la capture de cookies à la fois dans les requêtes et dans les
1992réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
1993bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
1994nouveau cookie.
1995
willy tarreau8337c6b2005-12-17 13:41:01 +01001996Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1997transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1998caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1999le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
2000place dans les logs.
2001
2002Exemples :
2003----------
2004 # capture du premier cookie dont le nom commence par "ASPSESSION"
2005 capture cookie ASPSESSION len 32
2006
2007 # capture du premier cookie dont le nom est exactement "vgnvisitor"
2008 capture cookie vgnvisitor= len 32
2009
willy tarreau036e1ce2005-12-17 13:46:33 +01002010Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01002011positionné par le serveur, précédé du cookie positionné par le client. Chacun
2012de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01002013par le client ou le serveur, ou lorsque l'option est désactivée..
2014
2015Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
2016pour suivre un identifiant de requête globalement unique positionné par un
2017autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
2018de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
2019peut chercher des informations relatives à la longueur annoncée de la réponse,
2020le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
2021de redirection. Tout comme pour les captures de cookies, il est possible
2022d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
2023la suivante :
2024
2025 capture request header <nom> len <longueur max>
2026 capture response header <nom> len <longueur max>
2027
2028Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01002029
willy tarreauc5f73ed2005-12-18 01:26:38 +01002030Exemples:
2031---------
2032 # conserver le nom du serveur virtuel accédé par le client
2033 capture request header Host len 20
2034 # noter la longueur des données envoyées dans un POST
2035 capture request header Content-Length len 10
2036
2037 # noter le fonctionnement attendu du cache par le serveur
2038 capture response header Cache-Control len 8
2039 # noter l'URL de redirection
2040 capture response header Location len 20
2041
2042Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
2043fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
2044regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
2045chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
2046réponse sont présentés de la même manière, mais après un espace suivant le bloc
2047d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
2048
2049 Config:
2050
2051 capture request header Host len 20
2052 capture request header Content-Length len 10
2053 capture request header Referer len 20
2054 capture response header Server len 20
2055 capture response header Content-Length len 10
2056 capture response header Cache-Control len 8
2057 capture response header Via len 20
2058 capture response header Location len 20
2059
2060 Log :
2061
willy tarreau532bb552006-05-13 18:40:37 +02002062 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/"
2063 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"
2064 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 +01002065
20664.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01002067-----------------------
willy tarreau532bb552006-05-13 18:40:37 +02002068- 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 +01002069 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
2070 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01002071
willy tarreau532bb552006-05-13 18:40:37 +02002072- 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"
2073 => Idem, mais la requête a été mise en attente dans la file globale derrière
2074 9 autres requêtes déjà présentes, et y a attendu 1230 ms.
2075
2076- 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 +01002077 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
2078 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 +01002079 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 +01002080 total entre l'accept() et le premier octet de donnée est de 30 ms.
2081
willy tarreau532bb552006-05-13 18:40:37 +02002082- 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 +01002083 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
2084 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
2085 d'informations risquant d'être cachées. Dans ce cas, la réponse est
2086 remplacée par '502 bad gateway'.
2087
willy tarreau532bb552006-05-13 18:40:37 +02002088- 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 +01002089 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01002090 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01002091 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01002092
willy tarreau532bb552006-05-13 18:40:37 +02002093- 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 +01002094 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01002095 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01002096 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
2097 pu renvoyer un message 408 au client.
2098
willy tarreauc5f73ed2005-12-18 01:26:38 +01002099- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
2100 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
2101 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01002102
willy tarreau532bb552006-05-13 18:40:37 +02002103- 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 +01002104 => La requête client met 3s à entrer (peut-être un problème réseau), et la
2105 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreau532bb552006-05-13 18:40:37 +02002106 secondes (retries 3 dans la conf), puis un code 503 est retourné au
2107 client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
2108 instance, et 205 sur l'ensemble des instances pour ce processus. Il est
2109 possible que le serveur ait refusé la connexion parce qu'il y en avait
2110 déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01002111
willy tarreau4302f492005-12-18 01:00:37 +01002112
willy tarreauc5f73ed2005-12-18 01:26:38 +010021134.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01002114----------------------------------
2115En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
2116requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01002117possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
2118de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01002119connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
2120comme faisant partie des échanges de données consécutifs à la première requête.
2121Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01002122
2123La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01002124 reqadd <string> pour ajouter un en-tête dans la requête
2125 reqrep <search> <replace> pour modifier la requête
2126 reqirep <search> <replace> idem sans distinction majuscules/minuscules
2127 reqdel <search> pour supprimer un en-tête dans la requête
2128 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002129 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01002130 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002131 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01002132 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002133 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01002134 reqipass <search> idem sans distinction majuscules/minuscules
Willy Tarreau2272dc12006-09-03 10:19:38 +02002135 reqtarpit <search> bloquer et maintenir une request validant <search>
2136 reqitarpit <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002137
willy tarreau036e1ce2005-12-17 13:46:33 +01002138 rspadd <string> pour ajouter un en-tête dans la réponse
2139 rsprep <search> <replace> pour modifier la réponse
2140 rspirep <search> <replace> idem sans distinction majuscules/minuscules
2141 rspdel <search> pour supprimer un en-tête dans la réponse
2142 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01002143 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01002144 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01002145 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002146
willy tarreau0f7af912005-12-17 12:21:26 +01002147
willy tarreau036e1ce2005-12-17 13:46:33 +01002148<search> est une expression régulière compatible POSIX regexp supportant le
2149groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
2150doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
2151chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
2152backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01002153
2154 \t pour une tabulation
2155 \r pour un retour charriot
2156 \n pour un saut de ligne
2157 \ pour différencier un espace d'un séparateur
2158 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01002159 \\ pour utiliser un backslash dans la regex
2160 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01002161 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01002162
willy tarreau0f7af912005-12-17 12:21:26 +01002163
willy tarreau5cbea6f2005-12-17 12:48:26 +01002164<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
2165Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
2166groupe délimité par des parenthèses dans l'expression régulière, par sa
Willy Tarreau2272dc12006-09-03 10:19:38 +02002167position numérale. Les positions vont de 0 à 9, et sont codées par un '\'
2168suivi du chiffre désiré (0 désignant la ligne complète). Il est également
2169possible d'insérer un caractère non imprimable (utile pour le saut de ligne)
2170inscrivant '\x' suivi du code hexadécimal de ce caractère (comme en C).
willy tarreau5cbea6f2005-12-17 12:48:26 +01002171
2172<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01002173dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002174
2175Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01002176-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002177 - 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 +01002178 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002179 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
2180 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
2181 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01002182 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
2183 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
2184 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01002185 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01002186 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
2187 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
Willy Tarreau2272dc12006-09-03 10:19:38 +02002188 - une requête bloquée par 'reqtarpit' sera maintenue pendant une durée égale
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002189 au paramètre 'contimeout', ou jusqu'à l'abandon du client. Rien ne sera
2190 envoyé au serveur. Lorsque le temps alloué expire, le proxy répondra avec
2191 une réponse "500 server error" de sorte que l'attaquant ne suspecte pas
2192 qu'il ait été bloqué. Les logs rapporteront aussi ce code 500, mais les
2193 flags de terminaison indiqueront "PT".
willy tarreau0f7af912005-12-17 12:21:26 +01002194
2195Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01002196----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01002197 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01002198
willy tarreauc5f73ed2005-12-18 01:26:38 +01002199 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
2200 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
2201 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002202
willy tarreauc5f73ed2005-12-18 01:26:38 +01002203 # force proxy connections to close
2204 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
2205 # rewrite locations
2206 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002207
willy tarreauc5f73ed2005-12-18 01:26:38 +01002208 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01002209
willy tarreau197e8ec2005-12-17 14:10:59 +01002210 # Every header should end with a colon followed by one space.
2211 reqideny ^[^:\ ]*[\ ]*$
2212
2213 # block Apache chunk exploit
2214 reqideny ^Transfer-Encoding:[\ ]*chunked
2215 reqideny ^Host:\ apache-
2216
2217 # block annoying worms that fill the logs...
2218 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
2219 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
2220 reqideny ^[^:\ ]*\ .*<script
2221 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
2222
Willy Tarreau2272dc12006-09-03 10:19:38 +02002223 # tarpit attacks on the login page.
2224 reqtarpit ^[^:\ ]*\ .*\.php?login=[^0-9]
2225
willy tarreau197e8ec2005-12-17 14:10:59 +01002226 # allow other syntactically valid requests, and block any other method
2227 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
2228 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
2229 reqideny ^[^:\ ]*\
2230
2231 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01002232 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01002233
willy tarreauc5f73ed2005-12-18 01:26:38 +01002234 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01002235 rspidel ^Server:\
2236 rspadd Server:\ Formilux/0.1.8
2237
willy tarreau0f7af912005-12-17 12:21:26 +01002238
willy tarreau982249e2005-12-18 00:57:06 +01002239De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01002240'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002241connaître l'adresse IP du client initial. Depuis la version 1.3.8, il est
2242possible de préciser le mot-clé "except" suivi d'une adresse ou un réseau
2243IP source pour lequel l'entête ne sera pas ajouté. C'est très pratique dans le
2244cas où un autre reverse-proxy ajoutant déjà l'entête est installé sur la même
2245machine ou dans une DMZ connue. Le cas le plus fréquent est lié à l'utilisation
2246de stunnel en local.
willy tarreauc1cae632005-12-17 14:12:23 +01002247
willy tarreau982249e2005-12-18 00:57:06 +01002248Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01002249en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01002250Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
2251méthode impliquant 4 règles.
2252
willy tarreauc1cae632005-12-17 14:12:23 +01002253Exemple :
2254---------
2255 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002256 mode http
2257 log global
2258 option httplog
2259 option dontlognull
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002260 option forwardfor except 127.0.0.1/8
willy tarreauc5f73ed2005-12-18 01:26:38 +01002261 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01002262
Willy TARREAU767ba712006-03-01 22:40:50 +01002263Notons que certains serveurs HTTP ne referment pas nécessairement la session
2264TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
2265ce qui se traduit par des grands nombres de sessions établies et des temps
2266globaux très longs sur les requêtes. Pour contourner ce problème, la version
22671.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
2268vers le serveur dès qu'il commence à répondre et seulement si le tampon de
2269requête est vide. Attention toutefois à ne PAS utiliser cette option si des
2270méthodes CONNECT sont attendues entre le client et le serveur. L'option
2271'forceclose' implique l'option 'httpclose'.
2272
2273Exemple :
2274---------
2275 listen http_proxy 0.0.0.0:80
2276 mode http
2277 log global
2278 option httplog
2279 option dontlognull
2280 option forwardfor
2281 option forceclose
2282
2283
willy tarreauc29948c2005-12-17 13:10:27 +010022844.4) Répartition avec persistence
2285---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002286La combinaison de l'insertion de cookie avec la répartition de charge interne
2287permet d'assurer une persistence dans les sessions HTTP d'une manière
2288pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01002289 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01002290 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01002291 - insérer un cookie dans les réponses issues d'une répartition uniquement,
2292 et faire en sorte que des caches ne mémorisent pas ce cookie.
2293 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002294
2295Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01002296---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002297 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002298 mode http
2299 cookie SERVERID insert nocache indirect
2300 balance roundrobin
2301 server srv1 192.168.1.1:80 cookie server01 check
2302 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01002303
willy tarreau0174f312005-12-18 01:02:42 +01002304L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
2305cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
2306Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
2307client et le serveur de travailler en mode "keep-alive" afin que le proxy
2308puisse corriger le nom du cookie dans toutes les futures requêtes.
2309
2310 listen application 0.0.0.0:80
2311 mode http
2312 cookie JSESSIONID prefix
2313 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002314 server srv1 192.168.1.1:80 cookie srv1 check
2315 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002316 option httpclose
2317
2318
willy tarreau982249e2005-12-18 00:57:06 +010023194.5) Protection contre les fuites d'informations du serveur
2320-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002321Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002322créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002323'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2324un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2325activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002326 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002327 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002328 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002329 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002330 un en-tête 'Cache-control: public' ;
2331 - celles qui ont un en-tête 'Pragma: no-cache' ;
2332 - celles qui ont un en-tête 'Cache-control: private' ;
2333 - celles qui ont un en-tête 'Cache-control: no-store' ;
2334 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2335 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2336 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2337 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2338 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002339 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002340
willy tarreau982249e2005-12-18 00:57:06 +01002341Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2342même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2343message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2344dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002345en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002346l'administrateur sache qu'il y a une action correctrice à entreprendre.
2347
23484.6) Personalisation des erreurs
2349--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002350Certaines situations conduisent à retourner une erreur HTTP au client :
2351 - requête invalide ou trop longue => code HTTP 400
2352 - requête mettant trop de temps à venir => code HTTP 408
2353 - requête interdite (bloquée par un reqideny) => code HTTP 403
2354 - erreur interne du proxy => code HTTP 500
2355 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2356 - aucun serveur disponible pour cette requête => code HTTP 503
2357 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2358
2359Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2360Cependant, en fonction du type de clientèle, on peut préférer retourner des
willy tarreau64a3cc32005-12-18 01:13:11 +01002361pages personnalisées. Ceci est possible par le biais de la commande "errorloc":
willy tarreau8337c6b2005-12-17 13:41:01 +01002362
2363 errorloc <code_HTTP> <location>
2364
2365Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2366le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2367d'une page précisée dans <location>. Cette adresse peut être relative au site,
2368ou absolue. Comme cette réponse est traîtée par le navigateur du client
2369lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2370
2371Exemple :
2372---------
2373 listen application 0.0.0.0:80
2374 errorloc 400 /badrequest.html
2375 errorloc 403 /forbidden.html
2376 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002377 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002378 errorloc 502 http://192.168.114.58/error50x.html
2379 errorloc 503 http://192.168.114.58/error50x.html
2380 errorloc 504 http://192.168.114.58/error50x.html
2381
willy tarreauc1f47532005-12-18 01:08:26 +01002382Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2383accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2384problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2385régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2386dans le champ Location avec la méthode GET uniquement. Seulement, certains
2387navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2388plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2389devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002390l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2391visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002392
2393Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2394utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2395dès que vous savez que vos clients supportent le code de retour HTTP 303.
2396
willy tarreau982249e2005-12-18 00:57:06 +010023974.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002398--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002399Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2400évite de répéter des paramètres communs à toutes les instances, tels que les
2401timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002402
2403Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2404précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2405'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2406section implique une annulation de tous les paramètres par défaut positionnés
2407précédemment, dans le but de les remplacer.
2408
2409La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2410paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2411un commentaire en guise paramètre.
2412
willy tarreau982249e2005-12-18 00:57:06 +01002413Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2414positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002415 - log (le premier et le second)
2416 - mode { tcp, http, health }
2417 - balance { roundrobin }
2418 - disabled (pour désactiver toutes les instances qui suivent)
2419 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2420 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002421 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2422 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002423 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002424 - cookie, capture
2425 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002426
2427Ne sont pas supportés dans cette version, les adresses de dispatch et les
2428configurations de serveurs, ainsi que tous les filtres basés sur les
2429expressions régulières :
2430 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002431 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002432
2433Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2434positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2435défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2436paramètres par défaut avant la déclaration de l'instance.
2437
2438Exemples :
2439----------
2440 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002441 log global
2442 mode tcp
2443 balance roundrobin
2444 clitimeout 180000
2445 srvtimeout 180000
2446 contimeout 4000
2447 retries 3
2448 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002449
2450 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002451 server srv1 192.168.1.1 check port 6000 inter 10000
2452 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002453
2454 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002455 server srv1 192.168.2.1 check port 6000 inter 10000
2456 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002457
2458 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002459 log global
2460 mode http
2461 option httplog
2462 option forwardfor
2463 option dontlognull
2464 balance roundrobin
2465 clitimeout 20000
2466 srvtimeout 20000
2467 contimeout 4000
2468 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002469
2470 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002471 cookie SERVERID postonly insert indirect
2472 capture cookie userid= len 10
2473 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2474 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002475
2476 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002477 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002478
willy tarreau8f635a42006-05-21 23:05:54 +02002479
24804.8) Rapport d'état sous forme de page HTML
2481-------------------------------------------
2482Avec la version 1.2.14, il devient possible pour haproxy d'interceptre des
2483requêtes pour une URI particulière et de retourner un rapport complet d'état de
2484l'activité du proxy, et des statistiques sur les serveurs. Ceci est disponible
2485via le mot clé "stats" associé à n'importe laquelle de ces options :
2486
2487 - stats enable
2488 - stats uri <uri prefix>
2489 - stats realm <authentication realm>
2490 - stats auth <user:password>
2491 - stats scope <proxy_id> | '.'
2492
2493
2494Par défaut, le rapport est désactivé. Le fait de spécifier une des combinaision
2495ci-dessus active le rapport pour l'instance de proxy qui le référence. La
2496solution la plus simple est d'utiliser "stats enable" qui activera le rapport
2497avec les paramètres par défaut suivant :
2498
2499 - default URI : "/haproxy?stats" (CONFIG_STATS_DEFAULT_URI)
2500 - default auth : non spécifié (pas d'authentication)
2501 - default realm : "HAProxy Statistics" (CONFIG_STATS_DEFAULT_REALM)
2502 - default scope : non specifié (accès à toutes les instances)
2503
2504L'option "stats uri <uri_prefix>" permet d'intercepter un autre préfixe d'URI
2505que celui par défaut. Noter que n'importe quelle URI qui COMMENCE avec cette
2506chaîne sera validée. Par exemple, une instance pourrait être dédiée à la page
2507d'état seulement et répondre à toute URI.
2508
2509Example :
2510---------
2511 # intercepte n'importe quelle URI et retourne la page d'état.
2512 listen stats :8080
2513 mode http
2514 stats uri /
2515
2516
2517L'option "stats auth <user:password>" active l'authentification "Basic" et
2518ajoute un couple "user:password" valide à la liste des comptes autorisés.
2519L'utilisateur <user> et le mot de passe <password> doivent être précisés
2520en clair dans le fichier de configuration, et comme ceci est de
2521l'authentification HTTP "Basic", il faut être conscient qu'ils transitent en
2522clair sur le réseau, donc il ne faut pas utiliser de compte sensible. La liste
2523est illimitée dans le but de pouvoir fournir des accès facilement à des
2524développeurs ou à des clients.
2525
2526L'option "stats realm <realm>" définit le "domaine" ("realm") de validité du
2527mot de passe qui sera présenté dans la boîte de dialogue du navigateur
2528lorsqu'il demandera un compte utilisateur et un mot de passe. Il est important
2529de s'assurer que celui-ci soit différent de ceux utilisés par l'application,
2530autrement le navigateur tentera d'en utiliser un caché depuis l'application.
2531Noter que les espaces dans le nom de "realm" doivent être protégés par un
2532backslash ('\').
2533
2534L'option "stats scope <proxy_id>" limite la portée du rapport d'état. Par
2535défaut, toutes les instances proxy sont listées. Mais dans certaines
2536circonstances, il serait préférable de ne lister que certains proxies ou
2537simplement le proxy courant. C'est ce que fait cette option. Le nom spécial "."
2538(un simple point) référence le proxy courant. Cette option peut être répétée
2539autant de fois que nécessaire pour autoriser d'autres proxies, même pour des
2540noms référencés plus loin dans la configuration ou bien des noms qui n'existent
2541pas encore. Le nom précisé est celui qui apparait après le mot clé "listen".
2542
2543Exemple :
2544---------
2545 # simple application embarquant la page d'état authentifiée
2546 listen app1 192.168.1.100:80
2547 mode http
2548 option httpclose
2549 balance roundrobin
2550 cookie SERVERID postonly insert indirect
2551 server srv1 192.168.1.1:8080 cookie srv1 check inter 1000
2552 server srv1 192.168.1.2:8080 cookie srv2 check inter 1000
2553 stats uri /my_stats
2554 stats realm Statistics\ for\ MyApp1-2
2555 stats auth guest:guest
2556 stats auth admin:AdMiN123
2557 stats scope .
2558 stats scope app2
2559
2560 # simple application embarquant la page d'état sans authentification
2561 listen app2 192.168.2.100:80
2562 mode http
2563 option httpclose
2564 balance roundrobin
2565 cookie SERVERID postonly insert indirect
2566 server srv1 192.168.2.1:8080 cookie srv1 check inter 1000
2567 server srv1 192.168.2.2:8080 cookie srv2 check inter 1000
2568 stats uri /my_stats
2569 stats realm Statistics\ for\ MyApp2
2570 stats scope .
2571
2572 listen admin_page :8080
2573 mode http
2574 stats uri /my_stats
2575 stats realm Global\ statistics
2576 stats auth admin:AdMiN123
2577
2578Notes :
2579-------
2580 - les options "stats" peuvent aussi être spécifiées dans une section
2581 "defaults", auquel cas la même configuration exactement sera fournie à
2582 toutes les instances suivantes, d'où l'utilité du scope ".". Toutefois, si
2583 une instance redéfinit n'importe quel paramètre "stats", alors les défauts
2584 ne lui seront pas appliqués.
2585
2586 - l'authentification "Basic" est très simpliste et non sécurisée contre la
2587 capture réseau. Aucun mot de passe sensible ne doit être utilisé, et il
2588 est bon de savoir qu'il n'existe pas de moyen de le supprimer du navigateur
2589 après usage, donc il sera envoyé tel quel à l'application au cours des
2590 accès successifs.
2591
2592 - Il est très important de préciser l'option "httpclose", sinon le proxy ne
2593 sera pas en mesure de détecter les URI dans les sessions keep-alive
2594 maintenues entre le navigateur et les serveurs, donc les URI de stats
2595 seront transmises telles quelles aux serveurs comme si l'option n'était
2596 pas précisée.
2597
2598
willy tarreaub719f002005-12-17 12:55:07 +01002599=======================
2600| Paramétrage système |
2601=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002602
2603Sous Linux 2.4
2604==============
2605
willy tarreaub719f002005-12-17 12:55:07 +01002606-- cut here --
2607#!/bin/sh
2608# set this to about 256/4M (16384 for 256M machine)
2609MAXFILES=16384
2610echo $MAXFILES > /proc/sys/fs/file-max
2611ulimit -n $MAXFILES
2612
2613if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002614 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002615fi
2616
2617if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002618 # 30 seconds for fin, 15 for time wait
2619 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2620 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2621 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2622 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002623fi
2624
willy tarreau0f7af912005-12-17 12:21:26 +01002625echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002626echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2627echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002628echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002629echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2630echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002631echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2632echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002633echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002634echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002635echo 0 > /proc/sys/net/ipv4/tcp_dsack
2636
2637# auto-tuned on 2.4
2638#echo 262143 > /proc/sys/net/core/rmem_max
2639#echo 262143 > /proc/sys/net/core/rmem_default
2640
2641echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2642echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2643
2644-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002645
willy tarreau197e8ec2005-12-17 14:10:59 +01002646Sous FreeBSD
2647============
2648
2649Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2650Clement Laforet <sheepkiller@cultdeadsheep.org>.
2651
2652Pour plus d'informations :
2653http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2654http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2655http://www.freshports.org/net/haproxy
2656
2657
willy tarreau0f7af912005-12-17 12:21:26 +01002658-- fin --