blob: eb0cd8566ff0a1816ba85074e69cfe44d4220e47 [file] [log] [blame]
willy tarreau0174f312005-12-18 01:02:42 +01001 -------------------
2 H A - P r o x y
3 Manuel de référence
4 -------------------
willy tarreaub952e1d2005-12-18 01:31:20 +01005 version 1.2.7
willy tarreauc5f73ed2005-12-18 01:26:38 +01006 willy tarreau
willy tarreaub952e1d2005-12-18 01:31:20 +01007 2005/10/09
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
13HA-Proxy est un relais TCP/HTTP offrant des facilités d'intégration en
14environnement 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 tarreau0f7af912005-12-17 12:21:26 +010024
willy tarreau64a3cc32005-12-18 01:13:11 +010025Il requiert peu de ressources, et son architecture événementielle mono-
26processus lui permet facilement de gérer plusieurs milliers de connexions
27simultanées sur plusieurs relais sans effondrer le système.
willy tarreaua1598082005-12-17 13:08:06 +010028
willy tarreau0f7af912005-12-17 12:21:26 +010029
30===========================
31| Paramètres de lancement |
32===========================
33
34Les options de lancement sont peu nombreuses :
35
36 -f <fichier de configuration>
37 -n <nombre maximal total de connexions simultanées>
38 -N <nombre maximal de connexions simultanées par proxy>
39 -d active le mode debug
40 -D passe en daemon
willy tarreau982249e2005-12-18 00:57:06 +010041 -q désactive l'affichage de messages sur la sortie standard.
42 -V affiche les messages sur la sortie standard, même si -q ou 'quiet' sont
43 spécifiés.
44 -c vérifie le fichier de configuration puis quitte avec un code de retour 0
45 si aucune erreur n'a été trouvée, ou 1 si une erreur de syntaxe a été
46 détectée.
willy tarreaufe2c5c12005-12-17 14:14:34 +010047 -p <fichier> indique au processus père qu'il doit écrire les PIDs de ses
48 fils dans ce fichier en mode démon.
willy tarreau0f7af912005-12-17 12:21:26 +010049 -s affiche les statistiques (si option compilée)
50 -l ajoute des informations aux statistiques
willy tarreau64a3cc32005-12-18 01:13:11 +010051 -de désactive l'utilisation de epoll()
52 -dp désactive l'utilisation de poll()
willy tarreau0f7af912005-12-17 12:21:26 +010053
willy tarreau64a3cc32005-12-18 01:13:11 +010054Le nombre maximal de connexion simultanées par proxy est le paramètre par
55défaut pour les proxies pour lesquels ce paramètre n'est pas précisé dans le
56fichier de configuration. Il s'agit du paramètre 'maxconn' dans les sections
57'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010058
willy tarreau64a3cc32005-12-18 01:13:11 +010059Le nombre maximal total de connexions simultanées limite le nombre de
60connexions TCP utilisables à un instant donné par le processus, tous proxies
61confondus. Ce paramètre remplace le paramètre 'maxconn' de la section 'global'.
willy tarreaua1598082005-12-17 13:08:06 +010062
willy tarreauc29948c2005-12-17 13:10:27 +010063Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
willy tarreauc5f73ed2005-12-18 01:26:38 +010064mode, toutes les connexions, déconnexions, et tous les échanges d'en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +010065sont affichés.
66
67Les statistiques ne sont disponibles que si le programme a été compilé avec
68l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
69d'utilité que lors de benchmarks par exemple.
70
willy tarreau0f7af912005-12-17 12:21:26 +010071
72============================
73| Fichier de configuration |
74============================
75
willy tarreauc29948c2005-12-17 13:10:27 +010076Structure
77=========
willy tarreau0f7af912005-12-17 12:21:26 +010078
willy tarreaua1598082005-12-17 13:08:06 +010079L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
willy tarreau64a3cc32005-12-18 01:13:11 +010080les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est
81pas précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +010082
83Le fichier de configuration est découpé en sections répérées par des mots clés
84tels que :
85
86 - 'global'
87 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +010088 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +010089
90Tous les paramètres font référence à la section définie par le dernier mot clé
91reconnu.
92
93
willy tarreauc29948c2005-12-17 13:10:27 +0100941) Paramètres globaux
95=====================
willy tarreaua1598082005-12-17 13:08:06 +010096
97Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
98proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
99supportés sont :
100
willy tarreau8337c6b2005-12-17 13:41:01 +0100101 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100102 - maxconn <nombre>
103 - uid <identifiant>
104 - gid <identifiant>
105 - chroot <répertoire>
106 - nbproc <nombre>
107 - daemon
108 - debug
willy tarreau64a3cc32005-12-18 01:13:11 +0100109 - noepoll
110 - nopoll
willy tarreaua1598082005-12-17 13:08:06 +0100111 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100112 - pidfile <fichier>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100113 - ulimit-n <nombre>
114
willy tarreaua1598082005-12-17 13:08:06 +0100115
1161.1) Journalisation des événements
117----------------------------------
118La plupart des événements sont journalisés : démarrages, arrêts, disparition et
119apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
120syslog vers un ou deux serveurs. La syntaxe est la suivante :
121
willy tarreau8337c6b2005-12-17 13:41:01 +0100122 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100123
124Les connexions sont envoyées en niveau "info". Les démarrages de service et de
125serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
126arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau64a3cc32005-12-18 01:13:11 +0100127bien pour les proxies que pour les serveurs testés par les proxies. Le
128paramètre optionnel <niveau_max> définit le niveau maximal de traces émises
129parmi les 8 valeurs suivantes :
willy tarreau8337c6b2005-12-17 13:41:01 +0100130 emerg, alert, crit, err, warning, notice, info, debug
131
willy tarreaueedaa9f2005-12-17 14:08:03 +0100132Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100133est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100134
135Les catégories possibles sont :
136 kern, user, mail, daemon, auth, syslog, lpr, news,
137 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
138 local0, local1, local2, local3, local4, local5, local6, local7
139
willy tarreau036e1ce2005-12-17 13:46:33 +0100140Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
141
willy tarreaua1598082005-12-17 13:08:06 +0100142Exemple :
143---------
144 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100145 log 192.168.2.200 local3
146 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100147
1481.2) limitation du nombre de connexions
149---------------------------------------
150Il est possible et conseillé de limiter le nombre global de connexions par
willy tarreauc5f73ed2005-12-18 01:26:38 +0100151processus à l'aide du mot clé global 'maxconn'. Les connexions sont comprises
152au sens 'acceptation de connexion', donc il faut s'attendre en règle général à
153avoir un peu plus du double de sessions TCP que le maximum de connexions fixé.
154C'est important pour fixer le paramètre 'ulimit -n' avant de lancer le proxy.
155Pour comptabiliser le nombre de sockets nécessaires, il faut prendre en compte
156ces paramètres :
157
willy tarreaua1598082005-12-17 13:08:06 +0100158 - 1 socket par connexion entrante
159 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100160 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100161 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100162 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100163
willy tarreau64a3cc32005-12-18 01:13:11 +0100164Dans le cas où chaque proxy n'écoute que sur un couple adresse/port,
willy tarreauc5f73ed2005-12-18 01:26:38 +0100165positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
166(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
167il est possible de spécifier cette limite dans la configuration à l'aide du
168mot-clé global 'ulimit-n', à condition bien entendu que le proxy ait été
169démarré sous le compte root (ou avec des droits suffisants pour élever le
170nombre de descripteurs de fichiers). Cette solution met un terme au problème
171récurrent d'incertitude de l'adéquation entre les limites systèmes lors de la
172dernière relance du proxessus et les limites en nombre de connexions. Noter que
173cette limite s'applique par processus.
174
175Exemple :
176---------
177 global
178 maxconn 32000
179 ulimit-n 65536
180
willy tarreauc29948c2005-12-17 13:10:27 +0100181
1821.3) Diminution des privilèges
183------------------------------
184Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
185serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100186de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100187
willy tarreauc29948c2005-12-17 13:10:27 +0100188Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
189numérique d'utilisateur. La valeur 0, correspondant normalement au super-
190utilisateur, possède ici une signification particulière car elle indique que
191l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
192C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
193un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
194changer. Il est particulièrement déconseillé d'utiliser des comptes génériques
195tels que 'nobody' car cette pratique revient à utiliser 'root' si d'autres
196processus utilisent les mêmes identifiants.
197
198Le paramètre 'chroot' autorise à changer la racine du processus une fois le
199programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100200puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100201généralement contournable sur certains OS (Linux, Solaris) pour peu que
202l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
203un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
204service pour cet usage, et de ne pas mutualiser un même répertoire pour
205plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
206il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
207l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100208
willy tarreau64a3cc32005-12-18 01:13:11 +0100209Remarque importante :
210---------------------
211Dans le cas où une telle faille serait mise en évidence, il est fort probable
212que les premières tentatives de son exploitation provoquent un arrêt du
willy tarreauc29948c2005-12-17 13:10:27 +0100213programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
willy tarreau64a3cc32005-12-18 01:13:11 +0100214encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur
215en environnement limité réduit les risques d'intrusion, il est parfois bien
216utile dans ces circonstances de connaître les conditions d'apparition du
217problème, via l'obtention d'un fichier 'core'. La plupart des systèmes, pour
218des raisons de sécurité, désactivent la génération du fichier 'core' après un
219changement d'identifiant pour le processus. Il faudra donc soit lancer le
220processus à partir d'un compte utilisateur aux droits réduits (mais ne pouvant
221pas effectuer le chroot), ou bien le faire en root sans réduction des droits
222(uid 0). Dans ce cas, le fichier se trouvera soit dans le répertoire de
223lancement, soit dans le répertoire spécifié après l'option 'chroot'. Ne pas
224oublier la commande suivante pour autoriser la génération du fichier avant de
225lancer le programme :
willy tarreauc29948c2005-12-17 13:10:27 +0100226
227# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100228
willy tarreauc29948c2005-12-17 13:10:27 +0100229Exemple :
230---------
231
232 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100233 uid 30000
234 gid 30000
235 chroot /var/chroot/haproxy
willy tarreauc29948c2005-12-17 13:10:27 +0100236
willy tarreaufe2c5c12005-12-17 14:14:34 +01002371.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100238----------------------------
239Le service peut fonctionner dans plusieurs modes :
240 - avant- / arrière-plan
241 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100242
willy tarreau64a3cc32005-12-18 01:13:11 +0100243Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne
244rend pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci
245dans un script de démarrage du système, sinon le système ne finirait pas son
willy tarreauc29948c2005-12-17 13:10:27 +0100246initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
247au processus appelant. C'est ce que fait l'option 'daemon' de la section
248'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100249
willy tarreauc29948c2005-12-17 13:10:27 +0100250Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
251standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
252logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
253Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100254
willy tarreauc29948c2005-12-17 13:10:27 +0100255Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
256problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
257entre les clients et les serveurs. Ce mode est incompatible avec les options
258'daemon' et 'quiet' pour des raisons de bon sens.
259
willy tarreaufe2c5c12005-12-17 14:14:34 +01002601.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100261-----------------------------------------------
262Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
263processeur pour effectuer les tâches de relayage, même si les charges
264nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
265grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
266programme sait démarrer plusieurs processus se répartissant la charge de
267travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
268section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100269qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
270la limite de nombre de descripteurs de fichiers allouée par processus sous
271Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100272
273Exemple :
274---------
275
276 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100277 daemon
278 quiet
279 nbproc 2
willy tarreauc29948c2005-12-17 13:10:27 +0100280
willy tarreaufe2c5c12005-12-17 14:14:34 +01002811.6) Simplification de la gestion des processus
282-----------------------------------------------
283Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
284paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
285d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
286le numéro de PID des processus fils, à raison d'un par ligne (valable
287uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
288afin de rester compatible avec un répertoire protégé en lecture seule. Il
289appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
2900644.
291
292Exemple :
293---------
294
295 global
296 daemon
297 quiet
298 nbproc 2
299 pidfile /var/run/haproxy-private.pid
300
301 # pour stopper seulement ces processus parmi d'autres :
302 # kill $(</var/run/haproxy-private.pid)
303
willy tarreauc29948c2005-12-17 13:10:27 +0100304
willy tarreau64a3cc32005-12-18 01:13:11 +01003051.7) Mécanismes de traitements des événements
306---------------------------------------------
307A partir de la version 1.2.5, haproxy supporte les mécanismes poll() et
308epoll(). Sur les systems où select() est limité par FD_SETSIZE (comme Solaris),
309poll() peut être une alternative intéressante. Des tests de performance
310montrent que les performances de poll() ne décroissent pas aussi vite que le
311nombre de sockets augmente, ce qui en fait une solution sûre pour les fortes
312charges. Cela dit, Soalris utilise déjà poll() pour émuler select(), donc tant
313que le nombre de sockets ne dépasse pas FD_SETSIZE, poll() ne devrait pas
314apporter de performances supplémentaires. Sur les systèmes à base Linux
315incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
316qui est extrèmement rapide indépendamment du nombre de sockets. Les tests sur
317haproxy ont montré une performance constante de 1 à 40000 sessions simultanées.
318
319Haproxy utilisera epoll() lorsqu'il est disponible, et se repliera sur poll(),
320puis en dernier lieu sur select(). Cependant, si pour une raison quelconque il
321s'avérait nécessaire de désactiver epoll() ou poll() (p.ex: à cause d'un bug ou
322juste pour comparer les performances), deux nouvelles options globales ont été
323ajoutées dans ce but : 'noepoll' et 'nopoll'.
324
325Exemple :
326---------
327 global
328 # utiliser seulement select()
329 noepoll
330 nopoll
331
332Remarque :
333----------
334Dans le but d'assurer une portabilité maximale des configurations, ces options
335sont acceptées et ignorées si les mécanismes poll() ou epoll() n'ont pas été
336activés lors de la compilation.
337
338Afin de simplifier la résolution de problèmes, le paramètre '-de' en ligne de
339commande désactive epoll() et le paramètre '-dp' désactive poll(). Ils sont
340respectivement équivalents à 'noepoll' et 'nopoll'.
341
342
willy tarreauc29948c2005-12-17 13:10:27 +01003432) Définition d'un service en écoute
344====================================
345
346Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100347
willy tarreaua41a8b42005-12-17 14:02:24 +0100348 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100349
willy tarreauc29948c2005-12-17 13:10:27 +0100350- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
willy tarreau64a3cc32005-12-18 01:13:11 +0100351 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé.
352 Aucun test n'est effectué concernant l'unicité de ce nom, qui n'est pas
353 obligatoire, mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100354
willy tarreaua41a8b42005-12-17 14:02:24 +0100355- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
356 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
357 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100358
willy tarreaua41a8b42005-12-17 14:02:24 +0100359- <plage_ports> correspond soit à un port, soit à une plage de ports sur
360 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
361 Cette plage peut être :
362 - soit un port numérique (ex: '80')
363 - soit une plage constituée de deux valeurs séparées par un tiret
364 (ex: '2000-2100') représentant les extrémités incluses dans la
365 plage.
366 Il faut faire attention à l'usage des plages, car chaque combinaison
367 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
368 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
369 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
willy tarreau64a3cc32005-12-18 01:13:11 +0100370 niveau de privilège particulier lors du lancement du programme
371 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100372
willy tarreaua41a8b42005-12-17 14:02:24 +0100373- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
374 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
375 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
376
377Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100378---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100379 listen http_proxy :80
380 listen x11_proxy 127.0.0.1:6000-6009
381 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
382 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100383
willy tarreaua41a8b42005-12-17 14:02:24 +0100384Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
385rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
386de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
387l'écriture de configurations :
388
389 bind [ <adresse_IP>:<plage_ports>[,...] ]
390
391Exemples :
392----------
393 listen http_proxy
394 bind :80,:443
willy tarreauc5f73ed2005-12-18 01:26:38 +0100395 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100396
willy tarreauc29948c2005-12-17 13:10:27 +01003972.1) Inhibition d'un service
398----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100399Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100400commenter toute une partie du fichier. Il suffit de positionner le mot clé
401"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100402
403 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100404 disabled
willy tarreau0f7af912005-12-17 12:21:26 +0100405
willy tarreaueedaa9f2005-12-17 14:08:03 +0100406Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
willy tarreauc5f73ed2005-12-18 01:26:38 +0100407 désactivé par le mot clé 'disabled', par exemple à cause d'une
408 configuration par défaut.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100409
willy tarreauc29948c2005-12-17 13:10:27 +01004102.2) Mode de fonctionnement
411---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100412Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100413 - TCP
414 - HTTP
415 - supervision
416
417Mode TCP
418--------
willy tarreau64a3cc32005-12-18 01:13:11 +0100419Dans ce mode, le service relaye, dès leur établissement, les connexions TCP
420vers un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il
421s'agit simplement d'une association
422 source<adresse:port> -> destination<adresse:port>.
willy tarreauc29948c2005-12-17 13:10:27 +0100423Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100424
willy tarreauc29948c2005-12-17 13:10:27 +0100425Exemple :
426---------
willy tarreau0f7af912005-12-17 12:21:26 +0100427 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100428 mode tcp
willy tarreau0f7af912005-12-17 12:21:26 +0100429
430Mode HTTP
431---------
willy tarreauc29948c2005-12-17 13:10:27 +0100432Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
433serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
willy tarreauc5f73ed2005-12-18 01:26:38 +0100434décision. Les en-têtes HTTP sont analysés pour y trouver un éventuel cookie, et
willy tarreauc29948c2005-12-17 13:10:27 +0100435certains d'entre-eux peuvent être modifiés par le biais d'expressions
436régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
437relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100438
willy tarreauc29948c2005-12-17 13:10:27 +0100439Exemple :
440---------
willy tarreau0f7af912005-12-17 12:21:26 +0100441 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100442 mode http
willy tarreau0f7af912005-12-17 12:21:26 +0100443
444Mode supervision
445----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100446Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
447santé du service. Il se contente de retourner "OK" à tout client se connectant
448sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100449déterminer quels sont les services utilisables. Si l'option 'httpchk' est
450activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
451attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100452le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100453
willy tarreauc29948c2005-12-17 13:10:27 +0100454Exemple :
455---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100456 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100457 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100458 mode health
willy tarreau0f7af912005-12-17 12:21:26 +0100459
willy tarreau197e8ec2005-12-17 14:10:59 +0100460 # réponse HTTP : 'HTTP/1.0 200 OK'
461 listen http_health_check 0.0.0.0:60001
willy tarreauc5f73ed2005-12-18 01:26:38 +0100462 mode health
463 option httpchk
willy tarreau197e8ec2005-12-17 14:10:59 +0100464
willy tarreau0f7af912005-12-17 12:21:26 +0100465
willy tarreauc5f73ed2005-12-18 01:26:38 +0100466Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
467bon fonctionnement du proxy sans perturber le service. Le mot-clé 'monitor-net'
468a été créé dans le butd de spécifier un réseau d'équipements qui ne PEUVENT PAS
469utiliser le service pour autre chose que des tests de fonctionnement. C'est
470particulièrement adapté aux proxies TCP, car cela empêche le proxy de relayer
471des établissements de connexion émis par un outil de surveillance.
472
473Lorsque c'est utilisé sur un proxy TCP, la connexion est acceptée puis refermée
474et rien n'est logué. C'est suffisant pour qu'un répartiteur de charge en amont
475détecte que le service est disponible.
476
477Lorsque c'est utilisé sur un proxy HTTP, la connexion est acceptée, rien n'est
478logué, puis la réponse suivante est envoyée et la session refermée :
479"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un répartiteur de charge
480HTTP en amont détecte le service comme opérationnel, aussi bien à travers des
481tests TCP que HTTP.
482
483Les proxies utilisant le mot-clé 'monitor-net' peuvent accessoirement se passer
484de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
485émises depuis d'autres adresses que celles du réseau de tests.
486
487Exemple :
488---------
489
490 listen tse-proxy
491 bind :3389,:1494,:5900 # TSE, ICA and VNC at once.
492 mode tcp
493 balance roundrobin
494 server tse-farm 192.168.1.10
495 monitor-net 192.168.1.252/31 # L4 load-balancers on .252 and .253
496
497
willy tarreauc29948c2005-12-17 13:10:27 +01004982.3) Limitation du nombre de connexions simultanées
499---------------------------------------------------
500Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
501connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
502d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
503limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100504
willy tarreauc29948c2005-12-17 13:10:27 +0100505Exemple :
506---------
507 listen tiny_server 0.0.0.0:80
508 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100509
510
willy tarreauc29948c2005-12-17 13:10:27 +01005112.4) Arrêt en douceur
512---------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100513Il est possible d'arrêter les services en douceur en envoyant un signal
514SIG_USR1 au processus relais. Tous les services seront alors mis en phase
515d'arrêt, mais pourront continuer d'accepter des connexions pendant un temps
516défini par le paramètre 'grace' (en millisecondes). Cela permet par exemple,
517de faire savoir rapidement à un répartiteur de charge qu'il ne doit plus
518utiliser un relais, tout en continuant d'assurer le service le temps qu'il
519s'en rende compte.
520
521Remarque :
522----------
523Les connexions actives ne sont jamais cassées. Dans le pire des cas, il faudra
524attendre en plus leur expiration avant l'arrêt total du processus. La valeur
525par défaut est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100526
527Exemple :
528---------
willy tarreauc29948c2005-12-17 13:10:27 +0100529 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100530 # le service tournera encore 10 secondes après la demande d'arrêt
531 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100532 mode http
533 grace 10000
willy tarreau0f7af912005-12-17 12:21:26 +0100534
willy tarreauc29948c2005-12-17 13:10:27 +0100535 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100536 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100537 mode health
538 grace 0
willy tarreau0f7af912005-12-17 12:21:26 +0100539
540
willy tarreauc29948c2005-12-17 13:10:27 +01005412.5) Temps d'expiration des connexions
542--------------------------------------
543Il est possible de paramétrer certaines durées d'expiration au niveau des
544connexions TCP. Trois temps indépendants sont configurables et acceptent des
545valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
546session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100547
548 - temps d'attente d'une donnée de la part du client, ou de la
549 possibilité de lui envoyer des données : "clitimeout" :
550
willy tarreauc5f73ed2005-12-18 01:26:38 +0100551 # time-out client à 2mn30.
552 clitimeout 150000
willy tarreau0f7af912005-12-17 12:21:26 +0100553
554 - temps d'attente d'une donnée de la part du serveur, ou de la
555 possibilité de lui envoyer des données : "srvtimeout" :
556
willy tarreauc5f73ed2005-12-18 01:26:38 +0100557 # time-out serveur à 30s.
558 srvtimeout 30000
willy tarreau0f7af912005-12-17 12:21:26 +0100559
560 - temps d'attente de l'établissement d'une connexion vers un serveur
561 "contimeout" :
562
willy tarreauc29948c2005-12-17 13:10:27 +0100563 # on abandonne si la connexion n'est pas établie après 4 secondes
willy tarreauc5f73ed2005-12-18 01:26:38 +0100564 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100565
willy tarreauc29948c2005-12-17 13:10:27 +0100566Remarques :
567-----------
568 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
569 type "health".
570 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
willy tarreau64a3cc32005-12-18 01:13:11 +0100571 possible de perdre des paquets. Du fait que la première retransmission
572 TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
573 inférieur à 3 secondes ne permet pas de se rattraper sur la perte
574 de paquets car la session aura été abandonnée avant la première
575 retransmission. Une valeur de 4 secondes réduira considérablement
576 le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100577
willy tarreauc29948c2005-12-17 13:10:27 +01005782.6) Tentatives de reconnexion
579------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100580Lors d'un échec de connexion vers un serveur, il est possible de
581retenter (potentiellement vers un autre serveur, en cas de répartition
582de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100583abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100584
willy tarreauc29948c2005-12-17 13:10:27 +0100585Exemple :
586---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100587 # on essaie encore trois fois maxi
588 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100589
willy tarreau0f7af912005-12-17 12:21:26 +0100590
willy tarreauc29948c2005-12-17 13:10:27 +01005912.7) Adresse du serveur
592-----------------------
593Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
594le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
595serveur d'assignation de cookie dans le cas où le service consiste à assurer
596uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100597le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
598du serveur distant, et il est maintenant recommandé d'utiliser de préférence
599le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100600
willy tarreauc29948c2005-12-17 13:10:27 +0100601Exemple :
602---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100603 # on envoie toutes les nouvelles connexions ici
604 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100605
willy tarreauc29948c2005-12-17 13:10:27 +0100606Remarque :
607----------
608Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
609'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100610
willy tarreau0f7af912005-12-17 12:21:26 +0100611
willy tarreau240afa62005-12-17 13:14:35 +01006122.8) Adresse de sortie
613----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100614Il est possible de forcer l'adresse utilisée pour établir les connexions vers
615les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
616port, bien que cette fonctionnalité se limite à des usages très spécifiques.
617C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100618pour permettre aux serveurs de trouver le chemin de retour dans des contextes
619de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
620choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
621librement par le système. Il est à noter que depuis la version 1.1.18, les
622tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
623source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100624
625Exemples :
626----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100627 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100628 # toutes les connexions prennent l'adresse 192.168.1.200
629 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100630
willy tarreaua41a8b42005-12-17 14:02:24 +0100631 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100632 # utiliser l'adresse 192.168.1.200 et le port réservé 900
633 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100634
635
6362.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100637--------------------------------
638En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
639vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
640par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100641
willy tarreauc29948c2005-12-17 13:10:27 +0100642Exemple :
643---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100644 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100645 mode http
646 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100647
willy tarreauc29948c2005-12-17 13:10:27 +0100648On peut modifier l'utilisation du cookie pour la rendre plus intelligente
649vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
650réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
651cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100652de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
653inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100654
655Exemples :
656----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100657
658Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100659dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
660directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100661
willy tarreauc5f73ed2005-12-18 01:26:38 +0100662 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100663
willy tarreauc29948c2005-12-17 13:10:27 +0100664Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
665lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100666
willy tarreauc5f73ed2005-12-18 01:26:38 +0100667 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100668
willy tarreau64a3cc32005-12-18 01:13:11 +0100669Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
670accès en répartition de charge interne. Dans ce cas, il est souhaitable que
671tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100672retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100673
willy tarreauc5f73ed2005-12-18 01:26:38 +0100674 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100675
willy tarreau0174f312005-12-18 01:02:42 +0100676Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
677puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
678permet d'insérer une instance de haproxy devant une application sans risquer
679d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
680plus d'un cookie :
681
682 cookie JSESSIONID prefix
683
willy tarreau240afa62005-12-17 13:14:35 +0100684Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
685ajouter le mot clé 'nocache' après 'insert' :
686
willy tarreauc5f73ed2005-12-18 01:26:38 +0100687 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100688
willy tarreau64a3cc32005-12-18 01:13:11 +0100689Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
690mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100691
willy tarreauc5f73ed2005-12-18 01:26:38 +0100692 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100693
willy tarreau240afa62005-12-17 13:14:35 +0100694
willy tarreau96d40372005-12-17 13:11:56 +0100695Remarques :
696-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100697- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
698 s'adapter à des applications générant déjà le cookie, avec un contenu
699 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100700
willy tarreau96d40372005-12-17 13:11:56 +0100701- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
702 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
703 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100704
willy tarreau240afa62005-12-17 13:14:35 +0100705- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
706 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
707 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
708 cookie de persistence inséré, donc provoquer des changements de serveurs pour
709 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100710
willy tarreau0174f312005-12-18 01:02:42 +0100711- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
712 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
713 présenté par l'application qui est censée savoir à quel moment il peut
714 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
715 présenté par le client dans chaque requête ultérieure, il est indispensable
716 de s'assurer que le client et le serveur communiqueront sans "keep-alive
717 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
718
willy tarreaucd878942005-12-17 13:27:43 +0100719- lorsque l'application est bien connue, et que les parties nécessitant de la
720 persistence sont systématiquement accédées par un formulaire en mode POST,
721 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
722 et "indirect", car la page d'accueil reste cachable, et c'est l'application
723 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100724
willy tarreau240afa62005-12-17 13:14:35 +01007252.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100726----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100727En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
728par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100729
willy tarreau5cbea6f2005-12-17 12:48:26 +0100730 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100731
willy tarreauc29948c2005-12-17 13:10:27 +0100732- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
733 configuration et les logs.
734- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
735- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100736
737Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100738---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100739 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100740 mode http
741 cookie SERVERID
742 dispatch 192.168.1.100:80
743 server web1 192.168.1.1:80 cookie server01
744 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100745
746Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100747-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100748
willy tarreaua41a8b42005-12-17 14:02:24 +01007493) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100750=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100751
willy tarreauc29948c2005-12-17 13:10:27 +0100752Le relais peut effectuer lui-même la répartition de charge entre les différents
753serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
754cela, on précise le mot clé 'balance' dans la définition du service,
755éventuellement suivi du nom d'un algorithme de répartition. En version 1.1.9,
756seul 'roundrobin' est géré, et c'est aussi la valeur implicite par défaut. Il
757est évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
758spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100759
760Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100761---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100762
willy tarreaua41a8b42005-12-17 14:02:24 +0100763 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100764 mode http
765 cookie SERVERID
766 balance roundrobin
767 server web1 192.168.1.1:80 cookie server01
768 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100769
willy tarreaua41a8b42005-12-17 14:02:24 +0100770Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
771du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
772sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
773champ <port> de l'adresse serveur :
774
775 - non spécifié ou nul :
776 la connexion sera envoyée au serveur sur le même port que celui sur
777 lequel le relais a reçu la connexion.
778
779 - valeur numérique (seul cas supporté pour les versions antérieures) :
780 le serveur recevra la connexion sur le port désigné.
781
782 - valeur numérique précédée d'un signe '+' :
783 la connexion sera envoyée au serveur sur le même port que celui sur
784 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
785
786 - valeur numérique précédée d'un signe '-' :
787 la connexion sera envoyée au serveur sur le même port que celui sur
788 lequel le relais a reçu la connexion, duquel on soustrait la valeur
789 désignée.
790
791Exemples :
792----------
793
794# même que précédemment
795
796 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100797 mode http
798 cookie SERVERID
799 balance roundrobin
800 server web1 192.168.1.1 cookie server01
801 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100802
803# relayage simultané des ports 80 et 81 et 8080-8089
804
805 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100806 mode http
807 cookie SERVERID
808 balance roundrobin
809 server web1 192.168.1.1 cookie server01
810 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100811
812# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
813
814 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100815 mode tcp
816 balance roundrobin
817 server srv1 192.168.1.1:+1000
818 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100819
willy tarreau0f7af912005-12-17 12:21:26 +0100820
willy tarreauc29948c2005-12-17 13:10:27 +01008213.1) Surveillance des serveurs
822------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100823Il est possible de tester l'état des serveurs par établissement de connexion
824TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
825utilisé dans le processus de répartition de charge interne. Pour activer la
826surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
827Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
828tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
829paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
830Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreaue47c8d72005-12-17 12:55:52 +0100831 - inter : 2000
832 - rise : 2
833 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +0100834 - port : port de connexion du serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +0100835
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100836Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +0100837certains cas de pannes, des serveurs peuvent continuer à accepter les
838connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
839d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
840et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
841les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
842contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
843RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
8441.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
845possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
846l'avantage d'être facilement extractibles des logs, et de ne pas induire
847d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
848considérées valides, les autres (y compris non-réponses) aboutissent à un
849échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
850deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
851"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
852accepte donc 4 formes :
willy tarreaueedaa9f2005-12-17 14:08:03 +0100853 - option httpchk -> OPTIONS / HTTP/1.0
854 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
855 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
856 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100857Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100858
willy tarreau8337c6b2005-12-17 13:41:01 +0100859Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
860utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
861ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
862de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
863les serveurs de secours qui le précèdent sont hors d'usage. Il n'y a donc pas
864de répartition de charge entre des serveurs de secours. Ce type de serveurs
865peut servir à retourner des pages d'indisponibilité de service. Dans ce cas,
866il est préférable de ne pas affecter de cookie, afin que les clients qui le
867rencontrent n'y soient pas affectés définitivement. Le fait de ne pas mettre
868de cookie envoie un cookie vide, ce qui a pour effet de supprimer un éventuel
869cookie affecté précédemment.
870
willy tarreaua41a8b42005-12-17 14:02:24 +0100871Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
872vers un port différent de celui de service. C'est nécessaire principalement
873pour les configurations où le serveur n'a pas de port prédéfini, par exemple
874lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
875le paramètre 'port' suivi du numéro de port devant répondre aux requêtes.
876
willy tarreau64a3cc32005-12-18 01:13:11 +0100877Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
878l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
879SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
880envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
881elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
882local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +0100883
willy tarreau982249e2005-12-18 00:57:06 +0100884Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
885logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
886afin de notifier l'administrateur qu'il faut prendre une action immédiate.
887
willy tarreau0174f312005-12-18 01:02:42 +0100888Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
889même valeur de cookie. C'est particulièrement utile en mode backup, pour
890sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
891oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
892temporairement vers une page d'erreur en attendant le redémarrage d'une
893application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
894le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
895chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
896le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
897pour plus d'informations.
898
willy tarreauc29948c2005-12-17 13:10:27 +0100899Exemples :
900----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100901# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100902 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100903 mode http
904 cookie SERVERID
905 balance roundrobin
906 server web1 192.168.1.1:80 cookie server01 check
907 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100908
willy tarreau2f6ba652005-12-17 13:57:42 +0100909# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +0100910 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100911 mode http
912 cookie SERVERID
913 balance roundrobin
914 option httpchk
915 server web1 192.168.1.1:80 cookie server01 check
916 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +0100917
willy tarreau2f6ba652005-12-17 13:57:42 +0100918# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
919 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100920 mode http
921 cookie SERVERID
922 balance roundrobin
923 option httpchk /index.html
924 server web1 192.168.1.1:80 cookie server01 check
925 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +0100926
willy tarreaueedaa9f2005-12-17 14:08:03 +0100927# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
928 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100929 mode http
930 cookie SERVERID
931 balance roundrobin
932 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
933 server web1 192.168.1.1:80 cookie server01 check
934 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +0100935
willy tarreau0174f312005-12-18 01:02:42 +0100936# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
937# douceur utilisant un second port (81) juste pour les health-checks.
938 listen http_proxy 0.0.0.0:80
939 mode http
940 cookie JSESSIONID prefix
941 balance roundrobin
942 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
943 server web1-norm 192.168.1.1:80 cookie s1 check port 81
944 server web2-norm 192.168.1.2:80 cookie s2 check port 81
945 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
946 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
947
willy tarreau96d40372005-12-17 13:11:56 +0100948# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +0100949# automatique dans la requête, tout en indiquant aux caches de ne pas garder
950# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +0100951 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100952 mode http
953 cookie SERVERID insert nocache indirect
954 balance roundrobin
955 server web1 192.168.1.1:80 cookie server01 check
956 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +0100957
willy tarreaueedaa9f2005-12-17 14:08:03 +0100958# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +0100959 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100960 mode http
961 cookie SERVERID insert nocache indirect
962 balance roundrobin
963 server web1 192.168.1.1:80 cookie server01 check
964 server web2 192.168.1.2:80 cookie server02 check
965 server web-backup 192.168.2.1:80 cookie server03 check backup
966 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +0100967
willy tarreaua41a8b42005-12-17 14:02:24 +0100968# relayage SMTP+TLS avec test du serveur et serveur de backup
969
970 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +0100971 mode tcp
972 balance roundrobin
973 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
974 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +0100975
willy tarreau0f7af912005-12-17 12:21:26 +0100976
willy tarreauc29948c2005-12-17 13:10:27 +01009773.2) Reconnexion vers un répartiteur en cas d'échec direct
978----------------------------------------------------------
979En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
980seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
981définitivement privés de service. La spécification du paramètre 'redispatch'
982autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
983(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +0100984
985Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +0100986---------
willy tarreau0f7af912005-12-17 12:21:26 +0100987 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100988 mode http
989 cookie SERVERID
990 dispatch 192.168.1.100:80
991 server web1 192.168.1.1:80 cookie server01
992 server web2 192.168.1.2:80 cookie server02
993 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +0100994
willy tarreau64a3cc32005-12-18 01:13:11 +0100995Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
996redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
997version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
998identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
999tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1000tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001001
1002 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001003 mode http
1004 option persist
1005 cookie SERVERID
1006 dispatch 192.168.1.100:80
1007 server web1 192.168.1.1:80 cookie server01
1008 server web2 192.168.1.2:80 cookie server02
1009 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001010
willy tarreauc29948c2005-12-17 13:10:27 +01001011
10124) Fonctionnalités additionnelles
1013=================================
1014
1015D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
1016principalement du mode transparent, de la journalisation des connexions, et de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001017la réécriture des en-têtes.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001018
willy tarreau0174f312005-12-18 01:02:42 +010010194.1) Fonctionnalités réseau
1020---------------------------
10214.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001022---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001023En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1024routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1025pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001026destination de la session détournée. Le système doit permettre de rediriger les
1027paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001028
1029Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001030---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001031 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001032 mode http
1033 transparent
1034 cookie SERVERID
1035 server server01 192.168.1.1:80
1036 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001037
1038 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1039 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001040
willy tarreaua41a8b42005-12-17 14:02:24 +01001041Remarque :
1042----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001043Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1044adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1045d'une même adresse avec une même instance et sans utiliser directement le mode
1046transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001047
1048Exemple :
1049---------
1050 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001051 mode tcp
1052 server server01 192.168.1.1 check port 60000
1053 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001054
1055 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1056 -j REDIRECT --to-ports 65000
1057
willy tarreau0174f312005-12-18 01:02:42 +01001058
10594.1.2) Choix d'une adresse source par serveur
1060---------------------------------------------------
1061Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1062IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1063backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1064pour joindre le même serveur. C'est également utilisable pour faciliter une
1065répartition de charge selon l'adresse IP source pour des connexions sortantes.
1066Bien entendu, la même adresse est utilisée pour les health-checks.
1067
1068Exemple :
1069---------
1070 # utiliser une adresse particulière pour joindre les 2 serveur
1071 listen http_proxy 0.0.0.0:65000
1072 mode http
1073 balance roundrobin
1074 server server01 192.168.1.1:80 source 192.168.2.13
1075 server server02 192.168.1.2:80 source 192.168.2.13
1076
1077Exemple :
1078---------
1079 # utiliser une adresse particulière pour joindre chaque serveur
1080 listen http_proxy 0.0.0.0:65000
1081 mode http
1082 balance roundrobin
1083 server server01 192.168.1.1:80 source 192.168.1.1
1084 server server02 192.168.2.1:80 source 192.168.2.1
1085
1086Exemple :
1087---------
1088 # faire une répartition d'adresse sources pour joindre le même proxy à
1089 # travers deux liens WAN
1090 listen http_proxy 0.0.0.0:65000
1091 mode http
1092 balance roundrobin
1093 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1094 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1095
1096Exemple :
1097---------
1098 # forcer une connexion TCP à s'attacher à un port particulier
1099 listen http_proxy 0.0.0.0:2000
1100 mode tcp
1101 balance roundrobin
1102 server srv1 192.168.1.1:80 source 192.168.2.1:20
1103 server srv2 192.168.1.2:80 source 192.168.2.1:20
1104
willy tarreaub952e1d2005-12-18 01:31:20 +010011054.1.3) Maintien de session TCP (keep-alive)
1106-------------------------------------------
1107Avec la version 1.2.7, il devient possible d'activer le maintien de session
1108TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1109d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1110externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1111aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1112time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1113positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1114vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1115pour activer le maintien de session TCP :
1116
1117 option tcpka # active le keep-alive côté client et côté serveur
1118 option clitcpka # active le keep-alive côté client
1119 option srvtcpka # active le keep-alive côté serveur
1120
willy tarreau0f7af912005-12-17 12:21:26 +01001121
willy tarreauc29948c2005-12-17 13:10:27 +010011224.2) Journalisation des connexions
1123----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001124
1125L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1126Il fournit probablement le plus fin niveau d'information disponible pour un
1127tel outil, ce qui est très important pour les diagnostics en environnements
1128complexes. En standard, les informations journalisées incluent le port client,
1129les chronométrages des états TCP/HTTP, des états de session précis au moment de
1130la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1131trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1132arbitraires.
1133
1134Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1135transparence sur les problèmes rencontrés, à la fois internes et externes, et
1136il est possible d'envoyer les logs vers des serveurs différents en même temps
1137avec des niveaux de filtrage différents :
1138
1139 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1140 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1141 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1142 - activité par instance (connexions clients), aussi bien lors de leur
1143 établissement qu'à leur terminaison.
1144
1145La possibilité de distribuer différents niveaux de logs à différents serveurs
1146permet à plusieurs équipes de production d'intéragir et de corriger leurs
1147problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1148occasionnellement les erreurs système, pendant que l'équipe application
1149surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1150que l'équipe sécurité analyse l'activité en différé d'une heure.
1151
1152
willy tarreauc1cae632005-12-17 14:12:23 +010011534.2.1) Niveaux de log
1154---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001155Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1156détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1157source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001158la requête HTTP, le code de retour, la quantité de données transmises, et même
1159dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1160Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1161la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001162est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001163
willy tarreau8337c6b2005-12-17 13:41:01 +01001164 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1165 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001166ou
1167 log global
1168
1169Remarque :
1170----------
1171La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1172paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001173
1174Exemple :
1175---------
1176 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001177 mode http
1178 log 192.168.2.200 local3
1179 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001180
willy tarreauc1cae632005-12-17 14:12:23 +010011814.2.2) Format des logs
1182----------------------
1183Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1184de la session entre le client et le relais. En précisant l'option 'tcplog',
1185la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1186sur son état lors de la déconnexion, ainsi que le temps de connexion et la
1187durée totale de la session.
1188
willy tarreauc5f73ed2005-12-18 01:26:38 +01001189Exemple de journalisation TCP :
1190-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001191 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001192 mode tcp
1193 option tcplog
1194 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001195
willy tarreauc5f73ed2005-12-18 01:26:38 +01001196>>> haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 -- 1/1
1197
1198 Champ Format / Description Exemple
1199
1200 1 nom_processus '[' pid ']:' haproxy[18989]:
1201 2 ip_client ':' port_client 127.0.0.1:34550
1202 3 '[' date ']' [15/Oct/2003:15:24:28]
1203 4 nom_instance relais-tcp
1204 5 nom_serveur Srv1
1205 6 temps_connect '/' temps_total 0/5007
1206 7 octets lus 0
1207 8 etat_terminaison --
1208 9 conns_instance '/' conns_processus 1/1
willy tarreau982249e2005-12-18 00:57:06 +01001209
willy tarreauc1cae632005-12-17 14:12:23 +01001210Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1211notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1212surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1213les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1214ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1215(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001216
willy tarreauc5f73ed2005-12-18 01:26:38 +01001217Exemple de journalisation HTTP :
1218--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001219 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001220 mode http
1221 option httplog
1222 option dontlognull
1223 log 192.168.2.200 local3
1224
1225>>> haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 9/7/147/723 200 243 - - ---- 3/3 "HEAD / HTTP/1.0"
1226
1227Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001228
willy tarreauc5f73ed2005-12-18 01:26:38 +01001229 haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/11215 503 0 - - SC-- 202/205 {w.ods.org|Mozilla} {} "HEAD / HTTP/1.0"
1230
1231 Champ Format / Description Exemple
1232
1233 1 nom_processus '[' pid ']:' haproxy[18989]:
1234 2 ip_client ':' port_client 10.0.0.1:34552
1235 3 '[' date ']' [15/Oct/2003:15:26:31]
1236 4 nom_instance relais-http
1237 5 nom_serveur Srv1
1238 6 Tq '/' Tc '/' Tr '/' Tt 3183/-1/-1/11215
1239 7 Code_retour_HTTP 503
1240 8 octets lus 0
1241 9 cookies_requête_capturés -
1242 10 cookies_reponse_capturés -
1243 11 etat_terminaison SC--
1244 12 conns_instance '/' conns_processus 202/205
1245 13 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1246 14 '{' entetes_reponse_capturés '}' {}
1247 15 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
1248
1249Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1250 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001251
1252Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1253de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1254Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001255la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1256tôt possible, c'est à dire juste avant que ne débutent les transferts de
1257données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1258de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001259traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1260représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001261
willy tarreau64a3cc32005-12-18 01:13:11 +01001262Afin d'éviter toute confusion avec les logs normaux, le temps total de
1263transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001264rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001265
1266Exemple :
1267---------
1268
1269 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001270 mode http
1271 option httplog
1272 option dontlognull
1273 option logasap
1274 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001275
willy tarreauc5f73ed2005-12-18 01:26:38 +01001276>>> 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 +01001277
1278
willy tarreauc1cae632005-12-17 14:12:23 +010012794.2.3) Chronométrage des événements
1280-----------------------------------
1281Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1282événements sont d'une très grande utilité. Tous les temps sont mesurés en
1283millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
1284la forme Tq/Tc/Tr/Tt :
1285
1286 - Tq: temps total de réception de la requête HTTP de la part du client.
1287 C'est le temps qui s'est écoulé entre le moment où le client a établi
1288 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1289 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1290 que la requête complète n'a jamais été reçue.
1291
1292 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1293 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1294 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1295 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1296 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1297 vers le serveur.
1298
1299 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001300 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001301 la connexion. Ca représente exactement le temps de traitement de la
1302 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001303 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001304
1305 - Tt: durée de vie totale de la session, entre le moment où la demande de
1306 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001307 refermée aux deux extrémités (client et serveur). La signification change
1308 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
1309 uniquement à (Tq + Tc + Tr), et se trouve préfixé d'un signe '+'. On peut
1310 donc déduire Td, le temps de transfert des données, en excluant les autres
1311 temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001312
1313 Td = Tt - (Tq + Tc + Tr)
1314
1315 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1316
1317En mode TCP ('option tcplog'), seuls les deux indicateurs Tc et Tt sont
1318rapportés.
1319
1320Ces temps fournissent de précieux renseignement sur des causes probables de
1321problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1322de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1323de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1324problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1325valeur de time-out dans la configuration, c'est souvent qu'une session a été
1326abandonnée sur expiration d'un time-out.
1327
1328Cas les plus fréquents :
1329
1330 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1331 le client et le relais.
1332 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1333 le relais et le serveur durant la phase de connexion. Cet indicateur
1334 devrait normalement toujours être très bas (moins de quelques dizaines).
1335 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1336 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1337 de pertes entre le relais et le serveur.
1338 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1339 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1340 session est maintenue après la fin des échanges. Voir plus loin pour
1341 savoir comment désactiver le keep-alive HTTP.
1342
1343Autres cas ('xx' représentant une valeur quelconque à ignorer) :
1344 -1/xx/xx/Tt : le client n'a pas envoyé sa requête dans le temps imparti ou
willy tarreauc5f73ed2005-12-18 01:26:38 +01001345 a refermé sa connexion sans compléter la requête.
willy tarreauc1cae632005-12-17 14:12:23 +01001346 Tq/-1/xx/Tt : la connexion n'a pas pu s'établir vers le serveur (refus ou
1347 time-out au bout de Tt-Tq ms).
1348 Tq/Tc/-1/Tt : le serveur a accepté la connexion mais n'a pas répondu dans
willy tarreauc5f73ed2005-12-18 01:26:38 +01001349 les temps ou bien a refermé sa connexion trop tôt, au bout
1350 de Tt-(Tq+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001351
13524.2.4) Conditions de déconnexion
1353--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001354Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1355le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1356un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1357une signification précise :
1358
1359 - sur le premier caractère, un code précisant le premier événement qui a causé
1360 la terminaison de la session :
1361
1362 C : fermeture inattendue de la session TCP de la part du client.
1363
1364 S : fermeture inattendue de la session TCP de la part du serveur, ou
1365 refus explicite de connexion de la part de ce dernier.
1366
1367 P : terminaison prématurée des sessions par le proxy, pour cause
1368 d'imposition d'une limite sur le nombre de connexions, pour cause
1369 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1370 sécurité a détecté et bloqué une anomalie dans la réponse du
1371 serveur qui aurait pu causer une fuite d'informations (par exemple,
1372 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001373
willy tarreauc5f73ed2005-12-18 01:26:38 +01001374 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1375 source, ...). Généralement, cela arrive au cours de l'établissement
1376 d'une connexion, et les logs système doivent contenir une copie de
1377 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001378
willy tarreauc5f73ed2005-12-18 01:26:38 +01001379 I : une erreur interne a été identifiée par le proxy à la suite d'un
1380 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1381 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001382
willy tarreauc5f73ed2005-12-18 01:26:38 +01001383 c : le délai maximal d'attente du client a expiré (clitimeout).
1384
1385 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1386
1387 - : terminaison normale de session.
1388
1389 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1390 la fermeture :
1391
1392 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1393 été transmis au serveur.
1394
1395 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1396 serveur peut au plus avoir vu la tentative de connexion, mais
1397 aucune donnée n'a été échangée.
1398
1399 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1400
1401 D : transfert des DONNEES du serveur vers le client.
1402
1403 L : transfert des dernières ("LAST") données du proxy vers le client,
1404 alors que le serveur a déjà fini.
1405
1406 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001407
1408 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001409 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001410
willy tarreauc5f73ed2005-12-18 01:26:38 +01001411 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1412 cas sur les NOUVELLES connexions clients.
1413
1414 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1415 serveur connu. Ceci peut être dû à un changement de configuration
1416 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1417 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001418
willy tarreauc5f73ed2005-12-18 01:26:38 +01001419 D : le client a présenté un cookie correspondant à un serveur hors
1420 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1421 un autre serveur ou a tout de même tenté de se connecter sur celui
1422 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001423
willy tarreauc5f73ed2005-12-18 01:26:38 +01001424 V : le client a présenté un cookie VALIDE et a pu se connecter au
1425 serveur correspondant.
1426
1427 - : non appliquable (pas de cookie positionné dans la configuration).
1428
1429 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1430 persistence retrourné par le serveur (uniquement en mode HTTP) :
1431
1432 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1433 n'a été inséré.
1434
1435 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1436 proxy en a INSERE un.
1437
willy tarreau197e8ec2005-12-17 14:10:59 +01001438 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001439 tel quel ("PASSIF").
1440
1441 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1442
1443 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1444 ne pas être retourné au client.
1445
1446 - : non appliquable
1447
1448
1449La combinaison des deux premiers indicateurs fournit une grande quantitié
1450d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1451peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1452des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001453
willy tarreauc5f73ed2005-12-18 01:26:38 +01001454Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1455
1456 Indic Raison
1457 CR Le client a abandonné avant d'émettre une requête complète. Il est
1458 très probable que la requête ait été tapée à la main dans un client
1459 telnet et abortée trop tôt.
1460
1461 cR Le temps imparti au client a expiré avant réception d'une requête
1462 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1463 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1464 transporter des paquets entiers, ou par des clients qui énvoient des
1465 requêtes à la main et ne tapent pas assez vite.
1466
1467 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1468 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1469 être la couche réseau qui indique au proxy que le serveur n'est pas
1470 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1471
1472 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1473
1474 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1475 nombre de connexions a atteint la limite 'maxconn' (global ou de
1476 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1477 augmenté, tout comme le paramètre 'maxconn' global.
1478
1479 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1480 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1481 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1482 consiste à affiner le paramétrage système.
1483
1484 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1485 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1486 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1487 paquets entiers.
1488
1489 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
1490 en-têtes. En général, cela indique qu'il a crashé.
1491
1492 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
1493 des transactions trop longues, probablement causées par un back-end
1494 saturé. Les seules solutions sont de corriger le problème sur
1495 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
1496 des attentes plus longues au risque que les clients abandonnent à
1497 leur tour, ou bien d'ajouter des serveurs.
1498
1499 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
1500 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
1501 soit à cause d'une requête validant un filtre d'interdiction, auquel
1502 cas le proxy a renvoyé une erreur HTTP 403.
1503
1504 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
1505 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
1506 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
1507 renvoyée au client.
1508
1509 cD Le client n'a pas lu de données pendant le temps qui lui était
1510 imparti. Ceci est souvent causé par des problèmes réseau côté client.
1511
1512 CD Le client a aborté sa connection de manière inattendue pendant le
1513 transfert des données. Ceci est provoqué soit par le crash d'un
1514 navigateur, ou par une session en HTTP keep-alive entre le serveur
1515 et le client terminée en premier par le client.
1516
1517 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
1518 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
1519 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
1520 situés entre le proxy et le serveur.
1521
15224.2.5) Caractères non-imprimables
1523---------------------------------
1524Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
1525tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
1526hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
1527dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
1528caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
1529est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
1530les en-têtes.
1531
15324.2.6) Capture d'en-têtes HTTP et de cookies
1533--------------------------------------------
1534La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
1535capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
1536
1537Les captures de cookies facilitent le suivi et la reconstitution d'une session
1538utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01001539
1540 capture cookie <préfixe_cookie> len <longueur_capture>
1541
willy tarreauc5f73ed2005-12-18 01:26:38 +01001542Ceci activera la capture de cookies à la fois dans les requêtes et dans les
1543réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
1544bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
1545nouveau cookie.
1546
willy tarreau8337c6b2005-12-17 13:41:01 +01001547Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1548transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1549caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1550le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
1551place dans les logs.
1552
1553Exemples :
1554----------
1555 # capture du premier cookie dont le nom commence par "ASPSESSION"
1556 capture cookie ASPSESSION len 32
1557
1558 # capture du premier cookie dont le nom est exactement "vgnvisitor"
1559 capture cookie vgnvisitor= len 32
1560
willy tarreau036e1ce2005-12-17 13:46:33 +01001561Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01001562positionné par le serveur, précédé du cookie positionné par le client. Chacun
1563de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01001564par le client ou le serveur, ou lorsque l'option est désactivée..
1565
1566Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
1567pour suivre un identifiant de requête globalement unique positionné par un
1568autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
1569de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
1570peut chercher des informations relatives à la longueur annoncée de la réponse,
1571le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
1572de redirection. Tout comme pour les captures de cookies, il est possible
1573d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
1574la suivante :
1575
1576 capture request header <nom> len <longueur max>
1577 capture response header <nom> len <longueur max>
1578
1579Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01001580
willy tarreauc5f73ed2005-12-18 01:26:38 +01001581Exemples:
1582---------
1583 # conserver le nom du serveur virtuel accédé par le client
1584 capture request header Host len 20
1585 # noter la longueur des données envoyées dans un POST
1586 capture request header Content-Length len 10
1587
1588 # noter le fonctionnement attendu du cache par le serveur
1589 capture response header Cache-Control len 8
1590 # noter l'URL de redirection
1591 capture response header Location len 20
1592
1593Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
1594fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
1595regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
1596chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
1597réponse sont présentés de la même manière, mais après un espace suivant le bloc
1598d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
1599
1600 Config:
1601
1602 capture request header Host len 20
1603 capture request header Content-Length len 10
1604 capture request header Referer len 20
1605 capture response header Server len 20
1606 capture response header Content-Length len 10
1607 capture response header Cache-Control len 8
1608 capture response header Via len 20
1609 capture response header Location len 20
1610
1611 Log :
1612
1613 Aug 9 20:26:09 localhost haproxy[2022]: 127.0.0.1:34014 [09/Aug/2004:20:26:09] relais-http netcache 0/0/162/+162 200 +350 - - ---- {fr.adserver.yahoo.co||http://fr.f416.mail.} {|864|private||} "GET http://fr.adserver.yahoo.com/"
1614 Aug 9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34020 [09/Aug/2004:20:30:46] relais-http netcache 0/0/182/+182 200 +279 - - ---- {w.ods.org||} {Formilux/0.1.8|3495|||} "GET http://w.ods.org/sytadin.html HTTP/1.1"
1615 Aug 9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34028 [09/Aug/2004:20:30:46] relais-http netcache 0/2/126/+128 200 +223 - - ---- {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"
1616
16174.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01001618-----------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001619- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/7/147/6723 200 243 - - ---- 3/5 "HEAD / HTTP/1.0"
willy tarreauc1cae632005-12-17 14:12:23 +01001620 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
1621 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01001622
willy tarreauc5f73ed2005-12-18 01:26:38 +01001623- 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 +01001624 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
1625 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 +01001626 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 +01001627 total entre l'accept() et le premier octet de donnée est de 30 ms.
1628
willy tarreauc5f73ed2005-12-18 01:26:38 +01001629- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/7/14/30 502 243 - - PH-- 2/3 "GET /cgi-bin/bug.cgi? HTTP/1.0"
willy tarreau982249e2005-12-18 00:57:06 +01001630 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
1631 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
1632 d'informations risquant d'être cachées. Dans ce cas, la réponse est
1633 remplacée par '502 bad gateway'.
1634
willy tarreauc5f73ed2005-12-18 01:26:38 +01001635- haproxy[18113]: 127.0.0.1:34548 [15/Oct/2003:15:18:55] relais-http <NOSRV> -1/-1/-1/8490 -1 0 - - CR-- 2/2 ""
willy tarreauc1cae632005-12-17 14:12:23 +01001636 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01001637 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01001638 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01001639
willy tarreauc5f73ed2005-12-18 01:26:38 +01001640- haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06] relais-http <NOSRV> -1/-1/-1/50001 408 0 - - cR-- 2/2 ""
willy tarreauc1cae632005-12-17 14:12:23 +01001641 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01001642 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01001643 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
1644 pu renvoyer un message 408 au client.
1645
willy tarreauc5f73ed2005-12-18 01:26:38 +01001646- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
1647 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
1648 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01001649
willy tarreauc5f73ed2005-12-18 01:26:38 +01001650- haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/11215 503 0 - - SC-- 202/205 "HEAD / HTTP/1.0"
willy tarreauc1cae632005-12-17 14:12:23 +01001651 => La requête client met 3s à entrer (peut-être un problème réseau), et la
1652 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreauc5f73ed2005-12-18 01:26:38 +01001653 secondes (retries 3 dans la conf), puis un code 503 est retourné au client.
1654 Il y avait 202 connexions sur cette instance, et 205 sur l'ensemble des
1655 instances pour ce processus. Il est possible que le serveur ait refusé la
1656 connexion parce qu'il y en avait déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01001657
willy tarreau4302f492005-12-18 01:00:37 +01001658
willy tarreauc5f73ed2005-12-18 01:26:38 +010016594.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01001660----------------------------------
1661En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
1662requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01001663possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
1664de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01001665connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
1666comme faisant partie des échanges de données consécutifs à la première requête.
1667Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01001668
1669La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01001670 reqadd <string> pour ajouter un en-tête dans la requête
1671 reqrep <search> <replace> pour modifier la requête
1672 reqirep <search> <replace> idem sans distinction majuscules/minuscules
1673 reqdel <search> pour supprimer un en-tête dans la requête
1674 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001675 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01001676 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001677 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01001678 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001679 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01001680 reqipass <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001681
willy tarreau036e1ce2005-12-17 13:46:33 +01001682 rspadd <string> pour ajouter un en-tête dans la réponse
1683 rsprep <search> <replace> pour modifier la réponse
1684 rspirep <search> <replace> idem sans distinction majuscules/minuscules
1685 rspdel <search> pour supprimer un en-tête dans la réponse
1686 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01001687 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01001688 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01001689 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001690
willy tarreau0f7af912005-12-17 12:21:26 +01001691
willy tarreau036e1ce2005-12-17 13:46:33 +01001692<search> est une expression régulière compatible POSIX regexp supportant le
1693groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
1694doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
1695chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
1696backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01001697
1698 \t pour une tabulation
1699 \r pour un retour charriot
1700 \n pour un saut de ligne
1701 \ pour différencier un espace d'un séparateur
1702 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01001703 \\ pour utiliser un backslash dans la regex
1704 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01001705 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01001706
willy tarreau0f7af912005-12-17 12:21:26 +01001707
willy tarreau5cbea6f2005-12-17 12:48:26 +01001708<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
1709Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
1710groupe délimité par des parenthèses dans l'expression régulière, par sa
1711position numérale. Les positions vont de 1 à 9, et sont codées par un '\'
1712suivi du chiffre désiré. Il est également possible d'insérer un caractère non
1713imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code
1714hexadécimal de ce caractère (comme en C).
1715
1716<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01001717dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001718
1719Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01001720-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001721 - 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 +01001722 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001723 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
1724 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
1725 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01001726 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
1727 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
1728 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01001729 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01001730 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
1731 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
willy tarreau0f7af912005-12-17 12:21:26 +01001732
1733Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01001734----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001735 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01001736
willy tarreauc5f73ed2005-12-18 01:26:38 +01001737 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
1738 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
1739 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001740
willy tarreauc5f73ed2005-12-18 01:26:38 +01001741 # force proxy connections to close
1742 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
1743 # rewrite locations
1744 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001745
willy tarreauc5f73ed2005-12-18 01:26:38 +01001746 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01001747
willy tarreau197e8ec2005-12-17 14:10:59 +01001748 # Every header should end with a colon followed by one space.
1749 reqideny ^[^:\ ]*[\ ]*$
1750
1751 # block Apache chunk exploit
1752 reqideny ^Transfer-Encoding:[\ ]*chunked
1753 reqideny ^Host:\ apache-
1754
1755 # block annoying worms that fill the logs...
1756 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
1757 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
1758 reqideny ^[^:\ ]*\ .*<script
1759 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
1760
1761 # allow other syntactically valid requests, and block any other method
1762 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
1763 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
1764 reqideny ^[^:\ ]*\
1765
1766 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01001767 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01001768
willy tarreauc5f73ed2005-12-18 01:26:38 +01001769 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01001770 rspidel ^Server:\
1771 rspadd Server:\ Formilux/0.1.8
1772
willy tarreau0f7af912005-12-17 12:21:26 +01001773
willy tarreau982249e2005-12-18 00:57:06 +01001774De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01001775'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
1776connaître l'adresse IP du client initial.
1777
willy tarreau982249e2005-12-18 00:57:06 +01001778Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01001779en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01001780Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
1781méthode impliquant 4 règles.
1782
willy tarreauc1cae632005-12-17 14:12:23 +01001783Exemple :
1784---------
1785 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001786 mode http
1787 log global
1788 option httplog
1789 option dontlognull
1790 option forwardfor
1791 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01001792
willy tarreauc29948c2005-12-17 13:10:27 +010017934.4) Répartition avec persistence
1794---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001795La combinaison de l'insertion de cookie avec la répartition de charge interne
1796permet d'assurer une persistence dans les sessions HTTP d'une manière
1797pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01001798 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01001799 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01001800 - insérer un cookie dans les réponses issues d'une répartition uniquement,
1801 et faire en sorte que des caches ne mémorisent pas ce cookie.
1802 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001803
1804Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01001805---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001806 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001807 mode http
1808 cookie SERVERID insert nocache indirect
1809 balance roundrobin
1810 server srv1 192.168.1.1:80 cookie server01 check
1811 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01001812
willy tarreau0174f312005-12-18 01:02:42 +01001813L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
1814cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
1815Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
1816client et le serveur de travailler en mode "keep-alive" afin que le proxy
1817puisse corriger le nom du cookie dans toutes les futures requêtes.
1818
1819 listen application 0.0.0.0:80
1820 mode http
1821 cookie JSESSIONID prefix
1822 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01001823 server srv1 192.168.1.1:80 cookie srv1 check
1824 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01001825 option httpclose
1826
1827
willy tarreau982249e2005-12-18 00:57:06 +010018284.5) Protection contre les fuites d'informations du serveur
1829-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001830Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01001831créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01001832'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
1833un risque de cacher un cookie sur un proxy côté client. Quand cette option est
1834activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01001835 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01001836 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01001837 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01001838 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01001839 un en-tête 'Cache-control: public' ;
1840 - celles qui ont un en-tête 'Pragma: no-cache' ;
1841 - celles qui ont un en-tête 'Cache-control: private' ;
1842 - celles qui ont un en-tête 'Cache-control: no-store' ;
1843 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
1844 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
1845 - celles qui ont un en-tête 'Cache-control: no-cache' ;
1846 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
1847 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01001848 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01001849
willy tarreau982249e2005-12-18 00:57:06 +01001850Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
1851même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
1852message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
1853dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01001854en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01001855l'administrateur sache qu'il y a une action correctrice à entreprendre.
1856
18574.6) Personalisation des erreurs
1858--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01001859Certaines situations conduisent à retourner une erreur HTTP au client :
1860 - requête invalide ou trop longue => code HTTP 400
1861 - requête mettant trop de temps à venir => code HTTP 408
1862 - requête interdite (bloquée par un reqideny) => code HTTP 403
1863 - erreur interne du proxy => code HTTP 500
1864 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
1865 - aucun serveur disponible pour cette requête => code HTTP 503
1866 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
1867
1868Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
1869Cependant, en fonction du type de clientèle, on peut préférer retourner des
willy tarreau64a3cc32005-12-18 01:13:11 +01001870pages personnalisées. Ceci est possible par le biais de la commande "errorloc":
willy tarreau8337c6b2005-12-17 13:41:01 +01001871
1872 errorloc <code_HTTP> <location>
1873
1874Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
1875le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
1876d'une page précisée dans <location>. Cette adresse peut être relative au site,
1877ou absolue. Comme cette réponse est traîtée par le navigateur du client
1878lui-même, il est indispensable que l'adresse fournie lui soit accessible.
1879
1880Exemple :
1881---------
1882 listen application 0.0.0.0:80
1883 errorloc 400 /badrequest.html
1884 errorloc 403 /forbidden.html
1885 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01001886 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01001887 errorloc 502 http://192.168.114.58/error50x.html
1888 errorloc 503 http://192.168.114.58/error50x.html
1889 errorloc 504 http://192.168.114.58/error50x.html
1890
willy tarreauc1f47532005-12-18 01:08:26 +01001891Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
1892accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
1893problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
1894régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
1895dans le champ Location avec la méthode GET uniquement. Seulement, certains
1896navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
1897plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
1898devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01001899l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
1900visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01001901
1902Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
1903utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
1904dès que vous savez que vos clients supportent le code de retour HTTP 303.
1905
willy tarreau982249e2005-12-18 00:57:06 +010019064.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01001907--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001908Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
1909évite de répéter des paramètres communs à toutes les instances, tels que les
1910timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01001911
1912Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
1913précédent l'instance qui les utilisera. On peut donc mettre autant de sections
1914'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
1915section implique une annulation de tous les paramètres par défaut positionnés
1916précédemment, dans le but de les remplacer.
1917
1918La section 'defaults' utilise la même syntaxe que la section 'listen', aux
1919paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
1920un commentaire en guise paramètre.
1921
willy tarreau982249e2005-12-18 00:57:06 +01001922Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
1923positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01001924 - log (le premier et le second)
1925 - mode { tcp, http, health }
1926 - balance { roundrobin }
1927 - disabled (pour désactiver toutes les instances qui suivent)
1928 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
1929 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01001930 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
1931 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01001932 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01001933 - cookie, capture
1934 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01001935
1936Ne sont pas supportés dans cette version, les adresses de dispatch et les
1937configurations de serveurs, ainsi que tous les filtres basés sur les
1938expressions régulières :
1939 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01001940 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01001941
1942Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
1943positionné par défaut. Donc si une option est spécifiée dans les paramètres par
1944défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
1945paramètres par défaut avant la déclaration de l'instance.
1946
1947Exemples :
1948----------
1949 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01001950 log global
1951 mode tcp
1952 balance roundrobin
1953 clitimeout 180000
1954 srvtimeout 180000
1955 contimeout 4000
1956 retries 3
1957 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01001958
1959 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01001960 server srv1 192.168.1.1 check port 6000 inter 10000
1961 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001962
1963 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01001964 server srv1 192.168.2.1 check port 6000 inter 10000
1965 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001966
1967 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01001968 log global
1969 mode http
1970 option httplog
1971 option forwardfor
1972 option dontlognull
1973 balance roundrobin
1974 clitimeout 20000
1975 srvtimeout 20000
1976 contimeout 4000
1977 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01001978
1979 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01001980 cookie SERVERID postonly insert indirect
1981 capture cookie userid= len 10
1982 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
1983 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01001984
1985 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01001986 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01001987
willy tarreaub719f002005-12-17 12:55:07 +01001988=======================
1989| Paramétrage système |
1990=======================
willy tarreau0f7af912005-12-17 12:21:26 +01001991
1992Sous Linux 2.4
1993==============
1994
willy tarreaub719f002005-12-17 12:55:07 +01001995-- cut here --
1996#!/bin/sh
1997# set this to about 256/4M (16384 for 256M machine)
1998MAXFILES=16384
1999echo $MAXFILES > /proc/sys/fs/file-max
2000ulimit -n $MAXFILES
2001
2002if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002003 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002004fi
2005
2006if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002007 # 30 seconds for fin, 15 for time wait
2008 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2009 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2010 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2011 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002012fi
2013
willy tarreau0f7af912005-12-17 12:21:26 +01002014echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002015echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2016echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002017echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002018echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2019echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002020echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2021echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002022echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002023echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002024echo 0 > /proc/sys/net/ipv4/tcp_dsack
2025
2026# auto-tuned on 2.4
2027#echo 262143 > /proc/sys/net/core/rmem_max
2028#echo 262143 > /proc/sys/net/core/rmem_default
2029
2030echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2031echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2032
2033-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002034
willy tarreau197e8ec2005-12-17 14:10:59 +01002035Sous FreeBSD
2036============
2037
2038Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2039Clement Laforet <sheepkiller@cultdeadsheep.org>.
2040
2041Pour plus d'informations :
2042http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2043http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2044http://www.freshports.org/net/haproxy
2045
2046
willy tarreau0f7af912005-12-17 12:21:26 +01002047-- fin --