blob: f1b08e87b4a60c95858d5fdd5f91c72550d92c6b [file] [log] [blame]
willy tarreau0f7af912005-12-17 12:21:26 +01001
2 H A - P r o x y
3 ---------------
willy tarreaufe2c5c12005-12-17 14:14:34 +01004 version 1.1.27
willy tarreau0f7af912005-12-17 12:21:26 +01005 willy tarreau
willy tarreaufe2c5c12005-12-17 14:14:34 +01006 2003/10/27
willy tarreau0f7af912005-12-17 12:21:26 +01007
willy tarreaub719f002005-12-17 12:55:07 +01008================
9| Introduction |
10================
willy tarreau0f7af912005-12-17 12:21:26 +010011
12HA-Proxy est un relais TCP/HTTP offrant des facilités d'intégration en
13environnement hautement disponible. En effet, il est capable de :
willy tarreauc29948c2005-12-17 13:10:27 +010014 - effectuer un aiguillage statique défini par des cookies ;
15 - effectuer une répartition de charge avec création de cookies pour assurer la
willy tarreaua1598082005-12-17 13:08:06 +010016 persistence de session ;
willy tarreau0f7af912005-12-17 12:21:26 +010017 - fournir une visibilité externe de son état de santé ;
willy tarreau8337c6b2005-12-17 13:41:01 +010018 - s'arrêter en douceur sans perte brutale de service ;
19 - modifier/ajouter/supprimer des entêtes dans la requête et la réponse ;
20 - interdire des requêtes qui vérifient certaines conditions ;
21 - utiliser des serveurs de secours lorsque les serveurs principaux sont hors
22 d'usage.
willy tarreau0f7af912005-12-17 12:21:26 +010023
willy tarreaua1598082005-12-17 13:08:06 +010024Il requiert peu de ressources, et son architecture événementielle mono-processus
25lui permet facilement de gérer plusieurs milliers de connexions simultanées sur
26plusieurs relais sans effondrer le système.
27
willy tarreau0f7af912005-12-17 12:21:26 +010028
29===========================
30| Paramètres de lancement |
31===========================
32
33Les options de lancement sont peu nombreuses :
34
35 -f <fichier de configuration>
36 -n <nombre maximal total de connexions simultanées>
37 -N <nombre maximal de connexions simultanées par proxy>
38 -d active le mode debug
39 -D passe en daemon
willy tarreaufe2c5c12005-12-17 14:14:34 +010040 -p <fichier> indique au processus père qu'il doit écrire les PIDs de ses
41 fils dans ce fichier en mode démon.
willy tarreau0f7af912005-12-17 12:21:26 +010042 -s affiche les statistiques (si option compilée)
43 -l ajoute des informations aux statistiques
44
willy tarreaua1598082005-12-17 13:08:06 +010045Le nombre maximal de connexion simultanées par proxy est le paramètre par défaut
46pour les proxies pour lesquels ce paramètre n'est pas précisé dans le fichier de
47configuration. Il s'agit du paramètre 'maxconn' dans les sections 'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010048
willy tarreaua1598082005-12-17 13:08:06 +010049Le nombre maximal total de connexions simultanées limite le nombre de connexions
willy tarreauc29948c2005-12-17 13:10:27 +010050TCP utilisables à un instant donné par le processus, tous proxies confondus. Ce
willy tarreaua1598082005-12-17 13:08:06 +010051paramètre remplace le paramètre 'maxconn' de la section 'global'.
52
willy tarreauc29948c2005-12-17 13:10:27 +010053Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
54mode, toutes les connexions, déconnexions, et tous les échanges d'entêtes HTTP
55sont affichés.
56
57Les statistiques ne sont disponibles que si le programme a été compilé avec
58l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
59d'utilité que lors de benchmarks par exemple.
60
willy tarreau0f7af912005-12-17 12:21:26 +010061
62============================
63| Fichier de configuration |
64============================
65
willy tarreauc29948c2005-12-17 13:10:27 +010066Structure
67=========
willy tarreau0f7af912005-12-17 12:21:26 +010068
willy tarreaua1598082005-12-17 13:08:06 +010069L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
70les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est pas
willy tarreauc29948c2005-12-17 13:10:27 +010071précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +010072
73Le fichier de configuration est découpé en sections répérées par des mots clés
74tels que :
75
76 - 'global'
77 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +010078 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +010079
80Tous les paramètres font référence à la section définie par le dernier mot clé
81reconnu.
82
83
willy tarreauc29948c2005-12-17 13:10:27 +0100841) Paramètres globaux
85=====================
willy tarreaua1598082005-12-17 13:08:06 +010086
87Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
88proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
89supportés sont :
90
willy tarreau8337c6b2005-12-17 13:41:01 +010091 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +010092 - maxconn <nombre>
93 - uid <identifiant>
94 - gid <identifiant>
95 - chroot <répertoire>
96 - nbproc <nombre>
97 - daemon
98 - debug
99 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100100 - pidfile <fichier>
willy tarreaua1598082005-12-17 13:08:06 +0100101
1021.1) Journalisation des événements
103----------------------------------
104La plupart des événements sont journalisés : démarrages, arrêts, disparition et
105apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
106syslog vers un ou deux serveurs. La syntaxe est la suivante :
107
willy tarreau8337c6b2005-12-17 13:41:01 +0100108 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100109
110Les connexions sont envoyées en niveau "info". Les démarrages de service et de
111serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
112arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau8337c6b2005-12-17 13:41:01 +0100113bien pour les proxies que pour les serveurs testés par les proxies. Le paramètre
114optionnel <niveau_max> définit le niveau maximal de traces émises parmi les 8
115valeurs suivantes :
116 emerg, alert, crit, err, warning, notice, info, debug
117
willy tarreaueedaa9f2005-12-17 14:08:03 +0100118Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100119est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100120
121Les catégories possibles sont :
122 kern, user, mail, daemon, auth, syslog, lpr, news,
123 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
124 local0, local1, local2, local3, local4, local5, local6, local7
125
willy tarreau036e1ce2005-12-17 13:46:33 +0100126Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
127
willy tarreaua1598082005-12-17 13:08:06 +0100128Exemple :
129---------
130 global
131 log 192.168.2.200 local3
willy tarreau8337c6b2005-12-17 13:41:01 +0100132 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100133
1341.2) limitation du nombre de connexions
135---------------------------------------
136Il est possible et conseillé de limiter le nombre global de connexions par
137processus. Les connexions sont comprises au sens 'acceptation de connexion',
138donc il faut s'attendre en règle général à avoir un peu plus du double de
139sessions TCP que le maximum de connexions fixé. C'est important pour fixer le
140paramètre 'ulimit -n' avant de lancer le proxy. Pour comptabiliser le nombre
141de sockets nécessaires, il faut prendre en compte ces paramètres :
142 - 1 socket par connexion entrante
143 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100144 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100145 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100146 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100147
willy tarreaueedaa9f2005-12-17 14:08:03 +0100148Dans le cas où chaque proxy n'écoute que sur un couple adresse/port, positionner
149la limite du nombre de descripteurs de fichiers (ulimit -n) à
150(2 * maxconn + nbproxy + nbserveurs + 1). Dans une future version, haproxy sera
willy tarreauc29948c2005-12-17 13:10:27 +0100151capable de positionner lui-même cette limite.
152
1531.3) Diminution des privilèges
154------------------------------
155Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
156serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100157de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100158
willy tarreauc29948c2005-12-17 13:10:27 +0100159Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
160numérique d'utilisateur. La valeur 0, correspondant normalement au super-
161utilisateur, possède ici une signification particulière car elle indique que
162l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
163C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
164un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
165changer. Il est particulièrement déconseillé d'utiliser des comptes génériques
166tels que 'nobody' car cette pratique revient à utiliser 'root' si d'autres
167processus utilisent les mêmes identifiants.
168
169Le paramètre 'chroot' autorise à changer la racine du processus une fois le
170programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100171puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100172généralement contournable sur certains OS (Linux, Solaris) pour peu que
173l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
174un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
175service pour cet usage, et de ne pas mutualiser un même répertoire pour
176plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
177il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
178l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100179
180Remarque: dans le cas où une telle faille serait mise en évidence, il est fort
181probable que les premières tentatives de son exploitation provoquent un arrêt du
182programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
183encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur en
184environnement limité réduit les risques d'intrusion, il est parfois bien utile
185dans ces circonstances de connaître les conditions d'apparition du problème, via
186l'obtention d'un fichier 'core'. La plupart des systèmes, pour des raisons de
187sécurité, désactivent la génération du fichier 'core' après un changement
188d'identifiant pour le processus. Il faudra donc soit lancer le processus à
189partir d'un compte utilisateur aux droits réduits (mais ne pouvant pas effectuer
190le chroot), ou bien le faire en root sans réduction des droits (uid 0). Dans ce
191cas, le fichier se trouvera soit dans le répertoire de lancement, soit dans le
192répertoire spécifié après l'option 'chroot'. Ne pas oublier la commande suivante
193pour autoriser la génération du fichier avant de lancer le programme :
194
195# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100196
willy tarreauc29948c2005-12-17 13:10:27 +0100197Exemple :
198---------
199
200 global
201 uid 30000
202 gid 30000
203 chroot /var/chroot/haproxy
204
willy tarreaufe2c5c12005-12-17 14:14:34 +01002051.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100206----------------------------
207Le service peut fonctionner dans plusieurs modes :
208 - avant- / arrière-plan
209 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100210
willy tarreauc29948c2005-12-17 13:10:27 +0100211Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne rend
212pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci dans un
213script de démarrage du système, sinon le système ne finirait pas son
214initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
215au processus appelant. C'est ce que fait l'option 'daemon' de la section
216'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100217
willy tarreauc29948c2005-12-17 13:10:27 +0100218Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
219standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
220logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
221Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100222
willy tarreauc29948c2005-12-17 13:10:27 +0100223Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
224problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
225entre les clients et les serveurs. Ce mode est incompatible avec les options
226'daemon' et 'quiet' pour des raisons de bon sens.
227
willy tarreaufe2c5c12005-12-17 14:14:34 +01002281.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100229-----------------------------------------------
230Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
231processeur pour effectuer les tâches de relayage, même si les charges
232nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
233grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
234programme sait démarrer plusieurs processus se répartissant la charge de
235travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
236section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
237qu'en mode 'daemon'.
238
239Exemple :
240---------
241
242 global
243 daemon
244 quiet
245 nbproc 2
246
willy tarreaufe2c5c12005-12-17 14:14:34 +01002471.6) Simplification de la gestion des processus
248-----------------------------------------------
249Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
250paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
251d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
252le numéro de PID des processus fils, à raison d'un par ligne (valable
253uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
254afin de rester compatible avec un répertoire protégé en lecture seule. Il
255appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
2560644.
257
258Exemple :
259---------
260
261 global
262 daemon
263 quiet
264 nbproc 2
265 pidfile /var/run/haproxy-private.pid
266
267 # pour stopper seulement ces processus parmi d'autres :
268 # kill $(</var/run/haproxy-private.pid)
269
willy tarreauc29948c2005-12-17 13:10:27 +0100270
2712) Définition d'un service en écoute
272====================================
273
274Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100275
willy tarreaua41a8b42005-12-17 14:02:24 +0100276 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100277
willy tarreauc29948c2005-12-17 13:10:27 +0100278- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
279 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé. Aucun
280 test n'est effectué concernant l'unicité de ce nom, qui n'est pas obligatoire,
willy tarreaua41a8b42005-12-17 14:02:24 +0100281 mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100282
willy tarreaua41a8b42005-12-17 14:02:24 +0100283- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
284 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
285 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100286
willy tarreaua41a8b42005-12-17 14:02:24 +0100287- <plage_ports> correspond soit à un port, soit à une plage de ports sur
288 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
289 Cette plage peut être :
290 - soit un port numérique (ex: '80')
291 - soit une plage constituée de deux valeurs séparées par un tiret
292 (ex: '2000-2100') représentant les extrémités incluses dans la
293 plage.
294 Il faut faire attention à l'usage des plages, car chaque combinaison
295 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
296 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
297 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
298 niveau de privilège particulier lors du lancement du programme (indépendamment
299 du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100300
willy tarreaua41a8b42005-12-17 14:02:24 +0100301- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
302 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
303 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
304
305Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100306---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100307 listen http_proxy :80
308 listen x11_proxy 127.0.0.1:6000-6009
309 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
310 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100311
willy tarreaua41a8b42005-12-17 14:02:24 +0100312Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
313rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
314de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
315l'écriture de configurations :
316
317 bind [ <adresse_IP>:<plage_ports>[,...] ]
318
319Exemples :
320----------
321 listen http_proxy
322 bind :80,:443
323 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100324
willy tarreauc29948c2005-12-17 13:10:27 +01003252.1) Inhibition d'un service
326----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100327Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100328commenter toute une partie du fichier. Il suffit de positionner le mot clé
329"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100330
331 listen smtp_proxy 0.0.0.0:25
332 disabled
333
willy tarreaueedaa9f2005-12-17 14:08:03 +0100334Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
335 désactivé par le mot clé 'disabled', par exemple à cause d'une
336 configuration par défaut.
337
willy tarreauc29948c2005-12-17 13:10:27 +01003382.2) Mode de fonctionnement
339---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100340Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100341 - TCP
342 - HTTP
343 - supervision
344
345Mode TCP
346--------
willy tarreauc29948c2005-12-17 13:10:27 +0100347Dans ce mode, le service relaye, dès leur établissement, les connexions TCP vers
348un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il s'agit
349simplement d'une association source<adresse:port> -> destination<adresse:port>.
350Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100351
willy tarreauc29948c2005-12-17 13:10:27 +0100352Exemple :
353---------
willy tarreau0f7af912005-12-17 12:21:26 +0100354 listen smtp_proxy 0.0.0.0:25
355 mode tcp
356
357Mode HTTP
358---------
willy tarreauc29948c2005-12-17 13:10:27 +0100359Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
360serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
361décision. Les entêtes HTTP sont analysés pour y trouver un éventuel cookie, et
362certains d'entre-eux peuvent être modifiés par le biais d'expressions
363régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
364relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100365
willy tarreauc29948c2005-12-17 13:10:27 +0100366Exemple :
367---------
willy tarreau0f7af912005-12-17 12:21:26 +0100368 listen http_proxy 0.0.0.0:80
369 mode http
370
371Mode supervision
372----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100373Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
374santé du service. Il se contente de retourner "OK" à tout client se connectant
375sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100376déterminer quels sont les services utilisables. Si l'option 'httpchk' est
377activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
378attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100379le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100380
willy tarreauc29948c2005-12-17 13:10:27 +0100381Exemple :
382---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100383 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100384 listen health_check 0.0.0.0:60000
385 mode health
386
willy tarreau197e8ec2005-12-17 14:10:59 +0100387 # réponse HTTP : 'HTTP/1.0 200 OK'
388 listen http_health_check 0.0.0.0:60001
389 mode health
390 option httpchk
391
willy tarreau0f7af912005-12-17 12:21:26 +0100392
willy tarreauc29948c2005-12-17 13:10:27 +01003932.3) Limitation du nombre de connexions simultanées
394---------------------------------------------------
395Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
396connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
397d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
398limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100399
willy tarreauc29948c2005-12-17 13:10:27 +0100400Exemple :
401---------
402 listen tiny_server 0.0.0.0:80
403 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100404
405
willy tarreauc29948c2005-12-17 13:10:27 +01004062.4) Arrêt en douceur
407---------------------
408Il est possible d'arrêter les services en douceur en envoyant un signal SIG_USR1
409au processus relais. Tous les services seront alors mis en phase d'arrêt, mais
410pourront continuer d'accepter des connexions pendant un temps défini par le
411paramètre 'grace' (en millisecondes). Cela permet par exemple, de faire savoir
412rapidement à un répartiteur de charge qu'il ne doit plus utiliser un relais,
413tout en continuant d'assurer le service le temps qu'il s'en rende compte.
414Remarque : les connexions actives ne sont jamais cassées. Dans le pire des cas,
415il faudra attendre en plus leur expiration avant l'arrêt total du processus. La
416valeur par défaut est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100417
418Exemple :
419---------
willy tarreauc29948c2005-12-17 13:10:27 +0100420 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100421 # le service tournera encore 10 secondes après la demande d'arrêt
422 listen http_proxy 0.0.0.0:80
423 mode http
424 grace 10000
425
willy tarreauc29948c2005-12-17 13:10:27 +0100426 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100427 listen health_check 0.0.0.0:60000
428 mode health
429 grace 0
430
431
willy tarreauc29948c2005-12-17 13:10:27 +01004322.5) Temps d'expiration des connexions
433--------------------------------------
434Il est possible de paramétrer certaines durées d'expiration au niveau des
435connexions TCP. Trois temps indépendants sont configurables et acceptent des
436valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
437session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100438
439 - temps d'attente d'une donnée de la part du client, ou de la
440 possibilité de lui envoyer des données : "clitimeout" :
441
442 # time-out client à 2mn30.
443 clitimeout 150000
444
445 - temps d'attente d'une donnée de la part du serveur, ou de la
446 possibilité de lui envoyer des données : "srvtimeout" :
447
willy tarreauc29948c2005-12-17 13:10:27 +0100448 # time-out serveur à 30s.
willy tarreau0f7af912005-12-17 12:21:26 +0100449 srvtimeout 30000
450
451 - temps d'attente de l'établissement d'une connexion vers un serveur
452 "contimeout" :
453
willy tarreauc29948c2005-12-17 13:10:27 +0100454 # on abandonne si la connexion n'est pas établie après 4 secondes
455 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100456
willy tarreauc29948c2005-12-17 13:10:27 +0100457Remarques :
458-----------
459 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
460 type "health".
461 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
462 possible de perdre des paquets. Du fait que la première retransmission TCP
463 n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion inférieur
464 à 3 secondes ne permet pas de se rattraper sur la perte de paquets car la
465 session aura été abandonnée avant la première retransmission. Une valeur de
466 4 secondes réduira considérablement le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100467
willy tarreauc29948c2005-12-17 13:10:27 +01004682.6) Tentatives de reconnexion
469------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100470Lors d'un échec de connexion vers un serveur, il est possible de
471retenter (potentiellement vers un autre serveur, en cas de répartition
472de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100473abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100474
willy tarreauc29948c2005-12-17 13:10:27 +0100475Exemple :
476---------
willy tarreau0f7af912005-12-17 12:21:26 +0100477 # on essaie encore trois fois maxi
478 retries 3
479
willy tarreau0f7af912005-12-17 12:21:26 +0100480
willy tarreauc29948c2005-12-17 13:10:27 +01004812.7) Adresse du serveur
482-----------------------
483Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
484le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
485serveur d'assignation de cookie dans le cas où le service consiste à assurer
486uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100487le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
488du serveur distant, et il est maintenant recommandé d'utiliser de préférence
489le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100490
willy tarreauc29948c2005-12-17 13:10:27 +0100491Exemple :
492---------
willy tarreau0f7af912005-12-17 12:21:26 +0100493 # on envoie toutes les nouvelles connexions ici
494 dispatch 192.168.1.2:80
495
willy tarreauc29948c2005-12-17 13:10:27 +0100496Remarque :
497----------
498Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
499'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100500
willy tarreau0f7af912005-12-17 12:21:26 +0100501
willy tarreau240afa62005-12-17 13:14:35 +01005022.8) Adresse de sortie
503----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100504Il est possible de forcer l'adresse utilisée pour établir les connexions vers
505les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
506port, bien que cette fonctionnalité se limite à des usages très spécifiques.
507C'est particulièrement utile en cas d'adressage multiple, et plus généralement
508pour permettre aux serveurs de trouver le chemin de retour dans des contextes de
509routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera choisie
510librement par le systeme. Si le port est '0' ou vide, il sera choisi librement
511par le système. Il est à noter que depuis la version 1.1.18, les tests de bon
willy tarreaueedaa9f2005-12-17 14:08:03 +0100512fonctionnement des serveurs seront aussi effectués à partir de la source
willy tarreaua41a8b42005-12-17 14:02:24 +0100513spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100514
515Exemples :
516----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100517 listen http_proxy *:80
willy tarreau240afa62005-12-17 13:14:35 +0100518 # toutes les connexions prennent l'adresse 192.168.1.200
519 source 192.168.1.200:0
520
willy tarreaua41a8b42005-12-17 14:02:24 +0100521 listen rlogin_proxy *:513
willy tarreau240afa62005-12-17 13:14:35 +0100522 # utiliser l'adresse 192.168.1.200 et le port réservé 900
523 source 192.168.1.200:900
524
525
5262.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100527--------------------------------
528En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
529vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
530par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100531
willy tarreauc29948c2005-12-17 13:10:27 +0100532Exemple :
533---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100534 listen http_proxy :80
willy tarreau0f7af912005-12-17 12:21:26 +0100535 mode http
536 cookie SERVERID
537
willy tarreauc29948c2005-12-17 13:10:27 +0100538On peut modifier l'utilisation du cookie pour la rendre plus intelligente
539vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
540réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
541cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100542de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
543inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100544
545Exemples :
546----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100547
548Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100549dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
550directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100551
552 cookie SERVERID indirect
553
willy tarreauc29948c2005-12-17 13:10:27 +0100554Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
555lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100556
557 cookie SERVERID rewrite
558
willy tarreauc29948c2005-12-17 13:10:27 +0100559Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un accès
willy tarreau8337c6b2005-12-17 13:41:01 +0100560en répartition de charge interne. Dans ce cas, il est souhaitable que tous les
561serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
562retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100563
564 cookie SERVERID insert
565
willy tarreau240afa62005-12-17 13:14:35 +0100566Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
567ajouter le mot clé 'nocache' après 'insert' :
568
569 cookie SERVERID insert nocache
570
willy tarreaucd878942005-12-17 13:27:43 +0100571Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le mot
572clé 'postonly' après 'insert' :
573
574 cookie SERVERID insert postonly
575
willy tarreau240afa62005-12-17 13:14:35 +0100576
willy tarreau96d40372005-12-17 13:11:56 +0100577Remarques :
578-----------
579- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour s'adapter
580 à des applications générant déjà le cookie, avec un contenu invalide. Il suffit
581 pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100582
willy tarreau96d40372005-12-17 13:11:56 +0100583- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
584 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
585 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100586
willy tarreau240afa62005-12-17 13:14:35 +0100587- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
588 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
589 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
590 cookie de persistence inséré, donc provoquer des changements de serveurs pour
591 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100592
willy tarreaucd878942005-12-17 13:27:43 +0100593- lorsque l'application est bien connue, et que les parties nécessitant de la
594 persistence sont systématiquement accédées par un formulaire en mode POST,
595 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
596 et "indirect", car la page d'accueil reste cachable, et c'est l'application
597 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100598
willy tarreau240afa62005-12-17 13:14:35 +01005992.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100600----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100601En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
602par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100603
willy tarreau5cbea6f2005-12-17 12:48:26 +0100604 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100605
willy tarreauc29948c2005-12-17 13:10:27 +0100606- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
607 configuration et les logs.
608- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
609- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100610
611Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100612---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100613 listen http_proxy :80
willy tarreau0f7af912005-12-17 12:21:26 +0100614 mode http
615 cookie SERVERID
616 dispatch 192.168.1.100:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100617 server web1 192.168.1.1:80 cookie server01
618 server web2 192.168.1.2:80 cookie server02
619
620Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100621-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100622
willy tarreaua41a8b42005-12-17 14:02:24 +01006233) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100624=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100625
willy tarreauc29948c2005-12-17 13:10:27 +0100626Le relais peut effectuer lui-même la répartition de charge entre les différents
627serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
628cela, on précise le mot clé 'balance' dans la définition du service,
629éventuellement suivi du nom d'un algorithme de répartition. En version 1.1.9,
630seul 'roundrobin' est géré, et c'est aussi la valeur implicite par défaut. Il
631est évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
632spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100633
634Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100635---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100636
willy tarreaua41a8b42005-12-17 14:02:24 +0100637 listen http_proxy :80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100638 mode http
639 cookie SERVERID
640 balance roundrobin
641 server web1 192.168.1.1:80 cookie server01
642 server web2 192.168.1.2:80 cookie server02
643
willy tarreaua41a8b42005-12-17 14:02:24 +0100644Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
645du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
646sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
647champ <port> de l'adresse serveur :
648
649 - non spécifié ou nul :
650 la connexion sera envoyée au serveur sur le même port que celui sur
651 lequel le relais a reçu la connexion.
652
653 - valeur numérique (seul cas supporté pour les versions antérieures) :
654 le serveur recevra la connexion sur le port désigné.
655
656 - valeur numérique précédée d'un signe '+' :
657 la connexion sera envoyée au serveur sur le même port que celui sur
658 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
659
660 - valeur numérique précédée d'un signe '-' :
661 la connexion sera envoyée au serveur sur le même port que celui sur
662 lequel le relais a reçu la connexion, duquel on soustrait la valeur
663 désignée.
664
665Exemples :
666----------
667
668# même que précédemment
669
670 listen http_proxy :80
671 mode http
672 cookie SERVERID
673 balance roundrobin
674 server web1 192.168.1.1 cookie server01
675 server web2 192.168.1.2 cookie server02
676
677# relayage simultané des ports 80 et 81 et 8080-8089
678
679 listen http_proxy :80,:81,:8080-8089
680 mode http
681 cookie SERVERID
682 balance roundrobin
683 server web1 192.168.1.1 cookie server01
684 server web2 192.168.1.2 cookie server02
685
686# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
687
688 listen http_proxy :25,:389,:663
689 mode tcp
690 balance roundrobin
691 server srv1 192.168.1.1:+1000
692 server srv2 192.168.1.2:+1000
693
willy tarreau0f7af912005-12-17 12:21:26 +0100694
willy tarreauc29948c2005-12-17 13:10:27 +01006953.1) Surveillance des serveurs
696------------------------------
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100697Il est possible de tester l'état des serveurs par établissement de connexion TCP
698ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas utilisé
willy tarreau8337c6b2005-12-17 13:41:01 +0100699dans le processus de répartition de charge interne. Pour activer la surveillance,
willy tarreauc29948c2005-12-17 13:10:27 +0100700ajouter le mot clé 'check' à la fin de la déclaration du serveur. Il est
701possible de spécifier l'intervalle (en millisecondes) séparant deux tests du
702serveur par le paramètre "inter", le nombre d'échecs acceptés par le paramètre
703"fall", et le nombre de succès avant reprise par le paramètre "rise". Les
704paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreaue47c8d72005-12-17 12:55:52 +0100705 - inter : 2000
706 - rise : 2
707 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +0100708 - port : port de connexion du serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +0100709
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100710Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
711certains cas de pannes, des serveurs peuvent continuer à accepter les connexions
712sans les traiter. Depuis la version 1.1.16, haproxy est en mesure d'envoyer des
willy tarreau036e1ce2005-12-17 13:46:33 +0100713requê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 +0100714utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20, les requêtes
715ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de contrôle d'accès aux
716ressources. Cependant, cette requête documentée dans la RFC2068 n'est pas
717comprise par tous les serveurs. Donc à partir de la version 1.1.21, la requête
718par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est possible de
719paramétrer la partie URI. Les requêtes OPTIONS présentent l'avantage d'être
720facilement extractibles des logs, et de ne pas induire d'accès aux fichiers côté
721serveur. Seules les réponses 2xx et 3xx sont considérées valides, les autres (y
722compris non-réponses) aboutissent à un échec. Le temps maximal imparti pour une
723réponse est égal à l'intervalle entre deux tests (paramètre "inter"). Pour
724activer ce mode, spécifier l'option "httpchk", éventuellement suivie d'une
willy tarreaueedaa9f2005-12-17 14:08:03 +0100725méthode et d'une URI. L'option "httpchk" accepte donc 4 formes :
726 - option httpchk -> OPTIONS / HTTP/1.0
727 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
728 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
729 - option httpchk METH URI VER -> <METH> <URI> <VER>
730Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100731
willy tarreau8337c6b2005-12-17 13:41:01 +0100732Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
733utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
734ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
735de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
736les serveurs de secours qui le précèdent sont hors d'usage. Il n'y a donc pas
737de répartition de charge entre des serveurs de secours. Ce type de serveurs
738peut servir à retourner des pages d'indisponibilité de service. Dans ce cas,
739il est préférable de ne pas affecter de cookie, afin que les clients qui le
740rencontrent n'y soient pas affectés définitivement. Le fait de ne pas mettre
741de cookie envoie un cookie vide, ce qui a pour effet de supprimer un éventuel
742cookie affecté précédemment.
743
willy tarreaua41a8b42005-12-17 14:02:24 +0100744Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
745vers un port différent de celui de service. C'est nécessaire principalement
746pour les configurations où le serveur n'a pas de port prédéfini, par exemple
747lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
748le paramètre 'port' suivi du numéro de port devant répondre aux requêtes.
749
willy tarreau8337c6b2005-12-17 13:41:01 +0100750Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement l'état
751courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal SIGHUP au
752processus proxy. L'état de tous les serveurs de tous les proxies est envoyé dans
753les logs en niveau "notice", ainsi que sur la sortie d'erreurs si elle est
754active. C'est une bonne raison pour avoir au moins un serveur de logs local en
755niveau notice.
756
willy tarreauc29948c2005-12-17 13:10:27 +0100757Exemples :
758----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100759# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100760 listen http_proxy 0.0.0.0:80
761 mode http
762 cookie SERVERID
763 balance roundrobin
764 server web1 192.168.1.1:80 cookie server01 check
765 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
766
willy tarreau2f6ba652005-12-17 13:57:42 +0100767# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +0100768 listen http_proxy 0.0.0.0:80
769 mode http
770 cookie SERVERID
771 balance roundrobin
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100772 option httpchk
willy tarreau5cbea6f2005-12-17 12:48:26 +0100773 server web1 192.168.1.1:80 cookie server01 check
willy tarreauc29948c2005-12-17 13:10:27 +0100774 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +0100775
willy tarreau2f6ba652005-12-17 13:57:42 +0100776# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
777 listen http_proxy 0.0.0.0:80
778 mode http
779 cookie SERVERID
780 balance roundrobin
781 option httpchk /index.html
782 server web1 192.168.1.1:80 cookie server01 check
783 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
784
willy tarreaueedaa9f2005-12-17 14:08:03 +0100785# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
786 listen http_proxy 0.0.0.0:80
787 mode http
788 cookie SERVERID
789 balance roundrobin
790 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
791 server web1 192.168.1.1:80 cookie server01 check
792 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
793
willy tarreau96d40372005-12-17 13:11:56 +0100794# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +0100795# automatique dans la requête, tout en indiquant aux caches de ne pas garder
796# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +0100797 listen web_appl 0.0.0.0:80
798 mode http
willy tarreau240afa62005-12-17 13:14:35 +0100799 cookie SERVERID insert nocache indirect
willy tarreauc29948c2005-12-17 13:10:27 +0100800 balance roundrobin
801 server web1 192.168.1.1:80 cookie server01 check
802 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +0100803
willy tarreaueedaa9f2005-12-17 14:08:03 +0100804# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +0100805 listen web_appl 0.0.0.0:80
806 mode http
807 cookie SERVERID insert nocache indirect
808 balance roundrobin
809 server web1 192.168.1.1:80 cookie server01 check
810 server web2 192.168.1.2:80 cookie server02 check
willy tarreaueedaa9f2005-12-17 14:08:03 +0100811 server web-backup 192.168.2.1:80 cookie server03 check backup
812 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +0100813
willy tarreaua41a8b42005-12-17 14:02:24 +0100814# relayage SMTP+TLS avec test du serveur et serveur de backup
815
816 listen http_proxy :25,:587
817 mode tcp
818 balance roundrobin
819 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
820 server srv2 192.168.1.2 backup
821
willy tarreau0f7af912005-12-17 12:21:26 +0100822
willy tarreauc29948c2005-12-17 13:10:27 +01008233.2) Reconnexion vers un répartiteur en cas d'échec direct
824----------------------------------------------------------
825En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
826seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
827définitivement privés de service. La spécification du paramètre 'redispatch'
828autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
829(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +0100830
831Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +0100832---------
willy tarreau0f7af912005-12-17 12:21:26 +0100833 listen http_proxy 0.0.0.0:80
834 mode http
835 cookie SERVERID
836 dispatch 192.168.1.100:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100837 server web1 192.168.1.1:80 cookie server01
838 server web2 192.168.1.2:80 cookie server02
willy tarreau8337c6b2005-12-17 13:41:01 +0100839 redispatch # renvoyer vers dispatch si refus de connexion.
840
841Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre redispatch
842ne s'applique qu'aux échecs de connexion au serveur. Depuis la version 1.1.17,
843il s'applique aussi aux connexions destinées à des serveurs identifiés comme
844hors d'usage par la surveillance. Si l'on souhaite malgré tout qu'un client
845disposant d'un cookie correspondant à un serveur défectueux tente de s'y
846connecter, il faut préciser l'option "persist" :
847
848 listen http_proxy 0.0.0.0:80
849 mode http
850 option persist
851 cookie SERVERID
852 dispatch 192.168.1.100:80
853 server web1 192.168.1.1:80 cookie server01
854 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100855 redispatch # renvoyer vers dispatch si serveur HS.
856
willy tarreauc29948c2005-12-17 13:10:27 +0100857
8584) Fonctionnalités additionnelles
859=================================
860
861D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
862principalement du mode transparent, de la journalisation des connexions, et de
863la réécriture des entêtes.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100864
willy tarreauc29948c2005-12-17 13:10:27 +01008654.1) Fonctionnement en mode transparent
866---------------------------------------
867En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions routées
868à travers la machine hébergeant le proxy. Dans ce mode, on ne précise pas
869l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
870destination de la session détournée. Le système doit permettre de rediriger les
871paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100872
873Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +0100874---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100875 listen http_proxy 0.0.0.0:65000
876 mode http
877 transparent
878 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100879 server server01 192.168.1.1:80
880 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100881
882 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
883 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +0100884
willy tarreaua41a8b42005-12-17 14:02:24 +0100885Remarque :
886----------
887Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est adressé
888le client qui sera utilisé. Cela permet de relayer tous les ports TCP d'une même
889adresse avec une même instance et sans utiliser directement le mode transparent.
890
891Exemple :
892---------
893 listen http_proxy 0.0.0.0:65000
894 mode tcp
895 server server01 192.168.1.1 check port 60000
896 server server02 192.168.1.2 check port 60000
897
898 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
899 -j REDIRECT --to-ports 65000
900
willy tarreau0f7af912005-12-17 12:21:26 +0100901
willy tarreauc29948c2005-12-17 13:10:27 +01009024.2) Journalisation des connexions
903----------------------------------
willy tarreauc1cae632005-12-17 14:12:23 +01009044.2.1) Niveaux de log
905---------------------
willy tarreauc29948c2005-12-17 13:10:27 +0100906Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
907détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
908source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +0100909la requête HTTP, le code de retour, la quantité de données transmises, et même
910dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
911Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
912la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +0100913est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +0100914
willy tarreau8337c6b2005-12-17 13:41:01 +0100915 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
916 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +0100917ou
918 log global
919
920Remarque :
921----------
922La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
923paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +0100924
925Exemple :
926---------
927 listen http_proxy 0.0.0.0:80
928 mode http
929 log 192.168.2.200 local3
930 log 192.168.2.201 local4
931
willy tarreauc1cae632005-12-17 14:12:23 +01009324.2.2) Format des logs
933----------------------
934Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
935de la session entre le client et le relais. En précisant l'option 'tcplog',
936la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
937sur son état lors de la déconnexion, ainsi que le temps de connexion et la
938durée totale de la session.
939
940Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
941notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
942surveillance effectuant des connexions et déconnexions fréquentes, polluerait
943les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
944ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
945(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +0100946
willy tarreau036e1ce2005-12-17 13:46:33 +0100947Exemple :
948---------
949 listen http_proxy 0.0.0.0:80
950 mode http
951 option httplog
952 option dontlognull
953 log 192.168.2.200 local3
954
willy tarreauc1cae632005-12-17 14:12:23 +01009554.2.3) Chronométrage des événements
956-----------------------------------
957Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
958événements sont d'une très grande utilité. Tous les temps sont mesurés en
959millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
960la forme Tq/Tc/Tr/Tt :
961
962 - Tq: temps total de réception de la requête HTTP de la part du client.
963 C'est le temps qui s'est écoulé entre le moment où le client a établi
964 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
965 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
966 que la requête complète n'a jamais été reçue.
967
968 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
969 C'est le temps écoulé entre le moment ou le relais a initié la demande de
970 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
971 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
972 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
973 vers le serveur.
974
975 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
976 renvoyer la totalité des entêtes HTTP à partir du moment où il a acquitté
977 la connexion. Ca représente exactement le temps de traitement de la
978 transaction sans le transfert des données associées. Une valeur '-1'
979 indique que le serveur n'a pas envoyé la totalité de l'entête HTTP.
980
981 - Tt: durée de vie totale de la session, entre le moment où la demande de
982 connexion du client a été acquittée et le moment où la connexion a été
983 refermée aux deux extrémités (client et serveur). On peut donc en déduire
984 Td, le temps de transfert des données, en excluant les autres temps :
985
986 Td = Tt - (Tq + Tc + Tr)
987
988 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
989
990En mode TCP ('option tcplog'), seuls les deux indicateurs Tc et Tt sont
991rapportés.
992
993Ces temps fournissent de précieux renseignement sur des causes probables de
994problèmes. Du fait que le protocole TCP définisse des temps de retransmission
995de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
996de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
997problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
998valeur de time-out dans la configuration, c'est souvent qu'une session a été
999abandonnée sur expiration d'un time-out.
1000
1001Cas les plus fréquents :
1002
1003 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1004 le client et le relais.
1005 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1006 le relais et le serveur durant la phase de connexion. Cet indicateur
1007 devrait normalement toujours être très bas (moins de quelques dizaines).
1008 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1009 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1010 de pertes entre le relais et le serveur.
1011 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1012 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1013 session est maintenue après la fin des échanges. Voir plus loin pour
1014 savoir comment désactiver le keep-alive HTTP.
1015
1016Autres cas ('xx' représentant une valeur quelconque à ignorer) :
1017 -1/xx/xx/Tt : le client n'a pas envoyé sa requête dans le temps imparti ou
1018 a refermé sa connexion sans compléter la requête.
1019 Tq/-1/xx/Tt : la connexion n'a pas pu s'établir vers le serveur (refus ou
1020 time-out au bout de Tt-Tq ms).
1021 Tq/Tc/-1/Tt : le serveur a accepté la connexion mais n'a pas répondu dans
1022 les temps ou bien a refermé sa connexion trop tôt, au bout
1023 de Tt-(Tq+Tc) ms.
1024
10254.2.4) Conditions de déconnexion
1026--------------------------------
1027Les logs TCP et HTTP fournissent un indicateur de complétude de la session.
1028C'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 +01001029 - sur le premier caractère, un code précisant le premier événement qui a causé
1030 la terminaison de la session :
1031
1032 C : fermeture de la session TCP de la part du client
1033 S : fermeture de la session TCP de la part du serveur, ou refus de connexion
1034 P : terminaison prématurée des sessions par le proxy, pour cas d'erreur
1035 interne ou de configuration (ex: filtre d'URL)
1036 c : expiration du délai d'attente côté client : clitimeout
1037 s : expiration du délai d'attente côté serveur: srvtimeout et contimeout
1038 - : terminaison normale.
1039
1040 - sur le second caractère, l'état d'avancement de la session HTTP lors de la
1041 fermeture :
1042
1043 R : terminaison en attendant la réception totale de la requête du client
1044 C : terminaison en attendant la connexion vers le serveur
1045 H : terminaison en attendant la réception totale des entêtes du serveur
1046 D : terminaison durant le transfert des données du serveur vers le client
1047 L : terminaison durant le transfert des dernières données du proxy vers
1048 le client, alors que le serveur a déjà fini.
1049 - : terminaison normale, après fin de transfert des données
1050
1051 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001052 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001053
1054 N : aucun cookie de persistence n'a été présenté.
1055 I : le client a présenté un cookie ne correspondant à aucun serveur
1056 connu.
1057 D : le client a présenté un cookie correspondant à un serveur hors
1058 d'usage. Suivant l'option 'persist', il a été renvoyé vers un
1059 autre serveur ou a tout de même tenté de se connecter sur celui
1060 correspondant au cookie.
1061 V : le client a présenté un cookie valide et a pu se connecter au
1062 serveur correspondant.
1063 - : non appliquable
1064
1065 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001066 persistence retrourné par le serveur (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001067
1068 N : aucun cookie de persistence n'a été fourni par le serveur.
willy tarreau197e8ec2005-12-17 14:10:59 +01001069 P : un cookie de persistence a été fourni par le serveur et transmis
1070 tel quel.
willy tarreau036e1ce2005-12-17 13:46:33 +01001071 I : aucun cookie n'a été fourni par le serveur, il a été inséré par le
1072 proxy.
1073 D : le cookie présenté par le serveur a été supprimé par le proxy pour
1074 ne pas être retourné au client.
1075 R : le cookie retourné par le serveur a été modifié par le proxy.
1076 - : non appliquable
1077
willy tarreau8337c6b2005-12-17 13:41:01 +01001078Le mot clé "capture" permet d'ajouter dans des logs HTTP des informations
1079capturées dans les échanges. La version 1.1.17 supporte uniquement une capture
1080de cookies client et serveur, ce qui permet dans bien des cas, de reconstituer
1081la session d'un utilisateur. La syntaxe est la suivante :
1082
1083 capture cookie <préfixe_cookie> len <longueur_capture>
1084
1085Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1086transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1087caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1088le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
1089place dans les logs.
1090
1091Exemples :
1092----------
1093 # capture du premier cookie dont le nom commence par "ASPSESSION"
1094 capture cookie ASPSESSION len 32
1095
1096 # capture du premier cookie dont le nom est exactement "vgnvisitor"
1097 capture cookie vgnvisitor= len 32
1098
willy tarreau036e1ce2005-12-17 13:46:33 +01001099Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
1100positionné par le serveur, précédé du cookie positionné par le client. Chacun de
1101ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni par le
1102client ou le serveur.
willy tarreau8337c6b2005-12-17 13:41:01 +01001103
willy tarreauc1cae632005-12-17 14:12:23 +010011044.2.5) Exemples de logs
1105-----------------------
1106- 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"
1107 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
1108 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01001109
willy tarreauc1cae632005-12-17 14:12:23 +01001110- haproxy[18113]: 127.0.0.1:34548 [15/Oct/2003:15:18:55] relais-http <NOSRV> -1/-1/-1/8490 -1 0 - - CR-- ""
1111 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
1112 ('C---') au bout de 8.5s, alors que le relais attendait l'entête ('-R--').
1113 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01001114
willy tarreauc1cae632005-12-17 14:12:23 +01001115- haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06] relais-http <NOSRV> -1/-1/-1/50001 408 0 - - cR-- ""
1116 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
1117 bout de 50s, alors que le relais attendait l'entête ('-R--'). Aucune
1118 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
1119 pu renvoyer un message 408 au client.
1120
1121- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
1122 => log en mode 'tcplog'. Expiration du time-out côté client ('c----') au bout
1123 de 5s.
1124
1125- 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"
1126 => La requête client met 3s à entrer (peut-être un problème réseau), et la
1127 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
1128 secondes (retries 3 dans la conf), puis un code 503 est retourné au client.
willy tarreau0f7af912005-12-17 12:21:26 +01001129
willy tarreauc29948c2005-12-17 13:10:27 +010011304.3) Modification des entêtes HTTP
1131----------------------------------
1132En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
1133requête et/ou la réponse à partir d'expressions régulières. Il est également
1134possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou de
1135la requête. Une limitation cependant : les en-têtes fournis au milieu de
1136connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
1137comme faisant partie des échanges de données consécutifs à la première requête.
1138Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01001139
1140La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01001141 reqadd <string> pour ajouter un en-tête dans la requête
1142 reqrep <search> <replace> pour modifier la requête
1143 reqirep <search> <replace> idem sans distinction majuscules/minuscules
1144 reqdel <search> pour supprimer un en-tête dans la requête
1145 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001146 reqallow <search> autoriser la requête si un entête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01001147 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001148 reqdeny <search> interdire la requête si un entête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01001149 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001150 reqpass <search> inhibe ces actions sur les entêtes validant <search>
1151 reqipass <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001152
willy tarreau036e1ce2005-12-17 13:46:33 +01001153 rspadd <string> pour ajouter un en-tête dans la réponse
1154 rsprep <search> <replace> pour modifier la réponse
1155 rspirep <search> <replace> idem sans distinction majuscules/minuscules
1156 rspdel <search> pour supprimer un en-tête dans la réponse
1157 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001158
willy tarreau0f7af912005-12-17 12:21:26 +01001159
willy tarreau036e1ce2005-12-17 13:46:33 +01001160<search> est une expression régulière compatible POSIX regexp supportant le
1161groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
1162doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
1163chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
1164backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01001165
1166 \t pour une tabulation
1167 \r pour un retour charriot
1168 \n pour un saut de ligne
1169 \ pour différencier un espace d'un séparateur
1170 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01001171 \\ pour utiliser un backslash dans la regex
1172 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01001173 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01001174
willy tarreau0f7af912005-12-17 12:21:26 +01001175
willy tarreau5cbea6f2005-12-17 12:48:26 +01001176<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
1177Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
1178groupe délimité par des parenthèses dans l'expression régulière, par sa
1179position numérale. Les positions vont de 1 à 9, et sont codées par un '\'
1180suivi du chiffre désiré. Il est également possible d'insérer un caractère non
1181imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code
1182hexadécimal de ce caractère (comme en C).
1183
1184<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01001185dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001186
1187Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01001188-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001189 - 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 +01001190 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001191 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
1192 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
1193 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01001194 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
1195 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
1196 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
1197 entêtes inutiles avant les ajouts.
willy tarreau0f7af912005-12-17 12:21:26 +01001198
1199Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01001200----------
1201 ###### a few examples ######
1202
1203 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
1204 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
1205 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
1206
1207 # force proxy connections to close
willy tarreauc29948c2005-12-17 13:10:27 +01001208 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
willy tarreau197e8ec2005-12-17 14:10:59 +01001209 # rewrite locations
willy tarreauc29948c2005-12-17 13:10:27 +01001210 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001211
1212 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01001213
willy tarreau197e8ec2005-12-17 14:10:59 +01001214 # Every header should end with a colon followed by one space.
1215 reqideny ^[^:\ ]*[\ ]*$
1216
1217 # block Apache chunk exploit
1218 reqideny ^Transfer-Encoding:[\ ]*chunked
1219 reqideny ^Host:\ apache-
1220
1221 # block annoying worms that fill the logs...
1222 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
1223 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
1224 reqideny ^[^:\ ]*\ .*<script
1225 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
1226
1227 # allow other syntactically valid requests, and block any other method
1228 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
1229 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
1230 reqideny ^[^:\ ]*\
1231
1232 # force connection:close, thus disabling HTTP keep-alive
1233 reqidel ^Connection:
1234 rspidel ^Connection:
1235 reqadd Connection:\ close
1236 rspadd Connection:\ close
1237
1238 # change the server name
1239 rspidel ^Server:\
1240 rspadd Server:\ Formilux/0.1.8
1241
willy tarreau0f7af912005-12-17 12:21:26 +01001242
willy tarreauc1cae632005-12-17 14:12:23 +01001243Enfin, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
1244'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
1245connaître l'adresse IP du client initial.
1246
1247Exemple :
1248---------
1249 listen http_proxy 0.0.0.0:80
1250 mode http
1251 log global
1252 option httplog
1253 option dontlognull
1254 option forwardfor
1255
willy tarreauc29948c2005-12-17 13:10:27 +010012564.4) Répartition avec persistence
1257---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001258
1259La combinaison de l'insertion de cookie avec la répartition de charge interne
1260permet d'assurer une persistence dans les sessions HTTP d'une manière
1261pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01001262 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01001263 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01001264 - insérer un cookie dans les réponses issues d'une répartition uniquement,
1265 et faire en sorte que des caches ne mémorisent pas ce cookie.
1266 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001267
1268Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01001269---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001270 listen application 0.0.0.0:80
1271 mode http
willy tarreau240afa62005-12-17 13:14:35 +01001272 cookie SERVERID insert nocache indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +01001273 balance roundrobin
1274 server 192.168.1.1:80 cookie server01 check
1275 server 192.168.1.2:80 cookie server02 check
1276
willy tarreau8337c6b2005-12-17 13:41:01 +010012774.5) Personalisation des erreurs
1278--------------------------------
1279
1280Certaines situations conduisent à retourner une erreur HTTP au client :
1281 - requête invalide ou trop longue => code HTTP 400
1282 - requête mettant trop de temps à venir => code HTTP 408
1283 - requête interdite (bloquée par un reqideny) => code HTTP 403
1284 - erreur interne du proxy => code HTTP 500
1285 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
1286 - aucun serveur disponible pour cette requête => code HTTP 503
1287 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
1288
1289Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
1290Cependant, en fonction du type de clientèle, on peut préférer retourner des
1291pages personnalisées. Ceci est possible par le biais de la commande "errorloc" :
1292
1293 errorloc <code_HTTP> <location>
1294
1295Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
1296le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
1297d'une page précisée dans <location>. Cette adresse peut être relative au site,
1298ou absolue. Comme cette réponse est traîtée par le navigateur du client
1299lui-même, il est indispensable que l'adresse fournie lui soit accessible.
1300
1301Exemple :
1302---------
1303 listen application 0.0.0.0:80
1304 errorloc 400 /badrequest.html
1305 errorloc 403 /forbidden.html
1306 errorloc 408 /toolong.html
1307 errorloc 500 http://haproxy.domain.net/bugreport.html
1308 errorloc 502 http://192.168.114.58/error50x.html
1309 errorloc 503 http://192.168.114.58/error50x.html
1310 errorloc 504 http://192.168.114.58/error50x.html
1311
willy tarreaua41a8b42005-12-17 14:02:24 +010013124.6) Changement des valeurs par défaut
1313--------------------------------------
1314
1315Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui évite
1316de répéter des paramètres communs à toutes les instances, tels que les timeouts,
1317adresses de log, modes de fonctionnement, etc.
1318
1319Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
1320précédent l'instance qui les utilisera. On peut donc mettre autant de sections
1321'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
1322section implique une annulation de tous les paramètres par défaut positionnés
1323précédemment, dans le but de les remplacer.
1324
1325La section 'defaults' utilise la même syntaxe que la section 'listen', aux
1326paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
1327un commentaire en guise paramètre.
1328
willy tarreau197e8ec2005-12-17 14:10:59 +01001329Dans la version 1.1.23, seuls les paramètres suivants peuvent être positionnés
willy tarreaua41a8b42005-12-17 14:02:24 +01001330dans une section 'defaults' :
1331 - log (le premier et le second)
1332 - mode { tcp, http, health }
1333 - balance { roundrobin }
1334 - disabled (pour désactiver toutes les instances qui suivent)
1335 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
1336 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
1337 - option { redispatch, transparent, keepalive, forwardfor, httplog,
willy tarreaueedaa9f2005-12-17 14:08:03 +01001338 dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01001339 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01001340 - cookie, capture
1341 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01001342
1343Ne sont pas supportés dans cette version, les adresses de dispatch et les
1344configurations de serveurs, ainsi que tous les filtres basés sur les
1345expressions régulières :
1346 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01001347 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01001348
1349Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
1350positionné par défaut. Donc si une option est spécifiée dans les paramètres par
1351défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
1352paramètres par défaut avant la déclaration de l'instance.
1353
1354Exemples :
1355----------
1356 defaults applications TCP
1357 log global
1358 mode tcp
1359 balance roundrobin
1360 clitimeout 180000
1361 srvtimeout 180000
1362 contimeout 4000
1363 retries 3
1364 redispatch
1365
1366 listen app_tcp1 10.0.0.1:6000-6063
1367 server srv1 192.168.1.1 check port 6000 inter 10000
1368 server srv2 192.168.1.2 backup
1369
1370 listen app_tcp2 10.0.0.2:6000-6063
1371 server srv1 192.168.2.1 check port 6000 inter 10000
1372 server srv2 192.168.2.2 backup
1373
1374 defaults applications HTTP
1375 log global
1376 mode http
1377 option httplog
1378 option forwardfor
1379 option dontlognull
1380 balance roundrobin
1381 clitimeout 20000
1382 srvtimeout 20000
1383 contimeout 4000
1384 retries 3
1385
1386 listen app_http1 10.0.0.1:80-81
1387 cookie SERVERID postonly insert indirect
1388 capture cookie userid= len 10
1389 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
1390 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
1391
1392 defaults
1393 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01001394
willy tarreaub719f002005-12-17 12:55:07 +01001395=======================
1396| Paramétrage système |
1397=======================
willy tarreau0f7af912005-12-17 12:21:26 +01001398
1399Sous Linux 2.4
1400==============
1401
willy tarreaub719f002005-12-17 12:55:07 +01001402-- cut here --
1403#!/bin/sh
1404# set this to about 256/4M (16384 for 256M machine)
1405MAXFILES=16384
1406echo $MAXFILES > /proc/sys/fs/file-max
1407ulimit -n $MAXFILES
1408
1409if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
1410 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
1411fi
1412
1413if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
1414 # 30 seconds for fin, 15 for time wait
1415 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
1416 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
1417 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
1418 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
1419fi
1420
willy tarreau0f7af912005-12-17 12:21:26 +01001421echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01001422echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
1423echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01001424echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01001425echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
1426echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01001427echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
1428echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01001429echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreaub719f002005-12-17 12:55:07 +01001430echo 0 > /proc/sys/net/ipv4/tcp_sack
1431echo 0 > /proc/sys/net/ipv4/tcp_dsack
1432
1433# auto-tuned on 2.4
1434#echo 262143 > /proc/sys/net/core/rmem_max
1435#echo 262143 > /proc/sys/net/core/rmem_default
1436
1437echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
1438echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
1439
1440-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01001441
willy tarreau197e8ec2005-12-17 14:10:59 +01001442Sous FreeBSD
1443============
1444
1445Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
1446Clement Laforet <sheepkiller@cultdeadsheep.org>.
1447
1448Pour plus d'informations :
1449http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
1450http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
1451http://www.freshports.org/net/haproxy
1452
1453
willy tarreau0f7af912005-12-17 12:21:26 +01001454-- fin --