blob: 8416ccbc0f645a349fddb0be5884e2cb89726fb7 [file] [log] [blame]
willy tarreau0f7af912005-12-17 12:21:26 +01001
2 H A - P r o x y
3 ---------------
willy tarreau982249e2005-12-18 00:57:06 +01004 version 1.2.1
willy tarreau0f7af912005-12-17 12:21:26 +01005 willy tarreau
willy tarreau982249e2005-12-18 00:57:06 +01006 2004/06/06
willy tarreau0f7af912005-12-17 12:21:26 +01007
willy tarreaub719f002005-12-17 12:55:07 +01008================
9| Introduction |
10================
willy tarreau0f7af912005-12-17 12:21:26 +010011
12HA-Proxy est un relais TCP/HTTP offrant des facilités d'intégration en
13environnement hautement disponible. En effet, il est capable de :
willy tarreauc29948c2005-12-17 13:10:27 +010014 - effectuer un aiguillage statique défini par des cookies ;
15 - effectuer une répartition de charge avec création de cookies pour assurer la
willy tarreaua1598082005-12-17 13:08:06 +010016 persistence de session ;
willy tarreau0f7af912005-12-17 12:21:26 +010017 - fournir une visibilité externe de son état de santé ;
willy tarreau8337c6b2005-12-17 13:41:01 +010018 - s'arrêter en douceur sans perte brutale de service ;
19 - modifier/ajouter/supprimer des entêtes dans la requête et la réponse ;
20 - interdire des requêtes qui vérifient certaines conditions ;
21 - utiliser des serveurs de secours lorsque les serveurs principaux sont hors
22 d'usage.
willy tarreau0f7af912005-12-17 12:21:26 +010023
willy tarreaua1598082005-12-17 13:08:06 +010024Il requiert peu de ressources, et son architecture événementielle mono-processus
25lui permet facilement de gérer plusieurs milliers de connexions simultanées sur
26plusieurs relais sans effondrer le système.
27
willy tarreau0f7af912005-12-17 12:21:26 +010028
29===========================
30| Paramètres de lancement |
31===========================
32
33Les options de lancement sont peu nombreuses :
34
35 -f <fichier de configuration>
36 -n <nombre maximal total de connexions simultanées>
37 -N <nombre maximal de connexions simultanées par proxy>
38 -d active le mode debug
39 -D passe en daemon
willy tarreau982249e2005-12-18 00:57:06 +010040 -q désactive l'affichage de messages sur la sortie standard.
41 -V affiche les messages sur la sortie standard, même si -q ou 'quiet' sont
42 spécifiés.
43 -c vérifie le fichier de configuration puis quitte avec un code de retour 0
44 si aucune erreur n'a été trouvée, ou 1 si une erreur de syntaxe a été
45 détectée.
willy tarreaufe2c5c12005-12-17 14:14:34 +010046 -p <fichier> indique au processus père qu'il doit écrire les PIDs de ses
47 fils dans ce fichier en mode démon.
willy tarreau0f7af912005-12-17 12:21:26 +010048 -s affiche les statistiques (si option compilée)
49 -l ajoute des informations aux statistiques
50
willy tarreaua1598082005-12-17 13:08:06 +010051Le nombre maximal de connexion simultanées par proxy est le paramètre par défaut
52pour les proxies pour lesquels ce paramètre n'est pas précisé dans le fichier de
53configuration. Il s'agit du paramètre 'maxconn' dans les sections 'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010054
willy tarreaua1598082005-12-17 13:08:06 +010055Le nombre maximal total de connexions simultanées limite le nombre de connexions
willy tarreauc29948c2005-12-17 13:10:27 +010056TCP utilisables à un instant donné par le processus, tous proxies confondus. Ce
willy tarreaua1598082005-12-17 13:08:06 +010057paramètre remplace le paramètre 'maxconn' de la section 'global'.
58
willy tarreauc29948c2005-12-17 13:10:27 +010059Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
60mode, toutes les connexions, déconnexions, et tous les échanges d'entêtes HTTP
61sont affichés.
62
63Les statistiques ne sont disponibles que si le programme a été compilé avec
64l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
65d'utilité que lors de benchmarks par exemple.
66
willy tarreau0f7af912005-12-17 12:21:26 +010067
68============================
69| Fichier de configuration |
70============================
71
willy tarreauc29948c2005-12-17 13:10:27 +010072Structure
73=========
willy tarreau0f7af912005-12-17 12:21:26 +010074
willy tarreaua1598082005-12-17 13:08:06 +010075L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
76les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est pas
willy tarreauc29948c2005-12-17 13:10:27 +010077précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +010078
79Le fichier de configuration est découpé en sections répérées par des mots clés
80tels que :
81
82 - 'global'
83 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +010084 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +010085
86Tous les paramètres font référence à la section définie par le dernier mot clé
87reconnu.
88
89
willy tarreauc29948c2005-12-17 13:10:27 +0100901) Paramètres globaux
91=====================
willy tarreaua1598082005-12-17 13:08:06 +010092
93Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
94proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
95supportés sont :
96
willy tarreau8337c6b2005-12-17 13:41:01 +010097 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +010098 - maxconn <nombre>
99 - uid <identifiant>
100 - gid <identifiant>
101 - chroot <répertoire>
102 - nbproc <nombre>
103 - daemon
104 - debug
105 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100106 - pidfile <fichier>
willy tarreaua1598082005-12-17 13:08:06 +0100107
1081.1) Journalisation des événements
109----------------------------------
110La plupart des événements sont journalisés : démarrages, arrêts, disparition et
111apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
112syslog vers un ou deux serveurs. La syntaxe est la suivante :
113
willy tarreau8337c6b2005-12-17 13:41:01 +0100114 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100115
116Les connexions sont envoyées en niveau "info". Les démarrages de service et de
117serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
118arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau8337c6b2005-12-17 13:41:01 +0100119bien pour les proxies que pour les serveurs testés par les proxies. Le paramètre
120optionnel <niveau_max> définit le niveau maximal de traces émises parmi les 8
121valeurs suivantes :
122 emerg, alert, crit, err, warning, notice, info, debug
123
willy tarreaueedaa9f2005-12-17 14:08:03 +0100124Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100125est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100126
127Les catégories possibles sont :
128 kern, user, mail, daemon, auth, syslog, lpr, news,
129 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
130 local0, local1, local2, local3, local4, local5, local6, local7
131
willy tarreau036e1ce2005-12-17 13:46:33 +0100132Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
133
willy tarreaua1598082005-12-17 13:08:06 +0100134Exemple :
135---------
136 global
137 log 192.168.2.200 local3
willy tarreau8337c6b2005-12-17 13:41:01 +0100138 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100139
1401.2) limitation du nombre de connexions
141---------------------------------------
142Il est possible et conseillé de limiter le nombre global de connexions par
143processus. Les connexions sont comprises au sens 'acceptation de connexion',
144donc il faut s'attendre en règle général à avoir un peu plus du double de
145sessions TCP que le maximum de connexions fixé. C'est important pour fixer le
146paramètre 'ulimit -n' avant de lancer le proxy. Pour comptabiliser le nombre
147de sockets nécessaires, il faut prendre en compte ces paramètres :
148 - 1 socket par connexion entrante
149 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100150 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100151 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100152 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100153
willy tarreaueedaa9f2005-12-17 14:08:03 +0100154Dans le cas où chaque proxy n'écoute que sur un couple adresse/port, positionner
155la limite du nombre de descripteurs de fichiers (ulimit -n) à
156(2 * maxconn + nbproxy + nbserveurs + 1). Dans une future version, haproxy sera
willy tarreauc29948c2005-12-17 13:10:27 +0100157capable de positionner lui-même cette limite.
158
1591.3) Diminution des privilèges
160------------------------------
161Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
162serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100163de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100164
willy tarreauc29948c2005-12-17 13:10:27 +0100165Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
166numérique d'utilisateur. La valeur 0, correspondant normalement au super-
167utilisateur, possède ici une signification particulière car elle indique que
168l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
169C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
170un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
171changer. Il est particulièrement déconseillé d'utiliser des comptes génériques
172tels que 'nobody' car cette pratique revient à utiliser 'root' si d'autres
173processus utilisent les mêmes identifiants.
174
175Le paramètre 'chroot' autorise à changer la racine du processus une fois le
176programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100177puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100178généralement contournable sur certains OS (Linux, Solaris) pour peu que
179l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
180un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
181service pour cet usage, et de ne pas mutualiser un même répertoire pour
182plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
183il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
184l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100185
186Remarque: dans le cas où une telle faille serait mise en évidence, il est fort
187probable que les premières tentatives de son exploitation provoquent un arrêt du
188programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
189encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur en
190environnement limité réduit les risques d'intrusion, il est parfois bien utile
191dans ces circonstances de connaître les conditions d'apparition du problème, via
192l'obtention d'un fichier 'core'. La plupart des systèmes, pour des raisons de
193sécurité, désactivent la génération du fichier 'core' après un changement
194d'identifiant pour le processus. Il faudra donc soit lancer le processus à
195partir d'un compte utilisateur aux droits réduits (mais ne pouvant pas effectuer
196le chroot), ou bien le faire en root sans réduction des droits (uid 0). Dans ce
197cas, le fichier se trouvera soit dans le répertoire de lancement, soit dans le
198répertoire spécifié après l'option 'chroot'. Ne pas oublier la commande suivante
199pour autoriser la génération du fichier avant de lancer le programme :
200
201# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100202
willy tarreauc29948c2005-12-17 13:10:27 +0100203Exemple :
204---------
205
206 global
207 uid 30000
208 gid 30000
209 chroot /var/chroot/haproxy
210
willy tarreaufe2c5c12005-12-17 14:14:34 +01002111.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100212----------------------------
213Le service peut fonctionner dans plusieurs modes :
214 - avant- / arrière-plan
215 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100216
willy tarreauc29948c2005-12-17 13:10:27 +0100217Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne rend
218pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci dans un
219script de démarrage du système, sinon le système ne finirait pas son
220initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
221au processus appelant. C'est ce que fait l'option 'daemon' de la section
222'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100223
willy tarreauc29948c2005-12-17 13:10:27 +0100224Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
225standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
226logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
227Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100228
willy tarreauc29948c2005-12-17 13:10:27 +0100229Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
230problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
231entre les clients et les serveurs. Ce mode est incompatible avec les options
232'daemon' et 'quiet' pour des raisons de bon sens.
233
willy tarreaufe2c5c12005-12-17 14:14:34 +01002341.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100235-----------------------------------------------
236Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
237processeur pour effectuer les tâches de relayage, même si les charges
238nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
239grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
240programme sait démarrer plusieurs processus se répartissant la charge de
241travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
242section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
243qu'en mode 'daemon'.
244
245Exemple :
246---------
247
248 global
249 daemon
250 quiet
251 nbproc 2
252
willy tarreaufe2c5c12005-12-17 14:14:34 +01002531.6) Simplification de la gestion des processus
254-----------------------------------------------
255Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
256paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
257d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
258le numéro de PID des processus fils, à raison d'un par ligne (valable
259uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
260afin de rester compatible avec un répertoire protégé en lecture seule. Il
261appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
2620644.
263
264Exemple :
265---------
266
267 global
268 daemon
269 quiet
270 nbproc 2
271 pidfile /var/run/haproxy-private.pid
272
273 # pour stopper seulement ces processus parmi d'autres :
274 # kill $(</var/run/haproxy-private.pid)
275
willy tarreauc29948c2005-12-17 13:10:27 +0100276
2772) Définition d'un service en écoute
278====================================
279
280Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100281
willy tarreaua41a8b42005-12-17 14:02:24 +0100282 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100283
willy tarreauc29948c2005-12-17 13:10:27 +0100284- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
285 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé. Aucun
286 test n'est effectué concernant l'unicité de ce nom, qui n'est pas obligatoire,
willy tarreaua41a8b42005-12-17 14:02:24 +0100287 mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100288
willy tarreaua41a8b42005-12-17 14:02:24 +0100289- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
290 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
291 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100292
willy tarreaua41a8b42005-12-17 14:02:24 +0100293- <plage_ports> correspond soit à un port, soit à une plage de ports sur
294 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
295 Cette plage peut être :
296 - soit un port numérique (ex: '80')
297 - soit une plage constituée de deux valeurs séparées par un tiret
298 (ex: '2000-2100') représentant les extrémités incluses dans la
299 plage.
300 Il faut faire attention à l'usage des plages, car chaque combinaison
301 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
302 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
303 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
304 niveau de privilège particulier lors du lancement du programme (indépendamment
305 du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100306
willy tarreaua41a8b42005-12-17 14:02:24 +0100307- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
308 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
309 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
310
311Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100312---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100313 listen http_proxy :80
314 listen x11_proxy 127.0.0.1:6000-6009
315 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
316 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100317
willy tarreaua41a8b42005-12-17 14:02:24 +0100318Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
319rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
320de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
321l'écriture de configurations :
322
323 bind [ <adresse_IP>:<plage_ports>[,...] ]
324
325Exemples :
326----------
327 listen http_proxy
328 bind :80,:443
329 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100330
willy tarreauc29948c2005-12-17 13:10:27 +01003312.1) Inhibition d'un service
332----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100333Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100334commenter toute une partie du fichier. Il suffit de positionner le mot clé
335"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100336
337 listen smtp_proxy 0.0.0.0:25
338 disabled
339
willy tarreaueedaa9f2005-12-17 14:08:03 +0100340Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
341 désactivé par le mot clé 'disabled', par exemple à cause d'une
342 configuration par défaut.
343
willy tarreauc29948c2005-12-17 13:10:27 +01003442.2) Mode de fonctionnement
345---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100346Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100347 - TCP
348 - HTTP
349 - supervision
350
351Mode TCP
352--------
willy tarreauc29948c2005-12-17 13:10:27 +0100353Dans ce mode, le service relaye, dès leur établissement, les connexions TCP vers
354un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il s'agit
355simplement d'une association source<adresse:port> -> destination<adresse:port>.
356Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100357
willy tarreauc29948c2005-12-17 13:10:27 +0100358Exemple :
359---------
willy tarreau0f7af912005-12-17 12:21:26 +0100360 listen smtp_proxy 0.0.0.0:25
361 mode tcp
362
363Mode HTTP
364---------
willy tarreauc29948c2005-12-17 13:10:27 +0100365Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
366serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
367décision. Les entêtes HTTP sont analysés pour y trouver un éventuel cookie, et
368certains d'entre-eux peuvent être modifiés par le biais d'expressions
369régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
370relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100371
willy tarreauc29948c2005-12-17 13:10:27 +0100372Exemple :
373---------
willy tarreau0f7af912005-12-17 12:21:26 +0100374 listen http_proxy 0.0.0.0:80
375 mode http
376
377Mode supervision
378----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100379Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
380santé du service. Il se contente de retourner "OK" à tout client se connectant
381sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100382déterminer quels sont les services utilisables. Si l'option 'httpchk' est
383activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
384attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100385le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100386
willy tarreauc29948c2005-12-17 13:10:27 +0100387Exemple :
388---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100389 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100390 listen health_check 0.0.0.0:60000
391 mode health
392
willy tarreau197e8ec2005-12-17 14:10:59 +0100393 # réponse HTTP : 'HTTP/1.0 200 OK'
394 listen http_health_check 0.0.0.0:60001
395 mode health
396 option httpchk
397
willy tarreau0f7af912005-12-17 12:21:26 +0100398
willy tarreauc29948c2005-12-17 13:10:27 +01003992.3) Limitation du nombre de connexions simultanées
400---------------------------------------------------
401Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
402connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
403d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
404limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100405
willy tarreauc29948c2005-12-17 13:10:27 +0100406Exemple :
407---------
408 listen tiny_server 0.0.0.0:80
409 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100410
411
willy tarreauc29948c2005-12-17 13:10:27 +01004122.4) Arrêt en douceur
413---------------------
414Il est possible d'arrêter les services en douceur en envoyant un signal SIG_USR1
415au processus relais. Tous les services seront alors mis en phase d'arrêt, mais
416pourront continuer d'accepter des connexions pendant un temps défini par le
417paramètre 'grace' (en millisecondes). Cela permet par exemple, de faire savoir
418rapidement à un répartiteur de charge qu'il ne doit plus utiliser un relais,
419tout en continuant d'assurer le service le temps qu'il s'en rende compte.
420Remarque : les connexions actives ne sont jamais cassées. Dans le pire des cas,
421il faudra attendre en plus leur expiration avant l'arrêt total du processus. La
422valeur par défaut est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100423
424Exemple :
425---------
willy tarreauc29948c2005-12-17 13:10:27 +0100426 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100427 # le service tournera encore 10 secondes après la demande d'arrêt
428 listen http_proxy 0.0.0.0:80
429 mode http
430 grace 10000
431
willy tarreauc29948c2005-12-17 13:10:27 +0100432 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100433 listen health_check 0.0.0.0:60000
434 mode health
435 grace 0
436
437
willy tarreauc29948c2005-12-17 13:10:27 +01004382.5) Temps d'expiration des connexions
439--------------------------------------
440Il est possible de paramétrer certaines durées d'expiration au niveau des
441connexions TCP. Trois temps indépendants sont configurables et acceptent des
442valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
443session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100444
445 - temps d'attente d'une donnée de la part du client, ou de la
446 possibilité de lui envoyer des données : "clitimeout" :
447
448 # time-out client à 2mn30.
449 clitimeout 150000
450
451 - temps d'attente d'une donnée de la part du serveur, ou de la
452 possibilité de lui envoyer des données : "srvtimeout" :
453
willy tarreauc29948c2005-12-17 13:10:27 +0100454 # time-out serveur à 30s.
willy tarreau0f7af912005-12-17 12:21:26 +0100455 srvtimeout 30000
456
457 - temps d'attente de l'établissement d'une connexion vers un serveur
458 "contimeout" :
459
willy tarreauc29948c2005-12-17 13:10:27 +0100460 # on abandonne si la connexion n'est pas établie après 4 secondes
461 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100462
willy tarreauc29948c2005-12-17 13:10:27 +0100463Remarques :
464-----------
465 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
466 type "health".
467 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
468 possible de perdre des paquets. Du fait que la première retransmission TCP
469 n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion inférieur
470 à 3 secondes ne permet pas de se rattraper sur la perte de paquets car la
471 session aura été abandonnée avant la première retransmission. Une valeur de
472 4 secondes réduira considérablement le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100473
willy tarreauc29948c2005-12-17 13:10:27 +01004742.6) Tentatives de reconnexion
475------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100476Lors d'un échec de connexion vers un serveur, il est possible de
477retenter (potentiellement vers un autre serveur, en cas de répartition
478de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100479abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100480
willy tarreauc29948c2005-12-17 13:10:27 +0100481Exemple :
482---------
willy tarreau0f7af912005-12-17 12:21:26 +0100483 # on essaie encore trois fois maxi
484 retries 3
485
willy tarreau0f7af912005-12-17 12:21:26 +0100486
willy tarreauc29948c2005-12-17 13:10:27 +01004872.7) Adresse du serveur
488-----------------------
489Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
490le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
491serveur d'assignation de cookie dans le cas où le service consiste à assurer
492uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100493le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
494du serveur distant, et il est maintenant recommandé d'utiliser de préférence
495le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100496
willy tarreauc29948c2005-12-17 13:10:27 +0100497Exemple :
498---------
willy tarreau0f7af912005-12-17 12:21:26 +0100499 # on envoie toutes les nouvelles connexions ici
500 dispatch 192.168.1.2:80
501
willy tarreauc29948c2005-12-17 13:10:27 +0100502Remarque :
503----------
504Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
505'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100506
willy tarreau0f7af912005-12-17 12:21:26 +0100507
willy tarreau240afa62005-12-17 13:14:35 +01005082.8) Adresse de sortie
509----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100510Il est possible de forcer l'adresse utilisée pour établir les connexions vers
511les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
512port, bien que cette fonctionnalité se limite à des usages très spécifiques.
513C'est particulièrement utile en cas d'adressage multiple, et plus généralement
514pour permettre aux serveurs de trouver le chemin de retour dans des contextes de
515routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera choisie
516librement par le systeme. Si le port est '0' ou vide, il sera choisi librement
517par le système. Il est à noter que depuis la version 1.1.18, les tests de bon
willy tarreaueedaa9f2005-12-17 14:08:03 +0100518fonctionnement des serveurs seront aussi effectués à partir de la source
willy tarreaua41a8b42005-12-17 14:02:24 +0100519spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100520
521Exemples :
522----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100523 listen http_proxy *:80
willy tarreau240afa62005-12-17 13:14:35 +0100524 # toutes les connexions prennent l'adresse 192.168.1.200
525 source 192.168.1.200:0
526
willy tarreaua41a8b42005-12-17 14:02:24 +0100527 listen rlogin_proxy *:513
willy tarreau240afa62005-12-17 13:14:35 +0100528 # utiliser l'adresse 192.168.1.200 et le port réservé 900
529 source 192.168.1.200:900
530
531
5322.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100533--------------------------------
534En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
535vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
536par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100537
willy tarreauc29948c2005-12-17 13:10:27 +0100538Exemple :
539---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100540 listen http_proxy :80
willy tarreau0f7af912005-12-17 12:21:26 +0100541 mode http
542 cookie SERVERID
543
willy tarreauc29948c2005-12-17 13:10:27 +0100544On peut modifier l'utilisation du cookie pour la rendre plus intelligente
545vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
546réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
547cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100548de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
549inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100550
551Exemples :
552----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100553
554Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100555dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
556directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100557
558 cookie SERVERID indirect
559
willy tarreauc29948c2005-12-17 13:10:27 +0100560Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
561lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100562
563 cookie SERVERID rewrite
564
willy tarreauc29948c2005-12-17 13:10:27 +0100565Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un accès
willy tarreau8337c6b2005-12-17 13:41:01 +0100566en répartition de charge interne. Dans ce cas, il est souhaitable que tous les
567serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
568retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100569
570 cookie SERVERID insert
571
willy tarreau240afa62005-12-17 13:14:35 +0100572Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
573ajouter le mot clé 'nocache' après 'insert' :
574
575 cookie SERVERID insert nocache
576
willy tarreaucd878942005-12-17 13:27:43 +0100577Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le mot
578clé 'postonly' après 'insert' :
579
580 cookie SERVERID insert postonly
581
willy tarreau240afa62005-12-17 13:14:35 +0100582
willy tarreau96d40372005-12-17 13:11:56 +0100583Remarques :
584-----------
585- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour s'adapter
586 à des applications générant déjà le cookie, avec un contenu invalide. Il suffit
587 pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100588
willy tarreau96d40372005-12-17 13:11:56 +0100589- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
590 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
591 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100592
willy tarreau240afa62005-12-17 13:14:35 +0100593- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
594 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
595 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
596 cookie de persistence inséré, donc provoquer des changements de serveurs pour
597 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100598
willy tarreaucd878942005-12-17 13:27:43 +0100599- lorsque l'application est bien connue, et que les parties nécessitant de la
600 persistence sont systématiquement accédées par un formulaire en mode POST,
601 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
602 et "indirect", car la page d'accueil reste cachable, et c'est l'application
603 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100604
willy tarreau240afa62005-12-17 13:14:35 +01006052.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100606----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100607En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
608par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100609
willy tarreau5cbea6f2005-12-17 12:48:26 +0100610 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100611
willy tarreauc29948c2005-12-17 13:10:27 +0100612- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
613 configuration et les logs.
614- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
615- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100616
617Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100618---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100619 listen http_proxy :80
willy tarreau0f7af912005-12-17 12:21:26 +0100620 mode http
621 cookie SERVERID
622 dispatch 192.168.1.100:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100623 server web1 192.168.1.1:80 cookie server01
624 server web2 192.168.1.2:80 cookie server02
625
626Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100627-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100628
willy tarreaua41a8b42005-12-17 14:02:24 +01006293) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100630=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100631
willy tarreauc29948c2005-12-17 13:10:27 +0100632Le relais peut effectuer lui-même la répartition de charge entre les différents
633serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
634cela, on précise le mot clé 'balance' dans la définition du service,
635éventuellement suivi du nom d'un algorithme de répartition. En version 1.1.9,
636seul 'roundrobin' est géré, et c'est aussi la valeur implicite par défaut. Il
637est évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
638spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100639
640Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100641---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100642
willy tarreaua41a8b42005-12-17 14:02:24 +0100643 listen http_proxy :80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100644 mode http
645 cookie SERVERID
646 balance roundrobin
647 server web1 192.168.1.1:80 cookie server01
648 server web2 192.168.1.2:80 cookie server02
649
willy tarreaua41a8b42005-12-17 14:02:24 +0100650Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
651du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
652sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
653champ <port> de l'adresse serveur :
654
655 - non spécifié ou nul :
656 la connexion sera envoyée au serveur sur le même port que celui sur
657 lequel le relais a reçu la connexion.
658
659 - valeur numérique (seul cas supporté pour les versions antérieures) :
660 le serveur recevra la connexion sur le port désigné.
661
662 - valeur numérique précédée d'un signe '+' :
663 la connexion sera envoyée au serveur sur le même port que celui sur
664 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
665
666 - valeur numérique précédée d'un signe '-' :
667 la connexion sera envoyée au serveur sur le même port que celui sur
668 lequel le relais a reçu la connexion, duquel on soustrait la valeur
669 désignée.
670
671Exemples :
672----------
673
674# même que précédemment
675
676 listen http_proxy :80
677 mode http
678 cookie SERVERID
679 balance roundrobin
680 server web1 192.168.1.1 cookie server01
681 server web2 192.168.1.2 cookie server02
682
683# relayage simultané des ports 80 et 81 et 8080-8089
684
685 listen http_proxy :80,:81,:8080-8089
686 mode http
687 cookie SERVERID
688 balance roundrobin
689 server web1 192.168.1.1 cookie server01
690 server web2 192.168.1.2 cookie server02
691
692# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
693
694 listen http_proxy :25,:389,:663
695 mode tcp
696 balance roundrobin
697 server srv1 192.168.1.1:+1000
698 server srv2 192.168.1.2:+1000
699
willy tarreau0f7af912005-12-17 12:21:26 +0100700
willy tarreauc29948c2005-12-17 13:10:27 +01007013.1) Surveillance des serveurs
702------------------------------
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100703Il est possible de tester l'état des serveurs par établissement de connexion TCP
704ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas utilisé
willy tarreau8337c6b2005-12-17 13:41:01 +0100705dans le processus de répartition de charge interne. Pour activer la surveillance,
willy tarreauc29948c2005-12-17 13:10:27 +0100706ajouter le mot clé 'check' à la fin de la déclaration du serveur. Il est
707possible de spécifier l'intervalle (en millisecondes) séparant deux tests du
708serveur par le paramètre "inter", le nombre d'échecs acceptés par le paramètre
709"fall", et le nombre de succès avant reprise par le paramètre "rise". Les
710paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreaue47c8d72005-12-17 12:55:52 +0100711 - inter : 2000
712 - rise : 2
713 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +0100714 - port : port de connexion du serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +0100715
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100716Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
717certains cas de pannes, des serveurs peuvent continuer à accepter les connexions
718sans les traiter. Depuis la version 1.1.16, haproxy est en mesure d'envoyer des
willy tarreau036e1ce2005-12-17 13:46:33 +0100719requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16 et 1.1.17
willy tarreau2f6ba652005-12-17 13:57:42 +0100720utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20, les requêtes
721ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de contrôle d'accès aux
722ressources. Cependant, cette requête documentée dans la RFC2068 n'est pas
723comprise par tous les serveurs. Donc à partir de la version 1.1.21, la requête
724par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est possible de
725paramétrer la partie URI. Les requêtes OPTIONS présentent l'avantage d'être
726facilement extractibles des logs, et de ne pas induire d'accès aux fichiers côté
727serveur. Seules les réponses 2xx et 3xx sont considérées valides, les autres (y
728compris non-réponses) aboutissent à un échec. Le temps maximal imparti pour une
729réponse est égal à l'intervalle entre deux tests (paramètre "inter"). Pour
730activer ce mode, spécifier l'option "httpchk", éventuellement suivie d'une
willy tarreaueedaa9f2005-12-17 14:08:03 +0100731méthode et d'une URI. L'option "httpchk" accepte donc 4 formes :
732 - option httpchk -> OPTIONS / HTTP/1.0
733 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
734 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
735 - option httpchk METH URI VER -> <METH> <URI> <VER>
736Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100737
willy tarreau8337c6b2005-12-17 13:41:01 +0100738Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
739utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
740ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
741de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
742les serveurs de secours qui le précèdent sont hors d'usage. Il n'y a donc pas
743de répartition de charge entre des serveurs de secours. Ce type de serveurs
744peut servir à retourner des pages d'indisponibilité de service. Dans ce cas,
745il est préférable de ne pas affecter de cookie, afin que les clients qui le
746rencontrent n'y soient pas affectés définitivement. Le fait de ne pas mettre
747de cookie envoie un cookie vide, ce qui a pour effet de supprimer un éventuel
748cookie affecté précédemment.
749
willy tarreaua41a8b42005-12-17 14:02:24 +0100750Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
751vers un port différent de celui de service. C'est nécessaire principalement
752pour les configurations où le serveur n'a pas de port prédéfini, par exemple
753lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
754le paramètre 'port' suivi du numéro de port devant répondre aux requêtes.
755
willy tarreau8337c6b2005-12-17 13:41:01 +0100756Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement l'état
757courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal SIGHUP au
758processus proxy. L'état de tous les serveurs de tous les proxies est envoyé dans
759les logs en niveau "notice", ainsi que sur la sortie d'erreurs si elle est
760active. C'est une bonne raison pour avoir au moins un serveur de logs local en
761niveau notice.
762
willy tarreau982249e2005-12-18 00:57:06 +0100763Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
764logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
765afin de notifier l'administrateur qu'il faut prendre une action immédiate.
766
willy tarreauc29948c2005-12-17 13:10:27 +0100767Exemples :
768----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100769# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100770 listen http_proxy 0.0.0.0:80
771 mode http
772 cookie SERVERID
773 balance roundrobin
774 server web1 192.168.1.1:80 cookie server01 check
775 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
776
willy tarreau2f6ba652005-12-17 13:57:42 +0100777# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +0100778 listen http_proxy 0.0.0.0:80
779 mode http
780 cookie SERVERID
781 balance roundrobin
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100782 option httpchk
willy tarreau5cbea6f2005-12-17 12:48:26 +0100783 server web1 192.168.1.1:80 cookie server01 check
willy tarreauc29948c2005-12-17 13:10:27 +0100784 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +0100785
willy tarreau2f6ba652005-12-17 13:57:42 +0100786# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
787 listen http_proxy 0.0.0.0:80
788 mode http
789 cookie SERVERID
790 balance roundrobin
791 option httpchk /index.html
792 server web1 192.168.1.1:80 cookie server01 check
793 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
794
willy tarreaueedaa9f2005-12-17 14:08:03 +0100795# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
796 listen http_proxy 0.0.0.0:80
797 mode http
798 cookie SERVERID
799 balance roundrobin
800 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
801 server web1 192.168.1.1:80 cookie server01 check
802 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
803
willy tarreau96d40372005-12-17 13:11:56 +0100804# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +0100805# automatique dans la requête, tout en indiquant aux caches de ne pas garder
806# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +0100807 listen web_appl 0.0.0.0:80
808 mode http
willy tarreau240afa62005-12-17 13:14:35 +0100809 cookie SERVERID insert nocache indirect
willy tarreauc29948c2005-12-17 13:10:27 +0100810 balance roundrobin
811 server web1 192.168.1.1:80 cookie server01 check
812 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +0100813
willy tarreaueedaa9f2005-12-17 14:08:03 +0100814# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +0100815 listen web_appl 0.0.0.0:80
816 mode http
817 cookie SERVERID insert nocache indirect
818 balance roundrobin
819 server web1 192.168.1.1:80 cookie server01 check
820 server web2 192.168.1.2:80 cookie server02 check
willy tarreaueedaa9f2005-12-17 14:08:03 +0100821 server web-backup 192.168.2.1:80 cookie server03 check backup
822 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +0100823
willy tarreaua41a8b42005-12-17 14:02:24 +0100824# relayage SMTP+TLS avec test du serveur et serveur de backup
825
826 listen http_proxy :25,:587
827 mode tcp
828 balance roundrobin
829 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
830 server srv2 192.168.1.2 backup
831
willy tarreau0f7af912005-12-17 12:21:26 +0100832
willy tarreauc29948c2005-12-17 13:10:27 +01008333.2) Reconnexion vers un répartiteur en cas d'échec direct
834----------------------------------------------------------
835En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
836seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
837définitivement privés de service. La spécification du paramètre 'redispatch'
838autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
839(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +0100840
841Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +0100842---------
willy tarreau0f7af912005-12-17 12:21:26 +0100843 listen http_proxy 0.0.0.0:80
844 mode http
845 cookie SERVERID
846 dispatch 192.168.1.100:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100847 server web1 192.168.1.1:80 cookie server01
848 server web2 192.168.1.2:80 cookie server02
willy tarreau8337c6b2005-12-17 13:41:01 +0100849 redispatch # renvoyer vers dispatch si refus de connexion.
850
851Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre redispatch
852ne s'applique qu'aux échecs de connexion au serveur. Depuis la version 1.1.17,
853il s'applique aussi aux connexions destinées à des serveurs identifiés comme
854hors d'usage par la surveillance. Si l'on souhaite malgré tout qu'un client
855disposant d'un cookie correspondant à un serveur défectueux tente de s'y
856connecter, il faut préciser l'option "persist" :
857
858 listen http_proxy 0.0.0.0:80
859 mode http
860 option persist
861 cookie SERVERID
862 dispatch 192.168.1.100:80
863 server web1 192.168.1.1:80 cookie server01
864 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100865 redispatch # renvoyer vers dispatch si serveur HS.
866
willy tarreauc29948c2005-12-17 13:10:27 +0100867
8684) Fonctionnalités additionnelles
869=================================
870
871D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
872principalement du mode transparent, de la journalisation des connexions, et de
873la réécriture des entêtes.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100874
willy tarreauc29948c2005-12-17 13:10:27 +01008754.1) Fonctionnement en mode transparent
876---------------------------------------
877En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions routées
878à travers la machine hébergeant le proxy. Dans ce mode, on ne précise pas
879l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
880destination de la session détournée. Le système doit permettre de rediriger les
881paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100882
883Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +0100884---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100885 listen http_proxy 0.0.0.0:65000
886 mode http
887 transparent
888 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100889 server server01 192.168.1.1:80
890 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100891
892 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
893 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +0100894
willy tarreaua41a8b42005-12-17 14:02:24 +0100895Remarque :
896----------
897Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est adressé
898le client qui sera utilisé. Cela permet de relayer tous les ports TCP d'une même
899adresse avec une même instance et sans utiliser directement le mode transparent.
900
901Exemple :
902---------
903 listen http_proxy 0.0.0.0:65000
904 mode tcp
905 server server01 192.168.1.1 check port 60000
906 server server02 192.168.1.2 check port 60000
907
908 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
909 -j REDIRECT --to-ports 65000
910
willy tarreau0f7af912005-12-17 12:21:26 +0100911
willy tarreauc29948c2005-12-17 13:10:27 +01009124.2) Journalisation des connexions
913----------------------------------
willy tarreauc1cae632005-12-17 14:12:23 +01009144.2.1) Niveaux de log
915---------------------
willy tarreauc29948c2005-12-17 13:10:27 +0100916Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
917détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
918source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +0100919la requête HTTP, le code de retour, la quantité de données transmises, et même
920dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
921Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
922la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +0100923est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +0100924
willy tarreau8337c6b2005-12-17 13:41:01 +0100925 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
926 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +0100927ou
928 log global
929
930Remarque :
931----------
932La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
933paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +0100934
935Exemple :
936---------
937 listen http_proxy 0.0.0.0:80
938 mode http
939 log 192.168.2.200 local3
940 log 192.168.2.201 local4
941
willy tarreauc1cae632005-12-17 14:12:23 +01009424.2.2) Format des logs
943----------------------
944Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
945de la session entre le client et le relais. En précisant l'option 'tcplog',
946la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
947sur son état lors de la déconnexion, ainsi que le temps de connexion et la
948durée totale de la session.
949
willy tarreau982249e2005-12-18 00:57:06 +0100950Exemple :
951---------
952 listen relais-tcp 0.0.0.0:8000
953 mode tcp
954 option tcplog
955 log 192.168.2.200 local3
956
957>>> haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 --
958
willy tarreauc1cae632005-12-17 14:12:23 +0100959Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
960notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
961surveillance effectuant des connexions et déconnexions fréquentes, polluerait
962les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
963ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
964(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +0100965
willy tarreau036e1ce2005-12-17 13:46:33 +0100966Exemple :
967---------
968 listen http_proxy 0.0.0.0:80
969 mode http
970 option httplog
971 option dontlognull
972 log 192.168.2.200 local3
973
willy tarreau982249e2005-12-18 00:57:06 +0100974>>> haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 9/7/147/723 200 243 - - ---- "HEAD / HTTP/1.0"
975
976Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
977de savoir ce qui se passe durant de gros transferts ou des sessions longues.
978Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
979la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus tôt
980possible, c'est à dire juste avant que ne débutent les transferts de données.
981Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat de la
982connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
983traitement des entêtes de la réponse du serveur, auquel cas le nombre d'octets
984représentera la taille des entêtes retournés au client.
985
986Afin d'éviter toute confusion avec les logs normaux, le temps total de transfert
987et le nombre d'octets transférés sont préfixés d'un signe '+' rappeleant que les
988valeurs réelles sont certainement plus élevées.
989
990Exemple :
991---------
992
993 listen http_proxy 0.0.0.0:80
994 mode http
995 option httplog
996 option dontlognull
997 option logasap
998 log 192.168.2.200 local3
999
1000>>> haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/7/14/+30 200 +243 - - ---- "GET /image.iso HTTP/1.0"
1001
1002
willy tarreauc1cae632005-12-17 14:12:23 +010010034.2.3) Chronométrage des événements
1004-----------------------------------
1005Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1006événements sont d'une très grande utilité. Tous les temps sont mesurés en
1007millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
1008la forme Tq/Tc/Tr/Tt :
1009
1010 - Tq: temps total de réception de la requête HTTP de la part du client.
1011 C'est le temps qui s'est écoulé entre le moment où le client a établi
1012 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1013 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1014 que la requête complète n'a jamais été reçue.
1015
1016 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1017 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1018 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1019 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1020 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1021 vers le serveur.
1022
1023 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
1024 renvoyer la totalité des entêtes HTTP à partir du moment où il a acquitté
1025 la connexion. Ca représente exactement le temps de traitement de la
1026 transaction sans le transfert des données associées. Une valeur '-1'
1027 indique que le serveur n'a pas envoyé la totalité de l'entête HTTP.
1028
1029 - Tt: durée de vie totale de la session, entre le moment où la demande de
1030 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001031 refermée aux deux extrémités (client et serveur). La signification change
1032 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
1033 uniquement à (Tq + Tc + Tr), et se trouve préfixé d'un signe '+'. On peut
1034 donc déduire Td, le temps de transfert des données, en excluant les autres
1035 temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001036
1037 Td = Tt - (Tq + Tc + Tr)
1038
1039 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1040
1041En mode TCP ('option tcplog'), seuls les deux indicateurs Tc et Tt sont
1042rapportés.
1043
1044Ces temps fournissent de précieux renseignement sur des causes probables de
1045problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1046de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1047de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1048problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1049valeur de time-out dans la configuration, c'est souvent qu'une session a été
1050abandonnée sur expiration d'un time-out.
1051
1052Cas les plus fréquents :
1053
1054 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1055 le client et le relais.
1056 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1057 le relais et le serveur durant la phase de connexion. Cet indicateur
1058 devrait normalement toujours être très bas (moins de quelques dizaines).
1059 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1060 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1061 de pertes entre le relais et le serveur.
1062 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1063 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1064 session est maintenue après la fin des échanges. Voir plus loin pour
1065 savoir comment désactiver le keep-alive HTTP.
1066
1067Autres cas ('xx' représentant une valeur quelconque à ignorer) :
1068 -1/xx/xx/Tt : le client n'a pas envoyé sa requête dans le temps imparti ou
1069 a refermé sa connexion sans compléter la requête.
1070 Tq/-1/xx/Tt : la connexion n'a pas pu s'établir vers le serveur (refus ou
1071 time-out au bout de Tt-Tq ms).
1072 Tq/Tc/-1/Tt : le serveur a accepté la connexion mais n'a pas répondu dans
1073 les temps ou bien a refermé sa connexion trop tôt, au bout
1074 de Tt-(Tq+Tc) ms.
1075
10764.2.4) Conditions de déconnexion
1077--------------------------------
1078Les logs TCP et HTTP fournissent un indicateur de complétude de la session.
1079C'est un champ de 4 caractères (2 en TCP) précédant la requête HTTP, indiquant :
willy tarreau036e1ce2005-12-17 13:46:33 +01001080 - sur le premier caractère, un code précisant le premier événement qui a causé
1081 la terminaison de la session :
1082
1083 C : fermeture de la session TCP de la part du client
1084 S : fermeture de la session TCP de la part du serveur, ou refus de connexion
1085 P : terminaison prématurée des sessions par le proxy, pour cas d'erreur
willy tarreau982249e2005-12-18 00:57:06 +01001086 interne, de configuration (ex: filtre d'URL), ou parce qu'un
1087 contrôle de sécurité a détecté une anomalie dans la réponse du
1088 serveur.
willy tarreau036e1ce2005-12-17 13:46:33 +01001089 c : expiration du délai d'attente côté client : clitimeout
1090 s : expiration du délai d'attente côté serveur: srvtimeout et contimeout
1091 - : terminaison normale.
1092
1093 - sur le second caractère, l'état d'avancement de la session HTTP lors de la
1094 fermeture :
1095
1096 R : terminaison en attendant la réception totale de la requête du client
1097 C : terminaison en attendant la connexion vers le serveur
willy tarreau982249e2005-12-18 00:57:06 +01001098 H : terminaison en traitant les entêtes du serveur
willy tarreau036e1ce2005-12-17 13:46:33 +01001099 D : terminaison durant le transfert des données du serveur vers le client
1100 L : terminaison durant le transfert des dernières données du proxy vers
1101 le client, alors que le serveur a déjà fini.
1102 - : terminaison normale, après fin de transfert des données
1103
1104 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001105 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001106
1107 N : aucun cookie de persistence n'a été présenté.
1108 I : le client a présenté un cookie ne correspondant à aucun serveur
1109 connu.
1110 D : le client a présenté un cookie correspondant à un serveur hors
1111 d'usage. Suivant l'option 'persist', il a été renvoyé vers un
1112 autre serveur ou a tout de même tenté de se connecter sur celui
1113 correspondant au cookie.
1114 V : le client a présenté un cookie valide et a pu se connecter au
1115 serveur correspondant.
1116 - : non appliquable
1117
1118 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001119 persistence retrourné par le serveur (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001120
1121 N : aucun cookie de persistence n'a été fourni par le serveur.
willy tarreau197e8ec2005-12-17 14:10:59 +01001122 P : un cookie de persistence a été fourni par le serveur et transmis
1123 tel quel.
willy tarreau036e1ce2005-12-17 13:46:33 +01001124 I : aucun cookie n'a été fourni par le serveur, il a été inséré par le
1125 proxy.
1126 D : le cookie présenté par le serveur a été supprimé par le proxy pour
1127 ne pas être retourné au client.
1128 R : le cookie retourné par le serveur a été modifié par le proxy.
1129 - : non appliquable
1130
willy tarreau8337c6b2005-12-17 13:41:01 +01001131Le mot clé "capture" permet d'ajouter dans des logs HTTP des informations
1132capturées dans les échanges. La version 1.1.17 supporte uniquement une capture
1133de cookies client et serveur, ce qui permet dans bien des cas, de reconstituer
1134la session d'un utilisateur. La syntaxe est la suivante :
1135
1136 capture cookie <préfixe_cookie> len <longueur_capture>
1137
1138Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1139transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1140caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1141le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
1142place dans les logs.
1143
1144Exemples :
1145----------
1146 # capture du premier cookie dont le nom commence par "ASPSESSION"
1147 capture cookie ASPSESSION len 32
1148
1149 # capture du premier cookie dont le nom est exactement "vgnvisitor"
1150 capture cookie vgnvisitor= len 32
1151
willy tarreau036e1ce2005-12-17 13:46:33 +01001152Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
1153positionné par le serveur, précédé du cookie positionné par le client. Chacun de
1154ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni par le
1155client ou le serveur.
willy tarreau8337c6b2005-12-17 13:41:01 +01001156
willy tarreauc1cae632005-12-17 14:12:23 +010011574.2.5) Exemples de logs
1158-----------------------
1159- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/7/147/6723 200 243 - - ---- "HEAD / HTTP/1.0"
1160 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
1161 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01001162
willy tarreau982249e2005-12-18 00:57:06 +01001163- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/7/14/+30 200 +243 - - ---- "GET /image.iso HTTP/1.0"
1164 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
1165 log a été généré juste avant le transfert de données. Le serveur a répondu
1166 en 14 ms, 243 octets d'entêtes ont été transférés au client, et le temps
1167 total entre l'accept() et le premier octet de donnée est de 30 ms.
1168
1169- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/7/14/30 502 243 - - PH-- "GET /cgi-bin/bug.cgi? HTTP/1.0"
1170 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
1171 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
1172 d'informations risquant d'être cachées. Dans ce cas, la réponse est
1173 remplacée par '502 bad gateway'.
1174
willy tarreauc1cae632005-12-17 14:12:23 +01001175- haproxy[18113]: 127.0.0.1:34548 [15/Oct/2003:15:18:55] relais-http <NOSRV> -1/-1/-1/8490 -1 0 - - CR-- ""
1176 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
1177 ('C---') au bout de 8.5s, alors que le relais attendait l'entête ('-R--').
1178 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01001179
willy tarreauc1cae632005-12-17 14:12:23 +01001180- haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06] relais-http <NOSRV> -1/-1/-1/50001 408 0 - - cR-- ""
1181 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
1182 bout de 50s, alors que le relais attendait l'entête ('-R--'). Aucune
1183 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
1184 pu renvoyer un message 408 au client.
1185
1186- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
1187 => log en mode 'tcplog'. Expiration du time-out côté client ('c----') au bout
1188 de 5s.
1189
1190- haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/11215 503 0 - - SC-- "HEAD / HTTP/1.0"
1191 => La requête client met 3s à entrer (peut-être un problème réseau), et la
1192 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
1193 secondes (retries 3 dans la conf), puis un code 503 est retourné au client.
willy tarreau0f7af912005-12-17 12:21:26 +01001194
willy tarreauc29948c2005-12-17 13:10:27 +010011954.3) Modification des entêtes HTTP
1196----------------------------------
1197En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
1198requête et/ou la réponse à partir d'expressions régulières. Il est également
1199possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou de
1200la requête. Une limitation cependant : les en-têtes fournis au milieu de
1201connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
1202comme faisant partie des échanges de données consécutifs à la première requête.
1203Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01001204
1205La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01001206 reqadd <string> pour ajouter un en-tête dans la requête
1207 reqrep <search> <replace> pour modifier la requête
1208 reqirep <search> <replace> idem sans distinction majuscules/minuscules
1209 reqdel <search> pour supprimer un en-tête dans la requête
1210 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001211 reqallow <search> autoriser la requête si un entête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01001212 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001213 reqdeny <search> interdire la requête si un entête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01001214 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001215 reqpass <search> inhibe ces actions sur les entêtes validant <search>
1216 reqipass <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001217
willy tarreau036e1ce2005-12-17 13:46:33 +01001218 rspadd <string> pour ajouter un en-tête dans la réponse
1219 rsprep <search> <replace> pour modifier la réponse
1220 rspirep <search> <replace> idem sans distinction majuscules/minuscules
1221 rspdel <search> pour supprimer un en-tête dans la réponse
1222 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01001223 rspdeny <search> remplace la réponse par un HTTP 502 si un
1224 entête valide <search>
1225 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001226
willy tarreau0f7af912005-12-17 12:21:26 +01001227
willy tarreau036e1ce2005-12-17 13:46:33 +01001228<search> est une expression régulière compatible POSIX regexp supportant le
1229groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
1230doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
1231chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
1232backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01001233
1234 \t pour une tabulation
1235 \r pour un retour charriot
1236 \n pour un saut de ligne
1237 \ pour différencier un espace d'un séparateur
1238 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01001239 \\ pour utiliser un backslash dans la regex
1240 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01001241 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01001242
willy tarreau0f7af912005-12-17 12:21:26 +01001243
willy tarreau5cbea6f2005-12-17 12:48:26 +01001244<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
1245Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
1246groupe délimité par des parenthèses dans l'expression régulière, par sa
1247position numérale. Les positions vont de 1 à 9, et sont codées par un '\'
1248suivi du chiffre désiré. Il est également possible d'insérer un caractère non
1249imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code
1250hexadécimal de ce caractère (comme en C).
1251
1252<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01001253dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001254
1255Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01001256-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001257 - 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 +01001258 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001259 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
1260 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
1261 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01001262 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
1263 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
1264 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
1265 entêtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01001266 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
1267 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
willy tarreau0f7af912005-12-17 12:21:26 +01001268
1269Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01001270----------
1271 ###### a few examples ######
1272
1273 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
1274 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
1275 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
1276
1277 # force proxy connections to close
willy tarreauc29948c2005-12-17 13:10:27 +01001278 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
willy tarreau197e8ec2005-12-17 14:10:59 +01001279 # rewrite locations
willy tarreauc29948c2005-12-17 13:10:27 +01001280 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001281
1282 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01001283
willy tarreau197e8ec2005-12-17 14:10:59 +01001284 # Every header should end with a colon followed by one space.
1285 reqideny ^[^:\ ]*[\ ]*$
1286
1287 # block Apache chunk exploit
1288 reqideny ^Transfer-Encoding:[\ ]*chunked
1289 reqideny ^Host:\ apache-
1290
1291 # block annoying worms that fill the logs...
1292 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
1293 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
1294 reqideny ^[^:\ ]*\ .*<script
1295 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
1296
1297 # allow other syntactically valid requests, and block any other method
1298 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
1299 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
1300 reqideny ^[^:\ ]*\
1301
1302 # force connection:close, thus disabling HTTP keep-alive
willy tarreau982249e2005-12-18 00:57:06 +01001303 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01001304
1305 # change the server name
1306 rspidel ^Server:\
1307 rspadd Server:\ Formilux/0.1.8
1308
willy tarreau0f7af912005-12-17 12:21:26 +01001309
willy tarreau982249e2005-12-18 00:57:06 +01001310De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01001311'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
1312connaître l'adresse IP du client initial.
1313
willy tarreau982249e2005-12-18 00:57:06 +01001314Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
1315entête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
1316Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
1317méthode impliquant 4 règles.
1318
willy tarreauc1cae632005-12-17 14:12:23 +01001319Exemple :
1320---------
1321 listen http_proxy 0.0.0.0:80
1322 mode http
1323 log global
1324 option httplog
1325 option dontlognull
1326 option forwardfor
willy tarreau982249e2005-12-18 00:57:06 +01001327 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01001328
willy tarreauc29948c2005-12-17 13:10:27 +010013294.4) Répartition avec persistence
1330---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001331La combinaison de l'insertion de cookie avec la répartition de charge interne
1332permet d'assurer une persistence dans les sessions HTTP d'une manière
1333pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01001334 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01001335 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01001336 - insérer un cookie dans les réponses issues d'une répartition uniquement,
1337 et faire en sorte que des caches ne mémorisent pas ce cookie.
1338 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001339
1340Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01001341---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001342 listen application 0.0.0.0:80
1343 mode http
willy tarreau240afa62005-12-17 13:14:35 +01001344 cookie SERVERID insert nocache indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +01001345 balance roundrobin
1346 server 192.168.1.1:80 cookie server01 check
1347 server 192.168.1.2:80 cookie server02 check
1348
willy tarreau982249e2005-12-18 00:57:06 +010013494.5) Protection contre les fuites d'informations du serveur
1350-----------------------------------------------------------
1351Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été créée.
1352Elle sert à inspecter minutieusement les entêtes 'Cache-control', 'Pragma', et
1353'Set-cookie' dans les réponses serveur pour déterminer s'il y a un risque de
1354cacher un cookie sur un proxy côté client. Quand cette option est activée, les
1355seules réponses qui peuvent être retournées au client sont :
1356 - toutes celles qui n'ont pas d'entête 'Set-cookie' ;
1357 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
1358 410, sauf si le server a positionné un entête 'Cache-control: public' ;
1359 - celles qui font suite à une requête POST, sauf si le serveur a positionné
1360 un entête 'Cache-control: public' ;
1361 - celles qui ont un entête 'Pragma: no-cache' ;
1362 - celles qui ont un entête 'Cache-control: private' ;
1363 - celles qui ont un entête 'Cache-control: no-store' ;
1364 - celles qui ont un entête 'Cache-control: max-age=0' ;
1365 - celles qui ont un entête 'Cache-control: s-maxage=0' ;
1366 - celles qui ont un entête 'Cache-control: no-cache' ;
1367 - celles qui ont un entête 'Cache-control: no-cache="set-cookie"' ;
1368 - celles qui ont un entête 'Cache-control: no-cache="set-cookie,'
1369 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01001370
willy tarreau982249e2005-12-18 00:57:06 +01001371Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
1372même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
1373message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
1374dire que c'est le proxy qui a bloqué la réponse durant le traitement des
1375entêtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
1376l'administrateur sache qu'il y a une action correctrice à entreprendre.
1377
13784.6) Personalisation des erreurs
1379--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01001380Certaines situations conduisent à retourner une erreur HTTP au client :
1381 - requête invalide ou trop longue => code HTTP 400
1382 - requête mettant trop de temps à venir => code HTTP 408
1383 - requête interdite (bloquée par un reqideny) => code HTTP 403
1384 - erreur interne du proxy => code HTTP 500
1385 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
1386 - aucun serveur disponible pour cette requête => code HTTP 503
1387 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
1388
1389Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
1390Cependant, en fonction du type de clientèle, on peut préférer retourner des
1391pages personnalisées. Ceci est possible par le biais de la commande "errorloc" :
1392
1393 errorloc <code_HTTP> <location>
1394
1395Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
1396le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
1397d'une page précisée dans <location>. Cette adresse peut être relative au site,
1398ou absolue. Comme cette réponse est traîtée par le navigateur du client
1399lui-même, il est indispensable que l'adresse fournie lui soit accessible.
1400
1401Exemple :
1402---------
1403 listen application 0.0.0.0:80
1404 errorloc 400 /badrequest.html
1405 errorloc 403 /forbidden.html
1406 errorloc 408 /toolong.html
1407 errorloc 500 http://haproxy.domain.net/bugreport.html
1408 errorloc 502 http://192.168.114.58/error50x.html
1409 errorloc 503 http://192.168.114.58/error50x.html
1410 errorloc 504 http://192.168.114.58/error50x.html
1411
willy tarreau982249e2005-12-18 00:57:06 +010014124.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01001413--------------------------------------
willy tarreaua41a8b42005-12-17 14:02:24 +01001414Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui évite
1415de répéter des paramètres communs à toutes les instances, tels que les timeouts,
1416adresses de log, modes de fonctionnement, etc.
1417
1418Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
1419précédent l'instance qui les utilisera. On peut donc mettre autant de sections
1420'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
1421section implique une annulation de tous les paramètres par défaut positionnés
1422précédemment, dans le but de les remplacer.
1423
1424La section 'defaults' utilise la même syntaxe que la section 'listen', aux
1425paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
1426un commentaire en guise paramètre.
1427
willy tarreau982249e2005-12-18 00:57:06 +01001428Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
1429positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01001430 - log (le premier et le second)
1431 - mode { tcp, http, health }
1432 - balance { roundrobin }
1433 - disabled (pour désactiver toutes les instances qui suivent)
1434 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
1435 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01001436 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
1437 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01001438 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01001439 - cookie, capture
1440 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01001441
1442Ne sont pas supportés dans cette version, les adresses de dispatch et les
1443configurations de serveurs, ainsi que tous les filtres basés sur les
1444expressions régulières :
1445 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01001446 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01001447
1448Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
1449positionné par défaut. Donc si une option est spécifiée dans les paramètres par
1450défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
1451paramètres par défaut avant la déclaration de l'instance.
1452
1453Exemples :
1454----------
1455 defaults applications TCP
1456 log global
1457 mode tcp
1458 balance roundrobin
1459 clitimeout 180000
1460 srvtimeout 180000
1461 contimeout 4000
1462 retries 3
1463 redispatch
1464
1465 listen app_tcp1 10.0.0.1:6000-6063
1466 server srv1 192.168.1.1 check port 6000 inter 10000
1467 server srv2 192.168.1.2 backup
1468
1469 listen app_tcp2 10.0.0.2:6000-6063
1470 server srv1 192.168.2.1 check port 6000 inter 10000
1471 server srv2 192.168.2.2 backup
1472
1473 defaults applications HTTP
1474 log global
1475 mode http
1476 option httplog
1477 option forwardfor
1478 option dontlognull
1479 balance roundrobin
1480 clitimeout 20000
1481 srvtimeout 20000
1482 contimeout 4000
1483 retries 3
1484
1485 listen app_http1 10.0.0.1:80-81
1486 cookie SERVERID postonly insert indirect
1487 capture cookie userid= len 10
1488 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
1489 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
1490
1491 defaults
1492 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01001493
willy tarreaub719f002005-12-17 12:55:07 +01001494=======================
1495| Paramétrage système |
1496=======================
willy tarreau0f7af912005-12-17 12:21:26 +01001497
1498Sous Linux 2.4
1499==============
1500
willy tarreaub719f002005-12-17 12:55:07 +01001501-- cut here --
1502#!/bin/sh
1503# set this to about 256/4M (16384 for 256M machine)
1504MAXFILES=16384
1505echo $MAXFILES > /proc/sys/fs/file-max
1506ulimit -n $MAXFILES
1507
1508if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
1509 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
1510fi
1511
1512if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
1513 # 30 seconds for fin, 15 for time wait
1514 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
1515 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
1516 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
1517 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
1518fi
1519
willy tarreau0f7af912005-12-17 12:21:26 +01001520echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01001521echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
1522echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01001523echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01001524echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
1525echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01001526echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
1527echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01001528echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreaub719f002005-12-17 12:55:07 +01001529echo 0 > /proc/sys/net/ipv4/tcp_sack
1530echo 0 > /proc/sys/net/ipv4/tcp_dsack
1531
1532# auto-tuned on 2.4
1533#echo 262143 > /proc/sys/net/core/rmem_max
1534#echo 262143 > /proc/sys/net/core/rmem_default
1535
1536echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
1537echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
1538
1539-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01001540
willy tarreau197e8ec2005-12-17 14:10:59 +01001541Sous FreeBSD
1542============
1543
1544Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
1545Clement Laforet <sheepkiller@cultdeadsheep.org>.
1546
1547Pour plus d'informations :
1548http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
1549http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
1550http://www.freshports.org/net/haproxy
1551
1552
willy tarreau0f7af912005-12-17 12:21:26 +01001553-- fin --