blob: 596531d6931d619362ad98aa2d3e638cddfed3f8 [file] [log] [blame]
willy tarreau0f7af912005-12-17 12:21:26 +01001
2 H A - P r o x y
3 ---------------
willy tarreauc1cae632005-12-17 14:12:23 +01004 version 1.1.25
willy tarreau0f7af912005-12-17 12:21:26 +01005 willy tarreau
willy tarreauc1cae632005-12-17 14:12:23 +01006 2003/10/15
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
40 -s affiche les statistiques (si option compilée)
41 -l ajoute des informations aux statistiques
42
willy tarreaua1598082005-12-17 13:08:06 +010043Le nombre maximal de connexion simultanées par proxy est le paramètre par défaut
44pour les proxies pour lesquels ce paramètre n'est pas précisé dans le fichier de
45configuration. Il s'agit du paramètre 'maxconn' dans les sections 'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010046
willy tarreaua1598082005-12-17 13:08:06 +010047Le nombre maximal total de connexions simultanées limite le nombre de connexions
willy tarreauc29948c2005-12-17 13:10:27 +010048TCP utilisables à un instant donné par le processus, tous proxies confondus. Ce
willy tarreaua1598082005-12-17 13:08:06 +010049paramètre remplace le paramètre 'maxconn' de la section 'global'.
50
willy tarreauc29948c2005-12-17 13:10:27 +010051Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
52mode, toutes les connexions, déconnexions, et tous les échanges d'entêtes HTTP
53sont affichés.
54
55Les statistiques ne sont disponibles que si le programme a été compilé avec
56l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
57d'utilité que lors de benchmarks par exemple.
58
willy tarreau0f7af912005-12-17 12:21:26 +010059
60============================
61| Fichier de configuration |
62============================
63
willy tarreauc29948c2005-12-17 13:10:27 +010064Structure
65=========
willy tarreau0f7af912005-12-17 12:21:26 +010066
willy tarreaua1598082005-12-17 13:08:06 +010067L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
68les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est pas
willy tarreauc29948c2005-12-17 13:10:27 +010069précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +010070
71Le fichier de configuration est découpé en sections répérées par des mots clés
72tels que :
73
74 - 'global'
75 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +010076 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +010077
78Tous les paramètres font référence à la section définie par le dernier mot clé
79reconnu.
80
81
willy tarreauc29948c2005-12-17 13:10:27 +0100821) Paramètres globaux
83=====================
willy tarreaua1598082005-12-17 13:08:06 +010084
85Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
86proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
87supportés sont :
88
willy tarreau8337c6b2005-12-17 13:41:01 +010089 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +010090 - maxconn <nombre>
91 - uid <identifiant>
92 - gid <identifiant>
93 - chroot <répertoire>
94 - nbproc <nombre>
95 - daemon
96 - debug
97 - quiet
98
991.1) Journalisation des événements
100----------------------------------
101La plupart des événements sont journalisés : démarrages, arrêts, disparition et
102apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
103syslog vers un ou deux serveurs. La syntaxe est la suivante :
104
willy tarreau8337c6b2005-12-17 13:41:01 +0100105 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100106
107Les connexions sont envoyées en niveau "info". Les démarrages de service et de
108serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
109arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau8337c6b2005-12-17 13:41:01 +0100110bien pour les proxies que pour les serveurs testés par les proxies. Le paramètre
111optionnel <niveau_max> définit le niveau maximal de traces émises parmi les 8
112valeurs suivantes :
113 emerg, alert, crit, err, warning, notice, info, debug
114
willy tarreaueedaa9f2005-12-17 14:08:03 +0100115Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100116est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100117
118Les catégories possibles sont :
119 kern, user, mail, daemon, auth, syslog, lpr, news,
120 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
121 local0, local1, local2, local3, local4, local5, local6, local7
122
willy tarreau036e1ce2005-12-17 13:46:33 +0100123Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
124
willy tarreaua1598082005-12-17 13:08:06 +0100125Exemple :
126---------
127 global
128 log 192.168.2.200 local3
willy tarreau8337c6b2005-12-17 13:41:01 +0100129 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100130
1311.2) limitation du nombre de connexions
132---------------------------------------
133Il est possible et conseillé de limiter le nombre global de connexions par
134processus. Les connexions sont comprises au sens 'acceptation de connexion',
135donc il faut s'attendre en règle général à avoir un peu plus du double de
136sessions TCP que le maximum de connexions fixé. C'est important pour fixer le
137paramètre 'ulimit -n' avant de lancer le proxy. Pour comptabiliser le nombre
138de sockets nécessaires, il faut prendre en compte ces paramètres :
139 - 1 socket par connexion entrante
140 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100141 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100142 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100143 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100144
willy tarreaueedaa9f2005-12-17 14:08:03 +0100145Dans le cas où chaque proxy n'écoute que sur un couple adresse/port, positionner
146la limite du nombre de descripteurs de fichiers (ulimit -n) à
147(2 * maxconn + nbproxy + nbserveurs + 1). Dans une future version, haproxy sera
willy tarreauc29948c2005-12-17 13:10:27 +0100148capable de positionner lui-même cette limite.
149
1501.3) Diminution des privilèges
151------------------------------
152Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
153serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100154de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100155
willy tarreauc29948c2005-12-17 13:10:27 +0100156Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
157numérique d'utilisateur. La valeur 0, correspondant normalement au super-
158utilisateur, possède ici une signification particulière car elle indique que
159l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
160C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
161un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
162changer. Il est particulièrement déconseillé d'utiliser des comptes génériques
163tels que 'nobody' car cette pratique revient à utiliser 'root' si d'autres
164processus utilisent les mêmes identifiants.
165
166Le paramètre 'chroot' autorise à changer la racine du processus une fois le
167programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100168puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100169généralement contournable sur certains OS (Linux, Solaris) pour peu que
170l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
171un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
172service pour cet usage, et de ne pas mutualiser un même répertoire pour
173plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
174il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
175l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100176
177Remarque: dans le cas où une telle faille serait mise en évidence, il est fort
178probable que les premières tentatives de son exploitation provoquent un arrêt du
179programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
180encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur en
181environnement limité réduit les risques d'intrusion, il est parfois bien utile
182dans ces circonstances de connaître les conditions d'apparition du problème, via
183l'obtention d'un fichier 'core'. La plupart des systèmes, pour des raisons de
184sécurité, désactivent la génération du fichier 'core' après un changement
185d'identifiant pour le processus. Il faudra donc soit lancer le processus à
186partir d'un compte utilisateur aux droits réduits (mais ne pouvant pas effectuer
187le chroot), ou bien le faire en root sans réduction des droits (uid 0). Dans ce
188cas, le fichier se trouvera soit dans le répertoire de lancement, soit dans le
189répertoire spécifié après l'option 'chroot'. Ne pas oublier la commande suivante
190pour autoriser la génération du fichier avant de lancer le programme :
191
192# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100193
willy tarreauc29948c2005-12-17 13:10:27 +0100194Exemple :
195---------
196
197 global
198 uid 30000
199 gid 30000
200 chroot /var/chroot/haproxy
201
2021.4) modes de fonctionnement
203----------------------------
204Le service peut fonctionner dans plusieurs modes :
205 - avant- / arrière-plan
206 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100207
willy tarreauc29948c2005-12-17 13:10:27 +0100208Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne rend
209pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci dans un
210script de démarrage du système, sinon le système ne finirait pas son
211initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
212au processus appelant. C'est ce que fait l'option 'daemon' de la section
213'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100214
willy tarreauc29948c2005-12-17 13:10:27 +0100215Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
216standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
217logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
218Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100219
willy tarreauc29948c2005-12-17 13:10:27 +0100220Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
221problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
222entre les clients et les serveurs. Ce mode est incompatible avec les options
223'daemon' et 'quiet' pour des raisons de bon sens.
224
2251.5) accroissement de la capacité de traitement
226-----------------------------------------------
227Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
228processeur pour effectuer les tâches de relayage, même si les charges
229nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
230grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
231programme sait démarrer plusieurs processus se répartissant la charge de
232travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
233section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
234qu'en mode 'daemon'.
235
236Exemple :
237---------
238
239 global
240 daemon
241 quiet
242 nbproc 2
243
244
2452) Définition d'un service en écoute
246====================================
247
248Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100249
willy tarreaua41a8b42005-12-17 14:02:24 +0100250 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100251
willy tarreauc29948c2005-12-17 13:10:27 +0100252- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
253 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé. Aucun
254 test n'est effectué concernant l'unicité de ce nom, qui n'est pas obligatoire,
willy tarreaua41a8b42005-12-17 14:02:24 +0100255 mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100256
willy tarreaua41a8b42005-12-17 14:02:24 +0100257- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
258 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
259 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100260
willy tarreaua41a8b42005-12-17 14:02:24 +0100261- <plage_ports> correspond soit à un port, soit à une plage de ports sur
262 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
263 Cette plage peut être :
264 - soit un port numérique (ex: '80')
265 - soit une plage constituée de deux valeurs séparées par un tiret
266 (ex: '2000-2100') représentant les extrémités incluses dans la
267 plage.
268 Il faut faire attention à l'usage des plages, car chaque combinaison
269 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
270 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
271 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
272 niveau de privilège particulier lors du lancement du programme (indépendamment
273 du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100274
willy tarreaua41a8b42005-12-17 14:02:24 +0100275- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
276 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
277 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
278
279Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100280---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100281 listen http_proxy :80
282 listen x11_proxy 127.0.0.1:6000-6009
283 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
284 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100285
willy tarreaua41a8b42005-12-17 14:02:24 +0100286Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
287rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
288de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
289l'écriture de configurations :
290
291 bind [ <adresse_IP>:<plage_ports>[,...] ]
292
293Exemples :
294----------
295 listen http_proxy
296 bind :80,:443
297 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100298
willy tarreauc29948c2005-12-17 13:10:27 +01002992.1) Inhibition d'un service
300----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100301Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100302commenter toute une partie du fichier. Il suffit de positionner le mot clé
303"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100304
305 listen smtp_proxy 0.0.0.0:25
306 disabled
307
willy tarreaueedaa9f2005-12-17 14:08:03 +0100308Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
309 désactivé par le mot clé 'disabled', par exemple à cause d'une
310 configuration par défaut.
311
willy tarreauc29948c2005-12-17 13:10:27 +01003122.2) Mode de fonctionnement
313---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100314Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100315 - TCP
316 - HTTP
317 - supervision
318
319Mode TCP
320--------
willy tarreauc29948c2005-12-17 13:10:27 +0100321Dans ce mode, le service relaye, dès leur établissement, les connexions TCP vers
322un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il s'agit
323simplement d'une association source<adresse:port> -> destination<adresse:port>.
324Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100325
willy tarreauc29948c2005-12-17 13:10:27 +0100326Exemple :
327---------
willy tarreau0f7af912005-12-17 12:21:26 +0100328 listen smtp_proxy 0.0.0.0:25
329 mode tcp
330
331Mode HTTP
332---------
willy tarreauc29948c2005-12-17 13:10:27 +0100333Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
334serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
335décision. Les entêtes HTTP sont analysés pour y trouver un éventuel cookie, et
336certains d'entre-eux peuvent être modifiés par le biais d'expressions
337régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
338relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100339
willy tarreauc29948c2005-12-17 13:10:27 +0100340Exemple :
341---------
willy tarreau0f7af912005-12-17 12:21:26 +0100342 listen http_proxy 0.0.0.0:80
343 mode http
344
345Mode supervision
346----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100347Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
348santé du service. Il se contente de retourner "OK" à tout client se connectant
349sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100350déterminer quels sont les services utilisables. Si l'option 'httpchk' est
351activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
352attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100353le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100354
willy tarreauc29948c2005-12-17 13:10:27 +0100355Exemple :
356---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100357 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100358 listen health_check 0.0.0.0:60000
359 mode health
360
willy tarreau197e8ec2005-12-17 14:10:59 +0100361 # réponse HTTP : 'HTTP/1.0 200 OK'
362 listen http_health_check 0.0.0.0:60001
363 mode health
364 option httpchk
365
willy tarreau0f7af912005-12-17 12:21:26 +0100366
willy tarreauc29948c2005-12-17 13:10:27 +01003672.3) Limitation du nombre de connexions simultanées
368---------------------------------------------------
369Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
370connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
371d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
372limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100373
willy tarreauc29948c2005-12-17 13:10:27 +0100374Exemple :
375---------
376 listen tiny_server 0.0.0.0:80
377 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100378
379
willy tarreauc29948c2005-12-17 13:10:27 +01003802.4) Arrêt en douceur
381---------------------
382Il est possible d'arrêter les services en douceur en envoyant un signal SIG_USR1
383au processus relais. Tous les services seront alors mis en phase d'arrêt, mais
384pourront continuer d'accepter des connexions pendant un temps défini par le
385paramètre 'grace' (en millisecondes). Cela permet par exemple, de faire savoir
386rapidement à un répartiteur de charge qu'il ne doit plus utiliser un relais,
387tout en continuant d'assurer le service le temps qu'il s'en rende compte.
388Remarque : les connexions actives ne sont jamais cassées. Dans le pire des cas,
389il faudra attendre en plus leur expiration avant l'arrêt total du processus. La
390valeur par défaut est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100391
392Exemple :
393---------
willy tarreauc29948c2005-12-17 13:10:27 +0100394 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100395 # le service tournera encore 10 secondes après la demande d'arrêt
396 listen http_proxy 0.0.0.0:80
397 mode http
398 grace 10000
399
willy tarreauc29948c2005-12-17 13:10:27 +0100400 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100401 listen health_check 0.0.0.0:60000
402 mode health
403 grace 0
404
405
willy tarreauc29948c2005-12-17 13:10:27 +01004062.5) Temps d'expiration des connexions
407--------------------------------------
408Il est possible de paramétrer certaines durées d'expiration au niveau des
409connexions TCP. Trois temps indépendants sont configurables et acceptent des
410valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
411session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100412
413 - temps d'attente d'une donnée de la part du client, ou de la
414 possibilité de lui envoyer des données : "clitimeout" :
415
416 # time-out client à 2mn30.
417 clitimeout 150000
418
419 - temps d'attente d'une donnée de la part du serveur, ou de la
420 possibilité de lui envoyer des données : "srvtimeout" :
421
willy tarreauc29948c2005-12-17 13:10:27 +0100422 # time-out serveur à 30s.
willy tarreau0f7af912005-12-17 12:21:26 +0100423 srvtimeout 30000
424
425 - temps d'attente de l'établissement d'une connexion vers un serveur
426 "contimeout" :
427
willy tarreauc29948c2005-12-17 13:10:27 +0100428 # on abandonne si la connexion n'est pas établie après 4 secondes
429 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100430
willy tarreauc29948c2005-12-17 13:10:27 +0100431Remarques :
432-----------
433 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
434 type "health".
435 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
436 possible de perdre des paquets. Du fait que la première retransmission TCP
437 n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion inférieur
438 à 3 secondes ne permet pas de se rattraper sur la perte de paquets car la
439 session aura été abandonnée avant la première retransmission. Une valeur de
440 4 secondes réduira considérablement le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100441
willy tarreauc29948c2005-12-17 13:10:27 +01004422.6) Tentatives de reconnexion
443------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100444Lors d'un échec de connexion vers un serveur, il est possible de
445retenter (potentiellement vers un autre serveur, en cas de répartition
446de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100447abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100448
willy tarreauc29948c2005-12-17 13:10:27 +0100449Exemple :
450---------
willy tarreau0f7af912005-12-17 12:21:26 +0100451 # on essaie encore trois fois maxi
452 retries 3
453
willy tarreau0f7af912005-12-17 12:21:26 +0100454
willy tarreauc29948c2005-12-17 13:10:27 +01004552.7) Adresse du serveur
456-----------------------
457Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
458le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
459serveur d'assignation de cookie dans le cas où le service consiste à assurer
460uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100461le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
462du serveur distant, et il est maintenant recommandé d'utiliser de préférence
463le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100464
willy tarreauc29948c2005-12-17 13:10:27 +0100465Exemple :
466---------
willy tarreau0f7af912005-12-17 12:21:26 +0100467 # on envoie toutes les nouvelles connexions ici
468 dispatch 192.168.1.2:80
469
willy tarreauc29948c2005-12-17 13:10:27 +0100470Remarque :
471----------
472Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
473'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100474
willy tarreau0f7af912005-12-17 12:21:26 +0100475
willy tarreau240afa62005-12-17 13:14:35 +01004762.8) Adresse de sortie
477----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100478Il est possible de forcer l'adresse utilisée pour établir les connexions vers
479les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
480port, bien que cette fonctionnalité se limite à des usages très spécifiques.
481C'est particulièrement utile en cas d'adressage multiple, et plus généralement
482pour permettre aux serveurs de trouver le chemin de retour dans des contextes de
483routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera choisie
484librement par le systeme. Si le port est '0' ou vide, il sera choisi librement
485par le système. Il est à noter que depuis la version 1.1.18, les tests de bon
willy tarreaueedaa9f2005-12-17 14:08:03 +0100486fonctionnement des serveurs seront aussi effectués à partir de la source
willy tarreaua41a8b42005-12-17 14:02:24 +0100487spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100488
489Exemples :
490----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100491 listen http_proxy *:80
willy tarreau240afa62005-12-17 13:14:35 +0100492 # toutes les connexions prennent l'adresse 192.168.1.200
493 source 192.168.1.200:0
494
willy tarreaua41a8b42005-12-17 14:02:24 +0100495 listen rlogin_proxy *:513
willy tarreau240afa62005-12-17 13:14:35 +0100496 # utiliser l'adresse 192.168.1.200 et le port réservé 900
497 source 192.168.1.200:900
498
499
5002.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100501--------------------------------
502En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
503vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
504par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100505
willy tarreauc29948c2005-12-17 13:10:27 +0100506Exemple :
507---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100508 listen http_proxy :80
willy tarreau0f7af912005-12-17 12:21:26 +0100509 mode http
510 cookie SERVERID
511
willy tarreauc29948c2005-12-17 13:10:27 +0100512On peut modifier l'utilisation du cookie pour la rendre plus intelligente
513vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
514réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
515cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100516de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
517inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100518
519Exemples :
520----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100521
522Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100523dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
524directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100525
526 cookie SERVERID indirect
527
willy tarreauc29948c2005-12-17 13:10:27 +0100528Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
529lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100530
531 cookie SERVERID rewrite
532
willy tarreauc29948c2005-12-17 13:10:27 +0100533Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un accès
willy tarreau8337c6b2005-12-17 13:41:01 +0100534en répartition de charge interne. Dans ce cas, il est souhaitable que tous les
535serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
536retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100537
538 cookie SERVERID insert
539
willy tarreau240afa62005-12-17 13:14:35 +0100540Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
541ajouter le mot clé 'nocache' après 'insert' :
542
543 cookie SERVERID insert nocache
544
willy tarreaucd878942005-12-17 13:27:43 +0100545Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le mot
546clé 'postonly' après 'insert' :
547
548 cookie SERVERID insert postonly
549
willy tarreau240afa62005-12-17 13:14:35 +0100550
willy tarreau96d40372005-12-17 13:11:56 +0100551Remarques :
552-----------
553- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour s'adapter
554 à des applications générant déjà le cookie, avec un contenu invalide. Il suffit
555 pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100556
willy tarreau96d40372005-12-17 13:11:56 +0100557- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
558 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
559 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100560
willy tarreau240afa62005-12-17 13:14:35 +0100561- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
562 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
563 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
564 cookie de persistence inséré, donc provoquer des changements de serveurs pour
565 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100566
willy tarreaucd878942005-12-17 13:27:43 +0100567- lorsque l'application est bien connue, et que les parties nécessitant de la
568 persistence sont systématiquement accédées par un formulaire en mode POST,
569 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
570 et "indirect", car la page d'accueil reste cachable, et c'est l'application
571 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100572
willy tarreau240afa62005-12-17 13:14:35 +01005732.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100574----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100575En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
576par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100577
willy tarreau5cbea6f2005-12-17 12:48:26 +0100578 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100579
willy tarreauc29948c2005-12-17 13:10:27 +0100580- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
581 configuration et les logs.
582- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
583- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100584
585Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100586---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100587 listen http_proxy :80
willy tarreau0f7af912005-12-17 12:21:26 +0100588 mode http
589 cookie SERVERID
590 dispatch 192.168.1.100:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100591 server web1 192.168.1.1:80 cookie server01
592 server web2 192.168.1.2:80 cookie server02
593
594Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100595-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100596
willy tarreaua41a8b42005-12-17 14:02:24 +01005973) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100598=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100599
willy tarreauc29948c2005-12-17 13:10:27 +0100600Le relais peut effectuer lui-même la répartition de charge entre les différents
601serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
602cela, on précise le mot clé 'balance' dans la définition du service,
603éventuellement suivi du nom d'un algorithme de répartition. En version 1.1.9,
604seul 'roundrobin' est géré, et c'est aussi la valeur implicite par défaut. Il
605est évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
606spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100607
608Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100609---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100610
willy tarreaua41a8b42005-12-17 14:02:24 +0100611 listen http_proxy :80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100612 mode http
613 cookie SERVERID
614 balance roundrobin
615 server web1 192.168.1.1:80 cookie server01
616 server web2 192.168.1.2:80 cookie server02
617
willy tarreaua41a8b42005-12-17 14:02:24 +0100618Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
619du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
620sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
621champ <port> de l'adresse serveur :
622
623 - non spécifié ou nul :
624 la connexion sera envoyée au serveur sur le même port que celui sur
625 lequel le relais a reçu la connexion.
626
627 - valeur numérique (seul cas supporté pour les versions antérieures) :
628 le serveur recevra la connexion sur le port désigné.
629
630 - valeur numérique précédée d'un signe '+' :
631 la connexion sera envoyée au serveur sur le même port que celui sur
632 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
633
634 - valeur numérique précédée d'un signe '-' :
635 la connexion sera envoyée au serveur sur le même port que celui sur
636 lequel le relais a reçu la connexion, duquel on soustrait la valeur
637 désignée.
638
639Exemples :
640----------
641
642# même que précédemment
643
644 listen http_proxy :80
645 mode http
646 cookie SERVERID
647 balance roundrobin
648 server web1 192.168.1.1 cookie server01
649 server web2 192.168.1.2 cookie server02
650
651# relayage simultané des ports 80 et 81 et 8080-8089
652
653 listen http_proxy :80,:81,:8080-8089
654 mode http
655 cookie SERVERID
656 balance roundrobin
657 server web1 192.168.1.1 cookie server01
658 server web2 192.168.1.2 cookie server02
659
660# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
661
662 listen http_proxy :25,:389,:663
663 mode tcp
664 balance roundrobin
665 server srv1 192.168.1.1:+1000
666 server srv2 192.168.1.2:+1000
667
willy tarreau0f7af912005-12-17 12:21:26 +0100668
willy tarreauc29948c2005-12-17 13:10:27 +01006693.1) Surveillance des serveurs
670------------------------------
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100671Il est possible de tester l'état des serveurs par établissement de connexion TCP
672ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas utilisé
willy tarreau8337c6b2005-12-17 13:41:01 +0100673dans le processus de répartition de charge interne. Pour activer la surveillance,
willy tarreauc29948c2005-12-17 13:10:27 +0100674ajouter le mot clé 'check' à la fin de la déclaration du serveur. Il est
675possible de spécifier l'intervalle (en millisecondes) séparant deux tests du
676serveur par le paramètre "inter", le nombre d'échecs acceptés par le paramètre
677"fall", et le nombre de succès avant reprise par le paramètre "rise". Les
678paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreaue47c8d72005-12-17 12:55:52 +0100679 - inter : 2000
680 - rise : 2
681 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +0100682 - port : port de connexion du serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +0100683
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100684Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
685certains cas de pannes, des serveurs peuvent continuer à accepter les connexions
686sans les traiter. Depuis la version 1.1.16, haproxy est en mesure d'envoyer des
willy tarreau036e1ce2005-12-17 13:46:33 +0100687requê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 +0100688utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20, les requêtes
689ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de contrôle d'accès aux
690ressources. Cependant, cette requête documentée dans la RFC2068 n'est pas
691comprise par tous les serveurs. Donc à partir de la version 1.1.21, la requête
692par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est possible de
693paramétrer la partie URI. Les requêtes OPTIONS présentent l'avantage d'être
694facilement extractibles des logs, et de ne pas induire d'accès aux fichiers côté
695serveur. Seules les réponses 2xx et 3xx sont considérées valides, les autres (y
696compris non-réponses) aboutissent à un échec. Le temps maximal imparti pour une
697réponse est égal à l'intervalle entre deux tests (paramètre "inter"). Pour
698activer ce mode, spécifier l'option "httpchk", éventuellement suivie d'une
willy tarreaueedaa9f2005-12-17 14:08:03 +0100699méthode et d'une URI. L'option "httpchk" accepte donc 4 formes :
700 - option httpchk -> OPTIONS / HTTP/1.0
701 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
702 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
703 - option httpchk METH URI VER -> <METH> <URI> <VER>
704Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100705
willy tarreau8337c6b2005-12-17 13:41:01 +0100706Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
707utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
708ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
709de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
710les serveurs de secours qui le précèdent sont hors d'usage. Il n'y a donc pas
711de répartition de charge entre des serveurs de secours. Ce type de serveurs
712peut servir à retourner des pages d'indisponibilité de service. Dans ce cas,
713il est préférable de ne pas affecter de cookie, afin que les clients qui le
714rencontrent n'y soient pas affectés définitivement. Le fait de ne pas mettre
715de cookie envoie un cookie vide, ce qui a pour effet de supprimer un éventuel
716cookie affecté précédemment.
717
willy tarreaua41a8b42005-12-17 14:02:24 +0100718Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
719vers un port différent de celui de service. C'est nécessaire principalement
720pour les configurations où le serveur n'a pas de port prédéfini, par exemple
721lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
722le paramètre 'port' suivi du numéro de port devant répondre aux requêtes.
723
willy tarreau8337c6b2005-12-17 13:41:01 +0100724Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement l'état
725courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal SIGHUP au
726processus proxy. L'état de tous les serveurs de tous les proxies est envoyé dans
727les logs en niveau "notice", ainsi que sur la sortie d'erreurs si elle est
728active. C'est une bonne raison pour avoir au moins un serveur de logs local en
729niveau notice.
730
willy tarreauc29948c2005-12-17 13:10:27 +0100731Exemples :
732----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100733# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100734 listen http_proxy 0.0.0.0:80
735 mode http
736 cookie SERVERID
737 balance roundrobin
738 server web1 192.168.1.1:80 cookie server01 check
739 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
740
willy tarreau2f6ba652005-12-17 13:57:42 +0100741# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +0100742 listen http_proxy 0.0.0.0:80
743 mode http
744 cookie SERVERID
745 balance roundrobin
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100746 option httpchk
willy tarreau5cbea6f2005-12-17 12:48:26 +0100747 server web1 192.168.1.1:80 cookie server01 check
willy tarreauc29948c2005-12-17 13:10:27 +0100748 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +0100749
willy tarreau2f6ba652005-12-17 13:57:42 +0100750# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
751 listen http_proxy 0.0.0.0:80
752 mode http
753 cookie SERVERID
754 balance roundrobin
755 option httpchk /index.html
756 server web1 192.168.1.1:80 cookie server01 check
757 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
758
willy tarreaueedaa9f2005-12-17 14:08:03 +0100759# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
760 listen http_proxy 0.0.0.0:80
761 mode http
762 cookie SERVERID
763 balance roundrobin
764 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
765 server web1 192.168.1.1:80 cookie server01 check
766 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
767
willy tarreau96d40372005-12-17 13:11:56 +0100768# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +0100769# automatique dans la requête, tout en indiquant aux caches de ne pas garder
770# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +0100771 listen web_appl 0.0.0.0:80
772 mode http
willy tarreau240afa62005-12-17 13:14:35 +0100773 cookie SERVERID insert nocache indirect
willy tarreauc29948c2005-12-17 13:10:27 +0100774 balance roundrobin
775 server web1 192.168.1.1:80 cookie server01 check
776 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +0100777
willy tarreaueedaa9f2005-12-17 14:08:03 +0100778# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +0100779 listen web_appl 0.0.0.0:80
780 mode http
781 cookie SERVERID insert nocache indirect
782 balance roundrobin
783 server web1 192.168.1.1:80 cookie server01 check
784 server web2 192.168.1.2:80 cookie server02 check
willy tarreaueedaa9f2005-12-17 14:08:03 +0100785 server web-backup 192.168.2.1:80 cookie server03 check backup
786 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +0100787
willy tarreaua41a8b42005-12-17 14:02:24 +0100788# relayage SMTP+TLS avec test du serveur et serveur de backup
789
790 listen http_proxy :25,:587
791 mode tcp
792 balance roundrobin
793 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
794 server srv2 192.168.1.2 backup
795
willy tarreau0f7af912005-12-17 12:21:26 +0100796
willy tarreauc29948c2005-12-17 13:10:27 +01007973.2) Reconnexion vers un répartiteur en cas d'échec direct
798----------------------------------------------------------
799En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
800seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
801définitivement privés de service. La spécification du paramètre 'redispatch'
802autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
803(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +0100804
805Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +0100806---------
willy tarreau0f7af912005-12-17 12:21:26 +0100807 listen http_proxy 0.0.0.0:80
808 mode http
809 cookie SERVERID
810 dispatch 192.168.1.100:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100811 server web1 192.168.1.1:80 cookie server01
812 server web2 192.168.1.2:80 cookie server02
willy tarreau8337c6b2005-12-17 13:41:01 +0100813 redispatch # renvoyer vers dispatch si refus de connexion.
814
815Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre redispatch
816ne s'applique qu'aux échecs de connexion au serveur. Depuis la version 1.1.17,
817il s'applique aussi aux connexions destinées à des serveurs identifiés comme
818hors d'usage par la surveillance. Si l'on souhaite malgré tout qu'un client
819disposant d'un cookie correspondant à un serveur défectueux tente de s'y
820connecter, il faut préciser l'option "persist" :
821
822 listen http_proxy 0.0.0.0:80
823 mode http
824 option persist
825 cookie SERVERID
826 dispatch 192.168.1.100:80
827 server web1 192.168.1.1:80 cookie server01
828 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100829 redispatch # renvoyer vers dispatch si serveur HS.
830
willy tarreauc29948c2005-12-17 13:10:27 +0100831
8324) Fonctionnalités additionnelles
833=================================
834
835D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
836principalement du mode transparent, de la journalisation des connexions, et de
837la réécriture des entêtes.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100838
willy tarreauc29948c2005-12-17 13:10:27 +01008394.1) Fonctionnement en mode transparent
840---------------------------------------
841En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions routées
842à travers la machine hébergeant le proxy. Dans ce mode, on ne précise pas
843l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
844destination de la session détournée. Le système doit permettre de rediriger les
845paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100846
847Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +0100848---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100849 listen http_proxy 0.0.0.0:65000
850 mode http
851 transparent
852 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100853 server server01 192.168.1.1:80
854 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100855
856 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
857 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +0100858
willy tarreaua41a8b42005-12-17 14:02:24 +0100859Remarque :
860----------
861Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est adressé
862le client qui sera utilisé. Cela permet de relayer tous les ports TCP d'une même
863adresse avec une même instance et sans utiliser directement le mode transparent.
864
865Exemple :
866---------
867 listen http_proxy 0.0.0.0:65000
868 mode tcp
869 server server01 192.168.1.1 check port 60000
870 server server02 192.168.1.2 check port 60000
871
872 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
873 -j REDIRECT --to-ports 65000
874
willy tarreau0f7af912005-12-17 12:21:26 +0100875
willy tarreauc29948c2005-12-17 13:10:27 +01008764.2) Journalisation des connexions
877----------------------------------
willy tarreauc1cae632005-12-17 14:12:23 +01008784.2.1) Niveaux de log
879---------------------
willy tarreauc29948c2005-12-17 13:10:27 +0100880Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
881détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
882source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +0100883la requête HTTP, le code de retour, la quantité de données transmises, et même
884dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
885Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
886la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +0100887est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +0100888
willy tarreau8337c6b2005-12-17 13:41:01 +0100889 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
890 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +0100891ou
892 log global
893
894Remarque :
895----------
896La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
897paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +0100898
899Exemple :
900---------
901 listen http_proxy 0.0.0.0:80
902 mode http
903 log 192.168.2.200 local3
904 log 192.168.2.201 local4
905
willy tarreauc1cae632005-12-17 14:12:23 +01009064.2.2) Format des logs
907----------------------
908Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
909de la session entre le client et le relais. En précisant l'option 'tcplog',
910la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
911sur son état lors de la déconnexion, ainsi que le temps de connexion et la
912durée totale de la session.
913
914Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
915notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
916surveillance effectuant des connexions et déconnexions fréquentes, polluerait
917les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
918ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
919(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +0100920
willy tarreau036e1ce2005-12-17 13:46:33 +0100921Exemple :
922---------
923 listen http_proxy 0.0.0.0:80
924 mode http
925 option httplog
926 option dontlognull
927 log 192.168.2.200 local3
928
willy tarreauc1cae632005-12-17 14:12:23 +01009294.2.3) Chronométrage des événements
930-----------------------------------
931Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
932événements sont d'une très grande utilité. Tous les temps sont mesurés en
933millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
934la forme Tq/Tc/Tr/Tt :
935
936 - Tq: temps total de réception de la requête HTTP de la part du client.
937 C'est le temps qui s'est écoulé entre le moment où le client a établi
938 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
939 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
940 que la requête complète n'a jamais été reçue.
941
942 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
943 C'est le temps écoulé entre le moment ou le relais a initié la demande de
944 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
945 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
946 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
947 vers le serveur.
948
949 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
950 renvoyer la totalité des entêtes HTTP à partir du moment où il a acquitté
951 la connexion. Ca représente exactement le temps de traitement de la
952 transaction sans le transfert des données associées. Une valeur '-1'
953 indique que le serveur n'a pas envoyé la totalité de l'entête HTTP.
954
955 - Tt: durée de vie totale de la session, entre le moment où la demande de
956 connexion du client a été acquittée et le moment où la connexion a été
957 refermée aux deux extrémités (client et serveur). On peut donc en déduire
958 Td, le temps de transfert des données, en excluant les autres temps :
959
960 Td = Tt - (Tq + Tc + Tr)
961
962 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
963
964En mode TCP ('option tcplog'), seuls les deux indicateurs Tc et Tt sont
965rapportés.
966
967Ces temps fournissent de précieux renseignement sur des causes probables de
968problèmes. Du fait que le protocole TCP définisse des temps de retransmission
969de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
970de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
971problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
972valeur de time-out dans la configuration, c'est souvent qu'une session a été
973abandonnée sur expiration d'un time-out.
974
975Cas les plus fréquents :
976
977 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
978 le client et le relais.
979 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
980 le relais et le serveur durant la phase de connexion. Cet indicateur
981 devrait normalement toujours être très bas (moins de quelques dizaines).
982 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
983 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
984 de pertes entre le relais et le serveur.
985 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
986 client et le serveur utilisent du keep-alive HTTP entre eux et que la
987 session est maintenue après la fin des échanges. Voir plus loin pour
988 savoir comment désactiver le keep-alive HTTP.
989
990Autres cas ('xx' représentant une valeur quelconque à ignorer) :
991 -1/xx/xx/Tt : le client n'a pas envoyé sa requête dans le temps imparti ou
992 a refermé sa connexion sans compléter la requête.
993 Tq/-1/xx/Tt : la connexion n'a pas pu s'établir vers le serveur (refus ou
994 time-out au bout de Tt-Tq ms).
995 Tq/Tc/-1/Tt : le serveur a accepté la connexion mais n'a pas répondu dans
996 les temps ou bien a refermé sa connexion trop tôt, au bout
997 de Tt-(Tq+Tc) ms.
998
9994.2.4) Conditions de déconnexion
1000--------------------------------
1001Les logs TCP et HTTP fournissent un indicateur de complétude de la session.
1002C'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 +01001003 - sur le premier caractère, un code précisant le premier événement qui a causé
1004 la terminaison de la session :
1005
1006 C : fermeture de la session TCP de la part du client
1007 S : fermeture de la session TCP de la part du serveur, ou refus de connexion
1008 P : terminaison prématurée des sessions par le proxy, pour cas d'erreur
1009 interne ou de configuration (ex: filtre d'URL)
1010 c : expiration du délai d'attente côté client : clitimeout
1011 s : expiration du délai d'attente côté serveur: srvtimeout et contimeout
1012 - : terminaison normale.
1013
1014 - sur le second caractère, l'état d'avancement de la session HTTP lors de la
1015 fermeture :
1016
1017 R : terminaison en attendant la réception totale de la requête du client
1018 C : terminaison en attendant la connexion vers le serveur
1019 H : terminaison en attendant la réception totale des entêtes du serveur
1020 D : terminaison durant le transfert des données du serveur vers le client
1021 L : terminaison durant le transfert des dernières données du proxy vers
1022 le client, alors que le serveur a déjà fini.
1023 - : terminaison normale, après fin de transfert des données
1024
1025 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001026 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001027
1028 N : aucun cookie de persistence n'a été présenté.
1029 I : le client a présenté un cookie ne correspondant à aucun serveur
1030 connu.
1031 D : le client a présenté un cookie correspondant à un serveur hors
1032 d'usage. Suivant l'option 'persist', il a été renvoyé vers un
1033 autre serveur ou a tout de même tenté de se connecter sur celui
1034 correspondant au cookie.
1035 V : le client a présenté un cookie valide et a pu se connecter au
1036 serveur correspondant.
1037 - : non appliquable
1038
1039 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001040 persistence retrourné par le serveur (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001041
1042 N : aucun cookie de persistence n'a été fourni par le serveur.
willy tarreau197e8ec2005-12-17 14:10:59 +01001043 P : un cookie de persistence a été fourni par le serveur et transmis
1044 tel quel.
willy tarreau036e1ce2005-12-17 13:46:33 +01001045 I : aucun cookie n'a été fourni par le serveur, il a été inséré par le
1046 proxy.
1047 D : le cookie présenté par le serveur a été supprimé par le proxy pour
1048 ne pas être retourné au client.
1049 R : le cookie retourné par le serveur a été modifié par le proxy.
1050 - : non appliquable
1051
willy tarreau8337c6b2005-12-17 13:41:01 +01001052Le mot clé "capture" permet d'ajouter dans des logs HTTP des informations
1053capturées dans les échanges. La version 1.1.17 supporte uniquement une capture
1054de cookies client et serveur, ce qui permet dans bien des cas, de reconstituer
1055la session d'un utilisateur. La syntaxe est la suivante :
1056
1057 capture cookie <préfixe_cookie> len <longueur_capture>
1058
1059Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1060transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1061caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1062le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
1063place dans les logs.
1064
1065Exemples :
1066----------
1067 # capture du premier cookie dont le nom commence par "ASPSESSION"
1068 capture cookie ASPSESSION len 32
1069
1070 # capture du premier cookie dont le nom est exactement "vgnvisitor"
1071 capture cookie vgnvisitor= len 32
1072
willy tarreau036e1ce2005-12-17 13:46:33 +01001073Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
1074positionné par le serveur, précédé du cookie positionné par le client. Chacun de
1075ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni par le
1076client ou le serveur.
willy tarreau8337c6b2005-12-17 13:41:01 +01001077
willy tarreauc1cae632005-12-17 14:12:23 +010010784.2.5) Exemples de logs
1079-----------------------
1080- 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"
1081 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
1082 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01001083
willy tarreauc1cae632005-12-17 14:12:23 +01001084- haproxy[18113]: 127.0.0.1:34548 [15/Oct/2003:15:18:55] relais-http <NOSRV> -1/-1/-1/8490 -1 0 - - CR-- ""
1085 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
1086 ('C---') au bout de 8.5s, alors que le relais attendait l'entête ('-R--').
1087 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01001088
willy tarreauc1cae632005-12-17 14:12:23 +01001089- haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06] relais-http <NOSRV> -1/-1/-1/50001 408 0 - - cR-- ""
1090 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
1091 bout de 50s, alors que le relais attendait l'entête ('-R--'). Aucune
1092 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
1093 pu renvoyer un message 408 au client.
1094
1095- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
1096 => log en mode 'tcplog'. Expiration du time-out côté client ('c----') au bout
1097 de 5s.
1098
1099- 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"
1100 => La requête client met 3s à entrer (peut-être un problème réseau), et la
1101 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
1102 secondes (retries 3 dans la conf), puis un code 503 est retourné au client.
willy tarreau0f7af912005-12-17 12:21:26 +01001103
willy tarreauc29948c2005-12-17 13:10:27 +010011044.3) Modification des entêtes HTTP
1105----------------------------------
1106En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
1107requête et/ou la réponse à partir d'expressions régulières. Il est également
1108possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou de
1109la requête. Une limitation cependant : les en-têtes fournis au milieu de
1110connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
1111comme faisant partie des échanges de données consécutifs à la première requête.
1112Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01001113
1114La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01001115 reqadd <string> pour ajouter un en-tête dans la requête
1116 reqrep <search> <replace> pour modifier la requête
1117 reqirep <search> <replace> idem sans distinction majuscules/minuscules
1118 reqdel <search> pour supprimer un en-tête dans la requête
1119 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001120 reqallow <search> autoriser la requête si un entête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01001121 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001122 reqdeny <search> interdire la requête si un entête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01001123 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreau036e1ce2005-12-17 13:46:33 +01001124 reqpass <search> inhibe ces actions sur les entêtes validant <search>
1125 reqipass <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001126
willy tarreau036e1ce2005-12-17 13:46:33 +01001127 rspadd <string> pour ajouter un en-tête dans la réponse
1128 rsprep <search> <replace> pour modifier la réponse
1129 rspirep <search> <replace> idem sans distinction majuscules/minuscules
1130 rspdel <search> pour supprimer un en-tête dans la réponse
1131 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01001132
willy tarreau0f7af912005-12-17 12:21:26 +01001133
willy tarreau036e1ce2005-12-17 13:46:33 +01001134<search> est une expression régulière compatible POSIX regexp supportant le
1135groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
1136doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
1137chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
1138backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01001139
1140 \t pour une tabulation
1141 \r pour un retour charriot
1142 \n pour un saut de ligne
1143 \ pour différencier un espace d'un séparateur
1144 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01001145 \\ pour utiliser un backslash dans la regex
1146 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01001147 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01001148
willy tarreau0f7af912005-12-17 12:21:26 +01001149
willy tarreau5cbea6f2005-12-17 12:48:26 +01001150<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
1151Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
1152groupe délimité par des parenthèses dans l'expression régulière, par sa
1153position numérale. Les positions vont de 1 à 9, et sont codées par un '\'
1154suivi du chiffre désiré. Il est également possible d'insérer un caractère non
1155imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code
1156hexadécimal de ce caractère (comme en C).
1157
1158<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01001159dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001160
1161Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01001162-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001163 - 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 +01001164 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001165 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
1166 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
1167 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01001168 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
1169 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
1170 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
1171 entêtes inutiles avant les ajouts.
willy tarreau0f7af912005-12-17 12:21:26 +01001172
1173Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01001174----------
1175 ###### a few examples ######
1176
1177 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
1178 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
1179 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
1180
1181 # force proxy connections to close
willy tarreauc29948c2005-12-17 13:10:27 +01001182 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
willy tarreau197e8ec2005-12-17 14:10:59 +01001183 # rewrite locations
willy tarreauc29948c2005-12-17 13:10:27 +01001184 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01001185
1186 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01001187
willy tarreau197e8ec2005-12-17 14:10:59 +01001188 # Every header should end with a colon followed by one space.
1189 reqideny ^[^:\ ]*[\ ]*$
1190
1191 # block Apache chunk exploit
1192 reqideny ^Transfer-Encoding:[\ ]*chunked
1193 reqideny ^Host:\ apache-
1194
1195 # block annoying worms that fill the logs...
1196 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
1197 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
1198 reqideny ^[^:\ ]*\ .*<script
1199 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
1200
1201 # allow other syntactically valid requests, and block any other method
1202 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
1203 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
1204 reqideny ^[^:\ ]*\
1205
1206 # force connection:close, thus disabling HTTP keep-alive
1207 reqidel ^Connection:
1208 rspidel ^Connection:
1209 reqadd Connection:\ close
1210 rspadd Connection:\ close
1211
1212 # change the server name
1213 rspidel ^Server:\
1214 rspadd Server:\ Formilux/0.1.8
1215
willy tarreau0f7af912005-12-17 12:21:26 +01001216
willy tarreauc1cae632005-12-17 14:12:23 +01001217Enfin, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
1218'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
1219connaître l'adresse IP du client initial.
1220
1221Exemple :
1222---------
1223 listen http_proxy 0.0.0.0:80
1224 mode http
1225 log global
1226 option httplog
1227 option dontlognull
1228 option forwardfor
1229
willy tarreauc29948c2005-12-17 13:10:27 +010012304.4) Répartition avec persistence
1231---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001232
1233La combinaison de l'insertion de cookie avec la répartition de charge interne
1234permet d'assurer une persistence dans les sessions HTTP d'une manière
1235pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01001236 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01001237 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01001238 - insérer un cookie dans les réponses issues d'une répartition uniquement,
1239 et faire en sorte que des caches ne mémorisent pas ce cookie.
1240 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001241
1242Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01001243---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001244 listen application 0.0.0.0:80
1245 mode http
willy tarreau240afa62005-12-17 13:14:35 +01001246 cookie SERVERID insert nocache indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +01001247 balance roundrobin
1248 server 192.168.1.1:80 cookie server01 check
1249 server 192.168.1.2:80 cookie server02 check
1250
willy tarreau8337c6b2005-12-17 13:41:01 +010012514.5) Personalisation des erreurs
1252--------------------------------
1253
1254Certaines situations conduisent à retourner une erreur HTTP au client :
1255 - requête invalide ou trop longue => code HTTP 400
1256 - requête mettant trop de temps à venir => code HTTP 408
1257 - requête interdite (bloquée par un reqideny) => code HTTP 403
1258 - erreur interne du proxy => code HTTP 500
1259 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
1260 - aucun serveur disponible pour cette requête => code HTTP 503
1261 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
1262
1263Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
1264Cependant, en fonction du type de clientèle, on peut préférer retourner des
1265pages personnalisées. Ceci est possible par le biais de la commande "errorloc" :
1266
1267 errorloc <code_HTTP> <location>
1268
1269Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
1270le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
1271d'une page précisée dans <location>. Cette adresse peut être relative au site,
1272ou absolue. Comme cette réponse est traîtée par le navigateur du client
1273lui-même, il est indispensable que l'adresse fournie lui soit accessible.
1274
1275Exemple :
1276---------
1277 listen application 0.0.0.0:80
1278 errorloc 400 /badrequest.html
1279 errorloc 403 /forbidden.html
1280 errorloc 408 /toolong.html
1281 errorloc 500 http://haproxy.domain.net/bugreport.html
1282 errorloc 502 http://192.168.114.58/error50x.html
1283 errorloc 503 http://192.168.114.58/error50x.html
1284 errorloc 504 http://192.168.114.58/error50x.html
1285
willy tarreaua41a8b42005-12-17 14:02:24 +010012864.6) Changement des valeurs par défaut
1287--------------------------------------
1288
1289Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui évite
1290de répéter des paramètres communs à toutes les instances, tels que les timeouts,
1291adresses de log, modes de fonctionnement, etc.
1292
1293Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
1294précédent l'instance qui les utilisera. On peut donc mettre autant de sections
1295'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
1296section implique une annulation de tous les paramètres par défaut positionnés
1297précédemment, dans le but de les remplacer.
1298
1299La section 'defaults' utilise la même syntaxe que la section 'listen', aux
1300paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
1301un commentaire en guise paramètre.
1302
willy tarreau197e8ec2005-12-17 14:10:59 +01001303Dans la version 1.1.23, seuls les paramètres suivants peuvent être positionnés
willy tarreaua41a8b42005-12-17 14:02:24 +01001304dans une section 'defaults' :
1305 - log (le premier et le second)
1306 - mode { tcp, http, health }
1307 - balance { roundrobin }
1308 - disabled (pour désactiver toutes les instances qui suivent)
1309 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
1310 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
1311 - option { redispatch, transparent, keepalive, forwardfor, httplog,
willy tarreaueedaa9f2005-12-17 14:08:03 +01001312 dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01001313 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01001314 - cookie, capture
1315 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01001316
1317Ne sont pas supportés dans cette version, les adresses de dispatch et les
1318configurations de serveurs, ainsi que tous les filtres basés sur les
1319expressions régulières :
1320 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01001321 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01001322
1323Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
1324positionné par défaut. Donc si une option est spécifiée dans les paramètres par
1325défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
1326paramètres par défaut avant la déclaration de l'instance.
1327
1328Exemples :
1329----------
1330 defaults applications TCP
1331 log global
1332 mode tcp
1333 balance roundrobin
1334 clitimeout 180000
1335 srvtimeout 180000
1336 contimeout 4000
1337 retries 3
1338 redispatch
1339
1340 listen app_tcp1 10.0.0.1:6000-6063
1341 server srv1 192.168.1.1 check port 6000 inter 10000
1342 server srv2 192.168.1.2 backup
1343
1344 listen app_tcp2 10.0.0.2:6000-6063
1345 server srv1 192.168.2.1 check port 6000 inter 10000
1346 server srv2 192.168.2.2 backup
1347
1348 defaults applications HTTP
1349 log global
1350 mode http
1351 option httplog
1352 option forwardfor
1353 option dontlognull
1354 balance roundrobin
1355 clitimeout 20000
1356 srvtimeout 20000
1357 contimeout 4000
1358 retries 3
1359
1360 listen app_http1 10.0.0.1:80-81
1361 cookie SERVERID postonly insert indirect
1362 capture cookie userid= len 10
1363 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
1364 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
1365
1366 defaults
1367 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01001368
willy tarreaub719f002005-12-17 12:55:07 +01001369=======================
1370| Paramétrage système |
1371=======================
willy tarreau0f7af912005-12-17 12:21:26 +01001372
1373Sous Linux 2.4
1374==============
1375
willy tarreaub719f002005-12-17 12:55:07 +01001376-- cut here --
1377#!/bin/sh
1378# set this to about 256/4M (16384 for 256M machine)
1379MAXFILES=16384
1380echo $MAXFILES > /proc/sys/fs/file-max
1381ulimit -n $MAXFILES
1382
1383if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
1384 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
1385fi
1386
1387if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
1388 # 30 seconds for fin, 15 for time wait
1389 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
1390 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
1391 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
1392 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
1393fi
1394
willy tarreau0f7af912005-12-17 12:21:26 +01001395echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01001396echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
1397echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01001398echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01001399echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
1400echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01001401echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
1402echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01001403echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreaub719f002005-12-17 12:55:07 +01001404echo 0 > /proc/sys/net/ipv4/tcp_sack
1405echo 0 > /proc/sys/net/ipv4/tcp_dsack
1406
1407# auto-tuned on 2.4
1408#echo 262143 > /proc/sys/net/core/rmem_max
1409#echo 262143 > /proc/sys/net/core/rmem_default
1410
1411echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
1412echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
1413
1414-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01001415
willy tarreau197e8ec2005-12-17 14:10:59 +01001416Sous FreeBSD
1417============
1418
1419Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
1420Clement Laforet <sheepkiller@cultdeadsheep.org>.
1421
1422Pour plus d'informations :
1423http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
1424http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
1425http://www.freshports.org/net/haproxy
1426
1427
willy tarreau0f7af912005-12-17 12:21:26 +01001428-- fin --