blob: 28687bb71634bde72f28fb5ae3b7dc3df2b96b53 [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 -------------------
5 version 1.2.3
willy tarreau0f7af912005-12-17 12:21:26 +01006 willy tarreau
willy tarreau0174f312005-12-18 01:02:42 +01007 2005/01/22
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 ;
16 - effectuer une répartition de charge avec création de cookies pour assurer la
willy tarreaua1598082005-12-17 13:08:06 +010017 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 ;
20 - modifier/ajouter/supprimer des entêtes dans la requête et la réponse ;
21 - 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 tarreaua1598082005-12-17 13:08:06 +010025Il requiert peu de ressources, et son architecture événementielle mono-processus
26lui permet facilement de gérer plusieurs milliers de connexions simultanées sur
27plusieurs relais sans effondrer le système.
28
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
51
willy tarreaua1598082005-12-17 13:08:06 +010052Le nombre maximal de connexion simultanées par proxy est le paramètre par défaut
53pour les proxies pour lesquels ce paramètre n'est pas précisé dans le fichier de
54configuration. Il s'agit du paramètre 'maxconn' dans les sections 'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010055
willy tarreaua1598082005-12-17 13:08:06 +010056Le nombre maximal total de connexions simultanées limite le nombre de connexions
willy tarreauc29948c2005-12-17 13:10:27 +010057TCP utilisables à un instant donné par le processus, tous proxies confondus. Ce
willy tarreaua1598082005-12-17 13:08:06 +010058paramètre remplace le paramètre 'maxconn' de la section 'global'.
59
willy tarreauc29948c2005-12-17 13:10:27 +010060Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
61mode, toutes les connexions, déconnexions, et tous les échanges d'entêtes HTTP
62sont affichés.
63
64Les statistiques ne sont disponibles que si le programme a été compilé avec
65l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
66d'utilité que lors de benchmarks par exemple.
67
willy tarreau0f7af912005-12-17 12:21:26 +010068
69============================
70| Fichier de configuration |
71============================
72
willy tarreauc29948c2005-12-17 13:10:27 +010073Structure
74=========
willy tarreau0f7af912005-12-17 12:21:26 +010075
willy tarreaua1598082005-12-17 13:08:06 +010076L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
77les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est pas
willy tarreauc29948c2005-12-17 13:10:27 +010078précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +010079
80Le fichier de configuration est découpé en sections répérées par des mots clés
81tels que :
82
83 - 'global'
84 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +010085 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +010086
87Tous les paramètres font référence à la section définie par le dernier mot clé
88reconnu.
89
90
willy tarreauc29948c2005-12-17 13:10:27 +0100911) Paramètres globaux
92=====================
willy tarreaua1598082005-12-17 13:08:06 +010093
94Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
95proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
96supportés sont :
97
willy tarreau8337c6b2005-12-17 13:41:01 +010098 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +010099 - maxconn <nombre>
100 - uid <identifiant>
101 - gid <identifiant>
102 - chroot <répertoire>
103 - nbproc <nombre>
104 - daemon
105 - debug
106 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100107 - pidfile <fichier>
willy tarreaua1598082005-12-17 13:08:06 +0100108
1091.1) Journalisation des événements
110----------------------------------
111La plupart des événements sont journalisés : démarrages, arrêts, disparition et
112apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
113syslog vers un ou deux serveurs. La syntaxe est la suivante :
114
willy tarreau8337c6b2005-12-17 13:41:01 +0100115 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100116
117Les connexions sont envoyées en niveau "info". Les démarrages de service et de
118serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
119arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau8337c6b2005-12-17 13:41:01 +0100120bien pour les proxies que pour les serveurs testés par les proxies. Le paramètre
121optionnel <niveau_max> définit le niveau maximal de traces émises parmi les 8
122valeurs suivantes :
123 emerg, alert, crit, err, warning, notice, info, debug
124
willy tarreaueedaa9f2005-12-17 14:08:03 +0100125Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100126est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100127
128Les catégories possibles sont :
129 kern, user, mail, daemon, auth, syslog, lpr, news,
130 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
131 local0, local1, local2, local3, local4, local5, local6, local7
132
willy tarreau036e1ce2005-12-17 13:46:33 +0100133Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
134
willy tarreaua1598082005-12-17 13:08:06 +0100135Exemple :
136---------
137 global
138 log 192.168.2.200 local3
willy tarreau8337c6b2005-12-17 13:41:01 +0100139 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100140
1411.2) limitation du nombre de connexions
142---------------------------------------
143Il est possible et conseillé de limiter le nombre global de connexions par
144processus. Les connexions sont comprises au sens 'acceptation de connexion',
145donc il faut s'attendre en règle général à avoir un peu plus du double de
146sessions TCP que le maximum de connexions fixé. C'est important pour fixer le
147paramètre 'ulimit -n' avant de lancer le proxy. Pour comptabiliser le nombre
148de sockets nécessaires, il faut prendre en compte ces paramètres :
149 - 1 socket par connexion entrante
150 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100151 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100152 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100153 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100154
willy tarreaueedaa9f2005-12-17 14:08:03 +0100155Dans le cas où chaque proxy n'écoute que sur un couple adresse/port, positionner
156la limite du nombre de descripteurs de fichiers (ulimit -n) à
157(2 * maxconn + nbproxy + nbserveurs + 1). Dans une future version, haproxy sera
willy tarreauc29948c2005-12-17 13:10:27 +0100158capable de positionner lui-même cette limite.
159
1601.3) Diminution des privilèges
161------------------------------
162Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
163serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100164de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100165
willy tarreauc29948c2005-12-17 13:10:27 +0100166Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
167numérique d'utilisateur. La valeur 0, correspondant normalement au super-
168utilisateur, possède ici une signification particulière car elle indique que
169l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
170C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
171un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
172changer. Il est particulièrement déconseillé d'utiliser des comptes génériques
173tels que 'nobody' car cette pratique revient à utiliser 'root' si d'autres
174processus utilisent les mêmes identifiants.
175
176Le paramètre 'chroot' autorise à changer la racine du processus une fois le
177programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100178puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100179généralement contournable sur certains OS (Linux, Solaris) pour peu que
180l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
181un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
182service pour cet usage, et de ne pas mutualiser un même répertoire pour
183plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
184il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
185l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100186
187Remarque: dans le cas où une telle faille serait mise en évidence, il est fort
188probable que les premières tentatives de son exploitation provoquent un arrêt du
189programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
190encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur en
191environnement limité réduit les risques d'intrusion, il est parfois bien utile
192dans ces circonstances de connaître les conditions d'apparition du problème, via
193l'obtention d'un fichier 'core'. La plupart des systèmes, pour des raisons de
194sécurité, désactivent la génération du fichier 'core' après un changement
195d'identifiant pour le processus. Il faudra donc soit lancer le processus à
196partir d'un compte utilisateur aux droits réduits (mais ne pouvant pas effectuer
197le chroot), ou bien le faire en root sans réduction des droits (uid 0). Dans ce
198cas, le fichier se trouvera soit dans le répertoire de lancement, soit dans le
199répertoire spécifié après l'option 'chroot'. Ne pas oublier la commande suivante
200pour autoriser la génération du fichier avant de lancer le programme :
201
202# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100203
willy tarreauc29948c2005-12-17 13:10:27 +0100204Exemple :
205---------
206
207 global
208 uid 30000
209 gid 30000
210 chroot /var/chroot/haproxy
211
willy tarreaufe2c5c12005-12-17 14:14:34 +01002121.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100213----------------------------
214Le service peut fonctionner dans plusieurs modes :
215 - avant- / arrière-plan
216 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100217
willy tarreauc29948c2005-12-17 13:10:27 +0100218Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne rend
219pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci dans un
220script de démarrage du système, sinon le système ne finirait pas son
221initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
222au processus appelant. C'est ce que fait l'option 'daemon' de la section
223'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100224
willy tarreauc29948c2005-12-17 13:10:27 +0100225Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
226standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
227logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
228Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100229
willy tarreauc29948c2005-12-17 13:10:27 +0100230Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
231problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
232entre les clients et les serveurs. Ce mode est incompatible avec les options
233'daemon' et 'quiet' pour des raisons de bon sens.
234
willy tarreaufe2c5c12005-12-17 14:14:34 +01002351.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100236-----------------------------------------------
237Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
238processeur pour effectuer les tâches de relayage, même si les charges
239nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
240grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
241programme sait démarrer plusieurs processus se répartissant la charge de
242travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
243section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100244qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
245la limite de nombre de descripteurs de fichiers allouée par processus sous
246Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100247
248Exemple :
249---------
250
251 global
252 daemon
253 quiet
254 nbproc 2
255
willy tarreaufe2c5c12005-12-17 14:14:34 +01002561.6) Simplification de la gestion des processus
257-----------------------------------------------
258Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
259paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
260d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
261le numéro de PID des processus fils, à raison d'un par ligne (valable
262uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
263afin de rester compatible avec un répertoire protégé en lecture seule. Il
264appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
2650644.
266
267Exemple :
268---------
269
270 global
271 daemon
272 quiet
273 nbproc 2
274 pidfile /var/run/haproxy-private.pid
275
276 # pour stopper seulement ces processus parmi d'autres :
277 # kill $(</var/run/haproxy-private.pid)
278
willy tarreauc29948c2005-12-17 13:10:27 +0100279
2802) Définition d'un service en écoute
281====================================
282
283Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100284
willy tarreaua41a8b42005-12-17 14:02:24 +0100285 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100286
willy tarreauc29948c2005-12-17 13:10:27 +0100287- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
288 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé. Aucun
289 test n'est effectué concernant l'unicité de ce nom, qui n'est pas obligatoire,
willy tarreaua41a8b42005-12-17 14:02:24 +0100290 mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100291
willy tarreaua41a8b42005-12-17 14:02:24 +0100292- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
293 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
294 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100295
willy tarreaua41a8b42005-12-17 14:02:24 +0100296- <plage_ports> correspond soit à un port, soit à une plage de ports sur
297 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
298 Cette plage peut être :
299 - soit un port numérique (ex: '80')
300 - soit une plage constituée de deux valeurs séparées par un tiret
301 (ex: '2000-2100') représentant les extrémités incluses dans la
302 plage.
303 Il faut faire attention à l'usage des plages, car chaque combinaison
304 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
305 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
306 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
307 niveau de privilège particulier lors du lancement du programme (indépendamment
308 du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100309
willy tarreaua41a8b42005-12-17 14:02:24 +0100310- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
311 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
312 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
313
314Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100315---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100316 listen http_proxy :80
317 listen x11_proxy 127.0.0.1:6000-6009
318 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
319 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100320
willy tarreaua41a8b42005-12-17 14:02:24 +0100321Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
322rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
323de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
324l'écriture de configurations :
325
326 bind [ <adresse_IP>:<plage_ports>[,...] ]
327
328Exemples :
329----------
330 listen http_proxy
331 bind :80,:443
332 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100333
willy tarreauc29948c2005-12-17 13:10:27 +01003342.1) Inhibition d'un service
335----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100336Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100337commenter toute une partie du fichier. Il suffit de positionner le mot clé
338"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100339
340 listen smtp_proxy 0.0.0.0:25
341 disabled
342
willy tarreaueedaa9f2005-12-17 14:08:03 +0100343Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
344 désactivé par le mot clé 'disabled', par exemple à cause d'une
345 configuration par défaut.
346
willy tarreauc29948c2005-12-17 13:10:27 +01003472.2) Mode de fonctionnement
348---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100349Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100350 - TCP
351 - HTTP
352 - supervision
353
354Mode TCP
355--------
willy tarreauc29948c2005-12-17 13:10:27 +0100356Dans ce mode, le service relaye, dès leur établissement, les connexions TCP vers
357un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il s'agit
358simplement d'une association source<adresse:port> -> destination<adresse:port>.
359Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100360
willy tarreauc29948c2005-12-17 13:10:27 +0100361Exemple :
362---------
willy tarreau0f7af912005-12-17 12:21:26 +0100363 listen smtp_proxy 0.0.0.0:25
364 mode tcp
365
366Mode HTTP
367---------
willy tarreauc29948c2005-12-17 13:10:27 +0100368Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
369serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
370décision. Les entêtes HTTP sont analysés pour y trouver un éventuel cookie, et
371certains d'entre-eux peuvent être modifiés par le biais d'expressions
372régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
373relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100374
willy tarreauc29948c2005-12-17 13:10:27 +0100375Exemple :
376---------
willy tarreau0f7af912005-12-17 12:21:26 +0100377 listen http_proxy 0.0.0.0:80
378 mode http
379
380Mode supervision
381----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100382Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
383santé du service. Il se contente de retourner "OK" à tout client se connectant
384sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100385déterminer quels sont les services utilisables. Si l'option 'httpchk' est
386activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
387attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100388le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100389
willy tarreauc29948c2005-12-17 13:10:27 +0100390Exemple :
391---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100392 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100393 listen health_check 0.0.0.0:60000
394 mode health
395
willy tarreau197e8ec2005-12-17 14:10:59 +0100396 # réponse HTTP : 'HTTP/1.0 200 OK'
397 listen http_health_check 0.0.0.0:60001
398 mode health
399 option httpchk
400
willy tarreau0f7af912005-12-17 12:21:26 +0100401
willy tarreauc29948c2005-12-17 13:10:27 +01004022.3) Limitation du nombre de connexions simultanées
403---------------------------------------------------
404Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
405connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
406d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
407limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100408
willy tarreauc29948c2005-12-17 13:10:27 +0100409Exemple :
410---------
411 listen tiny_server 0.0.0.0:80
412 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100413
414
willy tarreauc29948c2005-12-17 13:10:27 +01004152.4) Arrêt en douceur
416---------------------
417Il est possible d'arrêter les services en douceur en envoyant un signal SIG_USR1
418au processus relais. Tous les services seront alors mis en phase d'arrêt, mais
419pourront continuer d'accepter des connexions pendant un temps défini par le
420paramètre 'grace' (en millisecondes). Cela permet par exemple, de faire savoir
421rapidement à un répartiteur de charge qu'il ne doit plus utiliser un relais,
422tout en continuant d'assurer le service le temps qu'il s'en rende compte.
423Remarque : les connexions actives ne sont jamais cassées. Dans le pire des cas,
424il faudra attendre en plus leur expiration avant l'arrêt total du processus. La
425valeur par défaut est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100426
427Exemple :
428---------
willy tarreauc29948c2005-12-17 13:10:27 +0100429 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100430 # le service tournera encore 10 secondes après la demande d'arrêt
431 listen http_proxy 0.0.0.0:80
432 mode http
433 grace 10000
434
willy tarreauc29948c2005-12-17 13:10:27 +0100435 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100436 listen health_check 0.0.0.0:60000
437 mode health
438 grace 0
439
440
willy tarreauc29948c2005-12-17 13:10:27 +01004412.5) Temps d'expiration des connexions
442--------------------------------------
443Il est possible de paramétrer certaines durées d'expiration au niveau des
444connexions TCP. Trois temps indépendants sont configurables et acceptent des
445valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
446session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100447
448 - temps d'attente d'une donnée de la part du client, ou de la
449 possibilité de lui envoyer des données : "clitimeout" :
450
451 # time-out client à 2mn30.
452 clitimeout 150000
453
454 - temps d'attente d'une donnée de la part du serveur, ou de la
455 possibilité de lui envoyer des données : "srvtimeout" :
456
willy tarreauc29948c2005-12-17 13:10:27 +0100457 # time-out serveur à 30s.
willy tarreau0f7af912005-12-17 12:21:26 +0100458 srvtimeout 30000
459
460 - temps d'attente de l'établissement d'une connexion vers un serveur
461 "contimeout" :
462
willy tarreauc29948c2005-12-17 13:10:27 +0100463 # on abandonne si la connexion n'est pas établie après 4 secondes
464 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100465
willy tarreauc29948c2005-12-17 13:10:27 +0100466Remarques :
467-----------
468 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
469 type "health".
470 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
471 possible de perdre des paquets. Du fait que la première retransmission TCP
472 n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion inférieur
473 à 3 secondes ne permet pas de se rattraper sur la perte de paquets car la
474 session aura été abandonnée avant la première retransmission. Une valeur de
475 4 secondes réduira considérablement le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100476
willy tarreauc29948c2005-12-17 13:10:27 +01004772.6) Tentatives de reconnexion
478------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100479Lors d'un échec de connexion vers un serveur, il est possible de
480retenter (potentiellement vers un autre serveur, en cas de répartition
481de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100482abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100483
willy tarreauc29948c2005-12-17 13:10:27 +0100484Exemple :
485---------
willy tarreau0f7af912005-12-17 12:21:26 +0100486 # on essaie encore trois fois maxi
487 retries 3
488
willy tarreau0f7af912005-12-17 12:21:26 +0100489
willy tarreauc29948c2005-12-17 13:10:27 +01004902.7) Adresse du serveur
491-----------------------
492Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
493le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
494serveur d'assignation de cookie dans le cas où le service consiste à assurer
495uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100496le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
497du serveur distant, et il est maintenant recommandé d'utiliser de préférence
498le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100499
willy tarreauc29948c2005-12-17 13:10:27 +0100500Exemple :
501---------
willy tarreau0f7af912005-12-17 12:21:26 +0100502 # on envoie toutes les nouvelles connexions ici
503 dispatch 192.168.1.2:80
504
willy tarreauc29948c2005-12-17 13:10:27 +0100505Remarque :
506----------
507Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
508'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100509
willy tarreau0f7af912005-12-17 12:21:26 +0100510
willy tarreau240afa62005-12-17 13:14:35 +01005112.8) Adresse de sortie
512----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100513Il est possible de forcer l'adresse utilisée pour établir les connexions vers
514les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
515port, bien que cette fonctionnalité se limite à des usages très spécifiques.
516C'est particulièrement utile en cas d'adressage multiple, et plus généralement
517pour permettre aux serveurs de trouver le chemin de retour dans des contextes de
518routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera choisie
519librement par le systeme. Si le port est '0' ou vide, il sera choisi librement
520par le système. Il est à noter que depuis la version 1.1.18, les tests de bon
willy tarreaueedaa9f2005-12-17 14:08:03 +0100521fonctionnement des serveurs seront aussi effectués à partir de la source
willy tarreaua41a8b42005-12-17 14:02:24 +0100522spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100523
524Exemples :
525----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100526 listen http_proxy *:80
willy tarreau240afa62005-12-17 13:14:35 +0100527 # toutes les connexions prennent l'adresse 192.168.1.200
528 source 192.168.1.200:0
529
willy tarreaua41a8b42005-12-17 14:02:24 +0100530 listen rlogin_proxy *:513
willy tarreau240afa62005-12-17 13:14:35 +0100531 # utiliser l'adresse 192.168.1.200 et le port réservé 900
532 source 192.168.1.200:900
533
534
5352.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100536--------------------------------
537En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
538vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
539par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100540
willy tarreauc29948c2005-12-17 13:10:27 +0100541Exemple :
542---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100543 listen http_proxy :80
willy tarreau0f7af912005-12-17 12:21:26 +0100544 mode http
545 cookie SERVERID
546
willy tarreauc29948c2005-12-17 13:10:27 +0100547On peut modifier l'utilisation du cookie pour la rendre plus intelligente
548vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
549réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
550cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100551de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
552inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100553
554Exemples :
555----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100556
557Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100558dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
559directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100560
561 cookie SERVERID indirect
562
willy tarreauc29948c2005-12-17 13:10:27 +0100563Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
564lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100565
566 cookie SERVERID rewrite
567
willy tarreauc29948c2005-12-17 13:10:27 +0100568Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un accès
willy tarreau8337c6b2005-12-17 13:41:01 +0100569en répartition de charge interne. Dans ce cas, il est souhaitable que tous les
570serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
571retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100572
573 cookie SERVERID insert
574
willy tarreau0174f312005-12-18 01:02:42 +0100575Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
576puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
577permet d'insérer une instance de haproxy devant une application sans risquer
578d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
579plus d'un cookie :
580
581 cookie JSESSIONID prefix
582
willy tarreau240afa62005-12-17 13:14:35 +0100583Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
584ajouter le mot clé 'nocache' après 'insert' :
585
586 cookie SERVERID insert nocache
587
willy tarreaucd878942005-12-17 13:27:43 +0100588Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le mot
589clé 'postonly' après 'insert' :
590
591 cookie SERVERID insert postonly
592
willy tarreau240afa62005-12-17 13:14:35 +0100593
willy tarreau96d40372005-12-17 13:11:56 +0100594Remarques :
595-----------
596- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour s'adapter
597 à des applications générant déjà le cookie, avec un contenu invalide. Il suffit
598 pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100599
willy tarreau96d40372005-12-17 13:11:56 +0100600- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
601 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
602 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100603
willy tarreau240afa62005-12-17 13:14:35 +0100604- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
605 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
606 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
607 cookie de persistence inséré, donc provoquer des changements de serveurs pour
608 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100609
willy tarreau0174f312005-12-18 01:02:42 +0100610- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
611 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
612 présenté par l'application qui est censée savoir à quel moment il peut
613 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
614 présenté par le client dans chaque requête ultérieure, il est indispensable
615 de s'assurer que le client et le serveur communiqueront sans "keep-alive
616 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
617
willy tarreaucd878942005-12-17 13:27:43 +0100618- lorsque l'application est bien connue, et que les parties nécessitant de la
619 persistence sont systématiquement accédées par un formulaire en mode POST,
620 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
621 et "indirect", car la page d'accueil reste cachable, et c'est l'application
622 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100623
willy tarreau240afa62005-12-17 13:14:35 +01006242.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100625----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100626En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
627par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100628
willy tarreau5cbea6f2005-12-17 12:48:26 +0100629 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100630
willy tarreauc29948c2005-12-17 13:10:27 +0100631- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
632 configuration et les logs.
633- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
634- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100635
636Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100637---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100638 listen http_proxy :80
willy tarreau0f7af912005-12-17 12:21:26 +0100639 mode http
640 cookie SERVERID
641 dispatch 192.168.1.100:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100642 server web1 192.168.1.1:80 cookie server01
643 server web2 192.168.1.2:80 cookie server02
644
645Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100646-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100647
willy tarreaua41a8b42005-12-17 14:02:24 +01006483) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100649=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100650
willy tarreauc29948c2005-12-17 13:10:27 +0100651Le relais peut effectuer lui-même la répartition de charge entre les différents
652serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
653cela, on précise le mot clé 'balance' dans la définition du service,
654éventuellement suivi du nom d'un algorithme de répartition. En version 1.1.9,
655seul 'roundrobin' est géré, et c'est aussi la valeur implicite par défaut. Il
656est évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
657spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100658
659Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100660---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100661
willy tarreaua41a8b42005-12-17 14:02:24 +0100662 listen http_proxy :80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100663 mode http
664 cookie SERVERID
665 balance roundrobin
666 server web1 192.168.1.1:80 cookie server01
667 server web2 192.168.1.2:80 cookie server02
668
willy tarreaua41a8b42005-12-17 14:02:24 +0100669Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
670du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
671sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
672champ <port> de l'adresse serveur :
673
674 - non spécifié ou nul :
675 la connexion sera envoyée au serveur sur le même port que celui sur
676 lequel le relais a reçu la connexion.
677
678 - valeur numérique (seul cas supporté pour les versions antérieures) :
679 le serveur recevra la connexion sur le port désigné.
680
681 - valeur numérique précédée d'un signe '+' :
682 la connexion sera envoyée au serveur sur le même port que celui sur
683 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
684
685 - valeur numérique précédée d'un signe '-' :
686 la connexion sera envoyée au serveur sur le même port que celui sur
687 lequel le relais a reçu la connexion, duquel on soustrait la valeur
688 désignée.
689
690Exemples :
691----------
692
693# même que précédemment
694
695 listen http_proxy :80
696 mode http
697 cookie SERVERID
698 balance roundrobin
699 server web1 192.168.1.1 cookie server01
700 server web2 192.168.1.2 cookie server02
701
702# relayage simultané des ports 80 et 81 et 8080-8089
703
704 listen http_proxy :80,:81,:8080-8089
705 mode http
706 cookie SERVERID
707 balance roundrobin
708 server web1 192.168.1.1 cookie server01
709 server web2 192.168.1.2 cookie server02
710
711# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
712
713 listen http_proxy :25,:389,:663
714 mode tcp
715 balance roundrobin
716 server srv1 192.168.1.1:+1000
717 server srv2 192.168.1.2:+1000
718
willy tarreau0f7af912005-12-17 12:21:26 +0100719
willy tarreauc29948c2005-12-17 13:10:27 +01007203.1) Surveillance des serveurs
721------------------------------
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100722Il est possible de tester l'état des serveurs par établissement de connexion TCP
723ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas utilisé
willy tarreau8337c6b2005-12-17 13:41:01 +0100724dans le processus de répartition de charge interne. Pour activer la surveillance,
willy tarreauc29948c2005-12-17 13:10:27 +0100725ajouter le mot clé 'check' à la fin de la déclaration du serveur. Il est
726possible de spécifier l'intervalle (en millisecondes) séparant deux tests du
727serveur par le paramètre "inter", le nombre d'échecs acceptés par le paramètre
728"fall", et le nombre de succès avant reprise par le paramètre "rise". Les
729paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreaue47c8d72005-12-17 12:55:52 +0100730 - inter : 2000
731 - rise : 2
732 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +0100733 - port : port de connexion du serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +0100734
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100735Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
736certains cas de pannes, des serveurs peuvent continuer à accepter les connexions
737sans les traiter. Depuis la version 1.1.16, haproxy est en mesure d'envoyer des
willy tarreau036e1ce2005-12-17 13:46:33 +0100738requê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 +0100739utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20, les requêtes
740ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de contrôle d'accès aux
741ressources. Cependant, cette requête documentée dans la RFC2068 n'est pas
742comprise par tous les serveurs. Donc à partir de la version 1.1.21, la requête
743par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est possible de
744paramétrer la partie URI. Les requêtes OPTIONS présentent l'avantage d'être
745facilement extractibles des logs, et de ne pas induire d'accès aux fichiers côté
746serveur. Seules les réponses 2xx et 3xx sont considérées valides, les autres (y
747compris non-réponses) aboutissent à un échec. Le temps maximal imparti pour une
748réponse est égal à l'intervalle entre deux tests (paramètre "inter"). Pour
749activer ce mode, spécifier l'option "httpchk", éventuellement suivie d'une
willy tarreaueedaa9f2005-12-17 14:08:03 +0100750méthode et d'une URI. L'option "httpchk" accepte donc 4 formes :
751 - option httpchk -> OPTIONS / HTTP/1.0
752 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
753 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
754 - option httpchk METH URI VER -> <METH> <URI> <VER>
755Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100756
willy tarreau8337c6b2005-12-17 13:41:01 +0100757Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
758utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
759ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
760de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
761les serveurs de secours qui le précèdent sont hors d'usage. Il n'y a donc pas
762de répartition de charge entre des serveurs de secours. Ce type de serveurs
763peut servir à retourner des pages d'indisponibilité de service. Dans ce cas,
764il est préférable de ne pas affecter de cookie, afin que les clients qui le
765rencontrent n'y soient pas affectés définitivement. Le fait de ne pas mettre
766de cookie envoie un cookie vide, ce qui a pour effet de supprimer un éventuel
767cookie affecté précédemment.
768
willy tarreaua41a8b42005-12-17 14:02:24 +0100769Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
770vers un port différent de celui de service. C'est nécessaire principalement
771pour les configurations où le serveur n'a pas de port prédéfini, par exemple
772lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
773le paramètre 'port' suivi du numéro de port devant répondre aux requêtes.
774
willy tarreau8337c6b2005-12-17 13:41:01 +0100775Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement l'état
776courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal SIGHUP au
777processus proxy. L'état de tous les serveurs de tous les proxies est envoyé dans
778les logs en niveau "notice", ainsi que sur la sortie d'erreurs si elle est
779active. C'est une bonne raison pour avoir au moins un serveur de logs local en
780niveau notice.
781
willy tarreau982249e2005-12-18 00:57:06 +0100782Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
783logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
784afin de notifier l'administrateur qu'il faut prendre une action immédiate.
785
willy tarreau0174f312005-12-18 01:02:42 +0100786Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
787même valeur de cookie. C'est particulièrement utile en mode backup, pour
788sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
789oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
790temporairement vers une page d'erreur en attendant le redémarrage d'une
791application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
792le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
793chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
794le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
795pour plus d'informations.
796
willy tarreauc29948c2005-12-17 13:10:27 +0100797Exemples :
798----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100799# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100800 listen http_proxy 0.0.0.0:80
801 mode http
802 cookie SERVERID
803 balance roundrobin
804 server web1 192.168.1.1:80 cookie server01 check
805 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
806
willy tarreau2f6ba652005-12-17 13:57:42 +0100807# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +0100808 listen http_proxy 0.0.0.0:80
809 mode http
810 cookie SERVERID
811 balance roundrobin
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100812 option httpchk
willy tarreau5cbea6f2005-12-17 12:48:26 +0100813 server web1 192.168.1.1:80 cookie server01 check
willy tarreauc29948c2005-12-17 13:10:27 +0100814 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +0100815
willy tarreau2f6ba652005-12-17 13:57:42 +0100816# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
817 listen http_proxy 0.0.0.0:80
818 mode http
819 cookie SERVERID
820 balance roundrobin
821 option httpchk /index.html
822 server web1 192.168.1.1:80 cookie server01 check
823 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
824
willy tarreaueedaa9f2005-12-17 14:08:03 +0100825# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
826 listen http_proxy 0.0.0.0:80
827 mode http
828 cookie SERVERID
829 balance roundrobin
830 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
831 server web1 192.168.1.1:80 cookie server01 check
832 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
833
willy tarreau0174f312005-12-18 01:02:42 +0100834# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
835# douceur utilisant un second port (81) juste pour les health-checks.
836 listen http_proxy 0.0.0.0:80
837 mode http
838 cookie JSESSIONID prefix
839 balance roundrobin
840 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
841 server web1-norm 192.168.1.1:80 cookie s1 check port 81
842 server web2-norm 192.168.1.2:80 cookie s2 check port 81
843 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
844 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
845
willy tarreau96d40372005-12-17 13:11:56 +0100846# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +0100847# automatique dans la requête, tout en indiquant aux caches de ne pas garder
848# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +0100849 listen web_appl 0.0.0.0:80
850 mode http
willy tarreau240afa62005-12-17 13:14:35 +0100851 cookie SERVERID insert nocache indirect
willy tarreauc29948c2005-12-17 13:10:27 +0100852 balance roundrobin
853 server web1 192.168.1.1:80 cookie server01 check
854 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +0100855
willy tarreaueedaa9f2005-12-17 14:08:03 +0100856# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +0100857 listen web_appl 0.0.0.0:80
858 mode http
859 cookie SERVERID insert nocache indirect
860 balance roundrobin
861 server web1 192.168.1.1:80 cookie server01 check
862 server web2 192.168.1.2:80 cookie server02 check
willy tarreaueedaa9f2005-12-17 14:08:03 +0100863 server web-backup 192.168.2.1:80 cookie server03 check backup
864 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +0100865
willy tarreaua41a8b42005-12-17 14:02:24 +0100866# relayage SMTP+TLS avec test du serveur et serveur de backup
867
868 listen http_proxy :25,:587
869 mode tcp
870 balance roundrobin
871 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
872 server srv2 192.168.1.2 backup
873
willy tarreau0f7af912005-12-17 12:21:26 +0100874
willy tarreauc29948c2005-12-17 13:10:27 +01008753.2) Reconnexion vers un répartiteur en cas d'échec direct
876----------------------------------------------------------
877En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
878seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
879définitivement privés de service. La spécification du paramètre 'redispatch'
880autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
881(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +0100882
883Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +0100884---------
willy tarreau0f7af912005-12-17 12:21:26 +0100885 listen http_proxy 0.0.0.0:80
886 mode http
887 cookie SERVERID
888 dispatch 192.168.1.100:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100889 server web1 192.168.1.1:80 cookie server01
890 server web2 192.168.1.2:80 cookie server02
willy tarreau8337c6b2005-12-17 13:41:01 +0100891 redispatch # renvoyer vers dispatch si refus de connexion.
892
893Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre redispatch
894ne s'applique qu'aux échecs de connexion au serveur. Depuis la version 1.1.17,
895il s'applique aussi aux connexions destinées à des serveurs identifiés comme
896hors d'usage par la surveillance. Si l'on souhaite malgré tout qu'un client
897disposant d'un cookie correspondant à un serveur défectueux tente de s'y
898connecter, il faut préciser l'option "persist" :
899
900 listen http_proxy 0.0.0.0:80
901 mode http
902 option persist
903 cookie SERVERID
904 dispatch 192.168.1.100:80
905 server web1 192.168.1.1:80 cookie server01
906 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100907 redispatch # renvoyer vers dispatch si serveur HS.
908
willy tarreauc29948c2005-12-17 13:10:27 +0100909
9104) Fonctionnalités additionnelles
911=================================
912
913D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
914principalement du mode transparent, de la journalisation des connexions, et de
915la réécriture des entêtes.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100916
willy tarreau0174f312005-12-18 01:02:42 +01009174.1) Fonctionnalités réseau
918---------------------------
9194.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +0100920---------------------------------------
921En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions routées
922à travers la machine hébergeant le proxy. Dans ce mode, on ne précise pas
923l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
924destination de la session détournée. Le système doit permettre de rediriger les
925paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100926
927Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +0100928---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100929 listen http_proxy 0.0.0.0:65000
930 mode http
931 transparent
932 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100933 server server01 192.168.1.1:80
934 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100935
936 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
937 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +0100938
willy tarreaua41a8b42005-12-17 14:02:24 +0100939Remarque :
940----------
941Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est adressé
942le client qui sera utilisé. Cela permet de relayer tous les ports TCP d'une même
943adresse avec une même instance et sans utiliser directement le mode transparent.
944
945Exemple :
946---------
947 listen http_proxy 0.0.0.0:65000
948 mode tcp
949 server server01 192.168.1.1 check port 60000
950 server server02 192.168.1.2 check port 60000
951
952 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
953 -j REDIRECT --to-ports 65000
954
willy tarreau0174f312005-12-18 01:02:42 +0100955
9564.1.2) Choix d'une adresse source par serveur
957---------------------------------------------------
958Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
959IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
960backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
961pour joindre le même serveur. C'est également utilisable pour faciliter une
962répartition de charge selon l'adresse IP source pour des connexions sortantes.
963Bien entendu, la même adresse est utilisée pour les health-checks.
964
965Exemple :
966---------
967 # utiliser une adresse particulière pour joindre les 2 serveur
968 listen http_proxy 0.0.0.0:65000
969 mode http
970 balance roundrobin
971 server server01 192.168.1.1:80 source 192.168.2.13
972 server server02 192.168.1.2:80 source 192.168.2.13
973
974Exemple :
975---------
976 # utiliser une adresse particulière pour joindre chaque serveur
977 listen http_proxy 0.0.0.0:65000
978 mode http
979 balance roundrobin
980 server server01 192.168.1.1:80 source 192.168.1.1
981 server server02 192.168.2.1:80 source 192.168.2.1
982
983Exemple :
984---------
985 # faire une répartition d'adresse sources pour joindre le même proxy à
986 # travers deux liens WAN
987 listen http_proxy 0.0.0.0:65000
988 mode http
989 balance roundrobin
990 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
991 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
992
993Exemple :
994---------
995 # forcer une connexion TCP à s'attacher à un port particulier
996 listen http_proxy 0.0.0.0:2000
997 mode tcp
998 balance roundrobin
999 server srv1 192.168.1.1:80 source 192.168.2.1:20
1000 server srv2 192.168.1.2:80 source 192.168.2.1:20
1001
willy tarreau0f7af912005-12-17 12:21:26 +01001002
willy tarreauc29948c2005-12-17 13:10:27 +010010034.2) Journalisation des connexions
1004----------------------------------
willy tarreauc1cae632005-12-17 14:12:23 +010010054.2.1) Niveaux de log
1006---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001007Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1008détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1009source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001010la requête HTTP, le code de retour, la quantité de données transmises, et même
1011dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1012Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1013la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001014est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001015
willy tarreau8337c6b2005-12-17 13:41:01 +01001016 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1017 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001018ou
1019 log global
1020
1021Remarque :
1022----------
1023La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1024paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001025
1026Exemple :
1027---------
1028 listen http_proxy 0.0.0.0:80
1029 mode http
1030 log 192.168.2.200 local3
1031 log 192.168.2.201 local4
1032
willy tarreauc1cae632005-12-17 14:12:23 +010010334.2.2) Format des logs
1034----------------------
1035Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1036de la session entre le client et le relais. En précisant l'option 'tcplog',
1037la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1038sur son état lors de la déconnexion, ainsi que le temps de connexion et la
1039durée totale de la session.
1040
willy tarreau982249e2005-12-18 00:57:06 +01001041Exemple :
1042---------
1043 listen relais-tcp 0.0.0.0:8000
1044 mode tcp
1045 option tcplog
1046 log 192.168.2.200 local3
1047
1048>>> haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 --
1049
willy tarreauc1cae632005-12-17 14:12:23 +01001050Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1051notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1052surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1053les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1054ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1055(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001056
willy tarreau036e1ce2005-12-17 13:46:33 +01001057Exemple :
1058---------
1059 listen http_proxy 0.0.0.0:80
1060 mode http
1061 option httplog
1062 option dontlognull
1063 log 192.168.2.200 local3
1064
willy tarreau982249e2005-12-18 00:57:06 +01001065>>> 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"
1066
1067Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1068de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1069Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
1070la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus tôt
1071possible, c'est à dire juste avant que ne débutent les transferts de données.
1072Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat de la
1073connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
1074traitement des entêtes de la réponse du serveur, auquel cas le nombre d'octets
1075représentera la taille des entêtes retournés au client.
1076
1077Afin d'éviter toute confusion avec les logs normaux, le temps total de transfert
1078et le nombre d'octets transférés sont préfixés d'un signe '+' rappeleant que les
1079valeurs réelles sont certainement plus élevées.
1080
1081Exemple :
1082---------
1083
1084 listen http_proxy 0.0.0.0:80
1085 mode http
1086 option httplog
1087 option dontlognull
1088 option logasap
1089 log 192.168.2.200 local3
1090
1091>>> 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"
1092
1093
willy tarreauc1cae632005-12-17 14:12:23 +010010944.2.3) Chronométrage des événements
1095-----------------------------------
1096Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1097événements sont d'une très grande utilité. Tous les temps sont mesurés en
1098millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
1099la forme Tq/Tc/Tr/Tt :
1100
1101 - Tq: temps total de réception de la requête HTTP de la part du client.
1102 C'est le temps qui s'est écoulé entre le moment où le client a établi
1103 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1104 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1105 que la requête complète n'a jamais été reçue.
1106
1107 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1108 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1109 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1110 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1111 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1112 vers le serveur.
1113
1114 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
1115 renvoyer la totalité des entêtes HTTP à partir du moment où il a acquitté
1116 la connexion. Ca représente exactement le temps de traitement de la
1117 transaction sans le transfert des données associées. Une valeur '-1'
1118 indique que le serveur n'a pas envoyé la totalité de l'entête HTTP.
1119
1120 - Tt: durée de vie totale de la session, entre le moment où la demande de
1121 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001122 refermée aux deux extrémités (client et serveur). La signification change
1123 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
1124 uniquement à (Tq + Tc + Tr), et se trouve préfixé d'un signe '+'. On peut
1125 donc déduire Td, le temps de transfert des données, en excluant les autres
1126 temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001127
1128 Td = Tt - (Tq + Tc + Tr)
1129
1130 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1131
1132En mode TCP ('option tcplog'), seuls les deux indicateurs Tc et Tt sont
1133rapportés.
1134
1135Ces temps fournissent de précieux renseignement sur des causes probables de
1136problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1137de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1138de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1139problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1140valeur de time-out dans la configuration, c'est souvent qu'une session a été
1141abandonnée sur expiration d'un time-out.
1142
1143Cas les plus fréquents :
1144
1145 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1146 le client et le relais.
1147 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1148 le relais et le serveur durant la phase de connexion. Cet indicateur
1149 devrait normalement toujours être très bas (moins de quelques dizaines).
1150 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1151 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1152 de pertes entre le relais et le serveur.
1153 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1154 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1155 session est maintenue après la fin des échanges. Voir plus loin pour
1156 savoir comment désactiver le keep-alive HTTP.
1157
1158Autres cas ('xx' représentant une valeur quelconque à ignorer) :
1159 -1/xx/xx/Tt : le client n'a pas envoyé sa requête dans le temps imparti ou
1160 a refermé sa connexion sans compléter la requête.
1161 Tq/-1/xx/Tt : la connexion n'a pas pu s'établir vers le serveur (refus ou
1162 time-out au bout de Tt-Tq ms).
1163 Tq/Tc/-1/Tt : le serveur a accepté la connexion mais n'a pas répondu dans
1164 les temps ou bien a refermé sa connexion trop tôt, au bout
1165 de Tt-(Tq+Tc) ms.
1166
11674.2.4) Conditions de déconnexion
1168--------------------------------
1169Les logs TCP et HTTP fournissent un indicateur de complétude de la session.
1170C'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 +01001171 - sur le premier caractère, un code précisant le premier événement qui a causé
1172 la terminaison de la session :
1173
1174 C : fermeture de la session TCP de la part du client
1175 S : fermeture de la session TCP de la part du serveur, ou refus de connexion
1176 P : terminaison prématurée des sessions par le proxy, pour cas d'erreur
willy tarreau982249e2005-12-18 00:57:06 +01001177 interne, de configuration (ex: filtre d'URL), ou parce qu'un
1178 contrôle de sécurité a détecté une anomalie dans la réponse du
1179 serveur.
willy tarreau036e1ce2005-12-17 13:46:33 +01001180 c : expiration du délai d'attente côté client : clitimeout
1181 s : expiration du délai d'attente côté serveur: srvtimeout et contimeout
1182 - : terminaison normale.
1183
1184 - sur le second caractère, l'état d'avancement de la session HTTP lors de la
1185 fermeture :
1186
1187 R : terminaison en attendant la réception totale de la requête du client
1188 C : terminaison en attendant la connexion vers le serveur
willy tarreau982249e2005-12-18 00:57:06 +01001189 H : terminaison en traitant les entêtes du serveur
willy tarreau036e1ce2005-12-17 13:46:33 +01001190 D : terminaison durant le transfert des données du serveur vers le client
1191 L : terminaison durant le transfert des dernières données du proxy vers
1192 le client, alors que le serveur a déjà fini.
1193 - : terminaison normale, après fin de transfert des données
1194
1195 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001196 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001197
1198 N : aucun cookie de persistence n'a été présenté.
1199 I : le client a présenté un cookie ne correspondant à aucun serveur
1200 connu.
1201 D : le client a présenté un cookie correspondant à un serveur hors
1202 d'usage. Suivant l'option 'persist', il a été renvoyé vers un
1203 autre serveur ou a tout de même tenté de se connecter sur celui
1204 correspondant au cookie.
1205 V : le client a présenté un cookie valide et a pu se connecter au
1206 serveur correspondant.
1207 - : non appliquable
1208
1209 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001210 persistence retrourné par le serveur (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001211
1212 N : aucun cookie de persistence n'a été fourni par le serveur.
willy tarreau197e8ec2005-12-17 14:10:59 +01001213 P : un cookie de persistence a été fourni par le serveur et transmis
1214 tel quel.
willy tarreau036e1ce2005-12-17 13:46:33 +01001215 I : aucun cookie n'a été fourni par le serveur, il a été inséré par le
1216 proxy.
1217 D : le cookie présenté par le serveur a été supprimé par le proxy pour
1218 ne pas être retourné au client.
1219 R : le cookie retourné par le serveur a été modifié par le proxy.
1220 - : non appliquable
1221
willy tarreau8337c6b2005-12-17 13:41:01 +01001222Le mot clé "capture" permet d'ajouter dans des logs HTTP des informations
1223capturées dans les échanges. La version 1.1.17 supporte uniquement une capture
1224de cookies client et serveur, ce qui permet dans bien des cas, de reconstituer
1225la session d'un utilisateur. La syntaxe est la suivante :
1226
1227 capture cookie <préfixe_cookie> len <longueur_capture>
1228
1229Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1230transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1231caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1232le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
1233place dans les logs.
1234
1235Exemples :
1236----------
1237 # capture du premier cookie dont le nom commence par "ASPSESSION"
1238 capture cookie ASPSESSION len 32
1239
1240 # capture du premier cookie dont le nom est exactement "vgnvisitor"
1241 capture cookie vgnvisitor= len 32
1242
willy tarreau036e1ce2005-12-17 13:46:33 +01001243Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
1244positionné par le serveur, précédé du cookie positionné par le client. Chacun de
1245ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni par le
1246client ou le serveur.
willy tarreau8337c6b2005-12-17 13:41:01 +01001247
willy tarreauc1cae632005-12-17 14:12:23 +010012484.2.5) Exemples de logs
1249-----------------------
1250- 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"
1251 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
1252 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01001253
willy tarreau982249e2005-12-18 00:57:06 +01001254- 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"
1255 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
1256 log a été généré juste avant le transfert de données. Le serveur a répondu
1257 en 14 ms, 243 octets d'entêtes ont été transférés au client, et le temps
1258 total entre l'accept() et le premier octet de donnée est de 30 ms.
1259
1260- 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"
1261 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
1262 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
1263 d'informations risquant d'être cachées. Dans ce cas, la réponse est
1264 remplacée par '502 bad gateway'.
1265
willy tarreauc1cae632005-12-17 14:12:23 +01001266- haproxy[18113]: 127.0.0.1:34548 [15/Oct/2003:15:18:55] relais-http <NOSRV> -1/-1/-1/8490 -1 0 - - CR-- ""
1267 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
1268 ('C---') au bout de 8.5s, alors que le relais attendait l'entête ('-R--').
1269 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01001270
willy tarreauc1cae632005-12-17 14:12:23 +01001271- haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06] relais-http <NOSRV> -1/-1/-1/50001 408 0 - - cR-- ""
1272 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
1273 bout de 50s, alors que le relais attendait l'entête ('-R--'). Aucune
1274 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
1275 pu renvoyer un message 408 au client.
1276
1277- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
1278 => log en mode 'tcplog'. Expiration du time-out côté client ('c----') au bout
1279 de 5s.
1280
1281- 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"
1282 => La requête client met 3s à entrer (peut-être un problème réseau), et la
1283 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
1284 secondes (retries 3 dans la conf), puis un code 503 est retourné au client.
willy tarreau0f7af912005-12-17 12:21:26 +01001285
willy tarreau4302f492005-12-18 01:00:37 +010012864.2.6) Caractères non-imprimables
1287---------------------------------
1288Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
1289tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
1290hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
1291dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
1292caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
1293est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
1294les en-têtes.
1295
12964.2.7) Journalisation d'en-têtes
1297--------------------------------
1298Depuis la version 1.1.29, il est désormais possible de conserver des extraits
1299d'en-têtes HTTP dans les logs. On peut aussi bien extraire des en-têtes de la
1300requête que de la réponse. C'est particulièrement pratique pour savoir à quel
1301serveur virtuel une requête s'adressait, pour connaitre la longueur des données
1302émises lors d'un POST, ou encore loguer un identifiant unique de requête
1303positionné en amont. Dans la réponse, on peut chercher également à conserver des
1304informations relatives à la taille annoncée de la réponse, le fonctionnement
1305attendu du cache, ou encore la localisation d'un objet en cas de redirection.
1306La syntaxe est la suivante :
1307
1308 capture request header <nom> len <longueur max>
1309 capture response header <nom> len <longueur max>
1310
1311Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
1312
1313Exemples:
1314---------
1315 # conserver le nom du serveur virtuel accédé par le client
1316 capture request header Host len 20
1317 # noter la longueur des données envoyées dans un POST
1318 capture request header Content-Length len 10
1319
1320 # noter le fonctionnement attendu du cache par le serveur
1321 capture response header Cache-Control len 8
1322 # noter l'URL de redirection
1323 capture response header Location len 20
1324
1325Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
1326fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
1327regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
1328chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
1329réponse sont présentés de la même manière, mais après un espace suivant le bloc
1330d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
1331
1332Config:
1333
1334 capture request header Host len 20
1335 capture request header Content-Length len 10
1336 capture request header Referer len 20
1337 capture response header Server len 20
1338 capture response header Content-Length len 10
1339 capture response header Cache-Control len 8
1340 capture response header Via len 20
1341 capture response header Location len 20
1342
1343Log :
1344
1345Aug 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/"
1346Aug 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"
1347Aug 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"
1348
willy tarreauc29948c2005-12-17 13:10:27 +010013494.3) Modification des entêtes HTTP
1350----------------------------------
1351En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
1352requête et/ou la réponse à partir d'expressions régulières. Il est également
1353possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou de
1354la requête. Une limitation cependant : les en-têtes fournis au milieu de
1355connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
1356comme faisant partie des échanges de données consécutifs à la première requête.
1357Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01001358
1359La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01001360 reqadd <string> pour ajouter un en-tête dans la requête
1361 reqrep <search> <replace> pour modifier la requête
1362 reqirep <search> <replace> idem sans distinction majuscules/minuscules
1363 reqdel <search> pour supprimer un en-tête dans la requête
1364 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001365 reqallow <search> autoriser la requête si un entête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01001366 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001367 reqdeny <search> interdire la requête si un entête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01001368 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001369 reqpass <search> inhibe ces actions sur les entêtes validant <search>
1370 reqipass <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001371
willy tarreau036e1ce2005-12-17 13:46:33 +01001372 rspadd <string> pour ajouter un en-tête dans la réponse
1373 rsprep <search> <replace> pour modifier la réponse
1374 rspirep <search> <replace> idem sans distinction majuscules/minuscules
1375 rspdel <search> pour supprimer un en-tête dans la réponse
1376 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01001377 rspdeny <search> remplace la réponse par un HTTP 502 si un
1378 entête valide <search>
1379 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001380
willy tarreau0f7af912005-12-17 12:21:26 +01001381
willy tarreau036e1ce2005-12-17 13:46:33 +01001382<search> est une expression régulière compatible POSIX regexp supportant le
1383groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
1384doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
1385chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
1386backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01001387
1388 \t pour une tabulation
1389 \r pour un retour charriot
1390 \n pour un saut de ligne
1391 \ pour différencier un espace d'un séparateur
1392 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01001393 \\ pour utiliser un backslash dans la regex
1394 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01001395 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01001396
willy tarreau0f7af912005-12-17 12:21:26 +01001397
willy tarreau5cbea6f2005-12-17 12:48:26 +01001398<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
1399Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
1400groupe délimité par des parenthèses dans l'expression régulière, par sa
1401position numérale. Les positions vont de 1 à 9, et sont codées par un '\'
1402suivi du chiffre désiré. Il est également possible d'insérer un caractère non
1403imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code
1404hexadécimal de ce caractère (comme en C).
1405
1406<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01001407dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001408
1409Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01001410-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001411 - 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 +01001412 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001413 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
1414 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
1415 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01001416 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
1417 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
1418 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
1419 entêtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01001420 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
1421 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
willy tarreau0f7af912005-12-17 12:21:26 +01001422
1423Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01001424----------
1425 ###### a few examples ######
1426
1427 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
1428 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
1429 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
1430
1431 # force proxy connections to close
willy tarreauc29948c2005-12-17 13:10:27 +01001432 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
willy tarreau197e8ec2005-12-17 14:10:59 +01001433 # rewrite locations
willy tarreauc29948c2005-12-17 13:10:27 +01001434 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001435
1436 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01001437
willy tarreau197e8ec2005-12-17 14:10:59 +01001438 # Every header should end with a colon followed by one space.
1439 reqideny ^[^:\ ]*[\ ]*$
1440
1441 # block Apache chunk exploit
1442 reqideny ^Transfer-Encoding:[\ ]*chunked
1443 reqideny ^Host:\ apache-
1444
1445 # block annoying worms that fill the logs...
1446 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
1447 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
1448 reqideny ^[^:\ ]*\ .*<script
1449 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
1450
1451 # allow other syntactically valid requests, and block any other method
1452 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
1453 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
1454 reqideny ^[^:\ ]*\
1455
1456 # force connection:close, thus disabling HTTP keep-alive
willy tarreau982249e2005-12-18 00:57:06 +01001457 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01001458
1459 # change the server name
1460 rspidel ^Server:\
1461 rspadd Server:\ Formilux/0.1.8
1462
willy tarreau0f7af912005-12-17 12:21:26 +01001463
willy tarreau982249e2005-12-18 00:57:06 +01001464De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01001465'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
1466connaître l'adresse IP du client initial.
1467
willy tarreau982249e2005-12-18 00:57:06 +01001468Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
1469entête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
1470Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
1471méthode impliquant 4 règles.
1472
willy tarreauc1cae632005-12-17 14:12:23 +01001473Exemple :
1474---------
1475 listen http_proxy 0.0.0.0:80
1476 mode http
1477 log global
1478 option httplog
1479 option dontlognull
1480 option forwardfor
willy tarreau982249e2005-12-18 00:57:06 +01001481 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01001482
willy tarreauc29948c2005-12-17 13:10:27 +010014834.4) Répartition avec persistence
1484---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001485La combinaison de l'insertion de cookie avec la répartition de charge interne
1486permet d'assurer une persistence dans les sessions HTTP d'une manière
1487pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01001488 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01001489 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01001490 - insérer un cookie dans les réponses issues d'une répartition uniquement,
1491 et faire en sorte que des caches ne mémorisent pas ce cookie.
1492 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001493
1494Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01001495---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001496 listen application 0.0.0.0:80
1497 mode http
willy tarreau240afa62005-12-17 13:14:35 +01001498 cookie SERVERID insert nocache indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +01001499 balance roundrobin
1500 server 192.168.1.1:80 cookie server01 check
1501 server 192.168.1.2:80 cookie server02 check
1502
willy tarreau0174f312005-12-18 01:02:42 +01001503L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
1504cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
1505Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
1506client et le serveur de travailler en mode "keep-alive" afin que le proxy
1507puisse corriger le nom du cookie dans toutes les futures requêtes.
1508
1509 listen application 0.0.0.0:80
1510 mode http
1511 cookie JSESSIONID prefix
1512 balance roundrobin
1513 server 192.168.1.1:80 cookie srv1 check
1514 server 192.168.1.2:80 cookie srv2 check
1515 option httpclose
1516
1517
willy tarreau982249e2005-12-18 00:57:06 +010015184.5) Protection contre les fuites d'informations du serveur
1519-----------------------------------------------------------
1520Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été créée.
1521Elle sert à inspecter minutieusement les entêtes 'Cache-control', 'Pragma', et
1522'Set-cookie' dans les réponses serveur pour déterminer s'il y a un risque de
1523cacher un cookie sur un proxy côté client. Quand cette option est activée, les
1524seules réponses qui peuvent être retournées au client sont :
1525 - toutes celles qui n'ont pas d'entête 'Set-cookie' ;
1526 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
1527 410, sauf si le server a positionné un entête 'Cache-control: public' ;
1528 - celles qui font suite à une requête POST, sauf si le serveur a positionné
1529 un entête 'Cache-control: public' ;
1530 - celles qui ont un entête 'Pragma: no-cache' ;
1531 - celles qui ont un entête 'Cache-control: private' ;
1532 - celles qui ont un entête 'Cache-control: no-store' ;
1533 - celles qui ont un entête 'Cache-control: max-age=0' ;
1534 - celles qui ont un entête 'Cache-control: s-maxage=0' ;
1535 - celles qui ont un entête 'Cache-control: no-cache' ;
1536 - celles qui ont un entête 'Cache-control: no-cache="set-cookie"' ;
1537 - celles qui ont un entête 'Cache-control: no-cache="set-cookie,'
1538 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01001539
willy tarreau982249e2005-12-18 00:57:06 +01001540Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
1541même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
1542message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
1543dire que c'est le proxy qui a bloqué la réponse durant le traitement des
1544entêtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
1545l'administrateur sache qu'il y a une action correctrice à entreprendre.
1546
15474.6) Personalisation des erreurs
1548--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01001549Certaines situations conduisent à retourner une erreur HTTP au client :
1550 - requête invalide ou trop longue => code HTTP 400
1551 - requête mettant trop de temps à venir => code HTTP 408
1552 - requête interdite (bloquée par un reqideny) => code HTTP 403
1553 - erreur interne du proxy => code HTTP 500
1554 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
1555 - aucun serveur disponible pour cette requête => code HTTP 503
1556 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
1557
1558Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
1559Cependant, en fonction du type de clientèle, on peut préférer retourner des
1560pages personnalisées. Ceci est possible par le biais de la commande "errorloc" :
1561
1562 errorloc <code_HTTP> <location>
1563
1564Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
1565le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
1566d'une page précisée dans <location>. Cette adresse peut être relative au site,
1567ou absolue. Comme cette réponse est traîtée par le navigateur du client
1568lui-même, il est indispensable que l'adresse fournie lui soit accessible.
1569
1570Exemple :
1571---------
1572 listen application 0.0.0.0:80
1573 errorloc 400 /badrequest.html
1574 errorloc 403 /forbidden.html
1575 errorloc 408 /toolong.html
1576 errorloc 500 http://haproxy.domain.net/bugreport.html
1577 errorloc 502 http://192.168.114.58/error50x.html
1578 errorloc 503 http://192.168.114.58/error50x.html
1579 errorloc 504 http://192.168.114.58/error50x.html
1580
willy tarreau982249e2005-12-18 00:57:06 +010015814.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01001582--------------------------------------
willy tarreaua41a8b42005-12-17 14:02:24 +01001583Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui évite
1584de répéter des paramètres communs à toutes les instances, tels que les timeouts,
1585adresses de log, modes de fonctionnement, etc.
1586
1587Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
1588précédent l'instance qui les utilisera. On peut donc mettre autant de sections
1589'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
1590section implique une annulation de tous les paramètres par défaut positionnés
1591précédemment, dans le but de les remplacer.
1592
1593La section 'defaults' utilise la même syntaxe que la section 'listen', aux
1594paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
1595un commentaire en guise paramètre.
1596
willy tarreau982249e2005-12-18 00:57:06 +01001597Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
1598positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01001599 - log (le premier et le second)
1600 - mode { tcp, http, health }
1601 - balance { roundrobin }
1602 - disabled (pour désactiver toutes les instances qui suivent)
1603 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
1604 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01001605 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
1606 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01001607 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01001608 - cookie, capture
1609 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01001610
1611Ne sont pas supportés dans cette version, les adresses de dispatch et les
1612configurations de serveurs, ainsi que tous les filtres basés sur les
1613expressions régulières :
1614 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01001615 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01001616
1617Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
1618positionné par défaut. Donc si une option est spécifiée dans les paramètres par
1619défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
1620paramètres par défaut avant la déclaration de l'instance.
1621
1622Exemples :
1623----------
1624 defaults applications TCP
1625 log global
1626 mode tcp
1627 balance roundrobin
1628 clitimeout 180000
1629 srvtimeout 180000
1630 contimeout 4000
1631 retries 3
1632 redispatch
1633
1634 listen app_tcp1 10.0.0.1:6000-6063
1635 server srv1 192.168.1.1 check port 6000 inter 10000
1636 server srv2 192.168.1.2 backup
1637
1638 listen app_tcp2 10.0.0.2:6000-6063
1639 server srv1 192.168.2.1 check port 6000 inter 10000
1640 server srv2 192.168.2.2 backup
1641
1642 defaults applications HTTP
1643 log global
1644 mode http
1645 option httplog
1646 option forwardfor
1647 option dontlognull
1648 balance roundrobin
1649 clitimeout 20000
1650 srvtimeout 20000
1651 contimeout 4000
1652 retries 3
1653
1654 listen app_http1 10.0.0.1:80-81
1655 cookie SERVERID postonly insert indirect
1656 capture cookie userid= len 10
1657 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
1658 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
1659
1660 defaults
1661 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01001662
willy tarreaub719f002005-12-17 12:55:07 +01001663=======================
1664| Paramétrage système |
1665=======================
willy tarreau0f7af912005-12-17 12:21:26 +01001666
1667Sous Linux 2.4
1668==============
1669
willy tarreaub719f002005-12-17 12:55:07 +01001670-- cut here --
1671#!/bin/sh
1672# set this to about 256/4M (16384 for 256M machine)
1673MAXFILES=16384
1674echo $MAXFILES > /proc/sys/fs/file-max
1675ulimit -n $MAXFILES
1676
1677if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
1678 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
1679fi
1680
1681if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
1682 # 30 seconds for fin, 15 for time wait
1683 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
1684 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
1685 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
1686 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
1687fi
1688
willy tarreau0f7af912005-12-17 12:21:26 +01001689echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01001690echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
1691echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01001692echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01001693echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
1694echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01001695echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
1696echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01001697echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreaub719f002005-12-17 12:55:07 +01001698echo 0 > /proc/sys/net/ipv4/tcp_sack
1699echo 0 > /proc/sys/net/ipv4/tcp_dsack
1700
1701# auto-tuned on 2.4
1702#echo 262143 > /proc/sys/net/core/rmem_max
1703#echo 262143 > /proc/sys/net/core/rmem_default
1704
1705echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
1706echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
1707
1708-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01001709
willy tarreau197e8ec2005-12-17 14:10:59 +01001710Sous FreeBSD
1711============
1712
1713Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
1714Clement Laforet <sheepkiller@cultdeadsheep.org>.
1715
1716Pour plus d'informations :
1717http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
1718http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
1719http://www.freshports.org/net/haproxy
1720
1721
willy tarreau0f7af912005-12-17 12:21:26 +01001722-- fin --