blob: d2a963ce207851e833eb2066a252ea51145e39fa [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 TARREAU3481c462006-03-01 22:37:57 +01005 version 1.2.9
willy tarreauc5f73ed2005-12-18 01:26:38 +01006 willy tarreau
Willy TARREAU3481c462006-03-01 22:37:57 +01007 2006/03/01
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
willy tarreau22739ef2006-01-20 20:43:32 +0100514SIGUSR1 au processus relais. Tous les services seront alors mis en phase
willy tarreau64a3cc32005-12-18 01:13:11 +0100515d'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
willy tarreau22739ef2006-01-20 20:43:32 +0100524attendre en plus leur expiration avant l'arrêt total du processus, ou bien tuer
525manuellement le processus par l'envoi d'un signal SIGTERM. La valeur par défaut
526du paramètre 'grace' est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100527
528Exemple :
529---------
willy tarreauc29948c2005-12-17 13:10:27 +0100530 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100531 # le service tournera encore 10 secondes après la demande d'arrêt
532 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100533 mode http
534 grace 10000
willy tarreau0f7af912005-12-17 12:21:26 +0100535
willy tarreauc29948c2005-12-17 13:10:27 +0100536 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100537 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100538 mode health
539 grace 0
willy tarreau0f7af912005-12-17 12:21:26 +0100540
willy tarreau39df2dc2006-01-29 21:56:05 +0100541A partir de la version 1.2.8, un nouveau mécanisme de reconfiguration à chaud
willy tarreau22739ef2006-01-20 20:43:32 +0100542a été introduit. Il est désormais possible de mettre les proxies en "pause" en
543envoyant un signal SIGTTOU aux processus. Cela désactivera les sockets d'écoute
544sans casser les sessions existantes. Suite à cela, l'envoi d'un signal SIGTTIN
545réactivera les sockets d'écoute. Ceci est très pratique pour tenter de charger
546une nouvelle configuration ou même une nouvelle version de haproxy sans casser
547les connexions existantes. Si le rechargement s'effectue correctement, il ne
548reste plus qu'à envoyer un signal SIGUSR1 aux anciens processus, ce qui
549provoquera leur arrêt immédiat dès que leurs connexions seront terminées ; en
550revanche, si le rechargement échoue, il suffit d'envoyer un signal SIGTTIN pour
551remettre les ports en écoute et rétablir le service immédiatement. Veuillez
552noter que le paramètre 'grace' est ignoré pour le signal SIGTTOU ainsi que le
553signal SIGUSR1 une fois le processus en pause. Aussi, il peut s'avérer très
554utile de sauver le fichier de pid avant de démarrer une nouvelle instance.
555
willy tarreau0f7af912005-12-17 12:21:26 +0100556
willy tarreauc29948c2005-12-17 13:10:27 +01005572.5) Temps d'expiration des connexions
558--------------------------------------
559Il est possible de paramétrer certaines durées d'expiration au niveau des
560connexions TCP. Trois temps indépendants sont configurables et acceptent des
561valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
562session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100563
564 - temps d'attente d'une donnée de la part du client, ou de la
565 possibilité de lui envoyer des données : "clitimeout" :
566
willy tarreauc5f73ed2005-12-18 01:26:38 +0100567 # time-out client à 2mn30.
568 clitimeout 150000
willy tarreau0f7af912005-12-17 12:21:26 +0100569
570 - temps d'attente d'une donnée de la part du serveur, ou de la
571 possibilité de lui envoyer des données : "srvtimeout" :
572
willy tarreauc5f73ed2005-12-18 01:26:38 +0100573 # time-out serveur à 30s.
574 srvtimeout 30000
willy tarreau0f7af912005-12-17 12:21:26 +0100575
576 - temps d'attente de l'établissement d'une connexion vers un serveur
577 "contimeout" :
578
willy tarreauc29948c2005-12-17 13:10:27 +0100579 # on abandonne si la connexion n'est pas établie après 4 secondes
willy tarreauc5f73ed2005-12-18 01:26:38 +0100580 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100581
willy tarreauc29948c2005-12-17 13:10:27 +0100582Remarques :
583-----------
584 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
585 type "health".
586 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
willy tarreau64a3cc32005-12-18 01:13:11 +0100587 possible de perdre des paquets. Du fait que la première retransmission
588 TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
589 inférieur à 3 secondes ne permet pas de se rattraper sur la perte
590 de paquets car la session aura été abandonnée avant la première
591 retransmission. Une valeur de 4 secondes réduira considérablement
592 le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100593
willy tarreauc29948c2005-12-17 13:10:27 +01005942.6) Tentatives de reconnexion
595------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100596Lors d'un échec de connexion vers un serveur, il est possible de
597retenter (potentiellement vers un autre serveur, en cas de répartition
598de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100599abandon est fourni par le paramètre "retries".
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 essaie encore trois fois maxi
604 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100605
willy tarreau0f7af912005-12-17 12:21:26 +0100606
willy tarreauc29948c2005-12-17 13:10:27 +01006072.7) Adresse du serveur
608-----------------------
609Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
610le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
611serveur d'assignation de cookie dans le cas où le service consiste à assurer
612uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100613le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
614du serveur distant, et il est maintenant recommandé d'utiliser de préférence
615le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100616
willy tarreauc29948c2005-12-17 13:10:27 +0100617Exemple :
618---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100619 # on envoie toutes les nouvelles connexions ici
620 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100621
willy tarreauc29948c2005-12-17 13:10:27 +0100622Remarque :
623----------
624Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
625'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100626
willy tarreau0f7af912005-12-17 12:21:26 +0100627
willy tarreau240afa62005-12-17 13:14:35 +01006282.8) Adresse de sortie
629----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100630Il est possible de forcer l'adresse utilisée pour établir les connexions vers
631les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
632port, bien que cette fonctionnalité se limite à des usages très spécifiques.
633C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100634pour permettre aux serveurs de trouver le chemin de retour dans des contextes
635de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
636choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
637librement par le système. Il est à noter que depuis la version 1.1.18, les
638tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
639source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100640
641Exemples :
642----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100643 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100644 # toutes les connexions prennent l'adresse 192.168.1.200
645 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100646
willy tarreaua41a8b42005-12-17 14:02:24 +0100647 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100648 # utiliser l'adresse 192.168.1.200 et le port réservé 900
649 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100650
651
6522.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100653--------------------------------
654En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
655vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
656par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100657
willy tarreauc29948c2005-12-17 13:10:27 +0100658Exemple :
659---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100660 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100661 mode http
662 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100663
willy tarreauc29948c2005-12-17 13:10:27 +0100664On peut modifier l'utilisation du cookie pour la rendre plus intelligente
665vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
666réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
667cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100668de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
669inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100670
671Exemples :
672----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100673
674Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100675dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
676directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100677
willy tarreauc5f73ed2005-12-18 01:26:38 +0100678 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100679
willy tarreauc29948c2005-12-17 13:10:27 +0100680Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
681lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100682
willy tarreauc5f73ed2005-12-18 01:26:38 +0100683 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100684
willy tarreau64a3cc32005-12-18 01:13:11 +0100685Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
686accès en répartition de charge interne. Dans ce cas, il est souhaitable que
687tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100688retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100689
willy tarreauc5f73ed2005-12-18 01:26:38 +0100690 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100691
willy tarreau0174f312005-12-18 01:02:42 +0100692Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
693puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
694permet d'insérer une instance de haproxy devant une application sans risquer
695d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
696plus d'un cookie :
697
698 cookie JSESSIONID prefix
699
willy tarreau240afa62005-12-17 13:14:35 +0100700Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
701ajouter le mot clé 'nocache' après 'insert' :
702
willy tarreauc5f73ed2005-12-18 01:26:38 +0100703 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100704
willy tarreau64a3cc32005-12-18 01:13:11 +0100705Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
706mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100707
willy tarreauc5f73ed2005-12-18 01:26:38 +0100708 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100709
willy tarreau240afa62005-12-17 13:14:35 +0100710
willy tarreau96d40372005-12-17 13:11:56 +0100711Remarques :
712-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100713- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
714 s'adapter à des applications générant déjà le cookie, avec un contenu
715 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100716
willy tarreau96d40372005-12-17 13:11:56 +0100717- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
718 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
719 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100720
willy tarreau240afa62005-12-17 13:14:35 +0100721- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
722 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
723 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
724 cookie de persistence inséré, donc provoquer des changements de serveurs pour
725 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100726
willy tarreau0174f312005-12-18 01:02:42 +0100727- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
728 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
729 présenté par l'application qui est censée savoir à quel moment il peut
730 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
731 présenté par le client dans chaque requête ultérieure, il est indispensable
732 de s'assurer que le client et le serveur communiqueront sans "keep-alive
733 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
734
willy tarreaucd878942005-12-17 13:27:43 +0100735- lorsque l'application est bien connue, et que les parties nécessitant de la
736 persistence sont systématiquement accédées par un formulaire en mode POST,
737 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
738 et "indirect", car la page d'accueil reste cachable, et c'est l'application
739 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100740
willy tarreau240afa62005-12-17 13:14:35 +01007412.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100742----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100743En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
744par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100745
willy tarreau5cbea6f2005-12-17 12:48:26 +0100746 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100747
willy tarreauc29948c2005-12-17 13:10:27 +0100748- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
749 configuration et les logs.
750- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
751- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100752
753Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100754---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100755 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100756 mode http
757 cookie SERVERID
758 dispatch 192.168.1.100:80
759 server web1 192.168.1.1:80 cookie server01
760 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100761
762Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100763-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100764
willy tarreaua41a8b42005-12-17 14:02:24 +01007653) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100766=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100767
willy tarreauc29948c2005-12-17 13:10:27 +0100768Le relais peut effectuer lui-même la répartition de charge entre les différents
769serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
770cela, on précise le mot clé 'balance' dans la définition du service,
771éventuellement suivi du nom d'un algorithme de répartition. En version 1.1.9,
772seul 'roundrobin' est géré, et c'est aussi la valeur implicite par défaut. Il
773est évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
774spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100775
776Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100777---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100778
willy tarreaua41a8b42005-12-17 14:02:24 +0100779 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100780 mode http
781 cookie SERVERID
782 balance roundrobin
783 server web1 192.168.1.1:80 cookie server01
784 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100785
willy tarreaua41a8b42005-12-17 14:02:24 +0100786Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
787du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
788sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
789champ <port> de l'adresse serveur :
790
791 - non spécifié ou nul :
792 la connexion sera envoyée au serveur sur le même port que celui sur
793 lequel le relais a reçu la connexion.
794
795 - valeur numérique (seul cas supporté pour les versions antérieures) :
796 le serveur recevra la connexion sur le port désigné.
797
798 - valeur numérique précédée d'un signe '+' :
799 la connexion sera envoyée au serveur sur le même port que celui sur
800 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
801
802 - valeur numérique précédée d'un signe '-' :
803 la connexion sera envoyée au serveur sur le même port que celui sur
804 lequel le relais a reçu la connexion, duquel on soustrait la valeur
805 désignée.
806
807Exemples :
808----------
809
810# même que précédemment
811
812 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100813 mode http
814 cookie SERVERID
815 balance roundrobin
816 server web1 192.168.1.1 cookie server01
817 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100818
819# relayage simultané des ports 80 et 81 et 8080-8089
820
821 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100822 mode http
823 cookie SERVERID
824 balance roundrobin
825 server web1 192.168.1.1 cookie server01
826 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100827
828# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
829
830 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100831 mode tcp
832 balance roundrobin
833 server srv1 192.168.1.1:+1000
834 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100835
willy tarreau0f7af912005-12-17 12:21:26 +0100836
willy tarreauc29948c2005-12-17 13:10:27 +01008373.1) Surveillance des serveurs
838------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100839Il est possible de tester l'état des serveurs par établissement de connexion
840TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
841utilisé dans le processus de répartition de charge interne. Pour activer la
842surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
843Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
844tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
845paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
846Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreaue47c8d72005-12-17 12:55:52 +0100847 - inter : 2000
848 - rise : 2
849 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +0100850 - port : port de connexion du serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +0100851
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100852Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +0100853certains cas de pannes, des serveurs peuvent continuer à accepter les
854connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
855d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
856et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
857les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
858contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
859RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
8601.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
861possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
862l'avantage d'être facilement extractibles des logs, et de ne pas induire
863d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
864considérées valides, les autres (y compris non-réponses) aboutissent à un
865échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
866deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
867"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
868accepte donc 4 formes :
willy tarreaueedaa9f2005-12-17 14:08:03 +0100869 - option httpchk -> OPTIONS / HTTP/1.0
870 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
871 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
872 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100873Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100874
willy tarreau8337c6b2005-12-17 13:41:01 +0100875Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
876utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
877ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
878de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
879les serveurs de secours qui le précèdent sont hors d'usage. Il n'y a donc pas
Willy TARREAU3481c462006-03-01 22:37:57 +0100880de répartition de charge entre des serveurs de secours par défaut. A partir
881de la version 1.2.9, il est possible de les utiliser simultanément grâce à
882l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
883d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
884de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
885définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
886qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +0100887
willy tarreaua41a8b42005-12-17 14:02:24 +0100888Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
889vers un port différent de celui de service. C'est nécessaire principalement
890pour les configurations où le serveur n'a pas de port prédéfini, par exemple
891lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
892le paramètre 'port' suivi du numéro de port devant répondre aux requêtes.
893
willy tarreau64a3cc32005-12-18 01:13:11 +0100894Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
895l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
896SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
897envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
898elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
899local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +0100900
willy tarreau982249e2005-12-18 00:57:06 +0100901Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
902logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
903afin de notifier l'administrateur qu'il faut prendre une action immédiate.
904
willy tarreau0174f312005-12-18 01:02:42 +0100905Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
906même valeur de cookie. C'est particulièrement utile en mode backup, pour
907sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
908oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
909temporairement vers une page d'erreur en attendant le redémarrage d'une
910application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
911le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
912chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
913le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
914pour plus d'informations.
915
willy tarreauc29948c2005-12-17 13:10:27 +0100916Exemples :
917----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100918# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100919 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 server web1 192.168.1.1:80 cookie server01 check
924 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100925
willy tarreau2f6ba652005-12-17 13:57:42 +0100926# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +0100927 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100928 mode http
929 cookie SERVERID
930 balance roundrobin
931 option httpchk
932 server web1 192.168.1.1:80 cookie server01 check
933 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +0100934
willy tarreau2f6ba652005-12-17 13:57:42 +0100935# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
936 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100937 mode http
938 cookie SERVERID
939 balance roundrobin
940 option httpchk /index.html
941 server web1 192.168.1.1:80 cookie server01 check
942 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +0100943
willy tarreaueedaa9f2005-12-17 14:08:03 +0100944# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
945 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100946 mode http
947 cookie SERVERID
948 balance roundrobin
949 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
950 server web1 192.168.1.1:80 cookie server01 check
951 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +0100952
willy tarreau0174f312005-12-18 01:02:42 +0100953# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
954# douceur utilisant un second port (81) juste pour les health-checks.
955 listen http_proxy 0.0.0.0:80
956 mode http
957 cookie JSESSIONID prefix
958 balance roundrobin
959 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
960 server web1-norm 192.168.1.1:80 cookie s1 check port 81
961 server web2-norm 192.168.1.2:80 cookie s2 check port 81
962 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
963 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
964
willy tarreau96d40372005-12-17 13:11:56 +0100965# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +0100966# automatique dans la requête, tout en indiquant aux caches de ne pas garder
967# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +0100968 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100969 mode http
970 cookie SERVERID insert nocache indirect
971 balance roundrobin
972 server web1 192.168.1.1:80 cookie server01 check
973 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +0100974
willy tarreaueedaa9f2005-12-17 14:08:03 +0100975# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +0100976 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100977 mode http
978 cookie SERVERID insert nocache indirect
979 balance roundrobin
980 server web1 192.168.1.1:80 cookie server01 check
981 server web2 192.168.1.2:80 cookie server02 check
982 server web-backup 192.168.2.1:80 cookie server03 check backup
983 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +0100984
willy tarreaua41a8b42005-12-17 14:02:24 +0100985# relayage SMTP+TLS avec test du serveur et serveur de backup
986
987 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +0100988 mode tcp
989 balance roundrobin
990 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
991 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +0100992
Willy TARREAU3481c462006-03-01 22:37:57 +0100993# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
994 listen http_proxy 0.0.0.0:80
995 mode http
996 balance roundrobin
997 option httpchk
998 server inst1 192.168.1.1:80 cookie s1 check
999 server inst2 192.168.1.2:80 cookie s2 check
1000 server inst3 192.168.1.3:80 cookie s3 check
1001 server back1 192.168.1.10:80 check backup
1002 server back2 192.168.1.11:80 check backup
1003 option allbackups # all backups will be used
1004
willy tarreau0f7af912005-12-17 12:21:26 +01001005
willy tarreauc29948c2005-12-17 13:10:27 +010010063.2) Reconnexion vers un répartiteur en cas d'échec direct
1007----------------------------------------------------------
1008En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1009seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1010définitivement privés de service. La spécification du paramètre 'redispatch'
1011autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1012(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001013
1014Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001015---------
willy tarreau0f7af912005-12-17 12:21:26 +01001016 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001017 mode http
1018 cookie SERVERID
1019 dispatch 192.168.1.100:80
1020 server web1 192.168.1.1:80 cookie server01
1021 server web2 192.168.1.2:80 cookie server02
1022 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001023
willy tarreau64a3cc32005-12-18 01:13:11 +01001024Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1025redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1026version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1027identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1028tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1029tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001030
1031 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001032 mode http
1033 option persist
1034 cookie SERVERID
1035 dispatch 192.168.1.100:80
1036 server web1 192.168.1.1:80 cookie server01
1037 server web2 192.168.1.2:80 cookie server02
1038 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001039
willy tarreauc29948c2005-12-17 13:10:27 +01001040
10414) Fonctionnalités additionnelles
1042=================================
1043
1044D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
1045principalement du mode transparent, de la journalisation des connexions, et de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001046la réécriture des en-têtes.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001047
willy tarreau0174f312005-12-18 01:02:42 +010010484.1) Fonctionnalités réseau
1049---------------------------
10504.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001051---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001052En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1053routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1054pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001055destination de la session détournée. Le système doit permettre de rediriger les
1056paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001057
1058Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001059---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001060 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001061 mode http
1062 transparent
1063 cookie SERVERID
1064 server server01 192.168.1.1:80
1065 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001066
1067 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1068 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001069
willy tarreaua41a8b42005-12-17 14:02:24 +01001070Remarque :
1071----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001072Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1073adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1074d'une même adresse avec une même instance et sans utiliser directement le mode
1075transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001076
1077Exemple :
1078---------
1079 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001080 mode tcp
1081 server server01 192.168.1.1 check port 60000
1082 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001083
1084 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1085 -j REDIRECT --to-ports 65000
1086
willy tarreau0174f312005-12-18 01:02:42 +01001087
10884.1.2) Choix d'une adresse source par serveur
1089---------------------------------------------------
1090Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1091IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1092backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1093pour joindre le même serveur. C'est également utilisable pour faciliter une
1094répartition de charge selon l'adresse IP source pour des connexions sortantes.
1095Bien entendu, la même adresse est utilisée pour les health-checks.
1096
1097Exemple :
1098---------
1099 # utiliser une adresse particulière pour joindre les 2 serveur
1100 listen http_proxy 0.0.0.0:65000
1101 mode http
1102 balance roundrobin
1103 server server01 192.168.1.1:80 source 192.168.2.13
1104 server server02 192.168.1.2:80 source 192.168.2.13
1105
1106Exemple :
1107---------
1108 # utiliser une adresse particulière pour joindre chaque serveur
1109 listen http_proxy 0.0.0.0:65000
1110 mode http
1111 balance roundrobin
1112 server server01 192.168.1.1:80 source 192.168.1.1
1113 server server02 192.168.2.1:80 source 192.168.2.1
1114
1115Exemple :
1116---------
1117 # faire une répartition d'adresse sources pour joindre le même proxy à
1118 # travers deux liens WAN
1119 listen http_proxy 0.0.0.0:65000
1120 mode http
1121 balance roundrobin
1122 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1123 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1124
1125Exemple :
1126---------
1127 # forcer une connexion TCP à s'attacher à un port particulier
1128 listen http_proxy 0.0.0.0:2000
1129 mode tcp
1130 balance roundrobin
1131 server srv1 192.168.1.1:80 source 192.168.2.1:20
1132 server srv2 192.168.1.2:80 source 192.168.2.1:20
1133
willy tarreaub952e1d2005-12-18 01:31:20 +010011344.1.3) Maintien de session TCP (keep-alive)
1135-------------------------------------------
1136Avec la version 1.2.7, il devient possible d'activer le maintien de session
1137TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1138d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1139externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1140aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1141time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1142positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1143vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1144pour activer le maintien de session TCP :
1145
1146 option tcpka # active le keep-alive côté client et côté serveur
1147 option clitcpka # active le keep-alive côté client
1148 option srvtcpka # active le keep-alive côté serveur
1149
willy tarreau0f7af912005-12-17 12:21:26 +01001150
willy tarreauc29948c2005-12-17 13:10:27 +010011514.2) Journalisation des connexions
1152----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001153
1154L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1155Il fournit probablement le plus fin niveau d'information disponible pour un
1156tel outil, ce qui est très important pour les diagnostics en environnements
1157complexes. En standard, les informations journalisées incluent le port client,
1158les chronométrages des états TCP/HTTP, des états de session précis au moment de
1159la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1160trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1161arbitraires.
1162
1163Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1164transparence sur les problèmes rencontrés, à la fois internes et externes, et
1165il est possible d'envoyer les logs vers des serveurs différents en même temps
1166avec des niveaux de filtrage différents :
1167
1168 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1169 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1170 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1171 - activité par instance (connexions clients), aussi bien lors de leur
1172 établissement qu'à leur terminaison.
1173
1174La possibilité de distribuer différents niveaux de logs à différents serveurs
1175permet à plusieurs équipes de production d'intéragir et de corriger leurs
1176problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1177occasionnellement les erreurs système, pendant que l'équipe application
1178surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1179que l'équipe sécurité analyse l'activité en différé d'une heure.
1180
1181
willy tarreauc1cae632005-12-17 14:12:23 +010011824.2.1) Niveaux de log
1183---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001184Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1185détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1186source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001187la requête HTTP, le code de retour, la quantité de données transmises, et même
1188dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1189Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1190la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001191est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001192
willy tarreau8337c6b2005-12-17 13:41:01 +01001193 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1194 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001195ou
1196 log global
1197
1198Remarque :
1199----------
1200La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1201paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001202
1203Exemple :
1204---------
1205 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001206 mode http
1207 log 192.168.2.200 local3
1208 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001209
willy tarreauc1cae632005-12-17 14:12:23 +010012104.2.2) Format des logs
1211----------------------
1212Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1213de la session entre le client et le relais. En précisant l'option 'tcplog',
1214la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1215sur son état lors de la déconnexion, ainsi que le temps de connexion et la
1216durée totale de la session.
1217
willy tarreauc5f73ed2005-12-18 01:26:38 +01001218Exemple de journalisation TCP :
1219-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001220 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001221 mode tcp
1222 option tcplog
1223 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001224
willy tarreauc5f73ed2005-12-18 01:26:38 +01001225>>> haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 -- 1/1
1226
1227 Champ Format / Description Exemple
1228
1229 1 nom_processus '[' pid ']:' haproxy[18989]:
1230 2 ip_client ':' port_client 127.0.0.1:34550
1231 3 '[' date ']' [15/Oct/2003:15:24:28]
1232 4 nom_instance relais-tcp
1233 5 nom_serveur Srv1
1234 6 temps_connect '/' temps_total 0/5007
1235 7 octets lus 0
1236 8 etat_terminaison --
1237 9 conns_instance '/' conns_processus 1/1
willy tarreau982249e2005-12-18 00:57:06 +01001238
willy tarreauc1cae632005-12-17 14:12:23 +01001239Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1240notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1241surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1242les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1243ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1244(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001245
willy tarreauc5f73ed2005-12-18 01:26:38 +01001246Exemple de journalisation HTTP :
1247--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001248 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001249 mode http
1250 option httplog
1251 option dontlognull
1252 log 192.168.2.200 local3
1253
1254>>> 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"
1255
1256Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001257
willy tarreauc5f73ed2005-12-18 01:26:38 +01001258 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"
1259
1260 Champ Format / Description Exemple
1261
1262 1 nom_processus '[' pid ']:' haproxy[18989]:
1263 2 ip_client ':' port_client 10.0.0.1:34552
1264 3 '[' date ']' [15/Oct/2003:15:26:31]
1265 4 nom_instance relais-http
1266 5 nom_serveur Srv1
1267 6 Tq '/' Tc '/' Tr '/' Tt 3183/-1/-1/11215
1268 7 Code_retour_HTTP 503
1269 8 octets lus 0
1270 9 cookies_requête_capturés -
1271 10 cookies_reponse_capturés -
1272 11 etat_terminaison SC--
1273 12 conns_instance '/' conns_processus 202/205
1274 13 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1275 14 '{' entetes_reponse_capturés '}' {}
1276 15 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
1277
1278Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1279 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001280
1281Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1282de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1283Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001284la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1285tôt possible, c'est à dire juste avant que ne débutent les transferts de
1286données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1287de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001288traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1289représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001290
willy tarreau64a3cc32005-12-18 01:13:11 +01001291Afin d'éviter toute confusion avec les logs normaux, le temps total de
1292transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001293rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001294
1295Exemple :
1296---------
1297
1298 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001299 mode http
1300 option httplog
1301 option dontlognull
1302 option logasap
1303 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001304
willy tarreauc5f73ed2005-12-18 01:26:38 +01001305>>> 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 +01001306
1307
willy tarreauc1cae632005-12-17 14:12:23 +010013084.2.3) Chronométrage des événements
1309-----------------------------------
1310Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1311événements sont d'une très grande utilité. Tous les temps sont mesurés en
1312millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
1313la forme Tq/Tc/Tr/Tt :
1314
1315 - Tq: temps total de réception de la requête HTTP de la part du client.
1316 C'est le temps qui s'est écoulé entre le moment où le client a établi
1317 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1318 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1319 que la requête complète n'a jamais été reçue.
1320
1321 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1322 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1323 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1324 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1325 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1326 vers le serveur.
1327
1328 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001329 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001330 la connexion. Ca représente exactement le temps de traitement de la
1331 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001332 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001333
1334 - Tt: durée de vie totale de la session, entre le moment où la demande de
1335 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001336 refermée aux deux extrémités (client et serveur). La signification change
1337 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
1338 uniquement à (Tq + Tc + Tr), et se trouve préfixé d'un signe '+'. On peut
1339 donc déduire Td, le temps de transfert des données, en excluant les autres
1340 temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001341
1342 Td = Tt - (Tq + Tc + Tr)
1343
1344 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1345
1346En mode TCP ('option tcplog'), seuls les deux indicateurs Tc et Tt sont
1347rapportés.
1348
1349Ces temps fournissent de précieux renseignement sur des causes probables de
1350problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1351de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1352de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1353problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1354valeur de time-out dans la configuration, c'est souvent qu'une session a été
1355abandonnée sur expiration d'un time-out.
1356
1357Cas les plus fréquents :
1358
1359 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1360 le client et le relais.
1361 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1362 le relais et le serveur durant la phase de connexion. Cet indicateur
1363 devrait normalement toujours être très bas (moins de quelques dizaines).
1364 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1365 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1366 de pertes entre le relais et le serveur.
1367 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1368 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1369 session est maintenue après la fin des échanges. Voir plus loin pour
1370 savoir comment désactiver le keep-alive HTTP.
1371
1372Autres cas ('xx' représentant une valeur quelconque à ignorer) :
1373 -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 +01001374 a refermé sa connexion sans compléter la requête.
willy tarreauc1cae632005-12-17 14:12:23 +01001375 Tq/-1/xx/Tt : la connexion n'a pas pu s'établir vers le serveur (refus ou
1376 time-out au bout de Tt-Tq ms).
1377 Tq/Tc/-1/Tt : le serveur a accepté la connexion mais n'a pas répondu dans
willy tarreauc5f73ed2005-12-18 01:26:38 +01001378 les temps ou bien a refermé sa connexion trop tôt, au bout
1379 de Tt-(Tq+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001380
13814.2.4) Conditions de déconnexion
1382--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001383Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1384le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1385un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1386une signification précise :
1387
1388 - sur le premier caractère, un code précisant le premier événement qui a causé
1389 la terminaison de la session :
1390
1391 C : fermeture inattendue de la session TCP de la part du client.
1392
1393 S : fermeture inattendue de la session TCP de la part du serveur, ou
1394 refus explicite de connexion de la part de ce dernier.
1395
1396 P : terminaison prématurée des sessions par le proxy, pour cause
1397 d'imposition d'une limite sur le nombre de connexions, pour cause
1398 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1399 sécurité a détecté et bloqué une anomalie dans la réponse du
1400 serveur qui aurait pu causer une fuite d'informations (par exemple,
1401 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001402
willy tarreauc5f73ed2005-12-18 01:26:38 +01001403 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1404 source, ...). Généralement, cela arrive au cours de l'établissement
1405 d'une connexion, et les logs système doivent contenir une copie de
1406 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001407
willy tarreauc5f73ed2005-12-18 01:26:38 +01001408 I : une erreur interne a été identifiée par le proxy à la suite d'un
1409 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1410 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001411
willy tarreauc5f73ed2005-12-18 01:26:38 +01001412 c : le délai maximal d'attente du client a expiré (clitimeout).
1413
1414 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1415
1416 - : terminaison normale de session.
1417
1418 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1419 la fermeture :
1420
1421 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1422 été transmis au serveur.
1423
1424 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1425 serveur peut au plus avoir vu la tentative de connexion, mais
1426 aucune donnée n'a été échangée.
1427
1428 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1429
1430 D : transfert des DONNEES du serveur vers le client.
1431
1432 L : transfert des dernières ("LAST") données du proxy vers le client,
1433 alors que le serveur a déjà fini.
1434
1435 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001436
1437 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001438 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001439
willy tarreauc5f73ed2005-12-18 01:26:38 +01001440 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1441 cas sur les NOUVELLES connexions clients.
1442
1443 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1444 serveur connu. Ceci peut être dû à un changement de configuration
1445 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1446 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001447
willy tarreauc5f73ed2005-12-18 01:26:38 +01001448 D : le client a présenté un cookie correspondant à un serveur hors
1449 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1450 un autre serveur ou a tout de même tenté de se connecter sur celui
1451 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001452
willy tarreauc5f73ed2005-12-18 01:26:38 +01001453 V : le client a présenté un cookie VALIDE et a pu se connecter au
1454 serveur correspondant.
1455
1456 - : non appliquable (pas de cookie positionné dans la configuration).
1457
1458 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1459 persistence retrourné par le serveur (uniquement en mode HTTP) :
1460
1461 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1462 n'a été inséré.
1463
1464 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1465 proxy en a INSERE un.
1466
willy tarreau197e8ec2005-12-17 14:10:59 +01001467 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001468 tel quel ("PASSIF").
1469
1470 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1471
1472 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1473 ne pas être retourné au client.
1474
1475 - : non appliquable
1476
1477
1478La combinaison des deux premiers indicateurs fournit une grande quantitié
1479d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1480peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1481des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001482
willy tarreauc5f73ed2005-12-18 01:26:38 +01001483Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1484
1485 Indic Raison
1486 CR Le client a abandonné avant d'émettre une requête complète. Il est
1487 très probable que la requête ait été tapée à la main dans un client
1488 telnet et abortée trop tôt.
1489
1490 cR Le temps imparti au client a expiré avant réception d'une requête
1491 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1492 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1493 transporter des paquets entiers, ou par des clients qui énvoient des
1494 requêtes à la main et ne tapent pas assez vite.
1495
1496 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1497 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1498 être la couche réseau qui indique au proxy que le serveur n'est pas
1499 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1500
1501 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1502
1503 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1504 nombre de connexions a atteint la limite 'maxconn' (global ou de
1505 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1506 augmenté, tout comme le paramètre 'maxconn' global.
1507
1508 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1509 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1510 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1511 consiste à affiner le paramétrage système.
1512
1513 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1514 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1515 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1516 paquets entiers.
1517
1518 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
1519 en-têtes. En général, cela indique qu'il a crashé.
1520
1521 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
1522 des transactions trop longues, probablement causées par un back-end
1523 saturé. Les seules solutions sont de corriger le problème sur
1524 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
1525 des attentes plus longues au risque que les clients abandonnent à
1526 leur tour, ou bien d'ajouter des serveurs.
1527
1528 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
1529 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
1530 soit à cause d'une requête validant un filtre d'interdiction, auquel
1531 cas le proxy a renvoyé une erreur HTTP 403.
1532
1533 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
1534 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
1535 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
1536 renvoyée au client.
1537
1538 cD Le client n'a pas lu de données pendant le temps qui lui était
1539 imparti. Ceci est souvent causé par des problèmes réseau côté client.
1540
1541 CD Le client a aborté sa connection de manière inattendue pendant le
1542 transfert des données. Ceci est provoqué soit par le crash d'un
1543 navigateur, ou par une session en HTTP keep-alive entre le serveur
1544 et le client terminée en premier par le client.
1545
1546 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
1547 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
1548 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
1549 situés entre le proxy et le serveur.
1550
15514.2.5) Caractères non-imprimables
1552---------------------------------
1553Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
1554tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
1555hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
1556dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
1557caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
1558est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
1559les en-têtes.
1560
15614.2.6) Capture d'en-têtes HTTP et de cookies
1562--------------------------------------------
1563La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
1564capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
1565
1566Les captures de cookies facilitent le suivi et la reconstitution d'une session
1567utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01001568
1569 capture cookie <préfixe_cookie> len <longueur_capture>
1570
willy tarreauc5f73ed2005-12-18 01:26:38 +01001571Ceci activera la capture de cookies à la fois dans les requêtes et dans les
1572réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
1573bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
1574nouveau cookie.
1575
willy tarreau8337c6b2005-12-17 13:41:01 +01001576Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1577transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1578caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1579le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
1580place dans les logs.
1581
1582Exemples :
1583----------
1584 # capture du premier cookie dont le nom commence par "ASPSESSION"
1585 capture cookie ASPSESSION len 32
1586
1587 # capture du premier cookie dont le nom est exactement "vgnvisitor"
1588 capture cookie vgnvisitor= len 32
1589
willy tarreau036e1ce2005-12-17 13:46:33 +01001590Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01001591positionné par le serveur, précédé du cookie positionné par le client. Chacun
1592de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01001593par le client ou le serveur, ou lorsque l'option est désactivée..
1594
1595Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
1596pour suivre un identifiant de requête globalement unique positionné par un
1597autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
1598de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
1599peut chercher des informations relatives à la longueur annoncée de la réponse,
1600le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
1601de redirection. Tout comme pour les captures de cookies, il est possible
1602d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
1603la suivante :
1604
1605 capture request header <nom> len <longueur max>
1606 capture response header <nom> len <longueur max>
1607
1608Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01001609
willy tarreauc5f73ed2005-12-18 01:26:38 +01001610Exemples:
1611---------
1612 # conserver le nom du serveur virtuel accédé par le client
1613 capture request header Host len 20
1614 # noter la longueur des données envoyées dans un POST
1615 capture request header Content-Length len 10
1616
1617 # noter le fonctionnement attendu du cache par le serveur
1618 capture response header Cache-Control len 8
1619 # noter l'URL de redirection
1620 capture response header Location len 20
1621
1622Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
1623fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
1624regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
1625chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
1626réponse sont présentés de la même manière, mais après un espace suivant le bloc
1627d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
1628
1629 Config:
1630
1631 capture request header Host len 20
1632 capture request header Content-Length len 10
1633 capture request header Referer len 20
1634 capture response header Server len 20
1635 capture response header Content-Length len 10
1636 capture response header Cache-Control len 8
1637 capture response header Via len 20
1638 capture response header Location len 20
1639
1640 Log :
1641
1642 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/"
1643 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"
1644 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"
1645
16464.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01001647-----------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001648- 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 +01001649 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
1650 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01001651
willy tarreauc5f73ed2005-12-18 01:26:38 +01001652- 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 +01001653 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
1654 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 +01001655 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 +01001656 total entre l'accept() et le premier octet de donnée est de 30 ms.
1657
willy tarreauc5f73ed2005-12-18 01:26:38 +01001658- 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 +01001659 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
1660 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
1661 d'informations risquant d'être cachées. Dans ce cas, la réponse est
1662 remplacée par '502 bad gateway'.
1663
willy tarreauc5f73ed2005-12-18 01:26:38 +01001664- 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 +01001665 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01001666 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01001667 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01001668
willy tarreauc5f73ed2005-12-18 01:26:38 +01001669- 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 +01001670 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01001671 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01001672 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
1673 pu renvoyer un message 408 au client.
1674
willy tarreauc5f73ed2005-12-18 01:26:38 +01001675- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
1676 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
1677 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01001678
willy tarreauc5f73ed2005-12-18 01:26:38 +01001679- 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 +01001680 => La requête client met 3s à entrer (peut-être un problème réseau), et la
1681 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreauc5f73ed2005-12-18 01:26:38 +01001682 secondes (retries 3 dans la conf), puis un code 503 est retourné au client.
1683 Il y avait 202 connexions sur cette instance, et 205 sur l'ensemble des
1684 instances pour ce processus. Il est possible que le serveur ait refusé la
1685 connexion parce qu'il y en avait déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01001686
willy tarreau4302f492005-12-18 01:00:37 +01001687
willy tarreauc5f73ed2005-12-18 01:26:38 +010016884.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01001689----------------------------------
1690En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
1691requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01001692possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
1693de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01001694connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
1695comme faisant partie des échanges de données consécutifs à la première requête.
1696Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01001697
1698La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01001699 reqadd <string> pour ajouter un en-tête dans la requête
1700 reqrep <search> <replace> pour modifier la requête
1701 reqirep <search> <replace> idem sans distinction majuscules/minuscules
1702 reqdel <search> pour supprimer un en-tête dans la requête
1703 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001704 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01001705 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001706 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01001707 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001708 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01001709 reqipass <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001710
willy tarreau036e1ce2005-12-17 13:46:33 +01001711 rspadd <string> pour ajouter un en-tête dans la réponse
1712 rsprep <search> <replace> pour modifier la réponse
1713 rspirep <search> <replace> idem sans distinction majuscules/minuscules
1714 rspdel <search> pour supprimer un en-tête dans la réponse
1715 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01001716 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01001717 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01001718 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001719
willy tarreau0f7af912005-12-17 12:21:26 +01001720
willy tarreau036e1ce2005-12-17 13:46:33 +01001721<search> est une expression régulière compatible POSIX regexp supportant le
1722groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
1723doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
1724chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
1725backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01001726
1727 \t pour une tabulation
1728 \r pour un retour charriot
1729 \n pour un saut de ligne
1730 \ pour différencier un espace d'un séparateur
1731 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01001732 \\ pour utiliser un backslash dans la regex
1733 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01001734 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01001735
willy tarreau0f7af912005-12-17 12:21:26 +01001736
willy tarreau5cbea6f2005-12-17 12:48:26 +01001737<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
1738Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
1739groupe délimité par des parenthèses dans l'expression régulière, par sa
1740position numérale. Les positions vont de 1 à 9, et sont codées par un '\'
1741suivi du chiffre désiré. Il est également possible d'insérer un caractère non
1742imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code
1743hexadécimal de ce caractère (comme en C).
1744
1745<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01001746dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001747
1748Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01001749-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001750 - 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 +01001751 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001752 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
1753 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
1754 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01001755 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
1756 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
1757 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01001758 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01001759 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
1760 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
willy tarreau0f7af912005-12-17 12:21:26 +01001761
1762Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01001763----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001764 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01001765
willy tarreauc5f73ed2005-12-18 01:26:38 +01001766 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
1767 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
1768 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001769
willy tarreauc5f73ed2005-12-18 01:26:38 +01001770 # force proxy connections to close
1771 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
1772 # rewrite locations
1773 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001774
willy tarreauc5f73ed2005-12-18 01:26:38 +01001775 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01001776
willy tarreau197e8ec2005-12-17 14:10:59 +01001777 # Every header should end with a colon followed by one space.
1778 reqideny ^[^:\ ]*[\ ]*$
1779
1780 # block Apache chunk exploit
1781 reqideny ^Transfer-Encoding:[\ ]*chunked
1782 reqideny ^Host:\ apache-
1783
1784 # block annoying worms that fill the logs...
1785 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
1786 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
1787 reqideny ^[^:\ ]*\ .*<script
1788 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
1789
1790 # allow other syntactically valid requests, and block any other method
1791 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
1792 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
1793 reqideny ^[^:\ ]*\
1794
1795 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01001796 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01001797
willy tarreauc5f73ed2005-12-18 01:26:38 +01001798 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01001799 rspidel ^Server:\
1800 rspadd Server:\ Formilux/0.1.8
1801
willy tarreau0f7af912005-12-17 12:21:26 +01001802
willy tarreau982249e2005-12-18 00:57:06 +01001803De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01001804'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
1805connaître l'adresse IP du client initial.
1806
willy tarreau982249e2005-12-18 00:57:06 +01001807Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01001808en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01001809Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
1810méthode impliquant 4 règles.
1811
willy tarreauc1cae632005-12-17 14:12:23 +01001812Exemple :
1813---------
1814 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001815 mode http
1816 log global
1817 option httplog
1818 option dontlognull
1819 option forwardfor
1820 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01001821
Willy TARREAU767ba712006-03-01 22:40:50 +01001822Notons que certains serveurs HTTP ne referment pas nécessairement la session
1823TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
1824ce qui se traduit par des grands nombres de sessions établies et des temps
1825globaux très longs sur les requêtes. Pour contourner ce problème, la version
18261.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
1827vers le serveur dès qu'il commence à répondre et seulement si le tampon de
1828requête est vide. Attention toutefois à ne PAS utiliser cette option si des
1829méthodes CONNECT sont attendues entre le client et le serveur. L'option
1830'forceclose' implique l'option 'httpclose'.
1831
1832Exemple :
1833---------
1834 listen http_proxy 0.0.0.0:80
1835 mode http
1836 log global
1837 option httplog
1838 option dontlognull
1839 option forwardfor
1840 option forceclose
1841
1842
willy tarreauc29948c2005-12-17 13:10:27 +010018434.4) Répartition avec persistence
1844---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001845La combinaison de l'insertion de cookie avec la répartition de charge interne
1846permet d'assurer une persistence dans les sessions HTTP d'une manière
1847pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01001848 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01001849 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01001850 - insérer un cookie dans les réponses issues d'une répartition uniquement,
1851 et faire en sorte que des caches ne mémorisent pas ce cookie.
1852 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001853
1854Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01001855---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001856 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001857 mode http
1858 cookie SERVERID insert nocache indirect
1859 balance roundrobin
1860 server srv1 192.168.1.1:80 cookie server01 check
1861 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01001862
willy tarreau0174f312005-12-18 01:02:42 +01001863L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
1864cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
1865Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
1866client et le serveur de travailler en mode "keep-alive" afin que le proxy
1867puisse corriger le nom du cookie dans toutes les futures requêtes.
1868
1869 listen application 0.0.0.0:80
1870 mode http
1871 cookie JSESSIONID prefix
1872 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01001873 server srv1 192.168.1.1:80 cookie srv1 check
1874 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01001875 option httpclose
1876
1877
willy tarreau982249e2005-12-18 00:57:06 +010018784.5) Protection contre les fuites d'informations du serveur
1879-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001880Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01001881créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01001882'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
1883un risque de cacher un cookie sur un proxy côté client. Quand cette option est
1884activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01001885 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01001886 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01001887 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01001888 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01001889 un en-tête 'Cache-control: public' ;
1890 - celles qui ont un en-tête 'Pragma: no-cache' ;
1891 - celles qui ont un en-tête 'Cache-control: private' ;
1892 - celles qui ont un en-tête 'Cache-control: no-store' ;
1893 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
1894 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
1895 - celles qui ont un en-tête 'Cache-control: no-cache' ;
1896 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
1897 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01001898 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01001899
willy tarreau982249e2005-12-18 00:57:06 +01001900Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
1901même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
1902message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
1903dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01001904en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01001905l'administrateur sache qu'il y a une action correctrice à entreprendre.
1906
19074.6) Personalisation des erreurs
1908--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01001909Certaines situations conduisent à retourner une erreur HTTP au client :
1910 - requête invalide ou trop longue => code HTTP 400
1911 - requête mettant trop de temps à venir => code HTTP 408
1912 - requête interdite (bloquée par un reqideny) => code HTTP 403
1913 - erreur interne du proxy => code HTTP 500
1914 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
1915 - aucun serveur disponible pour cette requête => code HTTP 503
1916 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
1917
1918Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
1919Cependant, en fonction du type de clientèle, on peut préférer retourner des
willy tarreau64a3cc32005-12-18 01:13:11 +01001920pages personnalisées. Ceci est possible par le biais de la commande "errorloc":
willy tarreau8337c6b2005-12-17 13:41:01 +01001921
1922 errorloc <code_HTTP> <location>
1923
1924Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
1925le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
1926d'une page précisée dans <location>. Cette adresse peut être relative au site,
1927ou absolue. Comme cette réponse est traîtée par le navigateur du client
1928lui-même, il est indispensable que l'adresse fournie lui soit accessible.
1929
1930Exemple :
1931---------
1932 listen application 0.0.0.0:80
1933 errorloc 400 /badrequest.html
1934 errorloc 403 /forbidden.html
1935 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01001936 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01001937 errorloc 502 http://192.168.114.58/error50x.html
1938 errorloc 503 http://192.168.114.58/error50x.html
1939 errorloc 504 http://192.168.114.58/error50x.html
1940
willy tarreauc1f47532005-12-18 01:08:26 +01001941Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
1942accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
1943problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
1944régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
1945dans le champ Location avec la méthode GET uniquement. Seulement, certains
1946navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
1947plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
1948devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01001949l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
1950visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01001951
1952Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
1953utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
1954dès que vous savez que vos clients supportent le code de retour HTTP 303.
1955
willy tarreau982249e2005-12-18 00:57:06 +010019564.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01001957--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001958Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
1959évite de répéter des paramètres communs à toutes les instances, tels que les
1960timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01001961
1962Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
1963précédent l'instance qui les utilisera. On peut donc mettre autant de sections
1964'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
1965section implique une annulation de tous les paramètres par défaut positionnés
1966précédemment, dans le but de les remplacer.
1967
1968La section 'defaults' utilise la même syntaxe que la section 'listen', aux
1969paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
1970un commentaire en guise paramètre.
1971
willy tarreau982249e2005-12-18 00:57:06 +01001972Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
1973positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01001974 - log (le premier et le second)
1975 - mode { tcp, http, health }
1976 - balance { roundrobin }
1977 - disabled (pour désactiver toutes les instances qui suivent)
1978 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
1979 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01001980 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
1981 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01001982 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01001983 - cookie, capture
1984 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01001985
1986Ne sont pas supportés dans cette version, les adresses de dispatch et les
1987configurations de serveurs, ainsi que tous les filtres basés sur les
1988expressions régulières :
1989 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01001990 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01001991
1992Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
1993positionné par défaut. Donc si une option est spécifiée dans les paramètres par
1994défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
1995paramètres par défaut avant la déclaration de l'instance.
1996
1997Exemples :
1998----------
1999 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002000 log global
2001 mode tcp
2002 balance roundrobin
2003 clitimeout 180000
2004 srvtimeout 180000
2005 contimeout 4000
2006 retries 3
2007 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002008
2009 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002010 server srv1 192.168.1.1 check port 6000 inter 10000
2011 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002012
2013 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002014 server srv1 192.168.2.1 check port 6000 inter 10000
2015 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002016
2017 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002018 log global
2019 mode http
2020 option httplog
2021 option forwardfor
2022 option dontlognull
2023 balance roundrobin
2024 clitimeout 20000
2025 srvtimeout 20000
2026 contimeout 4000
2027 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002028
2029 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002030 cookie SERVERID postonly insert indirect
2031 capture cookie userid= len 10
2032 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2033 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002034
2035 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002036 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002037
willy tarreaub719f002005-12-17 12:55:07 +01002038=======================
2039| Paramétrage système |
2040=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002041
2042Sous Linux 2.4
2043==============
2044
willy tarreaub719f002005-12-17 12:55:07 +01002045-- cut here --
2046#!/bin/sh
2047# set this to about 256/4M (16384 for 256M machine)
2048MAXFILES=16384
2049echo $MAXFILES > /proc/sys/fs/file-max
2050ulimit -n $MAXFILES
2051
2052if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002053 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002054fi
2055
2056if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002057 # 30 seconds for fin, 15 for time wait
2058 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2059 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2060 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2061 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002062fi
2063
willy tarreau0f7af912005-12-17 12:21:26 +01002064echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002065echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2066echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002067echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002068echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2069echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002070echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2071echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002072echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002073echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002074echo 0 > /proc/sys/net/ipv4/tcp_dsack
2075
2076# auto-tuned on 2.4
2077#echo 262143 > /proc/sys/net/core/rmem_max
2078#echo 262143 > /proc/sys/net/core/rmem_default
2079
2080echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2081echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2082
2083-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002084
willy tarreau197e8ec2005-12-17 14:10:59 +01002085Sous FreeBSD
2086============
2087
2088Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2089Clement Laforet <sheepkiller@cultdeadsheep.org>.
2090
2091Pour plus d'informations :
2092http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2093http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2094http://www.freshports.org/net/haproxy
2095
2096
willy tarreau0f7af912005-12-17 12:21:26 +01002097-- fin --