blob: 97997289a19099f3292b7028bc94c94e3c058ec3 [file] [log] [blame]
willy tarreau0174f312005-12-18 01:02:42 +01001 -------------------
2 H A - P r o x y
3 Manuel de référence
4 -------------------
willy tarreaub952e1d2005-12-18 01:31:20 +01005 version 1.2.7
willy tarreauc5f73ed2005-12-18 01:26:38 +01006 willy tarreau
willy tarreaub952e1d2005-12-18 01:31:20 +01007 2005/10/09
willy tarreau0f7af912005-12-17 12:21:26 +01008
willy tarreaub719f002005-12-17 12:55:07 +01009================
10| Introduction |
11================
willy tarreau0f7af912005-12-17 12:21:26 +010012
13HA-Proxy est un relais TCP/HTTP offrant des facilités d'intégration en
14environnement hautement disponible. En effet, il est capable de :
willy tarreauc29948c2005-12-17 13:10:27 +010015 - effectuer un aiguillage statique défini par des cookies ;
willy tarreau64a3cc32005-12-18 01:13:11 +010016 - effectuer une répartition de charge avec création de cookies pour assurer
17 la persistence de session ;
willy tarreau0f7af912005-12-17 12:21:26 +010018 - fournir une visibilité externe de son état de santé ;
willy tarreau8337c6b2005-12-17 13:41:01 +010019 - s'arrêter en douceur sans perte brutale de service ;
willy tarreauc5f73ed2005-12-18 01:26:38 +010020 - modifier/ajouter/supprimer des en-têtes dans la requête et la réponse ;
willy tarreau8337c6b2005-12-17 13:41:01 +010021 - interdire des requêtes qui vérifient certaines conditions ;
22 - utiliser des serveurs de secours lorsque les serveurs principaux sont hors
23 d'usage.
willy tarreau0f7af912005-12-17 12:21:26 +010024
willy tarreau64a3cc32005-12-18 01:13:11 +010025Il requiert peu de ressources, et son architecture événementielle mono-
26processus lui permet facilement de gérer plusieurs milliers de connexions
27simultanées sur plusieurs relais sans effondrer le système.
willy tarreaua1598082005-12-17 13:08:06 +010028
willy tarreau0f7af912005-12-17 12:21:26 +010029
30===========================
31| Paramètres de lancement |
32===========================
33
34Les options de lancement sont peu nombreuses :
35
36 -f <fichier de configuration>
37 -n <nombre maximal total de connexions simultanées>
38 -N <nombre maximal de connexions simultanées par proxy>
39 -d active le mode debug
40 -D passe en daemon
willy tarreau982249e2005-12-18 00:57:06 +010041 -q désactive l'affichage de messages sur la sortie standard.
42 -V affiche les messages sur la sortie standard, même si -q ou 'quiet' sont
43 spécifiés.
44 -c vérifie le fichier de configuration puis quitte avec un code de retour 0
45 si aucune erreur n'a été trouvée, ou 1 si une erreur de syntaxe a été
46 détectée.
willy tarreaufe2c5c12005-12-17 14:14:34 +010047 -p <fichier> indique au processus père qu'il doit écrire les PIDs de ses
48 fils dans ce fichier en mode démon.
willy tarreau0f7af912005-12-17 12:21:26 +010049 -s affiche les statistiques (si option compilée)
50 -l ajoute des informations aux statistiques
willy tarreau64a3cc32005-12-18 01:13:11 +010051 -de désactive l'utilisation de epoll()
52 -dp désactive l'utilisation de poll()
willy tarreau0f7af912005-12-17 12:21:26 +010053
willy tarreau64a3cc32005-12-18 01:13:11 +010054Le nombre maximal de connexion simultanées par proxy est le paramètre par
55défaut pour les proxies pour lesquels ce paramètre n'est pas précisé dans le
56fichier de configuration. Il s'agit du paramètre 'maxconn' dans les sections
57'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010058
willy tarreau64a3cc32005-12-18 01:13:11 +010059Le nombre maximal total de connexions simultanées limite le nombre de
60connexions TCP utilisables à un instant donné par le processus, tous proxies
61confondus. Ce paramètre remplace le paramètre 'maxconn' de la section 'global'.
willy tarreaua1598082005-12-17 13:08:06 +010062
willy tarreauc29948c2005-12-17 13:10:27 +010063Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
willy tarreauc5f73ed2005-12-18 01:26:38 +010064mode, toutes les connexions, déconnexions, et tous les échanges d'en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +010065sont affichés.
66
67Les statistiques ne sont disponibles que si le programme a été compilé avec
68l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
69d'utilité que lors de benchmarks par exemple.
70
willy tarreau0f7af912005-12-17 12:21:26 +010071
72============================
73| Fichier de configuration |
74============================
75
willy tarreauc29948c2005-12-17 13:10:27 +010076Structure
77=========
willy tarreau0f7af912005-12-17 12:21:26 +010078
willy tarreaua1598082005-12-17 13:08:06 +010079L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
willy tarreau64a3cc32005-12-18 01:13:11 +010080les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est
81pas précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +010082
83Le fichier de configuration est découpé en sections répérées par des mots clés
84tels que :
85
86 - 'global'
87 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +010088 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +010089
90Tous les paramètres font référence à la section définie par le dernier mot clé
91reconnu.
92
93
willy tarreauc29948c2005-12-17 13:10:27 +0100941) Paramètres globaux
95=====================
willy tarreaua1598082005-12-17 13:08:06 +010096
97Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
98proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
99supportés sont :
100
willy tarreau8337c6b2005-12-17 13:41:01 +0100101 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100102 - maxconn <nombre>
103 - uid <identifiant>
104 - gid <identifiant>
105 - chroot <répertoire>
106 - nbproc <nombre>
107 - daemon
108 - debug
willy tarreau64a3cc32005-12-18 01:13:11 +0100109 - noepoll
110 - nopoll
willy tarreaua1598082005-12-17 13:08:06 +0100111 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100112 - pidfile <fichier>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100113 - ulimit-n <nombre>
114
willy tarreaua1598082005-12-17 13:08:06 +0100115
1161.1) Journalisation des événements
117----------------------------------
118La plupart des événements sont journalisés : démarrages, arrêts, disparition et
119apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
120syslog vers un ou deux serveurs. La syntaxe est la suivante :
121
willy tarreau8337c6b2005-12-17 13:41:01 +0100122 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100123
124Les connexions sont envoyées en niveau "info". Les démarrages de service et de
125serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
126arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau64a3cc32005-12-18 01:13:11 +0100127bien pour les proxies que pour les serveurs testés par les proxies. Le
128paramètre optionnel <niveau_max> définit le niveau maximal de traces émises
129parmi les 8 valeurs suivantes :
willy tarreau8337c6b2005-12-17 13:41:01 +0100130 emerg, alert, crit, err, warning, notice, info, debug
131
willy tarreaueedaa9f2005-12-17 14:08:03 +0100132Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100133est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100134
135Les catégories possibles sont :
136 kern, user, mail, daemon, auth, syslog, lpr, news,
137 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
138 local0, local1, local2, local3, local4, local5, local6, local7
139
willy tarreau036e1ce2005-12-17 13:46:33 +0100140Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
141
willy tarreaua1598082005-12-17 13:08:06 +0100142Exemple :
143---------
144 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100145 log 192.168.2.200 local3
146 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100147
1481.2) limitation du nombre de connexions
149---------------------------------------
150Il est possible et conseillé de limiter le nombre global de connexions par
willy tarreauc5f73ed2005-12-18 01:26:38 +0100151processus à l'aide du mot clé global 'maxconn'. Les connexions sont comprises
152au sens 'acceptation de connexion', donc il faut s'attendre en règle général à
153avoir un peu plus du double de sessions TCP que le maximum de connexions fixé.
154C'est important pour fixer le paramètre 'ulimit -n' avant de lancer le proxy.
155Pour comptabiliser le nombre de sockets nécessaires, il faut prendre en compte
156ces paramètres :
157
willy tarreaua1598082005-12-17 13:08:06 +0100158 - 1 socket par connexion entrante
159 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100160 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100161 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100162 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100163
willy tarreau64a3cc32005-12-18 01:13:11 +0100164Dans le cas où chaque proxy n'écoute que sur un couple adresse/port,
willy tarreauc5f73ed2005-12-18 01:26:38 +0100165positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
166(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
167il est possible de spécifier cette limite dans la configuration à l'aide du
168mot-clé global 'ulimit-n', à condition bien entendu que le proxy ait été
169démarré sous le compte root (ou avec des droits suffisants pour élever le
170nombre de descripteurs de fichiers). Cette solution met un terme au problème
171récurrent d'incertitude de l'adéquation entre les limites systèmes lors de la
172dernière relance du proxessus et les limites en nombre de connexions. Noter que
173cette limite s'applique par processus.
174
175Exemple :
176---------
177 global
178 maxconn 32000
179 ulimit-n 65536
180
willy tarreauc29948c2005-12-17 13:10:27 +0100181
1821.3) Diminution des privilèges
183------------------------------
184Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
185serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100186de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100187
willy tarreauc29948c2005-12-17 13:10:27 +0100188Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
189numérique d'utilisateur. La valeur 0, correspondant normalement au super-
190utilisateur, possède ici une signification particulière car elle indique que
191l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
192C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
193un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
194changer. Il est particulièrement déconseillé d'utiliser des comptes génériques
195tels que 'nobody' car cette pratique revient à utiliser 'root' si d'autres
196processus utilisent les mêmes identifiants.
197
198Le paramètre 'chroot' autorise à changer la racine du processus une fois le
199programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100200puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100201généralement contournable sur certains OS (Linux, Solaris) pour peu que
202l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
203un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
204service pour cet usage, et de ne pas mutualiser un même répertoire pour
205plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
206il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
207l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100208
willy tarreau64a3cc32005-12-18 01:13:11 +0100209Remarque importante :
210---------------------
211Dans le cas où une telle faille serait mise en évidence, il est fort probable
212que les premières tentatives de son exploitation provoquent un arrêt du
willy tarreauc29948c2005-12-17 13:10:27 +0100213programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
willy tarreau64a3cc32005-12-18 01:13:11 +0100214encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur
215en environnement limité réduit les risques d'intrusion, il est parfois bien
216utile dans ces circonstances de connaître les conditions d'apparition du
217problème, via l'obtention d'un fichier 'core'. La plupart des systèmes, pour
218des raisons de sécurité, désactivent la génération du fichier 'core' après un
219changement d'identifiant pour le processus. Il faudra donc soit lancer le
220processus à partir d'un compte utilisateur aux droits réduits (mais ne pouvant
221pas effectuer le chroot), ou bien le faire en root sans réduction des droits
222(uid 0). Dans ce cas, le fichier se trouvera soit dans le répertoire de
223lancement, soit dans le répertoire spécifié après l'option 'chroot'. Ne pas
224oublier la commande suivante pour autoriser la génération du fichier avant de
225lancer le programme :
willy tarreauc29948c2005-12-17 13:10:27 +0100226
227# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100228
willy tarreauc29948c2005-12-17 13:10:27 +0100229Exemple :
230---------
231
232 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100233 uid 30000
234 gid 30000
235 chroot /var/chroot/haproxy
willy tarreauc29948c2005-12-17 13:10:27 +0100236
willy tarreaufe2c5c12005-12-17 14:14:34 +01002371.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100238----------------------------
239Le service peut fonctionner dans plusieurs modes :
240 - avant- / arrière-plan
241 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100242
willy tarreau64a3cc32005-12-18 01:13:11 +0100243Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne
244rend pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci
245dans un script de démarrage du système, sinon le système ne finirait pas son
willy tarreauc29948c2005-12-17 13:10:27 +0100246initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
247au processus appelant. C'est ce que fait l'option 'daemon' de la section
248'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100249
willy tarreauc29948c2005-12-17 13:10:27 +0100250Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
251standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
252logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
253Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100254
willy tarreauc29948c2005-12-17 13:10:27 +0100255Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
256problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
257entre les clients et les serveurs. Ce mode est incompatible avec les options
258'daemon' et 'quiet' pour des raisons de bon sens.
259
willy tarreaufe2c5c12005-12-17 14:14:34 +01002601.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100261-----------------------------------------------
262Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
263processeur pour effectuer les tâches de relayage, même si les charges
264nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
265grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
266programme sait démarrer plusieurs processus se répartissant la charge de
267travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
268section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100269qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
270la limite de nombre de descripteurs de fichiers allouée par processus sous
271Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100272
273Exemple :
274---------
275
276 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100277 daemon
278 quiet
279 nbproc 2
willy tarreauc29948c2005-12-17 13:10:27 +0100280
willy tarreaufe2c5c12005-12-17 14:14:34 +01002811.6) Simplification de la gestion des processus
282-----------------------------------------------
283Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
284paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
285d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
286le numéro de PID des processus fils, à raison d'un par ligne (valable
287uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
288afin de rester compatible avec un répertoire protégé en lecture seule. Il
289appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
2900644.
291
292Exemple :
293---------
294
295 global
296 daemon
297 quiet
298 nbproc 2
299 pidfile /var/run/haproxy-private.pid
300
301 # pour stopper seulement ces processus parmi d'autres :
302 # kill $(</var/run/haproxy-private.pid)
303
willy tarreauc29948c2005-12-17 13:10:27 +0100304
willy tarreau64a3cc32005-12-18 01:13:11 +01003051.7) Mécanismes de traitements des événements
306---------------------------------------------
307A partir de la version 1.2.5, haproxy supporte les mécanismes poll() et
308epoll(). Sur les systems où select() est limité par FD_SETSIZE (comme Solaris),
309poll() peut être une alternative intéressante. Des tests de performance
310montrent que les performances de poll() ne décroissent pas aussi vite que le
311nombre de sockets augmente, ce qui en fait une solution sûre pour les fortes
312charges. Cela dit, Soalris utilise déjà poll() pour émuler select(), donc tant
313que le nombre de sockets ne dépasse pas FD_SETSIZE, poll() ne devrait pas
314apporter de performances supplémentaires. Sur les systèmes à base Linux
315incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
316qui est extrèmement rapide indépendamment du nombre de sockets. Les tests sur
317haproxy ont montré une performance constante de 1 à 40000 sessions simultanées.
318
319Haproxy utilisera epoll() lorsqu'il est disponible, et se repliera sur poll(),
320puis en dernier lieu sur select(). Cependant, si pour une raison quelconque il
321s'avérait nécessaire de désactiver epoll() ou poll() (p.ex: à cause d'un bug ou
322juste pour comparer les performances), deux nouvelles options globales ont été
323ajoutées dans ce but : 'noepoll' et 'nopoll'.
324
325Exemple :
326---------
327 global
328 # utiliser seulement select()
329 noepoll
330 nopoll
331
332Remarque :
333----------
334Dans le but d'assurer une portabilité maximale des configurations, ces options
335sont acceptées et ignorées si les mécanismes poll() ou epoll() n'ont pas été
336activés lors de la compilation.
337
338Afin de simplifier la résolution de problèmes, le paramètre '-de' en ligne de
339commande désactive epoll() et le paramètre '-dp' désactive poll(). Ils sont
340respectivement équivalents à 'noepoll' et 'nopoll'.
341
342
willy tarreauc29948c2005-12-17 13:10:27 +01003432) Définition d'un service en écoute
344====================================
345
346Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100347
willy tarreaua41a8b42005-12-17 14:02:24 +0100348 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100349
willy tarreauc29948c2005-12-17 13:10:27 +0100350- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
willy tarreau64a3cc32005-12-18 01:13:11 +0100351 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé.
352 Aucun test n'est effectué concernant l'unicité de ce nom, qui n'est pas
353 obligatoire, mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100354
willy tarreaua41a8b42005-12-17 14:02:24 +0100355- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
356 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
357 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100358
willy tarreaua41a8b42005-12-17 14:02:24 +0100359- <plage_ports> correspond soit à un port, soit à une plage de ports sur
360 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
361 Cette plage peut être :
362 - soit un port numérique (ex: '80')
363 - soit une plage constituée de deux valeurs séparées par un tiret
364 (ex: '2000-2100') représentant les extrémités incluses dans la
365 plage.
366 Il faut faire attention à l'usage des plages, car chaque combinaison
367 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
368 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
369 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
willy tarreau64a3cc32005-12-18 01:13:11 +0100370 niveau de privilège particulier lors du lancement du programme
371 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100372
willy tarreaua41a8b42005-12-17 14:02:24 +0100373- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
374 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
375 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
376
377Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100378---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100379 listen http_proxy :80
380 listen x11_proxy 127.0.0.1:6000-6009
381 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
382 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100383
willy tarreaua41a8b42005-12-17 14:02:24 +0100384Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
385rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
386de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
387l'écriture de configurations :
388
389 bind [ <adresse_IP>:<plage_ports>[,...] ]
390
391Exemples :
392----------
393 listen http_proxy
394 bind :80,:443
willy tarreauc5f73ed2005-12-18 01:26:38 +0100395 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100396
willy tarreauc29948c2005-12-17 13:10:27 +01003972.1) Inhibition d'un service
398----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100399Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100400commenter toute une partie du fichier. Il suffit de positionner le mot clé
401"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100402
403 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100404 disabled
willy tarreau0f7af912005-12-17 12:21:26 +0100405
willy tarreaueedaa9f2005-12-17 14:08:03 +0100406Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
willy tarreauc5f73ed2005-12-18 01:26:38 +0100407 désactivé par le mot clé 'disabled', par exemple à cause d'une
408 configuration par défaut.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100409
willy tarreauc29948c2005-12-17 13:10:27 +01004102.2) Mode de fonctionnement
411---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100412Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100413 - TCP
414 - HTTP
415 - supervision
416
417Mode TCP
418--------
willy tarreau64a3cc32005-12-18 01:13:11 +0100419Dans ce mode, le service relaye, dès leur établissement, les connexions TCP
420vers un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il
421s'agit simplement d'une association
422 source<adresse:port> -> destination<adresse:port>.
willy tarreauc29948c2005-12-17 13:10:27 +0100423Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100424
willy tarreauc29948c2005-12-17 13:10:27 +0100425Exemple :
426---------
willy tarreau0f7af912005-12-17 12:21:26 +0100427 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100428 mode tcp
willy tarreau0f7af912005-12-17 12:21:26 +0100429
430Mode HTTP
431---------
willy tarreauc29948c2005-12-17 13:10:27 +0100432Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
433serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
willy tarreauc5f73ed2005-12-18 01:26:38 +0100434décision. Les en-têtes HTTP sont analysés pour y trouver un éventuel cookie, et
willy tarreauc29948c2005-12-17 13:10:27 +0100435certains d'entre-eux peuvent être modifiés par le biais d'expressions
436régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
437relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100438
willy tarreauc29948c2005-12-17 13:10:27 +0100439Exemple :
440---------
willy tarreau0f7af912005-12-17 12:21:26 +0100441 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100442 mode http
willy tarreau0f7af912005-12-17 12:21:26 +0100443
444Mode supervision
445----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100446Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
447santé du service. Il se contente de retourner "OK" à tout client se connectant
448sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100449déterminer quels sont les services utilisables. Si l'option 'httpchk' est
450activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
451attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100452le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100453
willy tarreauc29948c2005-12-17 13:10:27 +0100454Exemple :
455---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100456 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100457 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100458 mode health
willy tarreau0f7af912005-12-17 12:21:26 +0100459
willy tarreau197e8ec2005-12-17 14:10:59 +0100460 # réponse HTTP : 'HTTP/1.0 200 OK'
461 listen http_health_check 0.0.0.0:60001
willy tarreauc5f73ed2005-12-18 01:26:38 +0100462 mode health
463 option httpchk
willy tarreau197e8ec2005-12-17 14:10:59 +0100464
willy tarreau0f7af912005-12-17 12:21:26 +0100465
willy tarreauc5f73ed2005-12-18 01:26:38 +0100466Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
467bon fonctionnement du proxy sans perturber le service. Le mot-clé 'monitor-net'
468a été créé dans le butd de spécifier un réseau d'équipements qui ne PEUVENT PAS
469utiliser le service pour autre chose que des tests de fonctionnement. C'est
470particulièrement adapté aux proxies TCP, car cela empêche le proxy de relayer
471des établissements de connexion émis par un outil de surveillance.
472
473Lorsque c'est utilisé sur un proxy TCP, la connexion est acceptée puis refermée
474et rien n'est logué. C'est suffisant pour qu'un répartiteur de charge en amont
475détecte que le service est disponible.
476
477Lorsque c'est utilisé sur un proxy HTTP, la connexion est acceptée, rien n'est
478logué, puis la réponse suivante est envoyée et la session refermée :
479"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un répartiteur de charge
480HTTP en amont détecte le service comme opérationnel, aussi bien à travers des
481tests TCP que HTTP.
482
483Les proxies utilisant le mot-clé 'monitor-net' peuvent accessoirement se passer
484de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
485émises depuis d'autres adresses que celles du réseau de tests.
486
487Exemple :
488---------
489
490 listen tse-proxy
491 bind :3389,:1494,:5900 # TSE, ICA and VNC at once.
492 mode tcp
493 balance roundrobin
494 server tse-farm 192.168.1.10
495 monitor-net 192.168.1.252/31 # L4 load-balancers on .252 and .253
496
497
willy tarreauc29948c2005-12-17 13:10:27 +01004982.3) Limitation du nombre de connexions simultanées
499---------------------------------------------------
500Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
501connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
502d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
503limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100504
willy tarreauc29948c2005-12-17 13:10:27 +0100505Exemple :
506---------
507 listen tiny_server 0.0.0.0:80
508 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100509
510
willy tarreauc29948c2005-12-17 13:10:27 +01005112.4) Arrêt en douceur
512---------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100513Il est possible d'arrêter les services en douceur en envoyant un signal
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
880de répartition de charge entre des serveurs de secours. Ce type de serveurs
881peut servir à retourner des pages d'indisponibilité de service. Dans ce cas,
882il est préférable de ne pas affecter de cookie, afin que les clients qui le
883rencontrent n'y soient pas affectés définitivement. Le fait de ne pas mettre
884de cookie envoie un cookie vide, ce qui a pour effet de supprimer un éventuel
885cookie affecté précédemment.
886
willy tarreaua41a8b42005-12-17 14:02:24 +0100887Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
888vers un port différent de celui de service. C'est nécessaire principalement
889pour les configurations où le serveur n'a pas de port prédéfini, par exemple
890lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
891le paramètre 'port' suivi du numéro de port devant répondre aux requêtes.
892
willy tarreau64a3cc32005-12-18 01:13:11 +0100893Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
894l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
895SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
896envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
897elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
898local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +0100899
willy tarreau982249e2005-12-18 00:57:06 +0100900Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
901logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
902afin de notifier l'administrateur qu'il faut prendre une action immédiate.
903
willy tarreau0174f312005-12-18 01:02:42 +0100904Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
905même valeur de cookie. C'est particulièrement utile en mode backup, pour
906sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
907oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
908temporairement vers une page d'erreur en attendant le redémarrage d'une
909application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
910le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
911chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
912le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
913pour plus d'informations.
914
willy tarreauc29948c2005-12-17 13:10:27 +0100915Exemples :
916----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100917# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100918 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100919 mode http
920 cookie SERVERID
921 balance roundrobin
922 server web1 192.168.1.1:80 cookie server01 check
923 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100924
willy tarreau2f6ba652005-12-17 13:57:42 +0100925# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +0100926 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100927 mode http
928 cookie SERVERID
929 balance roundrobin
930 option httpchk
931 server web1 192.168.1.1:80 cookie server01 check
932 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +0100933
willy tarreau2f6ba652005-12-17 13:57:42 +0100934# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
935 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100936 mode http
937 cookie SERVERID
938 balance roundrobin
939 option httpchk /index.html
940 server web1 192.168.1.1:80 cookie server01 check
941 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +0100942
willy tarreaueedaa9f2005-12-17 14:08:03 +0100943# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
944 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100945 mode http
946 cookie SERVERID
947 balance roundrobin
948 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
949 server web1 192.168.1.1:80 cookie server01 check
950 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +0100951
willy tarreau0174f312005-12-18 01:02:42 +0100952# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
953# douceur utilisant un second port (81) juste pour les health-checks.
954 listen http_proxy 0.0.0.0:80
955 mode http
956 cookie JSESSIONID prefix
957 balance roundrobin
958 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
959 server web1-norm 192.168.1.1:80 cookie s1 check port 81
960 server web2-norm 192.168.1.2:80 cookie s2 check port 81
961 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
962 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
963
willy tarreau96d40372005-12-17 13:11:56 +0100964# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +0100965# automatique dans la requête, tout en indiquant aux caches de ne pas garder
966# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +0100967 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100968 mode http
969 cookie SERVERID insert nocache indirect
970 balance roundrobin
971 server web1 192.168.1.1:80 cookie server01 check
972 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +0100973
willy tarreaueedaa9f2005-12-17 14:08:03 +0100974# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +0100975 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100976 mode http
977 cookie SERVERID insert nocache indirect
978 balance roundrobin
979 server web1 192.168.1.1:80 cookie server01 check
980 server web2 192.168.1.2:80 cookie server02 check
981 server web-backup 192.168.2.1:80 cookie server03 check backup
982 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +0100983
willy tarreaua41a8b42005-12-17 14:02:24 +0100984# relayage SMTP+TLS avec test du serveur et serveur de backup
985
986 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +0100987 mode tcp
988 balance roundrobin
989 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
990 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +0100991
willy tarreau0f7af912005-12-17 12:21:26 +0100992
willy tarreauc29948c2005-12-17 13:10:27 +01009933.2) Reconnexion vers un répartiteur en cas d'échec direct
994----------------------------------------------------------
995En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
996seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
997définitivement privés de service. La spécification du paramètre 'redispatch'
998autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
999(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001000
1001Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001002---------
willy tarreau0f7af912005-12-17 12:21:26 +01001003 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001004 mode http
1005 cookie SERVERID
1006 dispatch 192.168.1.100:80
1007 server web1 192.168.1.1:80 cookie server01
1008 server web2 192.168.1.2:80 cookie server02
1009 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001010
willy tarreau64a3cc32005-12-18 01:13:11 +01001011Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1012redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1013version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1014identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1015tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1016tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001017
1018 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001019 mode http
1020 option persist
1021 cookie SERVERID
1022 dispatch 192.168.1.100:80
1023 server web1 192.168.1.1:80 cookie server01
1024 server web2 192.168.1.2:80 cookie server02
1025 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001026
willy tarreauc29948c2005-12-17 13:10:27 +01001027
10284) Fonctionnalités additionnelles
1029=================================
1030
1031D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
1032principalement du mode transparent, de la journalisation des connexions, et de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001033la réécriture des en-têtes.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001034
willy tarreau0174f312005-12-18 01:02:42 +010010354.1) Fonctionnalités réseau
1036---------------------------
10374.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001038---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001039En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1040routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1041pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001042destination de la session détournée. Le système doit permettre de rediriger les
1043paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001044
1045Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001046---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001047 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001048 mode http
1049 transparent
1050 cookie SERVERID
1051 server server01 192.168.1.1:80
1052 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001053
1054 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1055 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001056
willy tarreaua41a8b42005-12-17 14:02:24 +01001057Remarque :
1058----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001059Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1060adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1061d'une même adresse avec une même instance et sans utiliser directement le mode
1062transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001063
1064Exemple :
1065---------
1066 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001067 mode tcp
1068 server server01 192.168.1.1 check port 60000
1069 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001070
1071 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1072 -j REDIRECT --to-ports 65000
1073
willy tarreau0174f312005-12-18 01:02:42 +01001074
10754.1.2) Choix d'une adresse source par serveur
1076---------------------------------------------------
1077Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1078IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1079backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1080pour joindre le même serveur. C'est également utilisable pour faciliter une
1081répartition de charge selon l'adresse IP source pour des connexions sortantes.
1082Bien entendu, la même adresse est utilisée pour les health-checks.
1083
1084Exemple :
1085---------
1086 # utiliser une adresse particulière pour joindre les 2 serveur
1087 listen http_proxy 0.0.0.0:65000
1088 mode http
1089 balance roundrobin
1090 server server01 192.168.1.1:80 source 192.168.2.13
1091 server server02 192.168.1.2:80 source 192.168.2.13
1092
1093Exemple :
1094---------
1095 # utiliser une adresse particulière pour joindre chaque serveur
1096 listen http_proxy 0.0.0.0:65000
1097 mode http
1098 balance roundrobin
1099 server server01 192.168.1.1:80 source 192.168.1.1
1100 server server02 192.168.2.1:80 source 192.168.2.1
1101
1102Exemple :
1103---------
1104 # faire une répartition d'adresse sources pour joindre le même proxy à
1105 # travers deux liens WAN
1106 listen http_proxy 0.0.0.0:65000
1107 mode http
1108 balance roundrobin
1109 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1110 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1111
1112Exemple :
1113---------
1114 # forcer une connexion TCP à s'attacher à un port particulier
1115 listen http_proxy 0.0.0.0:2000
1116 mode tcp
1117 balance roundrobin
1118 server srv1 192.168.1.1:80 source 192.168.2.1:20
1119 server srv2 192.168.1.2:80 source 192.168.2.1:20
1120
willy tarreaub952e1d2005-12-18 01:31:20 +010011214.1.3) Maintien de session TCP (keep-alive)
1122-------------------------------------------
1123Avec la version 1.2.7, il devient possible d'activer le maintien de session
1124TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1125d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1126externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1127aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1128time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1129positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1130vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1131pour activer le maintien de session TCP :
1132
1133 option tcpka # active le keep-alive côté client et côté serveur
1134 option clitcpka # active le keep-alive côté client
1135 option srvtcpka # active le keep-alive côté serveur
1136
willy tarreau0f7af912005-12-17 12:21:26 +01001137
willy tarreauc29948c2005-12-17 13:10:27 +010011384.2) Journalisation des connexions
1139----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001140
1141L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1142Il fournit probablement le plus fin niveau d'information disponible pour un
1143tel outil, ce qui est très important pour les diagnostics en environnements
1144complexes. En standard, les informations journalisées incluent le port client,
1145les chronométrages des états TCP/HTTP, des états de session précis au moment de
1146la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1147trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1148arbitraires.
1149
1150Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1151transparence sur les problèmes rencontrés, à la fois internes et externes, et
1152il est possible d'envoyer les logs vers des serveurs différents en même temps
1153avec des niveaux de filtrage différents :
1154
1155 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1156 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1157 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1158 - activité par instance (connexions clients), aussi bien lors de leur
1159 établissement qu'à leur terminaison.
1160
1161La possibilité de distribuer différents niveaux de logs à différents serveurs
1162permet à plusieurs équipes de production d'intéragir et de corriger leurs
1163problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1164occasionnellement les erreurs système, pendant que l'équipe application
1165surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1166que l'équipe sécurité analyse l'activité en différé d'une heure.
1167
1168
willy tarreauc1cae632005-12-17 14:12:23 +010011694.2.1) Niveaux de log
1170---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001171Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1172détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1173source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001174la requête HTTP, le code de retour, la quantité de données transmises, et même
1175dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1176Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1177la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001178est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001179
willy tarreau8337c6b2005-12-17 13:41:01 +01001180 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1181 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001182ou
1183 log global
1184
1185Remarque :
1186----------
1187La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1188paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001189
1190Exemple :
1191---------
1192 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001193 mode http
1194 log 192.168.2.200 local3
1195 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001196
willy tarreauc1cae632005-12-17 14:12:23 +010011974.2.2) Format des logs
1198----------------------
1199Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1200de la session entre le client et le relais. En précisant l'option 'tcplog',
1201la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1202sur son état lors de la déconnexion, ainsi que le temps de connexion et la
1203durée totale de la session.
1204
willy tarreauc5f73ed2005-12-18 01:26:38 +01001205Exemple de journalisation TCP :
1206-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001207 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001208 mode tcp
1209 option tcplog
1210 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001211
willy tarreauc5f73ed2005-12-18 01:26:38 +01001212>>> haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 -- 1/1
1213
1214 Champ Format / Description Exemple
1215
1216 1 nom_processus '[' pid ']:' haproxy[18989]:
1217 2 ip_client ':' port_client 127.0.0.1:34550
1218 3 '[' date ']' [15/Oct/2003:15:24:28]
1219 4 nom_instance relais-tcp
1220 5 nom_serveur Srv1
1221 6 temps_connect '/' temps_total 0/5007
1222 7 octets lus 0
1223 8 etat_terminaison --
1224 9 conns_instance '/' conns_processus 1/1
willy tarreau982249e2005-12-18 00:57:06 +01001225
willy tarreauc1cae632005-12-17 14:12:23 +01001226Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1227notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1228surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1229les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1230ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1231(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001232
willy tarreauc5f73ed2005-12-18 01:26:38 +01001233Exemple de journalisation HTTP :
1234--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001235 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001236 mode http
1237 option httplog
1238 option dontlognull
1239 log 192.168.2.200 local3
1240
1241>>> 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"
1242
1243Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001244
willy tarreauc5f73ed2005-12-18 01:26:38 +01001245 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"
1246
1247 Champ Format / Description Exemple
1248
1249 1 nom_processus '[' pid ']:' haproxy[18989]:
1250 2 ip_client ':' port_client 10.0.0.1:34552
1251 3 '[' date ']' [15/Oct/2003:15:26:31]
1252 4 nom_instance relais-http
1253 5 nom_serveur Srv1
1254 6 Tq '/' Tc '/' Tr '/' Tt 3183/-1/-1/11215
1255 7 Code_retour_HTTP 503
1256 8 octets lus 0
1257 9 cookies_requête_capturés -
1258 10 cookies_reponse_capturés -
1259 11 etat_terminaison SC--
1260 12 conns_instance '/' conns_processus 202/205
1261 13 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1262 14 '{' entetes_reponse_capturés '}' {}
1263 15 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
1264
1265Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1266 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001267
1268Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1269de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1270Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001271la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1272tôt possible, c'est à dire juste avant que ne débutent les transferts de
1273données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1274de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001275traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1276représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001277
willy tarreau64a3cc32005-12-18 01:13:11 +01001278Afin d'éviter toute confusion avec les logs normaux, le temps total de
1279transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001280rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001281
1282Exemple :
1283---------
1284
1285 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001286 mode http
1287 option httplog
1288 option dontlognull
1289 option logasap
1290 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001291
willy tarreauc5f73ed2005-12-18 01:26:38 +01001292>>> 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 +01001293
1294
willy tarreauc1cae632005-12-17 14:12:23 +010012954.2.3) Chronométrage des événements
1296-----------------------------------
1297Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1298événements sont d'une très grande utilité. Tous les temps sont mesurés en
1299millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
1300la forme Tq/Tc/Tr/Tt :
1301
1302 - Tq: temps total de réception de la requête HTTP de la part du client.
1303 C'est le temps qui s'est écoulé entre le moment où le client a établi
1304 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1305 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1306 que la requête complète n'a jamais été reçue.
1307
1308 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1309 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1310 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1311 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1312 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1313 vers le serveur.
1314
1315 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001316 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001317 la connexion. Ca représente exactement le temps de traitement de la
1318 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001319 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001320
1321 - Tt: durée de vie totale de la session, entre le moment où la demande de
1322 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001323 refermée aux deux extrémités (client et serveur). La signification change
1324 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
1325 uniquement à (Tq + Tc + Tr), et se trouve préfixé d'un signe '+'. On peut
1326 donc déduire Td, le temps de transfert des données, en excluant les autres
1327 temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001328
1329 Td = Tt - (Tq + Tc + Tr)
1330
1331 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1332
1333En mode TCP ('option tcplog'), seuls les deux indicateurs Tc et Tt sont
1334rapportés.
1335
1336Ces temps fournissent de précieux renseignement sur des causes probables de
1337problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1338de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1339de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1340problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1341valeur de time-out dans la configuration, c'est souvent qu'une session a été
1342abandonnée sur expiration d'un time-out.
1343
1344Cas les plus fréquents :
1345
1346 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1347 le client et le relais.
1348 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1349 le relais et le serveur durant la phase de connexion. Cet indicateur
1350 devrait normalement toujours être très bas (moins de quelques dizaines).
1351 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1352 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1353 de pertes entre le relais et le serveur.
1354 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1355 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1356 session est maintenue après la fin des échanges. Voir plus loin pour
1357 savoir comment désactiver le keep-alive HTTP.
1358
1359Autres cas ('xx' représentant une valeur quelconque à ignorer) :
1360 -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 +01001361 a refermé sa connexion sans compléter la requête.
willy tarreauc1cae632005-12-17 14:12:23 +01001362 Tq/-1/xx/Tt : la connexion n'a pas pu s'établir vers le serveur (refus ou
1363 time-out au bout de Tt-Tq ms).
1364 Tq/Tc/-1/Tt : le serveur a accepté la connexion mais n'a pas répondu dans
willy tarreauc5f73ed2005-12-18 01:26:38 +01001365 les temps ou bien a refermé sa connexion trop tôt, au bout
1366 de Tt-(Tq+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001367
13684.2.4) Conditions de déconnexion
1369--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001370Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1371le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1372un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1373une signification précise :
1374
1375 - sur le premier caractère, un code précisant le premier événement qui a causé
1376 la terminaison de la session :
1377
1378 C : fermeture inattendue de la session TCP de la part du client.
1379
1380 S : fermeture inattendue de la session TCP de la part du serveur, ou
1381 refus explicite de connexion de la part de ce dernier.
1382
1383 P : terminaison prématurée des sessions par le proxy, pour cause
1384 d'imposition d'une limite sur le nombre de connexions, pour cause
1385 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1386 sécurité a détecté et bloqué une anomalie dans la réponse du
1387 serveur qui aurait pu causer une fuite d'informations (par exemple,
1388 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001389
willy tarreauc5f73ed2005-12-18 01:26:38 +01001390 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1391 source, ...). Généralement, cela arrive au cours de l'établissement
1392 d'une connexion, et les logs système doivent contenir une copie de
1393 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001394
willy tarreauc5f73ed2005-12-18 01:26:38 +01001395 I : une erreur interne a été identifiée par le proxy à la suite d'un
1396 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1397 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001398
willy tarreauc5f73ed2005-12-18 01:26:38 +01001399 c : le délai maximal d'attente du client a expiré (clitimeout).
1400
1401 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1402
1403 - : terminaison normale de session.
1404
1405 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1406 la fermeture :
1407
1408 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1409 été transmis au serveur.
1410
1411 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1412 serveur peut au plus avoir vu la tentative de connexion, mais
1413 aucune donnée n'a été échangée.
1414
1415 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1416
1417 D : transfert des DONNEES du serveur vers le client.
1418
1419 L : transfert des dernières ("LAST") données du proxy vers le client,
1420 alors que le serveur a déjà fini.
1421
1422 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001423
1424 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001425 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001426
willy tarreauc5f73ed2005-12-18 01:26:38 +01001427 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1428 cas sur les NOUVELLES connexions clients.
1429
1430 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1431 serveur connu. Ceci peut être dû à un changement de configuration
1432 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1433 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001434
willy tarreauc5f73ed2005-12-18 01:26:38 +01001435 D : le client a présenté un cookie correspondant à un serveur hors
1436 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1437 un autre serveur ou a tout de même tenté de se connecter sur celui
1438 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001439
willy tarreauc5f73ed2005-12-18 01:26:38 +01001440 V : le client a présenté un cookie VALIDE et a pu se connecter au
1441 serveur correspondant.
1442
1443 - : non appliquable (pas de cookie positionné dans la configuration).
1444
1445 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1446 persistence retrourné par le serveur (uniquement en mode HTTP) :
1447
1448 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1449 n'a été inséré.
1450
1451 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1452 proxy en a INSERE un.
1453
willy tarreau197e8ec2005-12-17 14:10:59 +01001454 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001455 tel quel ("PASSIF").
1456
1457 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1458
1459 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1460 ne pas être retourné au client.
1461
1462 - : non appliquable
1463
1464
1465La combinaison des deux premiers indicateurs fournit une grande quantitié
1466d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1467peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1468des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001469
willy tarreauc5f73ed2005-12-18 01:26:38 +01001470Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1471
1472 Indic Raison
1473 CR Le client a abandonné avant d'émettre une requête complète. Il est
1474 très probable que la requête ait été tapée à la main dans un client
1475 telnet et abortée trop tôt.
1476
1477 cR Le temps imparti au client a expiré avant réception d'une requête
1478 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1479 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1480 transporter des paquets entiers, ou par des clients qui énvoient des
1481 requêtes à la main et ne tapent pas assez vite.
1482
1483 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1484 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1485 être la couche réseau qui indique au proxy que le serveur n'est pas
1486 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1487
1488 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1489
1490 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1491 nombre de connexions a atteint la limite 'maxconn' (global ou de
1492 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1493 augmenté, tout comme le paramètre 'maxconn' global.
1494
1495 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1496 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1497 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1498 consiste à affiner le paramétrage système.
1499
1500 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1501 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1502 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1503 paquets entiers.
1504
1505 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
1506 en-têtes. En général, cela indique qu'il a crashé.
1507
1508 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
1509 des transactions trop longues, probablement causées par un back-end
1510 saturé. Les seules solutions sont de corriger le problème sur
1511 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
1512 des attentes plus longues au risque que les clients abandonnent à
1513 leur tour, ou bien d'ajouter des serveurs.
1514
1515 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
1516 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
1517 soit à cause d'une requête validant un filtre d'interdiction, auquel
1518 cas le proxy a renvoyé une erreur HTTP 403.
1519
1520 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
1521 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
1522 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
1523 renvoyée au client.
1524
1525 cD Le client n'a pas lu de données pendant le temps qui lui était
1526 imparti. Ceci est souvent causé par des problèmes réseau côté client.
1527
1528 CD Le client a aborté sa connection de manière inattendue pendant le
1529 transfert des données. Ceci est provoqué soit par le crash d'un
1530 navigateur, ou par une session en HTTP keep-alive entre le serveur
1531 et le client terminée en premier par le client.
1532
1533 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
1534 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
1535 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
1536 situés entre le proxy et le serveur.
1537
15384.2.5) Caractères non-imprimables
1539---------------------------------
1540Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
1541tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
1542hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
1543dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
1544caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
1545est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
1546les en-têtes.
1547
15484.2.6) Capture d'en-têtes HTTP et de cookies
1549--------------------------------------------
1550La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
1551capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
1552
1553Les captures de cookies facilitent le suivi et la reconstitution d'une session
1554utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01001555
1556 capture cookie <préfixe_cookie> len <longueur_capture>
1557
willy tarreauc5f73ed2005-12-18 01:26:38 +01001558Ceci activera la capture de cookies à la fois dans les requêtes et dans les
1559réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
1560bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
1561nouveau cookie.
1562
willy tarreau8337c6b2005-12-17 13:41:01 +01001563Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1564transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1565caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1566le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
1567place dans les logs.
1568
1569Exemples :
1570----------
1571 # capture du premier cookie dont le nom commence par "ASPSESSION"
1572 capture cookie ASPSESSION len 32
1573
1574 # capture du premier cookie dont le nom est exactement "vgnvisitor"
1575 capture cookie vgnvisitor= len 32
1576
willy tarreau036e1ce2005-12-17 13:46:33 +01001577Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01001578positionné par le serveur, précédé du cookie positionné par le client. Chacun
1579de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01001580par le client ou le serveur, ou lorsque l'option est désactivée..
1581
1582Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
1583pour suivre un identifiant de requête globalement unique positionné par un
1584autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
1585de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
1586peut chercher des informations relatives à la longueur annoncée de la réponse,
1587le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
1588de redirection. Tout comme pour les captures de cookies, il est possible
1589d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
1590la suivante :
1591
1592 capture request header <nom> len <longueur max>
1593 capture response header <nom> len <longueur max>
1594
1595Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01001596
willy tarreauc5f73ed2005-12-18 01:26:38 +01001597Exemples:
1598---------
1599 # conserver le nom du serveur virtuel accédé par le client
1600 capture request header Host len 20
1601 # noter la longueur des données envoyées dans un POST
1602 capture request header Content-Length len 10
1603
1604 # noter le fonctionnement attendu du cache par le serveur
1605 capture response header Cache-Control len 8
1606 # noter l'URL de redirection
1607 capture response header Location len 20
1608
1609Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
1610fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
1611regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
1612chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
1613réponse sont présentés de la même manière, mais après un espace suivant le bloc
1614d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
1615
1616 Config:
1617
1618 capture request header Host len 20
1619 capture request header Content-Length len 10
1620 capture request header Referer len 20
1621 capture response header Server len 20
1622 capture response header Content-Length len 10
1623 capture response header Cache-Control len 8
1624 capture response header Via len 20
1625 capture response header Location len 20
1626
1627 Log :
1628
1629 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/"
1630 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"
1631 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"
1632
16334.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01001634-----------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001635- 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 +01001636 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
1637 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01001638
willy tarreauc5f73ed2005-12-18 01:26:38 +01001639- 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 +01001640 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
1641 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 +01001642 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 +01001643 total entre l'accept() et le premier octet de donnée est de 30 ms.
1644
willy tarreauc5f73ed2005-12-18 01:26:38 +01001645- 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 +01001646 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
1647 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
1648 d'informations risquant d'être cachées. Dans ce cas, la réponse est
1649 remplacée par '502 bad gateway'.
1650
willy tarreauc5f73ed2005-12-18 01:26:38 +01001651- 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 +01001652 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01001653 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01001654 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01001655
willy tarreauc5f73ed2005-12-18 01:26:38 +01001656- 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 +01001657 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01001658 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01001659 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
1660 pu renvoyer un message 408 au client.
1661
willy tarreauc5f73ed2005-12-18 01:26:38 +01001662- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
1663 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
1664 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01001665
willy tarreauc5f73ed2005-12-18 01:26:38 +01001666- 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 +01001667 => La requête client met 3s à entrer (peut-être un problème réseau), et la
1668 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreauc5f73ed2005-12-18 01:26:38 +01001669 secondes (retries 3 dans la conf), puis un code 503 est retourné au client.
1670 Il y avait 202 connexions sur cette instance, et 205 sur l'ensemble des
1671 instances pour ce processus. Il est possible que le serveur ait refusé la
1672 connexion parce qu'il y en avait déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01001673
willy tarreau4302f492005-12-18 01:00:37 +01001674
willy tarreauc5f73ed2005-12-18 01:26:38 +010016754.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01001676----------------------------------
1677En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
1678requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01001679possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
1680de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01001681connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
1682comme faisant partie des échanges de données consécutifs à la première requête.
1683Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01001684
1685La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01001686 reqadd <string> pour ajouter un en-tête dans la requête
1687 reqrep <search> <replace> pour modifier la requête
1688 reqirep <search> <replace> idem sans distinction majuscules/minuscules
1689 reqdel <search> pour supprimer un en-tête dans la requête
1690 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001691 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01001692 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001693 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01001694 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01001695 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01001696 reqipass <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001697
willy tarreau036e1ce2005-12-17 13:46:33 +01001698 rspadd <string> pour ajouter un en-tête dans la réponse
1699 rsprep <search> <replace> pour modifier la réponse
1700 rspirep <search> <replace> idem sans distinction majuscules/minuscules
1701 rspdel <search> pour supprimer un en-tête dans la réponse
1702 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01001703 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01001704 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01001705 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001706
willy tarreau0f7af912005-12-17 12:21:26 +01001707
willy tarreau036e1ce2005-12-17 13:46:33 +01001708<search> est une expression régulière compatible POSIX regexp supportant le
1709groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
1710doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
1711chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
1712backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01001713
1714 \t pour une tabulation
1715 \r pour un retour charriot
1716 \n pour un saut de ligne
1717 \ pour différencier un espace d'un séparateur
1718 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01001719 \\ pour utiliser un backslash dans la regex
1720 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01001721 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01001722
willy tarreau0f7af912005-12-17 12:21:26 +01001723
willy tarreau5cbea6f2005-12-17 12:48:26 +01001724<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
1725Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
1726groupe délimité par des parenthèses dans l'expression régulière, par sa
1727position numérale. Les positions vont de 1 à 9, et sont codées par un '\'
1728suivi du chiffre désiré. Il est également possible d'insérer un caractère non
1729imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code
1730hexadécimal de ce caractère (comme en C).
1731
1732<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01001733dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001734
1735Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01001736-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001737 - 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 +01001738 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001739 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
1740 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
1741 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01001742 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
1743 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
1744 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01001745 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01001746 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
1747 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
willy tarreau0f7af912005-12-17 12:21:26 +01001748
1749Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01001750----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001751 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01001752
willy tarreauc5f73ed2005-12-18 01:26:38 +01001753 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
1754 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
1755 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001756
willy tarreauc5f73ed2005-12-18 01:26:38 +01001757 # force proxy connections to close
1758 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
1759 # rewrite locations
1760 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001761
willy tarreauc5f73ed2005-12-18 01:26:38 +01001762 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01001763
willy tarreau197e8ec2005-12-17 14:10:59 +01001764 # Every header should end with a colon followed by one space.
1765 reqideny ^[^:\ ]*[\ ]*$
1766
1767 # block Apache chunk exploit
1768 reqideny ^Transfer-Encoding:[\ ]*chunked
1769 reqideny ^Host:\ apache-
1770
1771 # block annoying worms that fill the logs...
1772 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
1773 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
1774 reqideny ^[^:\ ]*\ .*<script
1775 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
1776
1777 # allow other syntactically valid requests, and block any other method
1778 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
1779 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
1780 reqideny ^[^:\ ]*\
1781
1782 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01001783 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01001784
willy tarreauc5f73ed2005-12-18 01:26:38 +01001785 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01001786 rspidel ^Server:\
1787 rspadd Server:\ Formilux/0.1.8
1788
willy tarreau0f7af912005-12-17 12:21:26 +01001789
willy tarreau982249e2005-12-18 00:57:06 +01001790De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01001791'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
1792connaître l'adresse IP du client initial.
1793
willy tarreau982249e2005-12-18 00:57:06 +01001794Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01001795en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01001796Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
1797méthode impliquant 4 règles.
1798
willy tarreauc1cae632005-12-17 14:12:23 +01001799Exemple :
1800---------
1801 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001802 mode http
1803 log global
1804 option httplog
1805 option dontlognull
1806 option forwardfor
1807 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01001808
willy tarreauc29948c2005-12-17 13:10:27 +010018094.4) Répartition avec persistence
1810---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001811La combinaison de l'insertion de cookie avec la répartition de charge interne
1812permet d'assurer une persistence dans les sessions HTTP d'une manière
1813pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01001814 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01001815 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01001816 - insérer un cookie dans les réponses issues d'une répartition uniquement,
1817 et faire en sorte que des caches ne mémorisent pas ce cookie.
1818 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001819
1820Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01001821---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001822 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001823 mode http
1824 cookie SERVERID insert nocache indirect
1825 balance roundrobin
1826 server srv1 192.168.1.1:80 cookie server01 check
1827 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01001828
willy tarreau0174f312005-12-18 01:02:42 +01001829L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
1830cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
1831Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
1832client et le serveur de travailler en mode "keep-alive" afin que le proxy
1833puisse corriger le nom du cookie dans toutes les futures requêtes.
1834
1835 listen application 0.0.0.0:80
1836 mode http
1837 cookie JSESSIONID prefix
1838 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01001839 server srv1 192.168.1.1:80 cookie srv1 check
1840 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01001841 option httpclose
1842
1843
willy tarreau982249e2005-12-18 00:57:06 +010018444.5) Protection contre les fuites d'informations du serveur
1845-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001846Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01001847créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01001848'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
1849un risque de cacher un cookie sur un proxy côté client. Quand cette option est
1850activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01001851 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01001852 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01001853 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01001854 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01001855 un en-tête 'Cache-control: public' ;
1856 - celles qui ont un en-tête 'Pragma: no-cache' ;
1857 - celles qui ont un en-tête 'Cache-control: private' ;
1858 - celles qui ont un en-tête 'Cache-control: no-store' ;
1859 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
1860 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
1861 - celles qui ont un en-tête 'Cache-control: no-cache' ;
1862 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
1863 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01001864 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01001865
willy tarreau982249e2005-12-18 00:57:06 +01001866Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
1867même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
1868message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
1869dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01001870en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01001871l'administrateur sache qu'il y a une action correctrice à entreprendre.
1872
18734.6) Personalisation des erreurs
1874--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01001875Certaines situations conduisent à retourner une erreur HTTP au client :
1876 - requête invalide ou trop longue => code HTTP 400
1877 - requête mettant trop de temps à venir => code HTTP 408
1878 - requête interdite (bloquée par un reqideny) => code HTTP 403
1879 - erreur interne du proxy => code HTTP 500
1880 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
1881 - aucun serveur disponible pour cette requête => code HTTP 503
1882 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
1883
1884Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
1885Cependant, en fonction du type de clientèle, on peut préférer retourner des
willy tarreau64a3cc32005-12-18 01:13:11 +01001886pages personnalisées. Ceci est possible par le biais de la commande "errorloc":
willy tarreau8337c6b2005-12-17 13:41:01 +01001887
1888 errorloc <code_HTTP> <location>
1889
1890Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
1891le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
1892d'une page précisée dans <location>. Cette adresse peut être relative au site,
1893ou absolue. Comme cette réponse est traîtée par le navigateur du client
1894lui-même, il est indispensable que l'adresse fournie lui soit accessible.
1895
1896Exemple :
1897---------
1898 listen application 0.0.0.0:80
1899 errorloc 400 /badrequest.html
1900 errorloc 403 /forbidden.html
1901 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01001902 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01001903 errorloc 502 http://192.168.114.58/error50x.html
1904 errorloc 503 http://192.168.114.58/error50x.html
1905 errorloc 504 http://192.168.114.58/error50x.html
1906
willy tarreauc1f47532005-12-18 01:08:26 +01001907Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
1908accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
1909problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
1910régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
1911dans le champ Location avec la méthode GET uniquement. Seulement, certains
1912navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
1913plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
1914devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01001915l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
1916visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01001917
1918Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
1919utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
1920dès que vous savez que vos clients supportent le code de retour HTTP 303.
1921
willy tarreau982249e2005-12-18 00:57:06 +010019224.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01001923--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001924Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
1925évite de répéter des paramètres communs à toutes les instances, tels que les
1926timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01001927
1928Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
1929précédent l'instance qui les utilisera. On peut donc mettre autant de sections
1930'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
1931section implique une annulation de tous les paramètres par défaut positionnés
1932précédemment, dans le but de les remplacer.
1933
1934La section 'defaults' utilise la même syntaxe que la section 'listen', aux
1935paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
1936un commentaire en guise paramètre.
1937
willy tarreau982249e2005-12-18 00:57:06 +01001938Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
1939positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01001940 - log (le premier et le second)
1941 - mode { tcp, http, health }
1942 - balance { roundrobin }
1943 - disabled (pour désactiver toutes les instances qui suivent)
1944 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
1945 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01001946 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
1947 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01001948 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01001949 - cookie, capture
1950 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01001951
1952Ne sont pas supportés dans cette version, les adresses de dispatch et les
1953configurations de serveurs, ainsi que tous les filtres basés sur les
1954expressions régulières :
1955 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01001956 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01001957
1958Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
1959positionné par défaut. Donc si une option est spécifiée dans les paramètres par
1960défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
1961paramètres par défaut avant la déclaration de l'instance.
1962
1963Exemples :
1964----------
1965 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01001966 log global
1967 mode tcp
1968 balance roundrobin
1969 clitimeout 180000
1970 srvtimeout 180000
1971 contimeout 4000
1972 retries 3
1973 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01001974
1975 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01001976 server srv1 192.168.1.1 check port 6000 inter 10000
1977 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001978
1979 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01001980 server srv1 192.168.2.1 check port 6000 inter 10000
1981 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001982
1983 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01001984 log global
1985 mode http
1986 option httplog
1987 option forwardfor
1988 option dontlognull
1989 balance roundrobin
1990 clitimeout 20000
1991 srvtimeout 20000
1992 contimeout 4000
1993 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01001994
1995 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01001996 cookie SERVERID postonly insert indirect
1997 capture cookie userid= len 10
1998 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
1999 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002000
2001 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002002 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002003
willy tarreaub719f002005-12-17 12:55:07 +01002004=======================
2005| Paramétrage système |
2006=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002007
2008Sous Linux 2.4
2009==============
2010
willy tarreaub719f002005-12-17 12:55:07 +01002011-- cut here --
2012#!/bin/sh
2013# set this to about 256/4M (16384 for 256M machine)
2014MAXFILES=16384
2015echo $MAXFILES > /proc/sys/fs/file-max
2016ulimit -n $MAXFILES
2017
2018if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002019 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002020fi
2021
2022if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002023 # 30 seconds for fin, 15 for time wait
2024 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2025 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2026 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2027 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002028fi
2029
willy tarreau0f7af912005-12-17 12:21:26 +01002030echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002031echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2032echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002033echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002034echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2035echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002036echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2037echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002038echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002039echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002040echo 0 > /proc/sys/net/ipv4/tcp_dsack
2041
2042# auto-tuned on 2.4
2043#echo 262143 > /proc/sys/net/core/rmem_max
2044#echo 262143 > /proc/sys/net/core/rmem_default
2045
2046echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2047echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2048
2049-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002050
willy tarreau197e8ec2005-12-17 14:10:59 +01002051Sous FreeBSD
2052============
2053
2054Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2055Clement Laforet <sheepkiller@cultdeadsheep.org>.
2056
2057Pour plus d'informations :
2058http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2059http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2060http://www.freshports.org/net/haproxy
2061
2062
willy tarreau0f7af912005-12-17 12:21:26 +01002063-- fin --