blob: 83279f133fd1c157568265f3dc2bac31875a30eb [file] [log] [blame]
willy tarreau0174f312005-12-18 01:02:42 +01001 -------------------
Willy Tarreau94b45912006-05-31 06:40:15 +02002 HAProxy
willy tarreau0174f312005-12-18 01:02:42 +01003 Manuel de référence
4 -------------------
Willy Tarreau8f2b8552006-07-09 17:11:39 +02005 version 1.3.1
willy tarreauc5f73ed2005-12-18 01:26:38 +01006 willy tarreau
Willy Tarreau8f2b8552006-07-09 17:11:39 +02007 2006/07/09
willy tarreau0f7af912005-12-17 12:21:26 +01008
willy tarreaub719f002005-12-17 12:55:07 +01009================
10| Introduction |
11================
willy tarreau0f7af912005-12-17 12:21:26 +010012
Willy Tarreau94b45912006-05-31 06:40:15 +020013HAProxy est un relais TCP/HTTP offrant des facilités d'intégration en
willy tarreau0f7af912005-12-17 12:21:26 +010014environnement hautement disponible. En effet, il est capable de :
willy tarreauc29948c2005-12-17 13:10:27 +010015 - effectuer un aiguillage statique défini par des cookies ;
willy tarreau64a3cc32005-12-18 01:13:11 +010016 - effectuer une répartition de charge avec création de cookies pour assurer
17 la persistence de session ;
willy tarreau0f7af912005-12-17 12:21:26 +010018 - fournir une visibilité externe de son état de santé ;
willy tarreau8337c6b2005-12-17 13:41:01 +010019 - s'arrêter en douceur sans perte brutale de service ;
willy tarreauc5f73ed2005-12-18 01:26:38 +010020 - modifier/ajouter/supprimer des en-têtes dans la requête et la réponse ;
willy tarreau8337c6b2005-12-17 13:41:01 +010021 - interdire des requêtes qui vérifient certaines conditions ;
22 - utiliser des serveurs de secours lorsque les serveurs principaux sont hors
23 d'usage.
willy tarreau532bb552006-05-13 18:40:37 +020024 - maintenir des clients sur le bon serveur serveur d'application en fonction
25 de cookies applicatifs.
willy tarreau8f635a42006-05-21 23:05:54 +020026 - fournir des rapports d'état en HTML à des utilisateurs authentifiés, à
27 travers des URI de l'application interceptées.
willy tarreau0f7af912005-12-17 12:21:26 +010028
willy tarreau64a3cc32005-12-18 01:13:11 +010029Il requiert peu de ressources, et son architecture événementielle mono-
30processus lui permet facilement de gérer plusieurs milliers de connexions
31simultanées sur plusieurs relais sans effondrer le système.
willy tarreaua1598082005-12-17 13:08:06 +010032
willy tarreau0f7af912005-12-17 12:21:26 +010033
34===========================
35| Paramètres de lancement |
36===========================
37
38Les options de lancement sont peu nombreuses :
39
40 -f <fichier de configuration>
41 -n <nombre maximal total de connexions simultanées>
willy tarreau532bb552006-05-13 18:40:37 +020042 = 'maxconn' dans la section 'global'
43 -N <nombre maximal de connexions simultanées par instance>
44 = 'maxconn' dans les sections 'listen' ou 'default'
willy tarreau0f7af912005-12-17 12:21:26 +010045 -d active le mode debug
46 -D passe en daemon
willy tarreau982249e2005-12-18 00:57:06 +010047 -q désactive l'affichage de messages sur la sortie standard.
48 -V affiche les messages sur la sortie standard, même si -q ou 'quiet' sont
49 spécifiés.
50 -c vérifie le fichier de configuration puis quitte avec un code de retour 0
51 si aucune erreur n'a été trouvée, ou 1 si une erreur de syntaxe a été
52 détectée.
willy tarreaufe2c5c12005-12-17 14:14:34 +010053 -p <fichier> indique au processus père qu'il doit écrire les PIDs de ses
54 fils dans ce fichier en mode démon.
willy tarreau34f45302006-04-15 21:37:14 +020055 -sf specifie une liste de PIDs auxquels envoyer un signal FINISH
56 -st specifie une liste de PIDs auxquels envoyer un signal TERMINATE
willy tarreau0f7af912005-12-17 12:21:26 +010057 -s affiche les statistiques (si option compilée)
58 -l ajoute des informations aux statistiques
willy tarreau64a3cc32005-12-18 01:13:11 +010059 -de désactive l'utilisation de epoll()
60 -dp désactive l'utilisation de poll()
willy tarreau34f45302006-04-15 21:37:14 +020061 -db désactive la mise en arrière-plan (utile pour débugger)
62 -m <megs> applique une limitation de <megs> Mo d'utilisation mémoire
willy tarreau0f7af912005-12-17 12:21:26 +010063
willy tarreau64a3cc32005-12-18 01:13:11 +010064Le nombre maximal de connexion simultanées par proxy est le paramètre par
65défaut pour les proxies pour lesquels ce paramètre n'est pas précisé dans le
66fichier de configuration. Il s'agit du paramètre 'maxconn' dans les sections
67'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010068
willy tarreau64a3cc32005-12-18 01:13:11 +010069Le nombre maximal total de connexions simultanées limite le nombre de
70connexions TCP utilisables à un instant donné par le processus, tous proxies
71confondus. Ce paramètre remplace le paramètre 'maxconn' de la section 'global'.
willy tarreaua1598082005-12-17 13:08:06 +010072
willy tarreauc29948c2005-12-17 13:10:27 +010073Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
willy tarreauc5f73ed2005-12-18 01:26:38 +010074mode, toutes les connexions, déconnexions, et tous les échanges d'en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +010075sont affichés.
76
willy tarreau34f45302006-04-15 21:37:14 +020077Pour debugger, l'option '-db' est très pratique car elle désactive
78temporairement le mode daemon et le mode multi-processus. Le service peut alors
79être arrêté par un simple appui sur Ctrl-C, sans avoir à modifier la
80configuration ni à activer le mode debug complet.
81
willy tarreauc29948c2005-12-17 13:10:27 +010082Les statistiques ne sont disponibles que si le programme a été compilé avec
83l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
willy tarreau8f635a42006-05-21 23:05:54 +020084d'utilité que lors de benchmarks par exemple, et sont amenées à disparaitre.
willy tarreauc29948c2005-12-17 13:10:27 +010085
willy tarreau532bb552006-05-13 18:40:37 +020086Les paramètres '-st' et '-sf' sont utilisés pour la reconfiguration à chaud.
87Voir la section à ce sujet.
willy tarreau0f7af912005-12-17 12:21:26 +010088
89============================
90| Fichier de configuration |
91============================
92
willy tarreauc29948c2005-12-17 13:10:27 +010093Structure
94=========
willy tarreau0f7af912005-12-17 12:21:26 +010095
willy tarreaua1598082005-12-17 13:08:06 +010096L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
willy tarreau64a3cc32005-12-18 01:13:11 +010097les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est
98pas précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +010099
100Le fichier de configuration est découpé en sections répérées par des mots clés
101tels que :
102
103 - 'global'
104 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +0100105 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +0100106
107Tous les paramètres font référence à la section définie par le dernier mot clé
108reconnu.
109
110
willy tarreauc29948c2005-12-17 13:10:27 +01001111) Paramètres globaux
112=====================
willy tarreaua1598082005-12-17 13:08:06 +0100113
114Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
115proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
116supportés sont :
117
willy tarreau8337c6b2005-12-17 13:41:01 +0100118 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100119 - maxconn <nombre>
120 - uid <identifiant>
121 - gid <identifiant>
122 - chroot <répertoire>
123 - nbproc <nombre>
124 - daemon
125 - debug
willy tarreau64a3cc32005-12-18 01:13:11 +0100126 - noepoll
127 - nopoll
willy tarreaua1598082005-12-17 13:08:06 +0100128 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100129 - pidfile <fichier>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100130 - ulimit-n <nombre>
131
willy tarreaua1598082005-12-17 13:08:06 +0100132
1331.1) Journalisation des événements
134----------------------------------
135La plupart des événements sont journalisés : démarrages, arrêts, disparition et
136apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
137syslog vers un ou deux serveurs. La syntaxe est la suivante :
138
willy tarreau8337c6b2005-12-17 13:41:01 +0100139 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100140
141Les connexions sont envoyées en niveau "info". Les démarrages de service et de
142serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
143arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau64a3cc32005-12-18 01:13:11 +0100144bien pour les proxies que pour les serveurs testés par les proxies. Le
145paramètre optionnel <niveau_max> définit le niveau maximal de traces émises
146parmi les 8 valeurs suivantes :
willy tarreau8337c6b2005-12-17 13:41:01 +0100147 emerg, alert, crit, err, warning, notice, info, debug
148
willy tarreaueedaa9f2005-12-17 14:08:03 +0100149Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100150est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100151
152Les catégories possibles sont :
153 kern, user, mail, daemon, auth, syslog, lpr, news,
154 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
155 local0, local1, local2, local3, local4, local5, local6, local7
156
willy tarreau036e1ce2005-12-17 13:46:33 +0100157Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
158
willy tarreaua1598082005-12-17 13:08:06 +0100159Exemple :
160---------
161 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100162 log 192.168.2.200 local3
163 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100164
1651.2) limitation du nombre de connexions
166---------------------------------------
167Il est possible et conseillé de limiter le nombre global de connexions par
willy tarreauc5f73ed2005-12-18 01:26:38 +0100168processus à l'aide du mot clé global 'maxconn'. Les connexions sont comprises
169au sens 'acceptation de connexion', donc il faut s'attendre en règle général à
170avoir un peu plus du double de sessions TCP que le maximum de connexions fixé.
171C'est important pour fixer le paramètre 'ulimit -n' avant de lancer le proxy.
172Pour comptabiliser le nombre de sockets nécessaires, il faut prendre en compte
173ces paramètres :
174
willy tarreaua1598082005-12-17 13:08:06 +0100175 - 1 socket par connexion entrante
176 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100177 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100178 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100179 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100180
willy tarreau64a3cc32005-12-18 01:13:11 +0100181Dans le cas où chaque proxy n'écoute que sur un couple adresse/port,
willy tarreauc5f73ed2005-12-18 01:26:38 +0100182positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
183(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
184il est possible de spécifier cette limite dans la configuration à l'aide du
185mot-clé global 'ulimit-n', à condition bien entendu que le proxy ait été
186démarré sous le compte root (ou avec des droits suffisants pour élever le
187nombre de descripteurs de fichiers). Cette solution met un terme au problème
188récurrent d'incertitude de l'adéquation entre les limites systèmes lors de la
189dernière relance du proxessus et les limites en nombre de connexions. Noter que
190cette limite s'applique par processus.
191
192Exemple :
193---------
194 global
195 maxconn 32000
196 ulimit-n 65536
197
willy tarreauc29948c2005-12-17 13:10:27 +0100198
1991.3) Diminution des privilèges
200------------------------------
201Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
202serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100203de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100204
willy tarreauc29948c2005-12-17 13:10:27 +0100205Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
206numérique d'utilisateur. La valeur 0, correspondant normalement au super-
207utilisateur, possède ici une signification particulière car elle indique que
208l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
209C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
210un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
211changer. Il est particulièrement déconseillé d'utiliser des comptes génériques
212tels que 'nobody' car cette pratique revient à utiliser 'root' si d'autres
213processus utilisent les mêmes identifiants.
214
215Le paramètre 'chroot' autorise à changer la racine du processus une fois le
216programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100217puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100218généralement contournable sur certains OS (Linux, Solaris) pour peu que
219l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
220un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
221service pour cet usage, et de ne pas mutualiser un même répertoire pour
222plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
223il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
224l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100225
willy tarreau64a3cc32005-12-18 01:13:11 +0100226Remarque importante :
227---------------------
228Dans le cas où une telle faille serait mise en évidence, il est fort probable
229que les premières tentatives de son exploitation provoquent un arrêt du
willy tarreauc29948c2005-12-17 13:10:27 +0100230programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
willy tarreau64a3cc32005-12-18 01:13:11 +0100231encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur
232en environnement limité réduit les risques d'intrusion, il est parfois bien
233utile dans ces circonstances de connaître les conditions d'apparition du
234problème, via l'obtention d'un fichier 'core'. La plupart des systèmes, pour
235des raisons de sécurité, désactivent la génération du fichier 'core' après un
236changement d'identifiant pour le processus. Il faudra donc soit lancer le
237processus à partir d'un compte utilisateur aux droits réduits (mais ne pouvant
238pas effectuer le chroot), ou bien le faire en root sans réduction des droits
239(uid 0). Dans ce cas, le fichier se trouvera soit dans le répertoire de
240lancement, soit dans le répertoire spécifié après l'option 'chroot'. Ne pas
241oublier la commande suivante pour autoriser la génération du fichier avant de
242lancer le programme :
willy tarreauc29948c2005-12-17 13:10:27 +0100243
244# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100245
willy tarreauc29948c2005-12-17 13:10:27 +0100246Exemple :
247---------
248
249 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100250 uid 30000
251 gid 30000
252 chroot /var/chroot/haproxy
willy tarreauc29948c2005-12-17 13:10:27 +0100253
willy tarreaufe2c5c12005-12-17 14:14:34 +01002541.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100255----------------------------
256Le service peut fonctionner dans plusieurs modes :
257 - avant- / arrière-plan
258 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100259
willy tarreau64a3cc32005-12-18 01:13:11 +0100260Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne
261rend pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci
262dans un script de démarrage du système, sinon le système ne finirait pas son
willy tarreauc29948c2005-12-17 13:10:27 +0100263initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
264au processus appelant. C'est ce que fait l'option 'daemon' de la section
265'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100266
willy tarreau34f45302006-04-15 21:37:14 +0200267Le paramètre de ligne de commande '-db' inhibe les options globales 'daemon'
268et 'nbproc' pour faire fonctionner le processus en mode normal, avant-plan.
269
willy tarreauc29948c2005-12-17 13:10:27 +0100270Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
271standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
272logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
273Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100274
willy tarreauc29948c2005-12-17 13:10:27 +0100275Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
276problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
277entre les clients et les serveurs. Ce mode est incompatible avec les options
278'daemon' et 'quiet' pour des raisons de bon sens.
279
willy tarreaufe2c5c12005-12-17 14:14:34 +01002801.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100281-----------------------------------------------
282Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
283processeur pour effectuer les tâches de relayage, même si les charges
284nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
285grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
286programme sait démarrer plusieurs processus se répartissant la charge de
287travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
288section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100289qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
290la limite de nombre de descripteurs de fichiers allouée par processus sous
291Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100292
293Exemple :
294---------
295
296 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100297 daemon
298 quiet
299 nbproc 2
willy tarreauc29948c2005-12-17 13:10:27 +0100300
willy tarreaufe2c5c12005-12-17 14:14:34 +01003011.6) Simplification de la gestion des processus
302-----------------------------------------------
303Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
304paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
305d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
306le numéro de PID des processus fils, à raison d'un par ligne (valable
307uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
308afin de rester compatible avec un répertoire protégé en lecture seule. Il
309appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
3100644.
311
312Exemple :
313---------
314
315 global
316 daemon
317 quiet
318 nbproc 2
319 pidfile /var/run/haproxy-private.pid
320
321 # pour stopper seulement ces processus parmi d'autres :
322 # kill $(</var/run/haproxy-private.pid)
323
willy tarreau34f45302006-04-15 21:37:14 +0200324 # pour recharger une configuration avec un impact minimal sur le service,
325 # et sans casser les sessions existantes :
326 # haproxy -f haproxy.cfg -p $(</var/run/haproxy-private.pid) -st $(</var/run/haproxy-private.pid)
willy tarreauc29948c2005-12-17 13:10:27 +0100327
willy tarreau64a3cc32005-12-18 01:13:11 +01003281.7) Mécanismes de traitements des événements
329---------------------------------------------
330A partir de la version 1.2.5, haproxy supporte les mécanismes poll() et
331epoll(). Sur les systems où select() est limité par FD_SETSIZE (comme Solaris),
332poll() peut être une alternative intéressante. Des tests de performance
333montrent que les performances de poll() ne décroissent pas aussi vite que le
334nombre de sockets augmente, ce qui en fait une solution sûre pour les fortes
335charges. Cela dit, Soalris utilise déjà poll() pour émuler select(), donc tant
336que le nombre de sockets ne dépasse pas FD_SETSIZE, poll() ne devrait pas
337apporter de performances supplémentaires. Sur les systèmes à base Linux
338incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
339qui est extrèmement rapide indépendamment du nombre de sockets. Les tests sur
340haproxy ont montré une performance constante de 1 à 40000 sessions simultanées.
341
342Haproxy utilisera epoll() lorsqu'il est disponible, et se repliera sur poll(),
343puis en dernier lieu sur select(). Cependant, si pour une raison quelconque il
344s'avérait nécessaire de désactiver epoll() ou poll() (p.ex: à cause d'un bug ou
345juste pour comparer les performances), deux nouvelles options globales ont été
346ajoutées dans ce but : 'noepoll' et 'nopoll'.
347
348Exemple :
349---------
350 global
351 # utiliser seulement select()
352 noepoll
353 nopoll
354
355Remarque :
356----------
357Dans le but d'assurer une portabilité maximale des configurations, ces options
358sont acceptées et ignorées si les mécanismes poll() ou epoll() n'ont pas été
359activés lors de la compilation.
360
361Afin de simplifier la résolution de problèmes, le paramètre '-de' en ligne de
362commande désactive epoll() et le paramètre '-dp' désactive poll(). Ils sont
363respectivement équivalents à 'noepoll' et 'nopoll'.
364
365
willy tarreauc29948c2005-12-17 13:10:27 +01003662) Définition d'un service en écoute
367====================================
368
369Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100370
willy tarreaua41a8b42005-12-17 14:02:24 +0100371 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100372
willy tarreauc29948c2005-12-17 13:10:27 +0100373- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
willy tarreau64a3cc32005-12-18 01:13:11 +0100374 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé.
375 Aucun test n'est effectué concernant l'unicité de ce nom, qui n'est pas
376 obligatoire, mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100377
willy tarreaua41a8b42005-12-17 14:02:24 +0100378- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
379 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
380 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100381
willy tarreaua41a8b42005-12-17 14:02:24 +0100382- <plage_ports> correspond soit à un port, soit à une plage de ports sur
383 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
384 Cette plage peut être :
385 - soit un port numérique (ex: '80')
386 - soit une plage constituée de deux valeurs séparées par un tiret
387 (ex: '2000-2100') représentant les extrémités incluses dans la
388 plage.
389 Il faut faire attention à l'usage des plages, car chaque combinaison
390 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
391 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
392 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
willy tarreau64a3cc32005-12-18 01:13:11 +0100393 niveau de privilège particulier lors du lancement du programme
394 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100395
willy tarreaua41a8b42005-12-17 14:02:24 +0100396- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
397 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
398 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
399
400Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100401---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100402 listen http_proxy :80
403 listen x11_proxy 127.0.0.1:6000-6009
404 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
405 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100406
willy tarreaua41a8b42005-12-17 14:02:24 +0100407Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
408rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
409de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
410l'écriture de configurations :
411
412 bind [ <adresse_IP>:<plage_ports>[,...] ]
413
414Exemples :
415----------
416 listen http_proxy
417 bind :80,:443
willy tarreauc5f73ed2005-12-18 01:26:38 +0100418 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100419
willy tarreauc29948c2005-12-17 13:10:27 +01004202.1) Inhibition d'un service
421----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100422Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100423commenter toute une partie du fichier. Il suffit de positionner le mot clé
424"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100425
426 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100427 disabled
willy tarreau0f7af912005-12-17 12:21:26 +0100428
willy tarreaueedaa9f2005-12-17 14:08:03 +0100429Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
willy tarreauc5f73ed2005-12-18 01:26:38 +0100430 désactivé par le mot clé 'disabled', par exemple à cause d'une
431 configuration par défaut.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100432
willy tarreauc29948c2005-12-17 13:10:27 +01004332.2) Mode de fonctionnement
434---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100435Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100436 - TCP
437 - HTTP
willy tarreau532bb552006-05-13 18:40:37 +0200438 - état de santé
willy tarreau0f7af912005-12-17 12:21:26 +0100439
440Mode TCP
441--------
willy tarreau64a3cc32005-12-18 01:13:11 +0100442Dans ce mode, le service relaye, dès leur établissement, les connexions TCP
443vers un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il
444s'agit simplement d'une association
445 source<adresse:port> -> destination<adresse:port>.
willy tarreauc29948c2005-12-17 13:10:27 +0100446Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100447
willy tarreauc29948c2005-12-17 13:10:27 +0100448Exemple :
449---------
willy tarreau0f7af912005-12-17 12:21:26 +0100450 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100451 mode tcp
willy tarreau0f7af912005-12-17 12:21:26 +0100452
453Mode HTTP
454---------
willy tarreauc29948c2005-12-17 13:10:27 +0100455Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
456serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
willy tarreauc5f73ed2005-12-18 01:26:38 +0100457décision. Les en-têtes HTTP sont analysés pour y trouver un éventuel cookie, et
willy tarreauc29948c2005-12-17 13:10:27 +0100458certains d'entre-eux peuvent être modifiés par le biais d'expressions
459régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
460relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100461
willy tarreauc29948c2005-12-17 13:10:27 +0100462Exemple :
463---------
willy tarreau0f7af912005-12-17 12:21:26 +0100464 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100465 mode http
willy tarreau0f7af912005-12-17 12:21:26 +0100466
467Mode supervision
468----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100469Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
470santé du service. Il se contente de retourner "OK" à tout client se connectant
471sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100472déterminer quels sont les services utilisables. Si l'option 'httpchk' est
473activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
474attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100475le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100476
willy tarreauc29948c2005-12-17 13:10:27 +0100477Exemple :
478---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100479 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100480 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100481 mode health
willy tarreau0f7af912005-12-17 12:21:26 +0100482
willy tarreau197e8ec2005-12-17 14:10:59 +0100483 # réponse HTTP : 'HTTP/1.0 200 OK'
484 listen http_health_check 0.0.0.0:60001
willy tarreauc5f73ed2005-12-18 01:26:38 +0100485 mode health
486 option httpchk
willy tarreau197e8ec2005-12-17 14:10:59 +0100487
willy tarreau0f7af912005-12-17 12:21:26 +0100488
willy tarreau532bb552006-05-13 18:40:37 +02004892.2.1 Supervision
490-----------------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100491Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
492bon fonctionnement du proxy sans perturber le service. Le mot-clé 'monitor-net'
493a été créé dans le butd de spécifier un réseau d'équipements qui ne PEUVENT PAS
494utiliser le service pour autre chose que des tests de fonctionnement. C'est
495particulièrement adapté aux proxies TCP, car cela empêche le proxy de relayer
496des établissements de connexion émis par un outil de surveillance.
497
498Lorsque c'est utilisé sur un proxy TCP, la connexion est acceptée puis refermée
499et rien n'est logué. C'est suffisant pour qu'un répartiteur de charge en amont
500détecte que le service est disponible.
501
502Lorsque c'est utilisé sur un proxy HTTP, la connexion est acceptée, rien n'est
503logué, puis la réponse suivante est envoyée et la session refermée :
504"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un répartiteur de charge
505HTTP en amont détecte le service comme opérationnel, aussi bien à travers des
506tests TCP que HTTP.
507
508Les proxies utilisant le mot-clé 'monitor-net' peuvent accessoirement se passer
509de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
510émises depuis d'autres adresses que celles du réseau de tests.
511
512Exemple :
513---------
514
515 listen tse-proxy
516 bind :3389,:1494,:5900 # TSE, ICA and VNC at once.
517 mode tcp
518 balance roundrobin
519 server tse-farm 192.168.1.10
520 monitor-net 192.168.1.252/31 # L4 load-balancers on .252 and .253
521
522
Willy Tarreau1c47f852006-07-09 08:22:27 +0200523Lorsque le système effectuant les tests est situé derrière un proxy, le mot-clé
524'monitor-net' n'est pas utilisable du fait que haproxy verra toujours la même
525adresse pour le proxy. Pour pallier à cette limitation, la version 1.2.15 a
526apporté le mot-clé 'monitor-uri'. Il définit une URI qui ne sera ni retransmise
527ni logée, mais pour laquelle haproxy retournera immédiatement une réponse
528"HTTP/1.0 200 OK". Cela rend possibles les tests de validité d'une chaîne
529reverse-proxy->haproxy en une requête HTTP. Cela peut être utilisé pour valider
530une combinaision de stunnel+haproxy à l'aide de tests HTTPS par exemple. Bien
531entendu, ce mot-clé n'est valide qu'en mode HTTP, sinon il n'y a pas de notion
532d'URI. Noter que la méthode et la version HTTP sont simplement ignorées.
533
534Exemple :
535---------
536
537 listen stunnel_backend :8080
538 mode http
539 balance roundrobin
540 server web1 192.168.1.10:80 check
541 server web2 192.168.1.11:80 check
542 monitor-uri /haproxy_test
543
544
willy tarreauc29948c2005-12-17 13:10:27 +01005452.3) Limitation du nombre de connexions simultanées
546---------------------------------------------------
547Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
548connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
549d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
550limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100551
willy tarreauc29948c2005-12-17 13:10:27 +0100552Exemple :
553---------
554 listen tiny_server 0.0.0.0:80
555 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100556
557
willy tarreauc29948c2005-12-17 13:10:27 +01005582.4) Arrêt en douceur
559---------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100560Il est possible d'arrêter les services en douceur en envoyant un signal
willy tarreau22739ef2006-01-20 20:43:32 +0100561SIGUSR1 au processus relais. Tous les services seront alors mis en phase
willy tarreau64a3cc32005-12-18 01:13:11 +0100562d'arrêt, mais pourront continuer d'accepter des connexions pendant un temps
563défini par le paramètre 'grace' (en millisecondes). Cela permet par exemple,
564de faire savoir rapidement à un répartiteur de charge qu'il ne doit plus
565utiliser un relais, tout en continuant d'assurer le service le temps qu'il
566s'en rende compte.
567
568Remarque :
569----------
570Les connexions actives ne sont jamais cassées. Dans le pire des cas, il faudra
willy tarreau22739ef2006-01-20 20:43:32 +0100571attendre en plus leur expiration avant l'arrêt total du processus, ou bien tuer
572manuellement le processus par l'envoi d'un signal SIGTERM. La valeur par défaut
573du paramètre 'grace' est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100574
575Exemple :
576---------
willy tarreauc29948c2005-12-17 13:10:27 +0100577 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100578 # le service tournera encore 10 secondes après la demande d'arrêt
579 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100580 mode http
581 grace 10000
willy tarreau0f7af912005-12-17 12:21:26 +0100582
willy tarreauc29948c2005-12-17 13:10:27 +0100583 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100584 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100585 mode health
586 grace 0
willy tarreau0f7af912005-12-17 12:21:26 +0100587
willy tarreau39df2dc2006-01-29 21:56:05 +0100588A partir de la version 1.2.8, un nouveau mécanisme de reconfiguration à chaud
willy tarreau22739ef2006-01-20 20:43:32 +0100589a été introduit. Il est désormais possible de mettre les proxies en "pause" en
590envoyant un signal SIGTTOU aux processus. Cela désactivera les sockets d'écoute
591sans casser les sessions existantes. Suite à cela, l'envoi d'un signal SIGTTIN
592réactivera les sockets d'écoute. Ceci est très pratique pour tenter de charger
593une nouvelle configuration ou même une nouvelle version de haproxy sans casser
594les connexions existantes. Si le rechargement s'effectue correctement, il ne
595reste plus qu'à envoyer un signal SIGUSR1 aux anciens processus, ce qui
596provoquera leur arrêt immédiat dès que leurs connexions seront terminées ; en
597revanche, si le rechargement échoue, il suffit d'envoyer un signal SIGTTIN pour
598remettre les ports en écoute et rétablir le service immédiatement. Veuillez
599noter que le paramètre 'grace' est ignoré pour le signal SIGTTOU ainsi que le
600signal SIGUSR1 une fois le processus en pause. Aussi, il peut s'avérer très
601utile de sauver le fichier de pid avant de démarrer une nouvelle instance.
602
willy tarreau34f45302006-04-15 21:37:14 +0200603Ce mécanisme est pleinement exploité à partir de la version 1.2.11 avec les
willy tarreau532bb552006-05-13 18:40:37 +0200604options '-st' et '-sf' (voir ci-dessous).
605
6062.4) Reconfiguration à chaud
607----------------------------
608Les paramètres '-st' et '-sf' sont utilisés pour informer des processus
609existants que la configuration va être rechargée. Ils recevront le signal
610SIGTTOU, leur demandant de libérer les ports en écoute afin que le nouveau
611processus puisse les prendre. Si quoi que ce soit se passe mal, le nouveau
612processus leur enverra un signal SIGTTIN pour leur indiquer qu'ils peuvent
613se remettre en écoute et continuer leur travail. En revanche, si la
614configuration se charge correctement, alors ils recevront un signal de demande
615de fin de travail en douceur (-sf), ou de terminaison immédiate (-st) qui
616coupera les sessions en cours. Un usage typique tel que celui-ci permet de
617recharger une configuration sans interruption de service :
618
619 # haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
620
willy tarreau0f7af912005-12-17 12:21:26 +0100621
willy tarreauc29948c2005-12-17 13:10:27 +01006222.5) Temps d'expiration des connexions
623--------------------------------------
624Il est possible de paramétrer certaines durées d'expiration au niveau des
625connexions TCP. Trois temps indépendants sont configurables et acceptent des
626valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
627session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100628
629 - temps d'attente d'une donnée de la part du client, ou de la
630 possibilité de lui envoyer des données : "clitimeout" :
631
willy tarreauc5f73ed2005-12-18 01:26:38 +0100632 # time-out client à 2mn30.
633 clitimeout 150000
willy tarreau0f7af912005-12-17 12:21:26 +0100634
635 - temps d'attente d'une donnée de la part du serveur, ou de la
636 possibilité de lui envoyer des données : "srvtimeout" :
637
willy tarreauc5f73ed2005-12-18 01:26:38 +0100638 # time-out serveur à 30s.
639 srvtimeout 30000
willy tarreau0f7af912005-12-17 12:21:26 +0100640
641 - temps d'attente de l'établissement d'une connexion vers un serveur
642 "contimeout" :
643
willy tarreauc29948c2005-12-17 13:10:27 +0100644 # on abandonne si la connexion n'est pas établie après 4 secondes
willy tarreauc5f73ed2005-12-18 01:26:38 +0100645 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100646
willy tarreauc29948c2005-12-17 13:10:27 +0100647Remarques :
648-----------
649 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
650 type "health".
651 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
willy tarreau64a3cc32005-12-18 01:13:11 +0100652 possible de perdre des paquets. Du fait que la première retransmission
653 TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
654 inférieur à 3 secondes ne permet pas de se rattraper sur la perte
655 de paquets car la session aura été abandonnée avant la première
656 retransmission. Une valeur de 4 secondes réduira considérablement
657 le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100658
willy tarreauc29948c2005-12-17 13:10:27 +01006592.6) Tentatives de reconnexion
660------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100661Lors d'un échec de connexion vers un serveur, il est possible de
662retenter (potentiellement vers un autre serveur, en cas de répartition
663de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100664abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100665
willy tarreauc29948c2005-12-17 13:10:27 +0100666Exemple :
667---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100668 # on essaie encore trois fois maxi
669 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100670
willy tarreau34f45302006-04-15 21:37:14 +0200671Il est à noter que la tentative de reconnexion peut amener à utiliser un autre
672serveur si le premier a disparu entre deux tentatives de connexion.
673
willy tarreau0f7af912005-12-17 12:21:26 +0100674
willy tarreauc29948c2005-12-17 13:10:27 +01006752.7) Adresse du serveur
676-----------------------
677Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
678le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
679serveur d'assignation de cookie dans le cas où le service consiste à assurer
680uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100681le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
682du serveur distant, et il est maintenant recommandé d'utiliser de préférence
683le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100684
willy tarreauc29948c2005-12-17 13:10:27 +0100685Exemple :
686---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100687 # on envoie toutes les nouvelles connexions ici
688 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100689
willy tarreauc29948c2005-12-17 13:10:27 +0100690Remarque :
691----------
692Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
693'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100694
willy tarreau0f7af912005-12-17 12:21:26 +0100695
willy tarreau240afa62005-12-17 13:14:35 +01006962.8) Adresse de sortie
697----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100698Il est possible de forcer l'adresse utilisée pour établir les connexions vers
699les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
700port, bien que cette fonctionnalité se limite à des usages très spécifiques.
701C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100702pour permettre aux serveurs de trouver le chemin de retour dans des contextes
703de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
704choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
705librement par le système. Il est à noter que depuis la version 1.1.18, les
706tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
707source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100708
709Exemples :
710----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100711 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100712 # toutes les connexions prennent l'adresse 192.168.1.200
713 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100714
willy tarreaua41a8b42005-12-17 14:02:24 +0100715 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100716 # utiliser l'adresse 192.168.1.200 et le port réservé 900
717 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100718
719
7202.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100721--------------------------------
722En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
723vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
724par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100725
willy tarreauc29948c2005-12-17 13:10:27 +0100726Exemple :
727---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100728 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100729 mode http
730 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100731
willy tarreauc29948c2005-12-17 13:10:27 +0100732On peut modifier l'utilisation du cookie pour la rendre plus intelligente
733vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
734réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
735cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100736de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
737inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100738
739Exemples :
740----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100741
742Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100743dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
744directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100745
willy tarreauc5f73ed2005-12-18 01:26:38 +0100746 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100747
willy tarreauc29948c2005-12-17 13:10:27 +0100748Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
749lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100750
willy tarreauc5f73ed2005-12-18 01:26:38 +0100751 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100752
willy tarreau64a3cc32005-12-18 01:13:11 +0100753Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
754accès en répartition de charge interne. Dans ce cas, il est souhaitable que
755tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100756retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100757
willy tarreauc5f73ed2005-12-18 01:26:38 +0100758 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100759
willy tarreau0174f312005-12-18 01:02:42 +0100760Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
761puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
762permet d'insérer une instance de haproxy devant une application sans risquer
763d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
764plus d'un cookie :
765
766 cookie JSESSIONID prefix
767
willy tarreau240afa62005-12-17 13:14:35 +0100768Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
769ajouter le mot clé 'nocache' après 'insert' :
770
willy tarreauc5f73ed2005-12-18 01:26:38 +0100771 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100772
willy tarreau64a3cc32005-12-18 01:13:11 +0100773Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
774mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100775
willy tarreauc5f73ed2005-12-18 01:26:38 +0100776 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100777
willy tarreau240afa62005-12-17 13:14:35 +0100778
willy tarreau96d40372005-12-17 13:11:56 +0100779Remarques :
780-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100781- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
782 s'adapter à des applications générant déjà le cookie, avec un contenu
783 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100784
willy tarreau96d40372005-12-17 13:11:56 +0100785- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
786 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
787 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100788
willy tarreau240afa62005-12-17 13:14:35 +0100789- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
790 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
791 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
792 cookie de persistence inséré, donc provoquer des changements de serveurs pour
793 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100794
willy tarreau0174f312005-12-18 01:02:42 +0100795- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
796 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
797 présenté par l'application qui est censée savoir à quel moment il peut
798 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
799 présenté par le client dans chaque requête ultérieure, il est indispensable
800 de s'assurer que le client et le serveur communiqueront sans "keep-alive
801 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
802
willy tarreaucd878942005-12-17 13:27:43 +0100803- lorsque l'application est bien connue, et que les parties nécessitant de la
804 persistence sont systématiquement accédées par un formulaire en mode POST,
805 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
806 et "indirect", car la page d'accueil reste cachable, et c'est l'application
807 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100808
willy tarreau240afa62005-12-17 13:14:35 +01008092.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100810----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100811En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
812par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100813
willy tarreau5cbea6f2005-12-17 12:48:26 +0100814 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100815
willy tarreauc29948c2005-12-17 13:10:27 +0100816- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
817 configuration et les logs.
818- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
819- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100820
821Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100822---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100823 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100824 mode http
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
830Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100831-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100832
willy tarreaua41a8b42005-12-17 14:02:24 +01008333) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100834=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100835
willy tarreauc29948c2005-12-17 13:10:27 +0100836Le relais peut effectuer lui-même la répartition de charge entre les différents
837serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
838cela, on précise le mot clé 'balance' dans la définition du service,
willy tarreau34f45302006-04-15 21:37:14 +0200839éventuellement suivi du nom d'un algorithme de répartition. Jusqu'à la version
8401.2.11, seul 'roundrobin' était géré, et c'est aussi la valeur implicite par
841défaut. Avec la version 1.2.12, le nouveau mot clé 'source' est apparu. Il est
842évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
willy tarreauc29948c2005-12-17 13:10:27 +0100843spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100844
845Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100846---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100847
willy tarreaua41a8b42005-12-17 14:02:24 +0100848 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100849 mode http
850 cookie SERVERID
851 balance roundrobin
852 server web1 192.168.1.1:80 cookie server01
853 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100854
willy tarreaua41a8b42005-12-17 14:02:24 +0100855Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
856du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
857sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
858champ <port> de l'adresse serveur :
859
860 - non spécifié ou nul :
861 la connexion sera envoyée au serveur sur le même port que celui sur
862 lequel le relais a reçu la connexion.
863
864 - valeur numérique (seul cas supporté pour les versions antérieures) :
865 le serveur recevra la connexion sur le port désigné.
866
867 - valeur numérique précédée d'un signe '+' :
868 la connexion sera envoyée au serveur sur le même port que celui sur
869 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
870
871 - valeur numérique précédée d'un signe '-' :
872 la connexion sera envoyée au serveur sur le même port que celui sur
873 lequel le relais a reçu la connexion, duquel on soustrait la valeur
874 désignée.
875
876Exemples :
877----------
878
879# même que précédemment
880
881 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100882 mode http
883 cookie SERVERID
884 balance roundrobin
885 server web1 192.168.1.1 cookie server01
886 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100887
888# relayage simultané des ports 80 et 81 et 8080-8089
889
890 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100891 mode http
892 cookie SERVERID
893 balance roundrobin
894 server web1 192.168.1.1 cookie server01
895 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100896
897# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
898
899 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100900 mode tcp
901 balance roundrobin
902 server srv1 192.168.1.1:+1000
903 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100904
willy tarreau34f45302006-04-15 21:37:14 +0200905Comme indiqué précédemment, la version 1.2.12 apporta le nouveau mot clé
906'source'. Lorsque celui-ci est utilisé, l'adresse IP du client est hachée et
907distribuée de manière homogène parmi les serveurs disponibles, de sorte qu'une
908même adresse IP aille toujours sur le même serveur tant qu'il n'y a aucun
909changement dans le nombre de serveurs disponibles. Ceci peut être utilisé par
910exemple pour attacher le HTTP et le HTTPS sur un même serveur pour un même
911client. Cela peut également être utilisé pour améliorer la persistance
912lorsqu'une partie de la population des clients n'accepte pas les cookies. Dans
913ce cas, seuls ces derniers seront perturbés par la perte d'un serveur.
914
915NOTE: il est important de prendre en compte le fait que beaucoup d'internautes
916 naviguent à travers des fermes de proxies qui assignent des adresses IP
917 différentes à chaque requête. D'autres internautes utilisent des liens à
918 la demande et obtiennent une adresse IP différente à chaque connexion. De
919 ce fait, le paramètre 'source' doit être utilisé avec une extrème
920 précaution.
921
922Exemples :
923----------
924
925# assurer qu'une même adresse IP ira sur le même serveur pour tout service
926
927 listen http_proxy
928 bind :80,:443
929 mode http
930 balance source
931 server web1 192.168.1.1
932 server web2 192.168.1.2
933
934# améliorer la persistance par l'utilisation de la source en plus du cookie :
935
936 listen http_proxy :80
937 mode http
938 cookie SERVERID
939 balance source
940 server web1 192.168.1.1 cookie server01
941 server web2 192.168.1.2 cookie server02
942
willy tarreau0f7af912005-12-17 12:21:26 +0100943
willy tarreauc29948c2005-12-17 13:10:27 +01009443.1) Surveillance des serveurs
945------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100946Il est possible de tester l'état des serveurs par établissement de connexion
947TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
948utilisé dans le processus de répartition de charge interne. Pour activer la
949surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
950Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
951tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
952paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
953Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreau34f45302006-04-15 21:37:14 +0200954
willy tarreaue47c8d72005-12-17 12:55:52 +0100955 - inter : 2000
956 - rise : 2
957 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +0100958 - port : port de connexion du serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +0100959
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100960Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +0100961certains cas de pannes, des serveurs peuvent continuer à accepter les
962connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
963d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
964et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
965les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
966contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
967RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
9681.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
969possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
970l'avantage d'être facilement extractibles des logs, et de ne pas induire
971d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
972considérées valides, les autres (y compris non-réponses) aboutissent à un
973échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
974deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
975"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
976accepte donc 4 formes :
willy tarreau34f45302006-04-15 21:37:14 +0200977
willy tarreaueedaa9f2005-12-17 14:08:03 +0100978 - option httpchk -> OPTIONS / HTTP/1.0
979 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
980 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
981 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreau34f45302006-04-15 21:37:14 +0200982
Willy Tarreauf3c69202006-07-09 16:42:34 +0200983HAProxy est souvent utilisé pour relayer divers protocoles reposant sur TCP,
984tels que HTTPS, SMTP ou LDAP, le plus commun étant HTTPS. Un problème assez
985couramment rencontré dans les data centers est le besoin de relayer du trafic
986vers des serveurs lointains tout en maintenant la possibilité de basculer sur
987un serveur de secours. Les tests purement TCP ne suffisent pas toujours dans
988ces situations car l'on trouve souvent, dans la chaîne, des proxies, firewalls
989ou répartiteurs de charge qui peuvent acquitter la connexion avant qu'elle
990n'atteigne le serveur. La seule solution à ce problème est d'envoyer des tests
991applicatifs. Comme la demande pour les tests HTTPS est élevée, ce test a été
992implémenté en version 1.2.15 sur la base de messages SSLv3 CLIENT HELLO. Pour
993l'activer, utiliser "option ssl-hello-chk". Ceci enverra des messages SSLv3
994CLIENT HELLO aux serveurs, en annonçant un support pour la majorité des
995algorithmes de chiffrement. Si en retour, le serveur envoie ce qui ressemble à
996une réponse SSLv3 SERVER HELLO ou ALERT (refus des algorithmes), alors la
997réponse sera considérée comme valide. Noter qu'Apache ne produit pas de log
998lorsqu'il reçoit des messages HELLO, ce qui en fait un type de message
999parfaitement adapté à ce besoin.
1000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001001Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001002
willy tarreau8337c6b2005-12-17 13:41:01 +01001003Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
1004utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
1005ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
1006de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
1007les serveurs de secours qui le précèdent sont hors d'usage. Il n'y a donc pas
Willy TARREAU3481c462006-03-01 22:37:57 +01001008de répartition de charge entre des serveurs de secours par défaut. A partir
1009de la version 1.2.9, il est possible de les utiliser simultanément grâce à
1010l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
1011d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
1012de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
1013définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
1014qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +01001015
willy tarreaua41a8b42005-12-17 14:02:24 +01001016Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
1017vers un port différent de celui de service. C'est nécessaire principalement
1018pour les configurations où le serveur n'a pas de port prédéfini, par exemple
1019lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
1020le paramètre 'port' suivi du numéro de port devant répondre aux requêtes.
1021
willy tarreau64a3cc32005-12-18 01:13:11 +01001022Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
1023l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
1024SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
1025envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
1026elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
1027local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +01001028
willy tarreau982249e2005-12-18 00:57:06 +01001029Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
1030logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
1031afin de notifier l'administrateur qu'il faut prendre une action immédiate.
1032
willy tarreau0174f312005-12-18 01:02:42 +01001033Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
1034même valeur de cookie. C'est particulièrement utile en mode backup, pour
1035sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
1036oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
1037temporairement vers une page d'erreur en attendant le redémarrage d'une
1038application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
1039le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
1040chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
1041le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
1042pour plus d'informations.
1043
willy tarreauc29948c2005-12-17 13:10:27 +01001044Exemples :
1045----------
willy tarreaua41a8b42005-12-17 14:02:24 +01001046# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001047 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001048 mode http
1049 cookie SERVERID
1050 balance roundrobin
1051 server web1 192.168.1.1:80 cookie server01 check
1052 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001053
willy tarreau2f6ba652005-12-17 13:57:42 +01001054# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001055 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001056 mode http
1057 cookie SERVERID
1058 balance roundrobin
1059 option httpchk
1060 server web1 192.168.1.1:80 cookie server01 check
1061 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +01001062
willy tarreau2f6ba652005-12-17 13:57:42 +01001063# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
1064 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001065 mode http
1066 cookie SERVERID
1067 balance roundrobin
1068 option httpchk /index.html
1069 server web1 192.168.1.1:80 cookie server01 check
1070 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +01001071
willy tarreaueedaa9f2005-12-17 14:08:03 +01001072# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1073 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001074 mode http
1075 cookie SERVERID
1076 balance roundrobin
1077 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1078 server web1 192.168.1.1:80 cookie server01 check
1079 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001080
willy tarreau0174f312005-12-18 01:02:42 +01001081# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1082# douceur utilisant un second port (81) juste pour les health-checks.
1083 listen http_proxy 0.0.0.0:80
1084 mode http
1085 cookie JSESSIONID prefix
1086 balance roundrobin
1087 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1088 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1089 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1090 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1091 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1092
willy tarreau96d40372005-12-17 13:11:56 +01001093# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001094# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1095# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +01001096 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001097 mode http
1098 cookie SERVERID insert nocache indirect
1099 balance roundrobin
1100 server web1 192.168.1.1:80 cookie server01 check
1101 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +01001102
willy tarreaueedaa9f2005-12-17 14:08:03 +01001103# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001104 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001105 mode http
1106 cookie SERVERID insert nocache indirect
1107 balance roundrobin
1108 server web1 192.168.1.1:80 cookie server01 check
1109 server web2 192.168.1.2:80 cookie server02 check
1110 server web-backup 192.168.2.1:80 cookie server03 check backup
1111 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001112
willy tarreaua41a8b42005-12-17 14:02:24 +01001113# relayage SMTP+TLS avec test du serveur et serveur de backup
1114
1115 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001116 mode tcp
1117 balance roundrobin
1118 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1119 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001120
Willy Tarreauf3c69202006-07-09 16:42:34 +02001121# relayage HTTPS avec test du serveur et serveur de backup
1122
1123 listen http_proxy :443
1124 mode tcp
1125 option ssl-hello-chk
1126 balance roundrobin
1127 server srv1 192.168.1.1 check inter 30000 rise 1 fall 2
1128 server srv2 192.168.1.2 backup
1129
Willy TARREAU3481c462006-03-01 22:37:57 +01001130# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1131 listen http_proxy 0.0.0.0:80
1132 mode http
1133 balance roundrobin
1134 option httpchk
1135 server inst1 192.168.1.1:80 cookie s1 check
1136 server inst2 192.168.1.2:80 cookie s2 check
1137 server inst3 192.168.1.3:80 cookie s3 check
1138 server back1 192.168.1.10:80 check backup
1139 server back2 192.168.1.11:80 check backup
1140 option allbackups # all backups will be used
1141
willy tarreau0f7af912005-12-17 12:21:26 +01001142
willy tarreauc29948c2005-12-17 13:10:27 +010011433.2) Reconnexion vers un répartiteur en cas d'échec direct
1144----------------------------------------------------------
1145En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1146seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1147définitivement privés de service. La spécification du paramètre 'redispatch'
1148autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1149(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001150
1151Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001152---------
willy tarreau0f7af912005-12-17 12:21:26 +01001153 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001154 mode http
1155 cookie SERVERID
1156 dispatch 192.168.1.100:80
1157 server web1 192.168.1.1:80 cookie server01
1158 server web2 192.168.1.2:80 cookie server02
1159 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001160
willy tarreau64a3cc32005-12-18 01:13:11 +01001161Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1162redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1163version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1164identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1165tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1166tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001167
1168 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001169 mode http
1170 option persist
1171 cookie SERVERID
1172 dispatch 192.168.1.100:80
1173 server web1 192.168.1.1:80 cookie server01
1174 server web2 192.168.1.2:80 cookie server02
1175 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001176
willy tarreauc29948c2005-12-17 13:10:27 +01001177
willy tarreau34f45302006-04-15 21:37:14 +020011783.3) Assignation de poids différents à des serveurs
1179---------------------------------------------------
1180Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1181d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1182que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1183soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1184raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1185plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1186plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1187la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1188une vue des serveurs disponibles la plus homogène possible en se basant sur
1189leur poids de sorte que la charge se distribue de la manière la plus lisse
1190possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
willy tarreau532bb552006-05-13 18:40:37 +02001191serveur par rapport aux autres. Le poids de 1 donne la fréquence d'apparition
1192la plus faible, et 256 la fréquence la plus élevée. De cette manière, si un
1193serveur disparait, les capacités restantes sont toujours respectées.
willy tarreau34f45302006-04-15 21:37:14 +02001194
1195
1196Exemple :
1197---------
1198# distribution équitable sur 2 opteron and un ancien pentium3
1199
1200 listen web_appl 0.0.0.0:80
1201 mode http
1202 cookie SERVERID insert nocache indirect
1203 balance roundrobin
1204 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1205 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1206 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1207 server web-backup1 192.168.2.1:80 cookie server04 check backup
1208 server web-excuse 192.168.3.1:80 check backup
1209
1210Notes :
1211-------
1212 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1213
1214 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1215 est plus propre d'utiliser les poids que de répliquer le même serveur
1216 plusieurs fois.
1217
1218 - les poids s'appliquent également aux serveurs de backup si l'option
1219 'allbackups' est positionnée.
1220
1221 - le poids s'applique aussi à la répartition selon la source
1222 ('balance source').
1223
1224 - quels que soient les poids, le premier serveur sera toujours assigné en
1225 premier. Cette règle facilite les diagnostics.
1226
1227 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1228 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1229 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1230
willy tarreau532bb552006-05-13 18:40:37 +02001231La distribution du trafic suivra exactement le séquencement suivant :
1232
1233 Request| 1 1 1 1
1234 number | 1 2 3 4 5 6 7 8 9 0 1 2 3
1235 --------+---------------------------
1236 p3-800 | X . . . . . . X . . . . .
1237 opt-20 | . X . X . X . . . X . X .
1238 opt-24 | . . X . X . X . X . X . X
1239
1240
12413.4) Limitation du nombre de sessions concurrentes par serveur
1242--------------------------------------------------------------
1243Certains serveurs web multi-processus tels qu'Apache souffrent dès qu'il y a
1244trop de sessions concurrentes, parce qu'il est très coûteux de faire
1245fonctionner des centaines ou des milliers de processus sur un système. Une
1246solution consiste à augmenter le nombre de serveurs et de répartir la charge
1247entre eux, mais cela pose un problème lorsque le but est uniquement de résister
1248à des pics de charge occasionnels.
1249
1250Pour résoudre ce problème, une nouvelle fonctionnalité a été implémentée dans
1251HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associée à une
1252file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
1253entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
1254de diminuer la valeur maxconn améliorera notablement les performances des
1255serveurs et diminuera les temps de réponse simplement parce que les serveurs
1256seront moins congestionnés.
1257
1258Quand une requête cherche à joindre n'importe quel serveur, le premier serveur
1259non saturé est utilisé, en respectant l'algorithme de répartition de charge. Si
1260tous les serveurs sont saturés, alors la requête sera mise dans la file
1261d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
1262toutes les requêtes précédentes auront été libérées et qu'un serveur aura été
1263libéré d'une connexion pour la traiter.
1264
1265Si une requête fait référence à un serveur en particulier (p.ex: hachage d'IP
1266source, ou persistance par cookie), et que ce server est saturé, alors la
1267requête sera mise dans la file d'attente dédiée à ce serveur. Cette file
1268d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
1269plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent déjà
1270que pour les nouveaux utilisateurs.
1271
1272Pour cela, les logs ont dû être enrichis pour indiquer le nombre de sessions
1273par serveur, la position de la requête dans les files d'attentes, et le temps
1274passé en file d'attente. Ceci aide considérablement à faire de la prévision de
1275capacité. Voir la section 'logs' plus bas pour plus d'informations.
1276
1277Exemple :
1278---------
1279 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1280 listen web_appl 0.0.0.0:80
1281 maxconn 10000
1282 mode http
1283 cookie SERVERID insert nocache indirect
1284 balance roundrobin
1285 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 maxconn 100 check
1286 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
1287 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
1288 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1289 server web-excuse 192.168.3.1:80 check backup
1290
willy tarreau8f635a42006-05-21 23:05:54 +02001291Cette option se montra si efficace pour réduire les temps de réponse des
1292serveurs que certains utilisateurs voulaient utiliser des valeurs trop basses
1293pour améliorer les performances de leurs serveurs. Seulement, ils n'étaient
1294alors plus en mesure de supporter de très fortes charges parce qu'il n'était
1295plus possible de les saturer. Pour cette raison, la version 1.2.14 a apporté la
1296limitation dynamique de connexions avec l'addition du paramètre "minconn".
1297Lorsque ce paramètre est associé à "maxconn", il active la limitation dynamique
1298basée sur la charge de l'instance. Le nombre maximal de sessions concurrentes
1299sur un serveur devient alors proportionnel au nombre de sessions de l'instance
1300par rapport à son 'maxconn'. Un minimum de <minconn> sessions sera toujours
1301permis quelle que soit la charge. Ceci assurera que les serveurs travailleront
1302au meilleur de leurs performances sous des charges normales, et qu'ils seront
1303tout de même capables de supporter de fortes pointes lorsque nécessaire. La
1304limite dynamique est calculée comme ceci :
1305
1306 srv.dyn_limit = max(srv.minconn, srv.maxconn * inst.sess / inst.maxconn)
1307
1308Exemple :
1309---------
1310 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1311 listen web_appl 0.0.0.0:80
1312 maxconn 10000
1313 mode http
1314 cookie SERVERID insert nocache indirect
1315 balance roundrobin
1316 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check
1317 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check
1318 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1319 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1320 server web-excuse 192.168.3.1:80 check backup
1321
1322Dans l'exemple ci-dessus, le serveur "pentium3-800' recevra au plus 100
1323connexions simultanées lorsque l'instance du proxy en atteindra 10000, et
1324recevra seulement 10 connexions simultanées tant que le proxy sera sous les 1000
1325sessions.
1326
willy tarreau532bb552006-05-13 18:40:37 +02001327Notes :
1328-------
1329 - la requête ne restera pas indéfiniment en file d'attente, elle est
1330 assujétie au paramètre 'contimeout', et si une requête ne peut pas
1331 sortir de la file avant ce time-out, soit parce que le serveur est
1332 saturé, soit parce qu'il y a trop de requêtes en file d'attente,
1333 alors elle expirera avec une erreur 503.
1334
willy tarreau8f635a42006-05-21 23:05:54 +02001335 - si seul <minconn> est spécifié, il a le même effet que <maxconn>
1336
willy tarreau532bb552006-05-13 18:40:37 +02001337 - positionner des valeurs trop basses pour 'maxconn' peut améliorer les
1338 performances mais aussi permettre à des utilisateurs trop lents de bloquer
1339 un serveur pour les autres utilisateurs.
1340
willy tarreau34f45302006-04-15 21:37:14 +02001341
willy tarreau8f635a42006-05-21 23:05:54 +020013423.5) Abandon des requêtes abortées
1343----------------------------------
1344En présence de très fortes charges, les serveurs mettront un certain temps à
1345répondre. La file d'attente du proxy se remplira, et les temps de réponse
1346suivront une croissance proportionnelle à la taille de file d'attente fois
1347le temps moyen de réponse par session. Lorsque les clients attendront plus de
1348quelques secondes, ils cliqueront souvent sur le bouton 'STOP' de leur
1349navigateur, laissant des requêtes inutiles en file d'attente et ralentissant
1350donc les autres utilisateurs.
1351
1352Comme il n'y a aucun moyen de distinguer un vrai clic sur STOP d'une simple
1353fermeture du canal de sortie sur le client (shutdown(SHUT_WR)), les agents HTTP
1354doivent être conservateurs et considérer que le client n'a probablement fermé
1355que le canal de sortie en attendant la réponse. Toutefois, ceci introduit des
1356risques de congestion lorsque beaucoup d'utilisateurs font de même, et s'avère
1357aujourd'hui complètement inutile car probablement aucun client ne referme la
1358session en attendant la réponse. Certains agents HTTP supportent ceci (Squid,
1359Apache, HAProxy), et d'autres ne le supportent pas (TUX, et la plupart des
1360répartiteurs de charge matériels). Donc la probabilité pour qu'une notification
1361de fermeture d'un canal d'entrée côté client représente un utilisateur cliquant
1362sur 'STOP' est proche de 100%, et il est vraiment tentant d'abandonner la
1363requête prématurément sans polluer les serveurs.
1364
1365Pour cette raison, une nouvelle option "abortonclose" a été introduite en
1366version 1.2.14. Par défaut (sans l'option), le comportement reste conforme à
1367HTTP. Mais lorsque l'option est spécifiée, une session dont le canal entrant
1368est fermé sera abortée si cela est possible, c'est à dire que la requête est
1369soit en file d'attente, soit en tentative de connexion. Ceci réduit
1370considérablement la longueur des files d'attentes et la charge sur les serveurs
1371saturés lorsque les utilisateurs sont tentés de cliquer sur 'STOP', ce qui à
1372son tour, réduit les temps de réponse pour les autres utilisateurs.
1373
1374Exemple :
1375---------
1376 listen web_appl 0.0.0.0:80
1377 maxconn 10000
1378 mode http
1379 cookie SERVERID insert nocache indirect
1380 balance roundrobin
1381 server web1 192.168.1.1:80 cookie s1 weight 10 maxconn 100 check
1382 server web2 192.168.1.2:80 cookie s2 weight 10 maxconn 100 check
1383 server web3 192.168.1.3:80 cookie s3 weight 10 maxconn 100 check
1384 server bck1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1385 option abortonclose
1386
1387
willy tarreauc29948c2005-12-17 13:10:27 +010013884) Fonctionnalités additionnelles
1389=================================
1390
1391D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
willy tarreau8f635a42006-05-21 23:05:54 +02001392principalement du mode transparent, de la journalisation des connexions, de la
1393réécriture des en-têtes, et du statut sous forme de page HTML.
1394
willy tarreau5cbea6f2005-12-17 12:48:26 +01001395
willy tarreau0174f312005-12-18 01:02:42 +010013964.1) Fonctionnalités réseau
1397---------------------------
13984.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001399---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001400En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1401routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1402pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001403destination de la session détournée. Le système doit permettre de rediriger les
1404paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001405
1406Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001407---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001408 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001409 mode http
1410 transparent
1411 cookie SERVERID
1412 server server01 192.168.1.1:80
1413 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001414
1415 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1416 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001417
willy tarreaua41a8b42005-12-17 14:02:24 +01001418Remarque :
1419----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001420Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1421adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1422d'une même adresse avec une même instance et sans utiliser directement le mode
1423transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001424
1425Exemple :
1426---------
1427 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001428 mode tcp
1429 server server01 192.168.1.1 check port 60000
1430 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001431
1432 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1433 -j REDIRECT --to-ports 65000
1434
willy tarreau0174f312005-12-18 01:02:42 +01001435
14364.1.2) Choix d'une adresse source par serveur
1437---------------------------------------------------
1438Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1439IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1440backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1441pour joindre le même serveur. C'est également utilisable pour faciliter une
1442répartition de charge selon l'adresse IP source pour des connexions sortantes.
1443Bien entendu, la même adresse est utilisée pour les health-checks.
1444
1445Exemple :
1446---------
1447 # utiliser une adresse particulière pour joindre les 2 serveur
1448 listen http_proxy 0.0.0.0:65000
1449 mode http
1450 balance roundrobin
1451 server server01 192.168.1.1:80 source 192.168.2.13
1452 server server02 192.168.1.2:80 source 192.168.2.13
1453
1454Exemple :
1455---------
1456 # utiliser une adresse particulière pour joindre chaque serveur
1457 listen http_proxy 0.0.0.0:65000
1458 mode http
1459 balance roundrobin
1460 server server01 192.168.1.1:80 source 192.168.1.1
1461 server server02 192.168.2.1:80 source 192.168.2.1
1462
1463Exemple :
1464---------
1465 # faire une répartition d'adresse sources pour joindre le même proxy à
1466 # travers deux liens WAN
1467 listen http_proxy 0.0.0.0:65000
1468 mode http
1469 balance roundrobin
1470 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1471 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1472
1473Exemple :
1474---------
1475 # forcer une connexion TCP à s'attacher à un port particulier
1476 listen http_proxy 0.0.0.0:2000
1477 mode tcp
1478 balance roundrobin
1479 server srv1 192.168.1.1:80 source 192.168.2.1:20
1480 server srv2 192.168.1.2:80 source 192.168.2.1:20
1481
willy tarreaub952e1d2005-12-18 01:31:20 +010014824.1.3) Maintien de session TCP (keep-alive)
1483-------------------------------------------
1484Avec la version 1.2.7, il devient possible d'activer le maintien de session
1485TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1486d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1487externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1488aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1489time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1490positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1491vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1492pour activer le maintien de session TCP :
1493
1494 option tcpka # active le keep-alive côté client et côté serveur
1495 option clitcpka # active le keep-alive côté client
1496 option srvtcpka # active le keep-alive côté serveur
1497
willy tarreau0f7af912005-12-17 12:21:26 +01001498
willy tarreauc29948c2005-12-17 13:10:27 +010014994.2) Journalisation des connexions
1500----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001501
1502L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1503Il fournit probablement le plus fin niveau d'information disponible pour un
1504tel outil, ce qui est très important pour les diagnostics en environnements
1505complexes. En standard, les informations journalisées incluent le port client,
1506les chronométrages des états TCP/HTTP, des états de session précis au moment de
1507la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1508trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1509arbitraires.
1510
1511Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1512transparence sur les problèmes rencontrés, à la fois internes et externes, et
1513il est possible d'envoyer les logs vers des serveurs différents en même temps
1514avec des niveaux de filtrage différents :
1515
1516 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1517 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1518 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1519 - activité par instance (connexions clients), aussi bien lors de leur
1520 établissement qu'à leur terminaison.
1521
1522La possibilité de distribuer différents niveaux de logs à différents serveurs
1523permet à plusieurs équipes de production d'intéragir et de corriger leurs
1524problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1525occasionnellement les erreurs système, pendant que l'équipe application
1526surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1527que l'équipe sécurité analyse l'activité en différé d'une heure.
1528
1529
willy tarreauc1cae632005-12-17 14:12:23 +010015304.2.1) Niveaux de log
1531---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001532Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1533détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1534source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001535la requête HTTP, le code de retour, la quantité de données transmises, et même
1536dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1537Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1538la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001539est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001540
willy tarreau8337c6b2005-12-17 13:41:01 +01001541 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1542 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001543ou
1544 log global
1545
1546Remarque :
1547----------
1548La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1549paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001550
1551Exemple :
1552---------
1553 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001554 mode http
1555 log 192.168.2.200 local3
1556 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001557
willy tarreauc1cae632005-12-17 14:12:23 +010015584.2.2) Format des logs
1559----------------------
1560Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1561de la session entre le client et le relais. En précisant l'option 'tcplog',
1562la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1563sur son état lors de la déconnexion, ainsi que le temps de connexion et la
willy tarreau532bb552006-05-13 18:40:37 +02001564durée totale de la session. Le nombre de sessions restantes après la
1565déconnexion est également indiqué (pour le serveur, l'instance et le process).
willy tarreauc1cae632005-12-17 14:12:23 +01001566
willy tarreauc5f73ed2005-12-18 01:26:38 +01001567Exemple de journalisation TCP :
1568-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001569 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001570 mode tcp
1571 option tcplog
1572 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001573
willy tarreau532bb552006-05-13 18:40:37 +02001574>>> haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/0/5007 0 -- 1/1/1 0/0
willy tarreauc5f73ed2005-12-18 01:26:38 +01001575
willy tarreau532bb552006-05-13 18:40:37 +02001576 Champ Format / Description Exemple
1577
1578 1 nom_processus '[' pid ']:' haproxy[18989]:
1579 2 ip_client ':' port_client 127.0.0.1:34550
1580 3 '[' date ']' [15/Oct/2003:15:24:28]
1581 4 nom_instance relais-tcp
1582 5 nom_serveur Srv1
1583 6 temps_file '/' temps_connect '/' temps_total 0/0/5007
1584 7 octets lus 0
1585 8 etat_terminaison --
1586 9 conn_srv '/' conns_inst '/' conns_processus 1/1/1
1587 10 position en file d'attente srv '/' globale 0/0
willy tarreau982249e2005-12-18 00:57:06 +01001588
willy tarreauc1cae632005-12-17 14:12:23 +01001589Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1590notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1591surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1592les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1593ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1594(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001595
willy tarreauc5f73ed2005-12-18 01:26:38 +01001596Exemple de journalisation HTTP :
1597--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001598 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001599 mode http
1600 option httplog
1601 option dontlognull
1602 log 192.168.2.200 local3
1603
willy tarreau532bb552006-05-13 18:40:37 +02001604>>> haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 9/0/7/147/723 200 243 - - ---- 2/3/3 0/0 "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001605
1606Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001607
willy tarreau532bb552006-05-13 18:40:37 +02001608 haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/-1/11215 503 0 - - SC-- 137/202/205 0/0 {w.ods.org|Mozilla} {} "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001609
willy tarreau532bb552006-05-13 18:40:37 +02001610 Champ Format / Description Exemple
1611
1612 1 nom_processus '[' pid ']:' haproxy[18989]:
1613 2 ip_client ':' port_client 10.0.0.1:34552
1614 3 '[' date ']' [15/Oct/2003:15:26:31]
1615 4 nom_instance relais-http
1616 5 nom_serveur Srv1
1617 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt 3183/-1/-1/-1/11215
1618 7 Code_retour_HTTP 503
1619 8 octets lus 0
1620 9 cookies_requête_capturés -
1621 10 cookies_reponse_capturés -
1622 11 etat_terminaison SC--
1623 12 conns_srv '/' conns_inst '/' conns_processus 137/202/205
1624 13 position file serveur '/' globale 0/0
1625 14 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1626 15 '{' entetes_reponse_capturés '}' {}
1627 16 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001628
1629Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1630 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001631
1632Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1633de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1634Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001635la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1636tôt possible, c'est à dire juste avant que ne débutent les transferts de
1637données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1638de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001639traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1640représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001641
willy tarreau64a3cc32005-12-18 01:13:11 +01001642Afin d'éviter toute confusion avec les logs normaux, le temps total de
1643transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001644rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001645
1646Exemple :
1647---------
1648
1649 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001650 mode http
1651 option httplog
1652 option dontlognull
1653 option logasap
1654 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001655
willy tarreauc5f73ed2005-12-18 01:26:38 +01001656>>> haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/7/14/+30 200 +243 - - ---- 3/3 "GET /image.iso HTTP/1.0"
willy tarreau982249e2005-12-18 00:57:06 +01001657
1658
willy tarreauc1cae632005-12-17 14:12:23 +010016594.2.3) Chronométrage des événements
1660-----------------------------------
1661Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1662événements sont d'une très grande utilité. Tous les temps sont mesurés en
1663millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
willy tarreau532bb552006-05-13 18:40:37 +02001664la forme Tq/Tw/Tc/Tr/Tt :
willy tarreauc1cae632005-12-17 14:12:23 +01001665
1666 - Tq: temps total de réception de la requête HTTP de la part du client.
1667 C'est le temps qui s'est écoulé entre le moment où le client a établi
1668 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1669 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1670 que la requête complète n'a jamais été reçue.
1671
willy tarreau532bb552006-05-13 18:40:37 +02001672 - Tw: temps total passé dans les files d'attente avant d'obtenir une place
1673 vers un serveur. Ceci tient compte à la fois de la file d'attente globale
1674 et de celle du serveur, et dépend du nombre de requêtes dans la file et du
1675 temps nécessaire au serveur pour compléter les sessions précédentes. La
1676 valeur '-1' indique que la requête a été détruite avant d'atteindre une
1677 file.
1678
willy tarreauc1cae632005-12-17 14:12:23 +01001679 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1680 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1681 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1682 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1683 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1684 vers le serveur.
1685
1686 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001687 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001688 la connexion. Ca représente exactement le temps de traitement de la
1689 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001690 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001691
1692 - Tt: durée de vie totale de la session, entre le moment où la demande de
1693 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001694 refermée aux deux extrémités (client et serveur). La signification change
1695 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
willy tarreau532bb552006-05-13 18:40:37 +02001696 uniquement à (Tq + Tw + Tc + Tr), et se trouve préfixé d'un signe '+'. On
1697 peut donc déduire Td, le temps de transfert des données, en excluant les
1698 autres temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001699
willy tarreau532bb552006-05-13 18:40:37 +02001700 Td = Tt - (Tq + Tw + Tc + Tr)
willy tarreauc1cae632005-12-17 14:12:23 +01001701
1702 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1703
willy tarreau532bb552006-05-13 18:40:37 +02001704En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
willy tarreauc1cae632005-12-17 14:12:23 +01001705rapportés.
1706
1707Ces temps fournissent de précieux renseignement sur des causes probables de
1708problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1709de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1710de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1711problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1712valeur de time-out dans la configuration, c'est souvent qu'une session a été
1713abandonnée sur expiration d'un time-out.
1714
1715Cas les plus fréquents :
1716
1717 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1718 le client et le relais.
1719 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1720 le relais et le serveur durant la phase de connexion. Cet indicateur
1721 devrait normalement toujours être très bas (moins de quelques dizaines).
1722 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1723 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1724 de pertes entre le relais et le serveur.
1725 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1726 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1727 session est maintenue après la fin des échanges. Voir plus loin pour
1728 savoir comment désactiver le keep-alive HTTP.
1729
1730Autres cas ('xx' représentant une valeur quelconque à ignorer) :
willy tarreau532bb552006-05-13 18:40:37 +02001731 -1/xx/xx/xx/Tt: le client n'a pas envoyé sa requête dans le temps imparti ou
willy tarreauc5f73ed2005-12-18 01:26:38 +01001732 a refermé sa connexion sans compléter la requête.
willy tarreau532bb552006-05-13 18:40:37 +02001733 Tq/-1/xx/xx/Tt: Il n'était pas possible de traiter la request, probablement
1734 parce que tous les serveurs étaient hors d'usage.
1735 Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'établir vers le serveur (refus ou
1736 time-out au bout de Tt-(Tq+Tw) ms).
1737 Tq/Tw/Tc/-1/Tt: le serveur a accepté la connexion mais n'a pas répondu dans
willy tarreauc5f73ed2005-12-18 01:26:38 +01001738 les temps ou bien a refermé sa connexion trop tôt, au bout
willy tarreau532bb552006-05-13 18:40:37 +02001739 de Tt-(Tq+Tw+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001740
17414.2.4) Conditions de déconnexion
1742--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001743Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1744le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1745un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1746une signification précise :
1747
1748 - sur le premier caractère, un code précisant le premier événement qui a causé
1749 la terminaison de la session :
1750
1751 C : fermeture inattendue de la session TCP de la part du client.
1752
1753 S : fermeture inattendue de la session TCP de la part du serveur, ou
1754 refus explicite de connexion de la part de ce dernier.
1755
1756 P : terminaison prématurée des sessions par le proxy, pour cause
1757 d'imposition d'une limite sur le nombre de connexions, pour cause
1758 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1759 sécurité a détecté et bloqué une anomalie dans la réponse du
1760 serveur qui aurait pu causer une fuite d'informations (par exemple,
1761 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001762
willy tarreauc5f73ed2005-12-18 01:26:38 +01001763 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1764 source, ...). Généralement, cela arrive au cours de l'établissement
1765 d'une connexion, et les logs système doivent contenir une copie de
1766 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001767
willy tarreauc5f73ed2005-12-18 01:26:38 +01001768 I : une erreur interne a été identifiée par le proxy à la suite d'un
1769 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1770 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001771
willy tarreauc5f73ed2005-12-18 01:26:38 +01001772 c : le délai maximal d'attente du client a expiré (clitimeout).
1773
1774 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1775
1776 - : terminaison normale de session.
1777
1778 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1779 la fermeture :
1780
1781 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1782 été transmis au serveur.
1783
willy tarreau532bb552006-05-13 18:40:37 +02001784 Q : attente en file d'attente (QUEUE) d'une place pour avoir une
1785 connexion vers un serveur. Ne peut apparaître que sur un serveur
1786 possédant un paramètre 'maxconn'. Aucune connexion n'a été envoyée
1787 au serveur.
1788
willy tarreauc5f73ed2005-12-18 01:26:38 +01001789 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1790 serveur peut au plus avoir vu la tentative de connexion, mais
1791 aucune donnée n'a été échangée.
1792
1793 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1794
1795 D : transfert des DONNEES du serveur vers le client.
1796
1797 L : transfert des dernières ("LAST") données du proxy vers le client,
1798 alors que le serveur a déjà fini.
1799
1800 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001801
1802 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001803 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001804
willy tarreauc5f73ed2005-12-18 01:26:38 +01001805 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1806 cas sur les NOUVELLES connexions clients.
1807
1808 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1809 serveur connu. Ceci peut être dû à un changement de configuration
1810 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1811 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001812
willy tarreauc5f73ed2005-12-18 01:26:38 +01001813 D : le client a présenté un cookie correspondant à un serveur hors
1814 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1815 un autre serveur ou a tout de même tenté de se connecter sur celui
1816 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001817
willy tarreauc5f73ed2005-12-18 01:26:38 +01001818 V : le client a présenté un cookie VALIDE et a pu se connecter au
1819 serveur correspondant.
1820
1821 - : non appliquable (pas de cookie positionné dans la configuration).
1822
1823 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1824 persistence retrourné par le serveur (uniquement en mode HTTP) :
1825
1826 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1827 n'a été inséré.
1828
1829 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1830 proxy en a INSERE un.
1831
willy tarreau197e8ec2005-12-17 14:10:59 +01001832 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001833 tel quel ("PASSIF").
1834
1835 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1836
1837 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1838 ne pas être retourné au client.
1839
1840 - : non appliquable
1841
1842
1843La combinaison des deux premiers indicateurs fournit une grande quantitié
1844d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1845peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1846des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001847
willy tarreauc5f73ed2005-12-18 01:26:38 +01001848Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1849
1850 Indic Raison
1851 CR Le client a abandonné avant d'émettre une requête complète. Il est
1852 très probable que la requête ait été tapée à la main dans un client
1853 telnet et abortée trop tôt.
1854
1855 cR Le temps imparti au client a expiré avant réception d'une requête
1856 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1857 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1858 transporter des paquets entiers, ou par des clients qui énvoient des
1859 requêtes à la main et ne tapent pas assez vite.
1860
1861 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1862 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1863 être la couche réseau qui indique au proxy que le serveur n'est pas
1864 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1865
1866 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1867
1868 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1869 nombre de connexions a atteint la limite 'maxconn' (global ou de
1870 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1871 augmenté, tout comme le paramètre 'maxconn' global.
1872
1873 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1874 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1875 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1876 consiste à affiner le paramétrage système.
1877
1878 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1879 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1880 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1881 paquets entiers.
1882
willy tarreau078c79a2006-05-13 12:23:58 +02001883 CH Le client a abandonné alors qu'il attendait un début de réponse de la
1884 part du serveur. Cela peut être causé par le serveur qui mettait trop
1885 de temps à répondre, ou par un client cliquant précipitamment sur le
1886 bouton 'Stop'.
1887
1888 CQ Le client a abandonné alors que sa session était mise en file
1889 d'attente pour obtenir un serveur avec suffisamment de connexions
1890 libres pour l'accepter. Cela signifie soit que l'ensemble des
1891 serveurs étaient saturés, soit que le serveur assigné a mis trop de
1892 temps à répondre.
1893
1894 sQ La session a attendu trop longtemps en file d'attente et a été
1895 expirée.
1896
willy tarreauc5f73ed2005-12-18 01:26:38 +01001897 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
1898 en-têtes. En général, cela indique qu'il a crashé.
1899
1900 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
1901 des transactions trop longues, probablement causées par un back-end
1902 saturé. Les seules solutions sont de corriger le problème sur
1903 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
1904 des attentes plus longues au risque que les clients abandonnent à
1905 leur tour, ou bien d'ajouter des serveurs.
1906
1907 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
1908 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
1909 soit à cause d'une requête validant un filtre d'interdiction, auquel
1910 cas le proxy a renvoyé une erreur HTTP 403.
1911
1912 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
1913 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
1914 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
1915 renvoyée au client.
1916
1917 cD Le client n'a pas lu de données pendant le temps qui lui était
1918 imparti. Ceci est souvent causé par des problèmes réseau côté client.
1919
1920 CD Le client a aborté sa connection de manière inattendue pendant le
1921 transfert des données. Ceci est provoqué soit par le crash d'un
1922 navigateur, ou par une session en HTTP keep-alive entre le serveur
1923 et le client terminée en premier par le client.
1924
1925 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
1926 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
1927 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
1928 situés entre le proxy et le serveur.
1929
19304.2.5) Caractères non-imprimables
1931---------------------------------
1932Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
1933tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
1934hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
1935dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
1936caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
1937est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
1938les en-têtes.
1939
19404.2.6) Capture d'en-têtes HTTP et de cookies
1941--------------------------------------------
1942La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
1943capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
1944
1945Les captures de cookies facilitent le suivi et la reconstitution d'une session
1946utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01001947
1948 capture cookie <préfixe_cookie> len <longueur_capture>
1949
willy tarreauc5f73ed2005-12-18 01:26:38 +01001950Ceci activera la capture de cookies à la fois dans les requêtes et dans les
1951réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
1952bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
1953nouveau cookie.
1954
willy tarreau8337c6b2005-12-17 13:41:01 +01001955Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1956transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1957caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1958le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
1959place dans les logs.
1960
1961Exemples :
1962----------
1963 # capture du premier cookie dont le nom commence par "ASPSESSION"
1964 capture cookie ASPSESSION len 32
1965
1966 # capture du premier cookie dont le nom est exactement "vgnvisitor"
1967 capture cookie vgnvisitor= len 32
1968
willy tarreau036e1ce2005-12-17 13:46:33 +01001969Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01001970positionné par le serveur, précédé du cookie positionné par le client. Chacun
1971de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01001972par le client ou le serveur, ou lorsque l'option est désactivée..
1973
1974Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
1975pour suivre un identifiant de requête globalement unique positionné par un
1976autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
1977de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
1978peut chercher des informations relatives à la longueur annoncée de la réponse,
1979le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
1980de redirection. Tout comme pour les captures de cookies, il est possible
1981d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
1982la suivante :
1983
1984 capture request header <nom> len <longueur max>
1985 capture response header <nom> len <longueur max>
1986
1987Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01001988
willy tarreauc5f73ed2005-12-18 01:26:38 +01001989Exemples:
1990---------
1991 # conserver le nom du serveur virtuel accédé par le client
1992 capture request header Host len 20
1993 # noter la longueur des données envoyées dans un POST
1994 capture request header Content-Length len 10
1995
1996 # noter le fonctionnement attendu du cache par le serveur
1997 capture response header Cache-Control len 8
1998 # noter l'URL de redirection
1999 capture response header Location len 20
2000
2001Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
2002fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
2003regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
2004chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
2005réponse sont présentés de la même manière, mais après un espace suivant le bloc
2006d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
2007
2008 Config:
2009
2010 capture request header Host len 20
2011 capture request header Content-Length len 10
2012 capture request header Referer len 20
2013 capture response header Server len 20
2014 capture response header Content-Length len 10
2015 capture response header Cache-Control len 8
2016 capture response header Via len 20
2017 capture response header Location len 20
2018
2019 Log :
2020
willy tarreau532bb552006-05-13 18:40:37 +02002021 Aug 9 20:26:09 localhost haproxy[2022]: 127.0.0.1:34014 [09/Aug/2004:20:26:09] relais-http netcache 0/0/0/162/+162 200 +350 - - ---- 0/0/0 0/0 {fr.adserver.yahoo.co||http://fr.f416.mail.} {|864|private||} "GET http://fr.adserver.yahoo.com/"
2022 Aug 9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34020 [09/Aug/2004:20:30:46] relais-http netcache 0/0/0/182/+182 200 +279 - - ---- 0/0/0 0/0 {w.ods.org||} {Formilux/0.1.8|3495|||} "GET http://w.ods.org/sytadin.html HTTP/1.1"
2023 Aug 9 20:30:46 localhost haproxy[2022]: 127.0.0.1:34028 [09/Aug/2004:20:30:46] relais-http netcache 0/0/2/126/+128 200 +223 - - ---- 0/0/0 0/0 {www.infotrafic.com||http://w.ods.org/syt} {Apache/2.0.40 (Red H|9068|||} "GET http://www.infotrafic.com/images/live/cartesidf/grandes/idf_ne.png HTTP/1.1"
willy tarreauc5f73ed2005-12-18 01:26:38 +01002024
20254.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01002026-----------------------
willy tarreau532bb552006-05-13 18:40:37 +02002027- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/0/7/147/6723 200 243 - - ---- 1/3/5 0/0"HEAD / HTTP/1.0"
willy tarreauc1cae632005-12-17 14:12:23 +01002028 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
2029 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01002030
willy tarreau532bb552006-05-13 18:40:37 +02002031- haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57] relais-http Srv1 6559/1230/7/147/6870 200 243 - - ---- 99/239/324 0/9 "HEAD / HTTP/1.0"
2032 => Idem, mais la requête a été mise en attente dans la file globale derrière
2033 9 autres requêtes déjà présentes, et y a attendu 1230 ms.
2034
2035- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/0/7/14/+30 200 +243 - - ---- 1/3/3 0/0 "GET /image.iso HTTP/1.0"
willy tarreau982249e2005-12-18 00:57:06 +01002036 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
2037 log a été généré juste avant le transfert de données. Le serveur a répondu
willy tarreauc5f73ed2005-12-18 01:26:38 +01002038 en 14 ms, 243 octets d'en-têtes ont été transférés au client, et le temps
willy tarreau982249e2005-12-18 00:57:06 +01002039 total entre l'accept() et le premier octet de donnée est de 30 ms.
2040
willy tarreau532bb552006-05-13 18:40:37 +02002041- haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17] relais-http Srv1 9/0/7/14/30 502 243 - - PH-- 0/2/3 0/0 "GET /cgi-bin/bug.cgi? HTTP/1.0"
willy tarreau982249e2005-12-18 00:57:06 +01002042 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
2043 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
2044 d'informations risquant d'être cachées. Dans ce cas, la réponse est
2045 remplacée par '502 bad gateway'.
2046
willy tarreau532bb552006-05-13 18:40:37 +02002047- haproxy[18113]: 127.0.0.1:34548 [15/Oct/2003:15:18:55] relais-http <NOSRV> -1/-1/-1/-1/8490 -1 0 - - CR-- 0/2/2 0/0 ""
willy tarreauc1cae632005-12-17 14:12:23 +01002048 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01002049 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01002050 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01002051
willy tarreau532bb552006-05-13 18:40:37 +02002052- haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06] relais-http <NOSRV> -1/-1/-1/-1/50001 408 0 - - cR-- 0/2/2 0/0 ""
willy tarreauc1cae632005-12-17 14:12:23 +01002053 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01002054 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01002055 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
2056 pu renvoyer un message 408 au client.
2057
willy tarreauc5f73ed2005-12-18 01:26:38 +01002058- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
2059 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
2060 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01002061
willy tarreau532bb552006-05-13 18:40:37 +02002062- haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31] relais-http Srv1 3183/-1/-1/-1/11215 503 0 - - SC-- 115/202/205 0/0 "HEAD / HTTP/1.0"
willy tarreauc1cae632005-12-17 14:12:23 +01002063 => La requête client met 3s à entrer (peut-être un problème réseau), et la
2064 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreau532bb552006-05-13 18:40:37 +02002065 secondes (retries 3 dans la conf), puis un code 503 est retourné au
2066 client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
2067 instance, et 205 sur l'ensemble des instances pour ce processus. Il est
2068 possible que le serveur ait refusé la connexion parce qu'il y en avait
2069 déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01002070
willy tarreau4302f492005-12-18 01:00:37 +01002071
willy tarreauc5f73ed2005-12-18 01:26:38 +010020724.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01002073----------------------------------
2074En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
2075requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01002076possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
2077de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01002078connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
2079comme faisant partie des échanges de données consécutifs à la première requête.
2080Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01002081
2082La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01002083 reqadd <string> pour ajouter un en-tête dans la requête
2084 reqrep <search> <replace> pour modifier la requête
2085 reqirep <search> <replace> idem sans distinction majuscules/minuscules
2086 reqdel <search> pour supprimer un en-tête dans la requête
2087 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002088 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01002089 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002090 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01002091 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002092 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01002093 reqipass <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002094
willy tarreau036e1ce2005-12-17 13:46:33 +01002095 rspadd <string> pour ajouter un en-tête dans la réponse
2096 rsprep <search> <replace> pour modifier la réponse
2097 rspirep <search> <replace> idem sans distinction majuscules/minuscules
2098 rspdel <search> pour supprimer un en-tête dans la réponse
2099 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01002100 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01002101 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01002102 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002103
willy tarreau0f7af912005-12-17 12:21:26 +01002104
willy tarreau036e1ce2005-12-17 13:46:33 +01002105<search> est une expression régulière compatible POSIX regexp supportant le
2106groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
2107doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
2108chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
2109backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01002110
2111 \t pour une tabulation
2112 \r pour un retour charriot
2113 \n pour un saut de ligne
2114 \ pour différencier un espace d'un séparateur
2115 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01002116 \\ pour utiliser un backslash dans la regex
2117 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01002118 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01002119
willy tarreau0f7af912005-12-17 12:21:26 +01002120
willy tarreau5cbea6f2005-12-17 12:48:26 +01002121<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
2122Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
2123groupe délimité par des parenthèses dans l'expression régulière, par sa
2124position numérale. Les positions vont de 1 à 9, et sont codées par un '\'
2125suivi du chiffre désiré. Il est également possible d'insérer un caractère non
2126imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code
2127hexadécimal de ce caractère (comme en C).
2128
2129<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01002130dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002131
2132Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01002133-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002134 - 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 +01002135 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002136 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
2137 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
2138 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01002139 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
2140 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
2141 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01002142 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01002143 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
2144 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
willy tarreau0f7af912005-12-17 12:21:26 +01002145
2146Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01002147----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01002148 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01002149
willy tarreauc5f73ed2005-12-18 01:26:38 +01002150 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
2151 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
2152 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002153
willy tarreauc5f73ed2005-12-18 01:26:38 +01002154 # force proxy connections to close
2155 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
2156 # rewrite locations
2157 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002158
willy tarreauc5f73ed2005-12-18 01:26:38 +01002159 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01002160
willy tarreau197e8ec2005-12-17 14:10:59 +01002161 # Every header should end with a colon followed by one space.
2162 reqideny ^[^:\ ]*[\ ]*$
2163
2164 # block Apache chunk exploit
2165 reqideny ^Transfer-Encoding:[\ ]*chunked
2166 reqideny ^Host:\ apache-
2167
2168 # block annoying worms that fill the logs...
2169 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
2170 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
2171 reqideny ^[^:\ ]*\ .*<script
2172 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
2173
2174 # allow other syntactically valid requests, and block any other method
2175 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
2176 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
2177 reqideny ^[^:\ ]*\
2178
2179 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01002180 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01002181
willy tarreauc5f73ed2005-12-18 01:26:38 +01002182 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01002183 rspidel ^Server:\
2184 rspadd Server:\ Formilux/0.1.8
2185
willy tarreau0f7af912005-12-17 12:21:26 +01002186
willy tarreau982249e2005-12-18 00:57:06 +01002187De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01002188'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
2189connaître l'adresse IP du client initial.
2190
willy tarreau982249e2005-12-18 00:57:06 +01002191Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01002192en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01002193Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
2194méthode impliquant 4 règles.
2195
willy tarreauc1cae632005-12-17 14:12:23 +01002196Exemple :
2197---------
2198 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002199 mode http
2200 log global
2201 option httplog
2202 option dontlognull
2203 option forwardfor
2204 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01002205
Willy TARREAU767ba712006-03-01 22:40:50 +01002206Notons que certains serveurs HTTP ne referment pas nécessairement la session
2207TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
2208ce qui se traduit par des grands nombres de sessions établies et des temps
2209globaux très longs sur les requêtes. Pour contourner ce problème, la version
22101.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
2211vers le serveur dès qu'il commence à répondre et seulement si le tampon de
2212requête est vide. Attention toutefois à ne PAS utiliser cette option si des
2213méthodes CONNECT sont attendues entre le client et le serveur. L'option
2214'forceclose' implique l'option 'httpclose'.
2215
2216Exemple :
2217---------
2218 listen http_proxy 0.0.0.0:80
2219 mode http
2220 log global
2221 option httplog
2222 option dontlognull
2223 option forwardfor
2224 option forceclose
2225
2226
willy tarreauc29948c2005-12-17 13:10:27 +010022274.4) Répartition avec persistence
2228---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002229La combinaison de l'insertion de cookie avec la répartition de charge interne
2230permet d'assurer une persistence dans les sessions HTTP d'une manière
2231pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01002232 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01002233 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01002234 - insérer un cookie dans les réponses issues d'une répartition uniquement,
2235 et faire en sorte que des caches ne mémorisent pas ce cookie.
2236 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002237
2238Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01002239---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002240 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002241 mode http
2242 cookie SERVERID insert nocache indirect
2243 balance roundrobin
2244 server srv1 192.168.1.1:80 cookie server01 check
2245 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01002246
willy tarreau0174f312005-12-18 01:02:42 +01002247L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
2248cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
2249Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
2250client et le serveur de travailler en mode "keep-alive" afin que le proxy
2251puisse corriger le nom du cookie dans toutes les futures requêtes.
2252
2253 listen application 0.0.0.0:80
2254 mode http
2255 cookie JSESSIONID prefix
2256 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002257 server srv1 192.168.1.1:80 cookie srv1 check
2258 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002259 option httpclose
2260
2261
willy tarreau982249e2005-12-18 00:57:06 +010022624.5) Protection contre les fuites d'informations du serveur
2263-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002264Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002265créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002266'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2267un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2268activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002269 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002270 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002271 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002272 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002273 un en-tête 'Cache-control: public' ;
2274 - celles qui ont un en-tête 'Pragma: no-cache' ;
2275 - celles qui ont un en-tête 'Cache-control: private' ;
2276 - celles qui ont un en-tête 'Cache-control: no-store' ;
2277 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2278 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2279 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2280 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2281 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002282 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002283
willy tarreau982249e2005-12-18 00:57:06 +01002284Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2285même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2286message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2287dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002288en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002289l'administrateur sache qu'il y a une action correctrice à entreprendre.
2290
22914.6) Personalisation des erreurs
2292--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002293Certaines situations conduisent à retourner une erreur HTTP au client :
2294 - requête invalide ou trop longue => code HTTP 400
2295 - requête mettant trop de temps à venir => code HTTP 408
2296 - requête interdite (bloquée par un reqideny) => code HTTP 403
2297 - erreur interne du proxy => code HTTP 500
2298 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2299 - aucun serveur disponible pour cette requête => code HTTP 503
2300 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2301
2302Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2303Cependant, en fonction du type de clientèle, on peut préférer retourner des
willy tarreau64a3cc32005-12-18 01:13:11 +01002304pages personnalisées. Ceci est possible par le biais de la commande "errorloc":
willy tarreau8337c6b2005-12-17 13:41:01 +01002305
2306 errorloc <code_HTTP> <location>
2307
2308Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2309le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2310d'une page précisée dans <location>. Cette adresse peut être relative au site,
2311ou absolue. Comme cette réponse est traîtée par le navigateur du client
2312lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2313
2314Exemple :
2315---------
2316 listen application 0.0.0.0:80
2317 errorloc 400 /badrequest.html
2318 errorloc 403 /forbidden.html
2319 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002320 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002321 errorloc 502 http://192.168.114.58/error50x.html
2322 errorloc 503 http://192.168.114.58/error50x.html
2323 errorloc 504 http://192.168.114.58/error50x.html
2324
willy tarreauc1f47532005-12-18 01:08:26 +01002325Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2326accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2327problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2328régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2329dans le champ Location avec la méthode GET uniquement. Seulement, certains
2330navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2331plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2332devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002333l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2334visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002335
2336Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2337utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2338dès que vous savez que vos clients supportent le code de retour HTTP 303.
2339
willy tarreau982249e2005-12-18 00:57:06 +010023404.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002341--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002342Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2343évite de répéter des paramètres communs à toutes les instances, tels que les
2344timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002345
2346Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2347précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2348'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2349section implique une annulation de tous les paramètres par défaut positionnés
2350précédemment, dans le but de les remplacer.
2351
2352La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2353paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2354un commentaire en guise paramètre.
2355
willy tarreau982249e2005-12-18 00:57:06 +01002356Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2357positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002358 - log (le premier et le second)
2359 - mode { tcp, http, health }
2360 - balance { roundrobin }
2361 - disabled (pour désactiver toutes les instances qui suivent)
2362 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2363 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002364 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2365 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002366 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002367 - cookie, capture
2368 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002369
2370Ne sont pas supportés dans cette version, les adresses de dispatch et les
2371configurations de serveurs, ainsi que tous les filtres basés sur les
2372expressions régulières :
2373 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002374 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002375
2376Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2377positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2378défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2379paramètres par défaut avant la déclaration de l'instance.
2380
2381Exemples :
2382----------
2383 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002384 log global
2385 mode tcp
2386 balance roundrobin
2387 clitimeout 180000
2388 srvtimeout 180000
2389 contimeout 4000
2390 retries 3
2391 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002392
2393 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002394 server srv1 192.168.1.1 check port 6000 inter 10000
2395 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002396
2397 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002398 server srv1 192.168.2.1 check port 6000 inter 10000
2399 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002400
2401 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002402 log global
2403 mode http
2404 option httplog
2405 option forwardfor
2406 option dontlognull
2407 balance roundrobin
2408 clitimeout 20000
2409 srvtimeout 20000
2410 contimeout 4000
2411 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002412
2413 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002414 cookie SERVERID postonly insert indirect
2415 capture cookie userid= len 10
2416 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2417 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002418
2419 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002420 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002421
willy tarreau8f635a42006-05-21 23:05:54 +02002422
24234.8) Rapport d'état sous forme de page HTML
2424-------------------------------------------
2425Avec la version 1.2.14, il devient possible pour haproxy d'interceptre des
2426requêtes pour une URI particulière et de retourner un rapport complet d'état de
2427l'activité du proxy, et des statistiques sur les serveurs. Ceci est disponible
2428via le mot clé "stats" associé à n'importe laquelle de ces options :
2429
2430 - stats enable
2431 - stats uri <uri prefix>
2432 - stats realm <authentication realm>
2433 - stats auth <user:password>
2434 - stats scope <proxy_id> | '.'
2435
2436
2437Par défaut, le rapport est désactivé. Le fait de spécifier une des combinaision
2438ci-dessus active le rapport pour l'instance de proxy qui le référence. La
2439solution la plus simple est d'utiliser "stats enable" qui activera le rapport
2440avec les paramètres par défaut suivant :
2441
2442 - default URI : "/haproxy?stats" (CONFIG_STATS_DEFAULT_URI)
2443 - default auth : non spécifié (pas d'authentication)
2444 - default realm : "HAProxy Statistics" (CONFIG_STATS_DEFAULT_REALM)
2445 - default scope : non specifié (accès à toutes les instances)
2446
2447L'option "stats uri <uri_prefix>" permet d'intercepter un autre préfixe d'URI
2448que celui par défaut. Noter que n'importe quelle URI qui COMMENCE avec cette
2449chaîne sera validée. Par exemple, une instance pourrait être dédiée à la page
2450d'état seulement et répondre à toute URI.
2451
2452Example :
2453---------
2454 # intercepte n'importe quelle URI et retourne la page d'état.
2455 listen stats :8080
2456 mode http
2457 stats uri /
2458
2459
2460L'option "stats auth <user:password>" active l'authentification "Basic" et
2461ajoute un couple "user:password" valide à la liste des comptes autorisés.
2462L'utilisateur <user> et le mot de passe <password> doivent être précisés
2463en clair dans le fichier de configuration, et comme ceci est de
2464l'authentification HTTP "Basic", il faut être conscient qu'ils transitent en
2465clair sur le réseau, donc il ne faut pas utiliser de compte sensible. La liste
2466est illimitée dans le but de pouvoir fournir des accès facilement à des
2467développeurs ou à des clients.
2468
2469L'option "stats realm <realm>" définit le "domaine" ("realm") de validité du
2470mot de passe qui sera présenté dans la boîte de dialogue du navigateur
2471lorsqu'il demandera un compte utilisateur et un mot de passe. Il est important
2472de s'assurer que celui-ci soit différent de ceux utilisés par l'application,
2473autrement le navigateur tentera d'en utiliser un caché depuis l'application.
2474Noter que les espaces dans le nom de "realm" doivent être protégés par un
2475backslash ('\').
2476
2477L'option "stats scope <proxy_id>" limite la portée du rapport d'état. Par
2478défaut, toutes les instances proxy sont listées. Mais dans certaines
2479circonstances, il serait préférable de ne lister que certains proxies ou
2480simplement le proxy courant. C'est ce que fait cette option. Le nom spécial "."
2481(un simple point) référence le proxy courant. Cette option peut être répétée
2482autant de fois que nécessaire pour autoriser d'autres proxies, même pour des
2483noms référencés plus loin dans la configuration ou bien des noms qui n'existent
2484pas encore. Le nom précisé est celui qui apparait après le mot clé "listen".
2485
2486Exemple :
2487---------
2488 # simple application embarquant la page d'état authentifiée
2489 listen app1 192.168.1.100:80
2490 mode http
2491 option httpclose
2492 balance roundrobin
2493 cookie SERVERID postonly insert indirect
2494 server srv1 192.168.1.1:8080 cookie srv1 check inter 1000
2495 server srv1 192.168.1.2:8080 cookie srv2 check inter 1000
2496 stats uri /my_stats
2497 stats realm Statistics\ for\ MyApp1-2
2498 stats auth guest:guest
2499 stats auth admin:AdMiN123
2500 stats scope .
2501 stats scope app2
2502
2503 # simple application embarquant la page d'état sans authentification
2504 listen app2 192.168.2.100:80
2505 mode http
2506 option httpclose
2507 balance roundrobin
2508 cookie SERVERID postonly insert indirect
2509 server srv1 192.168.2.1:8080 cookie srv1 check inter 1000
2510 server srv1 192.168.2.2:8080 cookie srv2 check inter 1000
2511 stats uri /my_stats
2512 stats realm Statistics\ for\ MyApp2
2513 stats scope .
2514
2515 listen admin_page :8080
2516 mode http
2517 stats uri /my_stats
2518 stats realm Global\ statistics
2519 stats auth admin:AdMiN123
2520
2521Notes :
2522-------
2523 - les options "stats" peuvent aussi être spécifiées dans une section
2524 "defaults", auquel cas la même configuration exactement sera fournie à
2525 toutes les instances suivantes, d'où l'utilité du scope ".". Toutefois, si
2526 une instance redéfinit n'importe quel paramètre "stats", alors les défauts
2527 ne lui seront pas appliqués.
2528
2529 - l'authentification "Basic" est très simpliste et non sécurisée contre la
2530 capture réseau. Aucun mot de passe sensible ne doit être utilisé, et il
2531 est bon de savoir qu'il n'existe pas de moyen de le supprimer du navigateur
2532 après usage, donc il sera envoyé tel quel à l'application au cours des
2533 accès successifs.
2534
2535 - Il est très important de préciser l'option "httpclose", sinon le proxy ne
2536 sera pas en mesure de détecter les URI dans les sessions keep-alive
2537 maintenues entre le navigateur et les serveurs, donc les URI de stats
2538 seront transmises telles quelles aux serveurs comme si l'option n'était
2539 pas précisée.
2540
2541
willy tarreaub719f002005-12-17 12:55:07 +01002542=======================
2543| Paramétrage système |
2544=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002545
2546Sous Linux 2.4
2547==============
2548
willy tarreaub719f002005-12-17 12:55:07 +01002549-- cut here --
2550#!/bin/sh
2551# set this to about 256/4M (16384 for 256M machine)
2552MAXFILES=16384
2553echo $MAXFILES > /proc/sys/fs/file-max
2554ulimit -n $MAXFILES
2555
2556if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002557 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002558fi
2559
2560if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002561 # 30 seconds for fin, 15 for time wait
2562 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2563 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2564 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2565 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002566fi
2567
willy tarreau0f7af912005-12-17 12:21:26 +01002568echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002569echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2570echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002571echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002572echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2573echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002574echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2575echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002576echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002577echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002578echo 0 > /proc/sys/net/ipv4/tcp_dsack
2579
2580# auto-tuned on 2.4
2581#echo 262143 > /proc/sys/net/core/rmem_max
2582#echo 262143 > /proc/sys/net/core/rmem_default
2583
2584echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2585echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2586
2587-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002588
willy tarreau197e8ec2005-12-17 14:10:59 +01002589Sous FreeBSD
2590============
2591
2592Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2593Clement Laforet <sheepkiller@cultdeadsheep.org>.
2594
2595Pour plus d'informations :
2596http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2597http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2598http://www.freshports.org/net/haproxy
2599
2600
willy tarreau0f7af912005-12-17 12:21:26 +01002601-- fin --