blob: ec746114962f94ed673d1c98bcfac0a190be6cd3 [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 Tarreau2272dc12006-09-03 10:19:38 +02005 version 1.3.2
willy tarreauc5f73ed2005-12-18 01:26:38 +01006 willy tarreau
Willy Tarreau2272dc12006-09-03 10:19:38 +02007 2006/09/03
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 Tarreaude99e992007-04-16 00:53:59 +020059 -dk désactive l'utilisation de kqueue()
60 -ds désactive l'utilisation de epoll() speculatif
willy tarreau64a3cc32005-12-18 01:13:11 +010061 -de désactive l'utilisation de epoll()
62 -dp désactive l'utilisation de poll()
willy tarreau34f45302006-04-15 21:37:14 +020063 -db désactive la mise en arrière-plan (utile pour débugger)
64 -m <megs> applique une limitation de <megs> Mo d'utilisation mémoire
willy tarreau0f7af912005-12-17 12:21:26 +010065
willy tarreau64a3cc32005-12-18 01:13:11 +010066Le nombre maximal de connexion simultanées par proxy est le paramètre par
67défaut pour les proxies pour lesquels ce paramètre n'est pas précisé dans le
68fichier de configuration. Il s'agit du paramètre 'maxconn' dans les sections
69'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010070
willy tarreau64a3cc32005-12-18 01:13:11 +010071Le nombre maximal total de connexions simultanées limite le nombre de
72connexions TCP utilisables à un instant donné par le processus, tous proxies
73confondus. Ce paramètre remplace le paramètre 'maxconn' de la section 'global'.
willy tarreaua1598082005-12-17 13:08:06 +010074
willy tarreauc29948c2005-12-17 13:10:27 +010075Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
willy tarreauc5f73ed2005-12-18 01:26:38 +010076mode, toutes les connexions, déconnexions, et tous les échanges d'en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +010077sont affichés.
78
willy tarreau34f45302006-04-15 21:37:14 +020079Pour debugger, l'option '-db' est très pratique car elle désactive
80temporairement le mode daemon et le mode multi-processus. Le service peut alors
81être arrêté par un simple appui sur Ctrl-C, sans avoir à modifier la
82configuration ni à activer le mode debug complet.
83
willy tarreauc29948c2005-12-17 13:10:27 +010084Les statistiques ne sont disponibles que si le programme a été compilé avec
85l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
willy tarreau8f635a42006-05-21 23:05:54 +020086d'utilité que lors de benchmarks par exemple, et sont amenées à disparaitre.
willy tarreauc29948c2005-12-17 13:10:27 +010087
willy tarreau532bb552006-05-13 18:40:37 +020088Les paramètres '-st' et '-sf' sont utilisés pour la reconfiguration à chaud.
89Voir la section à ce sujet.
willy tarreau0f7af912005-12-17 12:21:26 +010090
91============================
92| Fichier de configuration |
93============================
94
willy tarreauc29948c2005-12-17 13:10:27 +010095Structure
96=========
willy tarreau0f7af912005-12-17 12:21:26 +010097
willy tarreaua1598082005-12-17 13:08:06 +010098L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
willy tarreau64a3cc32005-12-18 01:13:11 +010099les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est
100pas précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +0100101
102Le fichier de configuration est découpé en sections répérées par des mots clés
103tels que :
104
105 - 'global'
106 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +0100107 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +0100108
109Tous les paramètres font référence à la section définie par le dernier mot clé
110reconnu.
111
112
willy tarreauc29948c2005-12-17 13:10:27 +01001131) Paramètres globaux
114=====================
willy tarreaua1598082005-12-17 13:08:06 +0100115
116Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
117proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
118supportés sont :
119
willy tarreau8337c6b2005-12-17 13:41:01 +0100120 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100121 - maxconn <nombre>
122 - uid <identifiant>
123 - gid <identifiant>
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200124 - user <nom d'utilisateur>
125 - group <nom de groupe>
willy tarreaua1598082005-12-17 13:08:06 +0100126 - chroot <répertoire>
127 - nbproc <nombre>
128 - daemon
129 - debug
Willy Tarreaude99e992007-04-16 00:53:59 +0200130 - nokqueue
131 - nosepoll
willy tarreau64a3cc32005-12-18 01:13:11 +0100132 - noepoll
133 - nopoll
willy tarreaua1598082005-12-17 13:08:06 +0100134 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100135 - pidfile <fichier>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100136 - ulimit-n <nombre>
Willy Tarreau1db37712007-06-03 17:16:49 +0200137 - tune.maxpollevents <nombre>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100138
willy tarreaua1598082005-12-17 13:08:06 +0100139
1401.1) Journalisation des événements
141----------------------------------
142La plupart des événements sont journalisés : démarrages, arrêts, disparition et
143apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
144syslog vers un ou deux serveurs. La syntaxe est la suivante :
145
willy tarreau8337c6b2005-12-17 13:41:01 +0100146 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100147
148Les connexions sont envoyées en niveau "info". Les démarrages de service et de
149serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
150arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau64a3cc32005-12-18 01:13:11 +0100151bien pour les proxies que pour les serveurs testés par les proxies. Le
152paramètre optionnel <niveau_max> définit le niveau maximal de traces émises
153parmi les 8 valeurs suivantes :
willy tarreau8337c6b2005-12-17 13:41:01 +0100154 emerg, alert, crit, err, warning, notice, info, debug
155
willy tarreaueedaa9f2005-12-17 14:08:03 +0100156Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100157est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100158
159Les catégories possibles sont :
160 kern, user, mail, daemon, auth, syslog, lpr, news,
161 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
162 local0, local1, local2, local3, local4, local5, local6, local7
163
willy tarreau036e1ce2005-12-17 13:46:33 +0100164Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
165
willy tarreaua1598082005-12-17 13:08:06 +0100166Exemple :
167---------
168 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100169 log 192.168.2.200 local3
170 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100171
1721.2) limitation du nombre de connexions
173---------------------------------------
174Il est possible et conseillé de limiter le nombre global de connexions par
willy tarreauc5f73ed2005-12-18 01:26:38 +0100175processus à l'aide du mot clé global 'maxconn'. Les connexions sont comprises
176au sens 'acceptation de connexion', donc il faut s'attendre en règle général à
177avoir un peu plus du double de sessions TCP que le maximum de connexions fixé.
178C'est important pour fixer le paramètre 'ulimit -n' avant de lancer le proxy.
179Pour comptabiliser le nombre de sockets nécessaires, il faut prendre en compte
180ces paramètres :
181
willy tarreaua1598082005-12-17 13:08:06 +0100182 - 1 socket par connexion entrante
183 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100184 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100185 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100186 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100187
willy tarreau64a3cc32005-12-18 01:13:11 +0100188Dans le cas où chaque proxy n'écoute que sur un couple adresse/port,
willy tarreauc5f73ed2005-12-18 01:26:38 +0100189positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
190(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
191il est possible de spécifier cette limite dans la configuration à l'aide du
192mot-clé global 'ulimit-n', à condition bien entendu que le proxy ait été
193démarré sous le compte root (ou avec des droits suffisants pour élever le
194nombre de descripteurs de fichiers). Cette solution met un terme au problème
195récurrent d'incertitude de l'adéquation entre les limites systèmes lors de la
196dernière relance du proxessus et les limites en nombre de connexions. Noter que
197cette limite s'applique par processus.
198
199Exemple :
200---------
201 global
202 maxconn 32000
203 ulimit-n 65536
204
willy tarreauc29948c2005-12-17 13:10:27 +0100205
2061.3) Diminution des privilèges
207------------------------------
208Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
209serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100210de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100211
willy tarreauc29948c2005-12-17 13:10:27 +0100212Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
213numérique d'utilisateur. La valeur 0, correspondant normalement au super-
214utilisateur, possède ici une signification particulière car elle indique que
215l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
216C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
217un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200218changer. Dans le cas où il ne serait pas possible de spécifier un identifiant
219numérique pour l'uid, il est possible de spécifier un nom d'utilisateur après
220le mot-clé 'user'. De la même manière, il est possible de préciser un nom de
221groupe après le mot-clé 'group'.
222
223Il est particulièrement déconseillé d'utiliser des comptes génériques tels que
224'nobody' car cette pratique revient à utiliser 'root' si d'autres processus
225utilisent les mêmes identifiants.
willy tarreauc29948c2005-12-17 13:10:27 +0100226
227Le paramètre 'chroot' autorise à changer la racine du processus une fois le
228programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100229puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100230généralement contournable sur certains OS (Linux, Solaris) pour peu que
231l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
232un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
233service pour cet usage, et de ne pas mutualiser un même répertoire pour
234plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
235il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
236l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100237
willy tarreau64a3cc32005-12-18 01:13:11 +0100238Remarque importante :
239---------------------
240Dans le cas où une telle faille serait mise en évidence, il est fort probable
241que les premières tentatives de son exploitation provoquent un arrêt du
willy tarreauc29948c2005-12-17 13:10:27 +0100242programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
willy tarreau64a3cc32005-12-18 01:13:11 +0100243encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur
244en environnement limité réduit les risques d'intrusion, il est parfois bien
245utile dans ces circonstances de connaître les conditions d'apparition du
246problème, via l'obtention d'un fichier 'core'. La plupart des systèmes, pour
247des raisons de sécurité, désactivent la génération du fichier 'core' après un
248changement d'identifiant pour le processus. Il faudra donc soit lancer le
249processus à partir d'un compte utilisateur aux droits réduits (mais ne pouvant
250pas effectuer le chroot), ou bien le faire en root sans réduction des droits
251(uid 0). Dans ce cas, le fichier se trouvera soit dans le répertoire de
252lancement, soit dans le répertoire spécifié après l'option 'chroot'. Ne pas
253oublier la commande suivante pour autoriser la génération du fichier avant de
254lancer le programme :
willy tarreauc29948c2005-12-17 13:10:27 +0100255
256# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100257
willy tarreauc29948c2005-12-17 13:10:27 +0100258Exemple :
259---------
260
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200261 # with uid/gid
willy tarreauc29948c2005-12-17 13:10:27 +0100262 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100263 uid 30000
264 gid 30000
265 chroot /var/chroot/haproxy
willy tarreauc29948c2005-12-17 13:10:27 +0100266
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200267 # with user/group
268 global
269 user haproxy
270 group public
271 chroot /var/chroot/haproxy
272
273
willy tarreaufe2c5c12005-12-17 14:14:34 +01002741.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100275----------------------------
276Le service peut fonctionner dans plusieurs modes :
277 - avant- / arrière-plan
278 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100279
willy tarreau64a3cc32005-12-18 01:13:11 +0100280Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne
281rend pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci
282dans un script de démarrage du système, sinon le système ne finirait pas son
willy tarreauc29948c2005-12-17 13:10:27 +0100283initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
284au processus appelant. C'est ce que fait l'option 'daemon' de la section
285'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100286
willy tarreau34f45302006-04-15 21:37:14 +0200287Le paramètre de ligne de commande '-db' inhibe les options globales 'daemon'
288et 'nbproc' pour faire fonctionner le processus en mode normal, avant-plan.
289
willy tarreauc29948c2005-12-17 13:10:27 +0100290Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
291standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
292logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
293Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100294
willy tarreauc29948c2005-12-17 13:10:27 +0100295Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
296problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
297entre les clients et les serveurs. Ce mode est incompatible avec les options
298'daemon' et 'quiet' pour des raisons de bon sens.
299
willy tarreaufe2c5c12005-12-17 14:14:34 +01003001.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100301-----------------------------------------------
302Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
303processeur pour effectuer les tâches de relayage, même si les charges
304nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
305grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
306programme sait démarrer plusieurs processus se répartissant la charge de
307travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
308section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100309qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
310la limite de nombre de descripteurs de fichiers allouée par processus sous
311Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100312
313Exemple :
314---------
315
316 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100317 daemon
318 quiet
319 nbproc 2
willy tarreauc29948c2005-12-17 13:10:27 +0100320
willy tarreaufe2c5c12005-12-17 14:14:34 +01003211.6) Simplification de la gestion des processus
322-----------------------------------------------
323Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
324paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
325d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
326le numéro de PID des processus fils, à raison d'un par ligne (valable
327uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
328afin de rester compatible avec un répertoire protégé en lecture seule. Il
329appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
3300644.
331
332Exemple :
333---------
334
335 global
336 daemon
337 quiet
338 nbproc 2
339 pidfile /var/run/haproxy-private.pid
340
341 # pour stopper seulement ces processus parmi d'autres :
342 # kill $(</var/run/haproxy-private.pid)
343
willy tarreau34f45302006-04-15 21:37:14 +0200344 # pour recharger une configuration avec un impact minimal sur le service,
345 # et sans casser les sessions existantes :
346 # haproxy -f haproxy.cfg -p $(</var/run/haproxy-private.pid) -st $(</var/run/haproxy-private.pid)
willy tarreauc29948c2005-12-17 13:10:27 +0100347
willy tarreau64a3cc32005-12-18 01:13:11 +01003481.7) Mécanismes de traitements des événements
349---------------------------------------------
350A partir de la version 1.2.5, haproxy supporte les mécanismes poll() et
351epoll(). Sur les systems où select() est limité par FD_SETSIZE (comme Solaris),
352poll() peut être une alternative intéressante. Des tests de performance
353montrent que les performances de poll() ne décroissent pas aussi vite que le
354nombre de sockets augmente, ce qui en fait une solution sûre pour les fortes
355charges. Cela dit, Soalris utilise déjà poll() pour émuler select(), donc tant
356que le nombre de sockets ne dépasse pas FD_SETSIZE, poll() ne devrait pas
357apporter de performances supplémentaires. Sur les systèmes à base Linux
358incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
359qui est extrèmement rapide indépendamment du nombre de sockets. Les tests sur
360haproxy ont montré une performance constante de 1 à 40000 sessions simultanées.
Willy Tarreaude99e992007-04-16 00:53:59 +0200361La version 1.3.9 a introduit le support de kqueue() pour FreeBSD/OpenBSD, ainsi
362qu'une variante appelée "speculative epoll()" consistant à tenter d'effectuer
363les opérations d'entrées/sorties avant de chaîner les événements par les appels
364système.
willy tarreau64a3cc32005-12-18 01:13:11 +0100365
Willy Tarreau1db37712007-06-03 17:16:49 +0200366Afin d'optimiser la latence, il est désormais possible de limiter le nombre
367d'événements remontés à chaque appel. La limite par défaut est fixée à 200. Si
368une latence plus petite est recherchée, il peut être justifié d'abaisser cette
369limite par l'utilisation du paramètre 'tune.maxpollevents' dans la section
370'global'. L'augmenter permettra d'économiser un peu le processeur en présence
371de très grands nombres de connexions simultanées.
372
Willy Tarreaude99e992007-04-16 00:53:59 +0200373Haproxy utilisera kqueue() ou speculative epoll() lorsque ce sera disponible,
374puis epoll(), et se repliera sur poll(), puis en dernier lieu sur select().
375Cependant, si pour une raison quelconque il s'avérait nécessaire de désactiver
376epoll() ou poll() (p.ex: à cause d'un bug ou juste pour comparer les
377performances), de nouvelles options globales ont été ajoutées dans ce but :
378'nosepoll', 'nokqueue', 'noepoll' et 'nopoll'.
willy tarreau64a3cc32005-12-18 01:13:11 +0100379
380Exemple :
381---------
382 global
383 # utiliser seulement select()
384 noepoll
385 nopoll
Willy Tarreau1db37712007-06-03 17:16:49 +0200386 tune.maxpollevents 100
willy tarreau64a3cc32005-12-18 01:13:11 +0100387
388Remarque :
389----------
390Dans le but d'assurer une portabilité maximale des configurations, ces options
391sont acceptées et ignorées si les mécanismes poll() ou epoll() n'ont pas été
392activés lors de la compilation.
393
394Afin de simplifier la résolution de problèmes, le paramètre '-de' en ligne de
Willy Tarreaude99e992007-04-16 00:53:59 +0200395commande désactive epoll(), le paramètre '-dp' désactive poll(), '-dk' kqueue()
396et '-ds' désactive speculative epoll(). Ils sont respectivement équivalents à
397'noepoll', 'nopoll', 'nokqueue' et 'nosepoll'.
willy tarreau64a3cc32005-12-18 01:13:11 +0100398
399
willy tarreauc29948c2005-12-17 13:10:27 +01004002) Définition d'un service en écoute
401====================================
402
403Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100404
willy tarreaua41a8b42005-12-17 14:02:24 +0100405 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100406
willy tarreauc29948c2005-12-17 13:10:27 +0100407- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
willy tarreau64a3cc32005-12-18 01:13:11 +0100408 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé.
409 Aucun test n'est effectué concernant l'unicité de ce nom, qui n'est pas
410 obligatoire, mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100411
willy tarreaua41a8b42005-12-17 14:02:24 +0100412- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
413 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
414 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100415
willy tarreaua41a8b42005-12-17 14:02:24 +0100416- <plage_ports> correspond soit à un port, soit à une plage de ports sur
417 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
418 Cette plage peut être :
419 - soit un port numérique (ex: '80')
420 - soit une plage constituée de deux valeurs séparées par un tiret
421 (ex: '2000-2100') représentant les extrémités incluses dans la
422 plage.
423 Il faut faire attention à l'usage des plages, car chaque combinaison
424 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
425 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
426 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
willy tarreau64a3cc32005-12-18 01:13:11 +0100427 niveau de privilège particulier lors du lancement du programme
428 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100429
willy tarreaua41a8b42005-12-17 14:02:24 +0100430- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
431 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
432 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
433
434Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100435---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100436 listen http_proxy :80
437 listen x11_proxy 127.0.0.1:6000-6009
438 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
439 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100440
willy tarreaua41a8b42005-12-17 14:02:24 +0100441Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
442rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
443de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
444l'écriture de configurations :
445
446 bind [ <adresse_IP>:<plage_ports>[,...] ]
447
448Exemples :
449----------
450 listen http_proxy
451 bind :80,:443
willy tarreauc5f73ed2005-12-18 01:26:38 +0100452 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100453
willy tarreauc29948c2005-12-17 13:10:27 +01004542.1) Inhibition d'un service
455----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100456Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100457commenter toute une partie du fichier. Il suffit de positionner le mot clé
458"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100459
460 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100461 disabled
willy tarreau0f7af912005-12-17 12:21:26 +0100462
willy tarreaueedaa9f2005-12-17 14:08:03 +0100463Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
willy tarreauc5f73ed2005-12-18 01:26:38 +0100464 désactivé par le mot clé 'disabled', par exemple à cause d'une
465 configuration par défaut.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100466
willy tarreauc29948c2005-12-17 13:10:27 +01004672.2) Mode de fonctionnement
468---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100469Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100470 - TCP
471 - HTTP
willy tarreau532bb552006-05-13 18:40:37 +0200472 - état de santé
willy tarreau0f7af912005-12-17 12:21:26 +0100473
474Mode TCP
475--------
willy tarreau64a3cc32005-12-18 01:13:11 +0100476Dans ce mode, le service relaye, dès leur établissement, les connexions TCP
477vers un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il
478s'agit simplement d'une association
479 source<adresse:port> -> destination<adresse:port>.
willy tarreauc29948c2005-12-17 13:10:27 +0100480Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100481
willy tarreauc29948c2005-12-17 13:10:27 +0100482Exemple :
483---------
willy tarreau0f7af912005-12-17 12:21:26 +0100484 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100485 mode tcp
willy tarreau0f7af912005-12-17 12:21:26 +0100486
487Mode HTTP
488---------
willy tarreauc29948c2005-12-17 13:10:27 +0100489Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
490serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
willy tarreauc5f73ed2005-12-18 01:26:38 +0100491décision. Les en-têtes HTTP sont analysés pour y trouver un éventuel cookie, et
willy tarreauc29948c2005-12-17 13:10:27 +0100492certains d'entre-eux peuvent être modifiés par le biais d'expressions
493régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
494relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100495
willy tarreauc29948c2005-12-17 13:10:27 +0100496Exemple :
497---------
willy tarreau0f7af912005-12-17 12:21:26 +0100498 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100499 mode http
willy tarreau0f7af912005-12-17 12:21:26 +0100500
501Mode supervision
502----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100503Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
504santé du service. Il se contente de retourner "OK" à tout client se connectant
505sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100506déterminer quels sont les services utilisables. Si l'option 'httpchk' est
507activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
508attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100509le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100510
willy tarreauc29948c2005-12-17 13:10:27 +0100511Exemple :
512---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100513 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100514 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100515 mode health
willy tarreau0f7af912005-12-17 12:21:26 +0100516
willy tarreau197e8ec2005-12-17 14:10:59 +0100517 # réponse HTTP : 'HTTP/1.0 200 OK'
518 listen http_health_check 0.0.0.0:60001
willy tarreauc5f73ed2005-12-18 01:26:38 +0100519 mode health
520 option httpchk
willy tarreau197e8ec2005-12-17 14:10:59 +0100521
willy tarreau0f7af912005-12-17 12:21:26 +0100522
willy tarreau532bb552006-05-13 18:40:37 +02005232.2.1 Supervision
524-----------------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100525Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
526bon fonctionnement du proxy sans perturber le service. Le mot-clé 'monitor-net'
527a été créé dans le butd de spécifier un réseau d'équipements qui ne PEUVENT PAS
528utiliser le service pour autre chose que des tests de fonctionnement. C'est
529particulièrement adapté aux proxies TCP, car cela empêche le proxy de relayer
530des établissements de connexion émis par un outil de surveillance.
531
532Lorsque c'est utilisé sur un proxy TCP, la connexion est acceptée puis refermée
533et rien n'est logué. C'est suffisant pour qu'un répartiteur de charge en amont
534détecte que le service est disponible.
535
536Lorsque c'est utilisé sur un proxy HTTP, la connexion est acceptée, rien n'est
537logué, puis la réponse suivante est envoyée et la session refermée :
538"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un répartiteur de charge
539HTTP en amont détecte le service comme opérationnel, aussi bien à travers des
540tests TCP que HTTP.
541
542Les proxies utilisant le mot-clé 'monitor-net' peuvent accessoirement se passer
543de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
544émises depuis d'autres adresses que celles du réseau de tests.
545
546Exemple :
547---------
548
549 listen tse-proxy
550 bind :3389,:1494,:5900 # TSE, ICA and VNC at once.
551 mode tcp
552 balance roundrobin
553 server tse-farm 192.168.1.10
554 monitor-net 192.168.1.252/31 # L4 load-balancers on .252 and .253
555
556
Willy Tarreau1c47f852006-07-09 08:22:27 +0200557Lorsque le système effectuant les tests est situé derrière un proxy, le mot-clé
558'monitor-net' n'est pas utilisable du fait que haproxy verra toujours la même
559adresse pour le proxy. Pour pallier à cette limitation, la version 1.2.15 a
560apporté le mot-clé 'monitor-uri'. Il définit une URI qui ne sera ni retransmise
561ni logée, mais pour laquelle haproxy retournera immédiatement une réponse
562"HTTP/1.0 200 OK". Cela rend possibles les tests de validité d'une chaîne
563reverse-proxy->haproxy en une requête HTTP. Cela peut être utilisé pour valider
564une combinaision de stunnel+haproxy à l'aide de tests HTTPS par exemple. Bien
565entendu, ce mot-clé n'est valide qu'en mode HTTP, sinon il n'y a pas de notion
566d'URI. Noter que la méthode et la version HTTP sont simplement ignorées.
567
568Exemple :
569---------
570
571 listen stunnel_backend :8080
572 mode http
573 balance roundrobin
574 server web1 192.168.1.10:80 check
575 server web2 192.168.1.11:80 check
576 monitor-uri /haproxy_test
577
578
willy tarreauc29948c2005-12-17 13:10:27 +01005792.3) Limitation du nombre de connexions simultanées
580---------------------------------------------------
581Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
582connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
583d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
584limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100585
willy tarreauc29948c2005-12-17 13:10:27 +0100586Exemple :
587---------
588 listen tiny_server 0.0.0.0:80
589 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100590
591
willy tarreauc29948c2005-12-17 13:10:27 +01005922.4) Arrêt en douceur
593---------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100594Il est possible d'arrêter les services en douceur en envoyant un signal
willy tarreau22739ef2006-01-20 20:43:32 +0100595SIGUSR1 au processus relais. Tous les services seront alors mis en phase
willy tarreau64a3cc32005-12-18 01:13:11 +0100596d'arrêt, mais pourront continuer d'accepter des connexions pendant un temps
597défini par le paramètre 'grace' (en millisecondes). Cela permet par exemple,
598de faire savoir rapidement à un répartiteur de charge qu'il ne doit plus
599utiliser un relais, tout en continuant d'assurer le service le temps qu'il
600s'en rende compte.
601
602Remarque :
603----------
604Les connexions actives ne sont jamais cassées. Dans le pire des cas, il faudra
willy tarreau22739ef2006-01-20 20:43:32 +0100605attendre en plus leur expiration avant l'arrêt total du processus, ou bien tuer
606manuellement le processus par l'envoi d'un signal SIGTERM. La valeur par défaut
607du paramètre 'grace' est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100608
609Exemple :
610---------
willy tarreauc29948c2005-12-17 13:10:27 +0100611 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100612 # le service tournera encore 10 secondes après la demande d'arrêt
613 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100614 mode http
615 grace 10000
willy tarreau0f7af912005-12-17 12:21:26 +0100616
willy tarreauc29948c2005-12-17 13:10:27 +0100617 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100618 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100619 mode health
620 grace 0
willy tarreau0f7af912005-12-17 12:21:26 +0100621
willy tarreau39df2dc2006-01-29 21:56:05 +0100622A partir de la version 1.2.8, un nouveau mécanisme de reconfiguration à chaud
willy tarreau22739ef2006-01-20 20:43:32 +0100623a été introduit. Il est désormais possible de mettre les proxies en "pause" en
624envoyant un signal SIGTTOU aux processus. Cela désactivera les sockets d'écoute
625sans casser les sessions existantes. Suite à cela, l'envoi d'un signal SIGTTIN
626réactivera les sockets d'écoute. Ceci est très pratique pour tenter de charger
627une nouvelle configuration ou même une nouvelle version de haproxy sans casser
628les connexions existantes. Si le rechargement s'effectue correctement, il ne
629reste plus qu'à envoyer un signal SIGUSR1 aux anciens processus, ce qui
630provoquera leur arrêt immédiat dès que leurs connexions seront terminées ; en
631revanche, si le rechargement échoue, il suffit d'envoyer un signal SIGTTIN pour
632remettre les ports en écoute et rétablir le service immédiatement. Veuillez
633noter que le paramètre 'grace' est ignoré pour le signal SIGTTOU ainsi que le
634signal SIGUSR1 une fois le processus en pause. Aussi, il peut s'avérer très
635utile de sauver le fichier de pid avant de démarrer une nouvelle instance.
636
willy tarreau34f45302006-04-15 21:37:14 +0200637Ce mécanisme est pleinement exploité à partir de la version 1.2.11 avec les
willy tarreau532bb552006-05-13 18:40:37 +0200638options '-st' et '-sf' (voir ci-dessous).
639
6402.4) Reconfiguration à chaud
641----------------------------
642Les paramètres '-st' et '-sf' sont utilisés pour informer des processus
643existants que la configuration va être rechargée. Ils recevront le signal
644SIGTTOU, leur demandant de libérer les ports en écoute afin que le nouveau
645processus puisse les prendre. Si quoi que ce soit se passe mal, le nouveau
646processus leur enverra un signal SIGTTIN pour leur indiquer qu'ils peuvent
647se remettre en écoute et continuer leur travail. En revanche, si la
648configuration se charge correctement, alors ils recevront un signal de demande
649de fin de travail en douceur (-sf), ou de terminaison immédiate (-st) qui
650coupera les sessions en cours. Un usage typique tel que celui-ci permet de
651recharger une configuration sans interruption de service :
652
653 # haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
654
willy tarreau0f7af912005-12-17 12:21:26 +0100655
willy tarreauc29948c2005-12-17 13:10:27 +01006562.5) Temps d'expiration des connexions
657--------------------------------------
658Il est possible de paramétrer certaines durées d'expiration au niveau des
659connexions TCP. Trois temps indépendants sont configurables et acceptent des
660valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
661session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100662
663 - temps d'attente d'une donnée de la part du client, ou de la
664 possibilité de lui envoyer des données : "clitimeout" :
665
willy tarreauc5f73ed2005-12-18 01:26:38 +0100666 # time-out client à 2mn30.
667 clitimeout 150000
willy tarreau0f7af912005-12-17 12:21:26 +0100668
669 - temps d'attente d'une donnée de la part du serveur, ou de la
670 possibilité de lui envoyer des données : "srvtimeout" :
671
willy tarreauc5f73ed2005-12-18 01:26:38 +0100672 # time-out serveur à 30s.
673 srvtimeout 30000
willy tarreau0f7af912005-12-17 12:21:26 +0100674
675 - temps d'attente de l'établissement d'une connexion vers un serveur
676 "contimeout" :
677
willy tarreauc29948c2005-12-17 13:10:27 +0100678 # on abandonne si la connexion n'est pas établie après 4 secondes
willy tarreauc5f73ed2005-12-18 01:26:38 +0100679 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100680
willy tarreauc29948c2005-12-17 13:10:27 +0100681Remarques :
682-----------
683 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
684 type "health".
685 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
willy tarreau64a3cc32005-12-18 01:13:11 +0100686 possible de perdre des paquets. Du fait que la première retransmission
687 TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
688 inférieur à 3 secondes ne permet pas de se rattraper sur la perte
689 de paquets car la session aura été abandonnée avant la première
690 retransmission. Une valeur de 4 secondes réduira considérablement
691 le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100692
willy tarreauc29948c2005-12-17 13:10:27 +01006932.6) Tentatives de reconnexion
694------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100695Lors d'un échec de connexion vers un serveur, il est possible de
696retenter (potentiellement vers un autre serveur, en cas de répartition
697de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100698abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100699
willy tarreauc29948c2005-12-17 13:10:27 +0100700Exemple :
701---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100702 # on essaie encore trois fois maxi
703 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100704
willy tarreau34f45302006-04-15 21:37:14 +0200705Il est à noter que la tentative de reconnexion peut amener à utiliser un autre
706serveur si le premier a disparu entre deux tentatives de connexion.
707
willy tarreau0f7af912005-12-17 12:21:26 +0100708
willy tarreauc29948c2005-12-17 13:10:27 +01007092.7) Adresse du serveur
710-----------------------
711Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
712le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
713serveur d'assignation de cookie dans le cas où le service consiste à assurer
714uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100715le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
716du serveur distant, et il est maintenant recommandé d'utiliser de préférence
717le mode 'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100718
willy tarreauc29948c2005-12-17 13:10:27 +0100719Exemple :
720---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100721 # on envoie toutes les nouvelles connexions ici
722 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100723
willy tarreauc29948c2005-12-17 13:10:27 +0100724Remarque :
725----------
726Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
727'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100728
willy tarreau0f7af912005-12-17 12:21:26 +0100729
willy tarreau240afa62005-12-17 13:14:35 +01007302.8) Adresse de sortie
731----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100732Il est possible de forcer l'adresse utilisée pour établir les connexions vers
733les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
734port, bien que cette fonctionnalité se limite à des usages très spécifiques.
735C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100736pour permettre aux serveurs de trouver le chemin de retour dans des contextes
737de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
738choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
739librement par le système. Il est à noter que depuis la version 1.1.18, les
740tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
741source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100742
743Exemples :
744----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100745 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100746 # toutes les connexions prennent l'adresse 192.168.1.200
747 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100748
willy tarreaua41a8b42005-12-17 14:02:24 +0100749 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100750 # utiliser l'adresse 192.168.1.200 et le port réservé 900
751 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100752
753
7542.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100755--------------------------------
756En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
757vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
758par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100759
willy tarreauc29948c2005-12-17 13:10:27 +0100760Exemple :
761---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100762 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100763 mode http
764 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100765
willy tarreauc29948c2005-12-17 13:10:27 +0100766On peut modifier l'utilisation du cookie pour la rendre plus intelligente
767vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
768réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
769cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100770de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
771inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100772
773Exemples :
774----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100775
776Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100777dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
778directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100779
willy tarreauc5f73ed2005-12-18 01:26:38 +0100780 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100781
willy tarreauc29948c2005-12-17 13:10:27 +0100782Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
783lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100784
willy tarreauc5f73ed2005-12-18 01:26:38 +0100785 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100786
willy tarreau64a3cc32005-12-18 01:13:11 +0100787Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
788accès en répartition de charge interne. Dans ce cas, il est souhaitable que
789tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100790retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100791
willy tarreauc5f73ed2005-12-18 01:26:38 +0100792 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100793
willy tarreau0174f312005-12-18 01:02:42 +0100794Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
795puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
796permet d'insérer une instance de haproxy devant une application sans risquer
797d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
798plus d'un cookie :
799
800 cookie JSESSIONID prefix
801
willy tarreau240afa62005-12-17 13:14:35 +0100802Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
803ajouter le mot clé 'nocache' après 'insert' :
804
willy tarreauc5f73ed2005-12-18 01:26:38 +0100805 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100806
willy tarreau64a3cc32005-12-18 01:13:11 +0100807Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
808mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100809
willy tarreauc5f73ed2005-12-18 01:26:38 +0100810 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100811
willy tarreau240afa62005-12-17 13:14:35 +0100812
willy tarreau96d40372005-12-17 13:11:56 +0100813Remarques :
814-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100815- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
816 s'adapter à des applications générant déjà le cookie, avec un contenu
817 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100818
willy tarreau96d40372005-12-17 13:11:56 +0100819- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
820 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
821 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100822
willy tarreau240afa62005-12-17 13:14:35 +0100823- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
824 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
825 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
826 cookie de persistence inséré, donc provoquer des changements de serveurs pour
827 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100828
willy tarreau0174f312005-12-18 01:02:42 +0100829- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
830 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
831 présenté par l'application qui est censée savoir à quel moment il peut
832 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
833 présenté par le client dans chaque requête ultérieure, il est indispensable
834 de s'assurer que le client et le serveur communiqueront sans "keep-alive
835 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
836
willy tarreaucd878942005-12-17 13:27:43 +0100837- lorsque l'application est bien connue, et que les parties nécessitant de la
838 persistence sont systématiquement accédées par un formulaire en mode POST,
839 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
840 et "indirect", car la page d'accueil reste cachable, et c'est l'application
841 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100842
willy tarreau240afa62005-12-17 13:14:35 +01008432.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100844----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100845En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
846par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100847
willy tarreau5cbea6f2005-12-17 12:48:26 +0100848 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100849
willy tarreauc29948c2005-12-17 13:10:27 +0100850- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
851 configuration et les logs.
852- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
853- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100854
855Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100856---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100857 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100858 mode http
859 cookie SERVERID
860 dispatch 192.168.1.100:80
861 server web1 192.168.1.1:80 cookie server01
862 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100863
864Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100865-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100866
willy tarreaua41a8b42005-12-17 14:02:24 +01008673) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100868=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100869
willy tarreauc29948c2005-12-17 13:10:27 +0100870Le relais peut effectuer lui-même la répartition de charge entre les différents
871serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
872cela, on précise le mot clé 'balance' dans la définition du service,
willy tarreau34f45302006-04-15 21:37:14 +0200873éventuellement suivi du nom d'un algorithme de répartition. Jusqu'à la version
8741.2.11, seul 'roundrobin' était géré, et c'est aussi la valeur implicite par
Willy Tarreau2fcb5002007-05-08 13:35:26 +0200875défaut. Avec la version 1.2.12, le nouveau mot clé 'source' est apparu. La
876version 1.3.10 a également apporté le mot clé 'uri'. Il est évident qu'en cas
877d'utilisation du répartiteur interne, il ne faudra pas spécifier d'adresse de
878dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100879
880Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100881---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100882
willy tarreaua41a8b42005-12-17 14:02:24 +0100883 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100884 mode http
885 cookie SERVERID
886 balance roundrobin
887 server web1 192.168.1.1:80 cookie server01
888 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100889
willy tarreaua41a8b42005-12-17 14:02:24 +0100890Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
891du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
892sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
893champ <port> de l'adresse serveur :
894
895 - non spécifié ou nul :
896 la connexion sera envoyée au serveur sur le même port que celui sur
897 lequel le relais a reçu la connexion.
898
899 - valeur numérique (seul cas supporté pour les versions antérieures) :
900 le serveur recevra la connexion sur le port désigné.
901
902 - valeur numérique précédée d'un signe '+' :
903 la connexion sera envoyée au serveur sur le même port que celui sur
904 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
905
906 - valeur numérique précédée d'un signe '-' :
907 la connexion sera envoyée au serveur sur le même port que celui sur
908 lequel le relais a reçu la connexion, duquel on soustrait la valeur
909 désignée.
910
911Exemples :
912----------
913
914# même que précédemment
915
916 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100917 mode http
918 cookie SERVERID
919 balance roundrobin
920 server web1 192.168.1.1 cookie server01
921 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100922
923# relayage simultané des ports 80 et 81 et 8080-8089
924
925 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100926 mode http
927 cookie SERVERID
928 balance roundrobin
929 server web1 192.168.1.1 cookie server01
930 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100931
932# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
933
934 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100935 mode tcp
936 balance roundrobin
937 server srv1 192.168.1.1:+1000
938 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100939
willy tarreau34f45302006-04-15 21:37:14 +0200940Comme indiqué précédemment, la version 1.2.12 apporta le nouveau mot clé
941'source'. Lorsque celui-ci est utilisé, l'adresse IP du client est hachée et
942distribuée de manière homogène parmi les serveurs disponibles, de sorte qu'une
943même adresse IP aille toujours sur le même serveur tant qu'il n'y a aucun
944changement dans le nombre de serveurs disponibles. Ceci peut être utilisé par
945exemple pour attacher le HTTP et le HTTPS sur un même serveur pour un même
946client. Cela peut également être utilisé pour améliorer la persistance
947lorsqu'une partie de la population des clients n'accepte pas les cookies. Dans
948ce cas, seuls ces derniers seront perturbés par la perte d'un serveur.
949
950NOTE: il est important de prendre en compte le fait que beaucoup d'internautes
951 naviguent à travers des fermes de proxies qui assignent des adresses IP
952 différentes à chaque requête. D'autres internautes utilisent des liens à
953 la demande et obtiennent une adresse IP différente à chaque connexion. De
954 ce fait, le paramètre 'source' doit être utilisé avec une extrème
955 précaution.
956
957Exemples :
958----------
959
960# assurer qu'une même adresse IP ira sur le même serveur pour tout service
961
962 listen http_proxy
963 bind :80,:443
964 mode http
965 balance source
966 server web1 192.168.1.1
967 server web2 192.168.1.2
968
969# améliorer la persistance par l'utilisation de la source en plus du cookie :
970
971 listen http_proxy :80
972 mode http
973 cookie SERVERID
974 balance source
975 server web1 192.168.1.1 cookie server01
976 server web2 192.168.1.2 cookie server02
977
Willy Tarreau2fcb5002007-05-08 13:35:26 +0200978De plus, tel qu'indiqué ci-dessus, la version 1.3.10 a introduit le mot clé
979'uri'. Il est très pratique dans le cas de répartition de charge entre des
980reverse-proxy-caches, parce qu'il utilisera le résultat d'un hachage de l'URI
981pour choisir un serveur, ce qui aura pour effet d'optimiser le taux de cache
982du fait que la même URI sera toujours envoyée au même cache. Ce mot-clé n'est
983autorisé qu'en mode HTTP.
984
985Example :
986---------
987
988# Envoie toujours une URI donnée au même serveur
989
990 listen http_proxy
991 bind :3128
992 mode http
993 balance uri
994 server squid1 192.168.1.1
995 server squid2 192.168.1.2
996
willy tarreau0f7af912005-12-17 12:21:26 +0100997
willy tarreauc29948c2005-12-17 13:10:27 +01009983.1) Surveillance des serveurs
999------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001000Il est possible de tester l'état des serveurs par établissement de connexion
1001TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
1002utilisé dans le processus de répartition de charge interne. Pour activer la
1003surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
1004Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
1005tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
1006paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
1007Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreau34f45302006-04-15 21:37:14 +02001008
willy tarreaue47c8d72005-12-17 12:55:52 +01001009 - inter : 2000
1010 - rise : 2
1011 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +01001012 - port : port de connexion du serveur
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001013 - addr : adresse de connexion du serveur (par defaut: adresse du serveur)
1014
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001015Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001016certains cas de pannes, des serveurs peuvent continuer à accepter les
1017connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
1018d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
1019et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
1020les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
1021contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
1022RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
10231.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
1024possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
1025l'avantage d'être facilement extractibles des logs, et de ne pas induire
1026d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
1027considérées valides, les autres (y compris non-réponses) aboutissent à un
1028échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
1029deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
1030"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
1031accepte donc 4 formes :
willy tarreau34f45302006-04-15 21:37:14 +02001032
willy tarreaueedaa9f2005-12-17 14:08:03 +01001033 - option httpchk -> OPTIONS / HTTP/1.0
1034 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
1035 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
1036 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreau34f45302006-04-15 21:37:14 +02001037
Willy Tarreauf3c69202006-07-09 16:42:34 +02001038HAProxy est souvent utilisé pour relayer divers protocoles reposant sur TCP,
1039tels que HTTPS, SMTP ou LDAP, le plus commun étant HTTPS. Un problème assez
1040couramment rencontré dans les data centers est le besoin de relayer du trafic
1041vers des serveurs lointains tout en maintenant la possibilité de basculer sur
1042un serveur de secours. Les tests purement TCP ne suffisent pas toujours dans
1043ces situations car l'on trouve souvent, dans la chaîne, des proxies, firewalls
1044ou répartiteurs de charge qui peuvent acquitter la connexion avant qu'elle
1045n'atteigne le serveur. La seule solution à ce problème est d'envoyer des tests
1046applicatifs. Comme la demande pour les tests HTTPS est élevée, ce test a été
1047implémenté en version 1.2.15 sur la base de messages SSLv3 CLIENT HELLO. Pour
1048l'activer, utiliser "option ssl-hello-chk". Ceci enverra des messages SSLv3
1049CLIENT HELLO aux serveurs, en annonçant un support pour la majorité des
1050algorithmes de chiffrement. Si en retour, le serveur envoie ce qui ressemble à
1051une réponse SSLv3 SERVER HELLO ou ALERT (refus des algorithmes), alors la
1052réponse sera considérée comme valide. Noter qu'Apache ne produit pas de log
1053lorsqu'il reçoit des messages HELLO, ce qui en fait un type de message
1054parfaitement adapté à ce besoin.
1055
Willy Tarreau23677902007-05-08 23:50:35 +02001056La version 1.3.10 est accompagnée d'un nouveau test d'état pour le SMTP. Par
1057défaut, il consiste à envoyer "HELO localhost" aux serveurs, et à attendre le
1058message "250" en retour. Notez qu'il peut aussi envoyer une requête plus
1059spécifique :
1060
1061 - option smtpchk -> envoie "HELO localhost"
1062 - option smtpchk EHLO mail.mydomain.com -> envoie ce message ESMTP
1063
willy tarreauc5f73ed2005-12-18 01:26:38 +01001064Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001065
willy tarreau8337c6b2005-12-17 13:41:01 +01001066Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
1067utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
1068ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
1069de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
1070les 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 +01001071de répartition de charge entre des serveurs de secours par défaut. A partir
1072de la version 1.2.9, il est possible de les utiliser simultanément grâce à
1073l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
1074d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
1075de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
1076définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
1077qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +01001078
willy tarreaua41a8b42005-12-17 14:02:24 +01001079Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
1080vers un port différent de celui de service. C'est nécessaire principalement
1081pour les configurations où le serveur n'a pas de port prédéfini, par exemple
1082lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001083le paramètre 'port' suivi du numéro de port devant répondre aux requêtes. Il
1084est possible d'envoyer les tests de fonctionnement vers une adresse différente
1085de celle de service. Cela permet d'utiliser, sur la machine faisant fonctionner
1086HAproxy, un démon permettant des tests specifiques ( REGEX sur un résultat et
1087basculement de plusieurs fermes en cas d'erreur sur l'une d'elles).
willy tarreaua41a8b42005-12-17 14:02:24 +01001088
willy tarreau64a3cc32005-12-18 01:13:11 +01001089Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
1090l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
1091SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
1092envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
1093elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
1094local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +01001095
willy tarreau982249e2005-12-18 00:57:06 +01001096Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
1097logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
1098afin de notifier l'administrateur qu'il faut prendre une action immédiate.
1099
willy tarreau0174f312005-12-18 01:02:42 +01001100Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
1101même valeur de cookie. C'est particulièrement utile en mode backup, pour
1102sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
1103oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
1104temporairement vers une page d'erreur en attendant le redémarrage d'une
1105application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
1106le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
1107chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
1108le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
1109pour plus d'informations.
1110
willy tarreauc29948c2005-12-17 13:10:27 +01001111Exemples :
1112----------
willy tarreaua41a8b42005-12-17 14:02:24 +01001113# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001114 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001115 mode http
1116 cookie SERVERID
1117 balance roundrobin
1118 server web1 192.168.1.1:80 cookie server01 check
1119 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001120
willy tarreau2f6ba652005-12-17 13:57:42 +01001121# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001122 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001123 mode http
1124 cookie SERVERID
1125 balance roundrobin
1126 option httpchk
1127 server web1 192.168.1.1:80 cookie server01 check
1128 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +01001129
willy tarreau2f6ba652005-12-17 13:57:42 +01001130# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
1131 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001132 mode http
1133 cookie SERVERID
1134 balance roundrobin
1135 option httpchk /index.html
1136 server web1 192.168.1.1:80 cookie server01 check
1137 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +01001138
willy tarreaueedaa9f2005-12-17 14:08:03 +01001139# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1140 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001141 mode http
1142 cookie SERVERID
1143 balance roundrobin
1144 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1145 server web1 192.168.1.1:80 cookie server01 check
1146 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001147
willy tarreau0174f312005-12-18 01:02:42 +01001148# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1149# douceur utilisant un second port (81) juste pour les health-checks.
1150 listen http_proxy 0.0.0.0:80
1151 mode http
1152 cookie JSESSIONID prefix
1153 balance roundrobin
1154 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1155 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1156 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1157 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1158 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1159
willy tarreau96d40372005-12-17 13:11:56 +01001160# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001161# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1162# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +01001163 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001164 mode http
1165 cookie SERVERID insert nocache indirect
1166 balance roundrobin
1167 server web1 192.168.1.1:80 cookie server01 check
1168 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +01001169
willy tarreaueedaa9f2005-12-17 14:08:03 +01001170# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001171 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001172 mode http
1173 cookie SERVERID insert nocache indirect
1174 balance roundrobin
1175 server web1 192.168.1.1:80 cookie server01 check
1176 server web2 192.168.1.2:80 cookie server02 check
1177 server web-backup 192.168.2.1:80 cookie server03 check backup
1178 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001179
willy tarreaua41a8b42005-12-17 14:02:24 +01001180# relayage SMTP+TLS avec test du serveur et serveur de backup
1181
1182 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001183 mode tcp
1184 balance roundrobin
1185 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1186 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001187
Willy Tarreauf3c69202006-07-09 16:42:34 +02001188# relayage HTTPS avec test du serveur et serveur de backup
1189
1190 listen http_proxy :443
1191 mode tcp
1192 option ssl-hello-chk
1193 balance roundrobin
1194 server srv1 192.168.1.1 check inter 30000 rise 1 fall 2
1195 server srv2 192.168.1.2 backup
1196
Willy TARREAU3481c462006-03-01 22:37:57 +01001197# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1198 listen http_proxy 0.0.0.0:80
1199 mode http
1200 balance roundrobin
1201 option httpchk
1202 server inst1 192.168.1.1:80 cookie s1 check
1203 server inst2 192.168.1.2:80 cookie s2 check
1204 server inst3 192.168.1.3:80 cookie s3 check
1205 server back1 192.168.1.10:80 check backup
1206 server back2 192.168.1.11:80 check backup
1207 option allbackups # all backups will be used
1208
willy tarreau0f7af912005-12-17 12:21:26 +01001209
willy tarreauc29948c2005-12-17 13:10:27 +010012103.2) Reconnexion vers un répartiteur en cas d'échec direct
1211----------------------------------------------------------
1212En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1213seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1214définitivement privés de service. La spécification du paramètre 'redispatch'
1215autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1216(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001217
1218Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001219---------
willy tarreau0f7af912005-12-17 12:21:26 +01001220 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001221 mode http
1222 cookie SERVERID
1223 dispatch 192.168.1.100:80
1224 server web1 192.168.1.1:80 cookie server01
1225 server web2 192.168.1.2:80 cookie server02
1226 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001227
willy tarreau64a3cc32005-12-18 01:13:11 +01001228Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1229redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1230version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1231identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1232tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1233tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001234
1235 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001236 mode http
1237 option persist
1238 cookie SERVERID
1239 dispatch 192.168.1.100:80
1240 server web1 192.168.1.1:80 cookie server01
1241 server web2 192.168.1.2:80 cookie server02
1242 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001243
willy tarreauc29948c2005-12-17 13:10:27 +01001244
willy tarreau34f45302006-04-15 21:37:14 +020012453.3) Assignation de poids différents à des serveurs
1246---------------------------------------------------
1247Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1248d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1249que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1250soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1251raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1252plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1253plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1254la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1255une vue des serveurs disponibles la plus homogène possible en se basant sur
1256leur poids de sorte que la charge se distribue de la manière la plus lisse
1257possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
willy tarreau532bb552006-05-13 18:40:37 +02001258serveur par rapport aux autres. Le poids de 1 donne la fréquence d'apparition
1259la plus faible, et 256 la fréquence la plus élevée. De cette manière, si un
1260serveur disparait, les capacités restantes sont toujours respectées.
willy tarreau34f45302006-04-15 21:37:14 +02001261
1262
1263Exemple :
1264---------
1265# distribution équitable sur 2 opteron and un ancien pentium3
1266
1267 listen web_appl 0.0.0.0:80
1268 mode http
1269 cookie SERVERID insert nocache indirect
1270 balance roundrobin
1271 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1272 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1273 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1274 server web-backup1 192.168.2.1:80 cookie server04 check backup
1275 server web-excuse 192.168.3.1:80 check backup
1276
1277Notes :
1278-------
1279 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1280
1281 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1282 est plus propre d'utiliser les poids que de répliquer le même serveur
1283 plusieurs fois.
1284
1285 - les poids s'appliquent également aux serveurs de backup si l'option
1286 'allbackups' est positionnée.
1287
1288 - le poids s'applique aussi à la répartition selon la source
1289 ('balance source').
1290
1291 - quels que soient les poids, le premier serveur sera toujours assigné en
1292 premier. Cette règle facilite les diagnostics.
1293
1294 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1295 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1296 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1297
willy tarreau532bb552006-05-13 18:40:37 +02001298La distribution du trafic suivra exactement le séquencement suivant :
1299
1300 Request| 1 1 1 1
1301 number | 1 2 3 4 5 6 7 8 9 0 1 2 3
1302 --------+---------------------------
1303 p3-800 | X . . . . . . X . . . . .
1304 opt-20 | . X . X . X . . . X . X .
1305 opt-24 | . . X . X . X . X . X . X
1306
1307
13083.4) Limitation du nombre de sessions concurrentes par serveur
1309--------------------------------------------------------------
1310Certains serveurs web multi-processus tels qu'Apache souffrent dès qu'il y a
1311trop de sessions concurrentes, parce qu'il est très coûteux de faire
1312fonctionner des centaines ou des milliers de processus sur un système. Une
1313solution consiste à augmenter le nombre de serveurs et de répartir la charge
1314entre eux, mais cela pose un problème lorsque le but est uniquement de résister
1315à des pics de charge occasionnels.
1316
1317Pour résoudre ce problème, une nouvelle fonctionnalité a été implémentée dans
1318HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associée à une
1319file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
1320entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
1321de diminuer la valeur maxconn améliorera notablement les performances des
1322serveurs et diminuera les temps de réponse simplement parce que les serveurs
1323seront moins congestionnés.
1324
1325Quand une requête cherche à joindre n'importe quel serveur, le premier serveur
1326non saturé est utilisé, en respectant l'algorithme de répartition de charge. Si
1327tous les serveurs sont saturés, alors la requête sera mise dans la file
1328d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
1329toutes les requêtes précédentes auront été libérées et qu'un serveur aura été
1330libéré d'une connexion pour la traiter.
1331
1332Si une requête fait référence à un serveur en particulier (p.ex: hachage d'IP
1333source, ou persistance par cookie), et que ce server est saturé, alors la
1334requête sera mise dans la file d'attente dédiée à ce serveur. Cette file
1335d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
1336plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent déjà
1337que pour les nouveaux utilisateurs.
1338
1339Pour cela, les logs ont dû être enrichis pour indiquer le nombre de sessions
1340par serveur, la position de la requête dans les files d'attentes, et le temps
1341passé en file d'attente. Ceci aide considérablement à faire de la prévision de
1342capacité. Voir la section 'logs' plus bas pour plus d'informations.
1343
1344Exemple :
1345---------
1346 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1347 listen web_appl 0.0.0.0:80
1348 maxconn 10000
1349 mode http
1350 cookie SERVERID insert nocache indirect
1351 balance roundrobin
1352 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 maxconn 100 check
1353 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
1354 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
1355 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1356 server web-excuse 192.168.3.1:80 check backup
1357
willy tarreau8f635a42006-05-21 23:05:54 +02001358Cette option se montra si efficace pour réduire les temps de réponse des
1359serveurs que certains utilisateurs voulaient utiliser des valeurs trop basses
1360pour améliorer les performances de leurs serveurs. Seulement, ils n'étaient
1361alors plus en mesure de supporter de très fortes charges parce qu'il n'était
1362plus possible de les saturer. Pour cette raison, la version 1.2.14 a apporté la
1363limitation dynamique de connexions avec l'addition du paramètre "minconn".
1364Lorsque ce paramètre est associé à "maxconn", il active la limitation dynamique
1365basée sur la charge de l'instance. Le nombre maximal de sessions concurrentes
1366sur un serveur devient alors proportionnel au nombre de sessions de l'instance
1367par rapport à son 'maxconn'. Un minimum de <minconn> sessions sera toujours
1368permis quelle que soit la charge. Ceci assurera que les serveurs travailleront
1369au meilleur de leurs performances sous des charges normales, et qu'ils seront
1370tout de même capables de supporter de fortes pointes lorsque nécessaire. La
1371limite dynamique est calculée comme ceci :
1372
1373 srv.dyn_limit = max(srv.minconn, srv.maxconn * inst.sess / inst.maxconn)
1374
1375Exemple :
1376---------
1377 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1378 listen web_appl 0.0.0.0:80
1379 maxconn 10000
1380 mode http
1381 cookie SERVERID insert nocache indirect
1382 balance roundrobin
1383 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check
1384 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check
1385 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1386 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1387 server web-excuse 192.168.3.1:80 check backup
1388
1389Dans l'exemple ci-dessus, le serveur "pentium3-800' recevra au plus 100
1390connexions simultanées lorsque l'instance du proxy en atteindra 10000, et
1391recevra seulement 10 connexions simultanées tant que le proxy sera sous les 1000
1392sessions.
1393
willy tarreau532bb552006-05-13 18:40:37 +02001394Notes :
1395-------
1396 - la requête ne restera pas indéfiniment en file d'attente, elle est
1397 assujétie au paramètre 'contimeout', et si une requête ne peut pas
1398 sortir de la file avant ce time-out, soit parce que le serveur est
1399 saturé, soit parce qu'il y a trop de requêtes en file d'attente,
1400 alors elle expirera avec une erreur 503.
1401
willy tarreau8f635a42006-05-21 23:05:54 +02001402 - si seul <minconn> est spécifié, il a le même effet que <maxconn>
1403
willy tarreau532bb552006-05-13 18:40:37 +02001404 - positionner des valeurs trop basses pour 'maxconn' peut améliorer les
1405 performances mais aussi permettre à des utilisateurs trop lents de bloquer
1406 un serveur pour les autres utilisateurs.
1407
willy tarreau34f45302006-04-15 21:37:14 +02001408
willy tarreau8f635a42006-05-21 23:05:54 +020014093.5) Abandon des requêtes abortées
1410----------------------------------
1411En présence de très fortes charges, les serveurs mettront un certain temps à
1412répondre. La file d'attente du proxy se remplira, et les temps de réponse
1413suivront une croissance proportionnelle à la taille de file d'attente fois
1414le temps moyen de réponse par session. Lorsque les clients attendront plus de
1415quelques secondes, ils cliqueront souvent sur le bouton 'STOP' de leur
1416navigateur, laissant des requêtes inutiles en file d'attente et ralentissant
1417donc les autres utilisateurs.
1418
1419Comme il n'y a aucun moyen de distinguer un vrai clic sur STOP d'une simple
1420fermeture du canal de sortie sur le client (shutdown(SHUT_WR)), les agents HTTP
1421doivent être conservateurs et considérer que le client n'a probablement fermé
1422que le canal de sortie en attendant la réponse. Toutefois, ceci introduit des
1423risques de congestion lorsque beaucoup d'utilisateurs font de même, et s'avère
1424aujourd'hui complètement inutile car probablement aucun client ne referme la
1425session en attendant la réponse. Certains agents HTTP supportent ceci (Squid,
1426Apache, HAProxy), et d'autres ne le supportent pas (TUX, et la plupart des
1427répartiteurs de charge matériels). Donc la probabilité pour qu'une notification
1428de fermeture d'un canal d'entrée côté client représente un utilisateur cliquant
1429sur 'STOP' est proche de 100%, et il est vraiment tentant d'abandonner la
1430requête prématurément sans polluer les serveurs.
1431
1432Pour cette raison, une nouvelle option "abortonclose" a été introduite en
1433version 1.2.14. Par défaut (sans l'option), le comportement reste conforme à
1434HTTP. Mais lorsque l'option est spécifiée, une session dont le canal entrant
1435est fermé sera abortée si cela est possible, c'est à dire que la requête est
1436soit en file d'attente, soit en tentative de connexion. Ceci réduit
1437considérablement la longueur des files d'attentes et la charge sur les serveurs
1438saturés lorsque les utilisateurs sont tentés de cliquer sur 'STOP', ce qui à
1439son tour, réduit les temps de réponse pour les autres utilisateurs.
1440
1441Exemple :
1442---------
1443 listen web_appl 0.0.0.0:80
1444 maxconn 10000
1445 mode http
1446 cookie SERVERID insert nocache indirect
1447 balance roundrobin
1448 server web1 192.168.1.1:80 cookie s1 weight 10 maxconn 100 check
1449 server web2 192.168.1.2:80 cookie s2 weight 10 maxconn 100 check
1450 server web3 192.168.1.3:80 cookie s3 weight 10 maxconn 100 check
1451 server bck1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1452 option abortonclose
1453
1454
willy tarreauc29948c2005-12-17 13:10:27 +010014554) Fonctionnalités additionnelles
1456=================================
1457
1458D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
willy tarreau8f635a42006-05-21 23:05:54 +02001459principalement du mode transparent, de la journalisation des connexions, de la
1460réécriture des en-têtes, et du statut sous forme de page HTML.
1461
willy tarreau5cbea6f2005-12-17 12:48:26 +01001462
willy tarreau0174f312005-12-18 01:02:42 +010014634.1) Fonctionnalités réseau
1464---------------------------
14654.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001466---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001467En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1468routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1469pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001470destination de la session détournée. Le système doit permettre de rediriger les
1471paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001472
1473Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001474---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001475 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001476 mode http
1477 transparent
1478 cookie SERVERID
1479 server server01 192.168.1.1:80
1480 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001481
1482 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1483 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001484
willy tarreaua41a8b42005-12-17 14:02:24 +01001485Remarque :
1486----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001487Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1488adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1489d'une même adresse avec une même instance et sans utiliser directement le mode
1490transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001491
1492Exemple :
1493---------
1494 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001495 mode tcp
1496 server server01 192.168.1.1 check port 60000
1497 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001498
1499 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1500 -j REDIRECT --to-ports 65000
1501
willy tarreau0174f312005-12-18 01:02:42 +01001502
15034.1.2) Choix d'une adresse source par serveur
1504---------------------------------------------------
1505Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1506IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1507backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1508pour joindre le même serveur. C'est également utilisable pour faciliter une
1509répartition de charge selon l'adresse IP source pour des connexions sortantes.
1510Bien entendu, la même adresse est utilisée pour les health-checks.
1511
1512Exemple :
1513---------
1514 # utiliser une adresse particulière pour joindre les 2 serveur
1515 listen http_proxy 0.0.0.0:65000
1516 mode http
1517 balance roundrobin
1518 server server01 192.168.1.1:80 source 192.168.2.13
1519 server server02 192.168.1.2:80 source 192.168.2.13
1520
1521Exemple :
1522---------
1523 # utiliser une adresse particulière pour joindre chaque serveur
1524 listen http_proxy 0.0.0.0:65000
1525 mode http
1526 balance roundrobin
1527 server server01 192.168.1.1:80 source 192.168.1.1
1528 server server02 192.168.2.1:80 source 192.168.2.1
1529
1530Exemple :
1531---------
1532 # faire une répartition d'adresse sources pour joindre le même proxy à
1533 # travers deux liens WAN
1534 listen http_proxy 0.0.0.0:65000
1535 mode http
1536 balance roundrobin
1537 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1538 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1539
1540Exemple :
1541---------
1542 # forcer une connexion TCP à s'attacher à un port particulier
1543 listen http_proxy 0.0.0.0:2000
1544 mode tcp
1545 balance roundrobin
1546 server srv1 192.168.1.1:80 source 192.168.2.1:20
1547 server srv2 192.168.1.2:80 source 192.168.2.1:20
1548
willy tarreaub952e1d2005-12-18 01:31:20 +010015494.1.3) Maintien de session TCP (keep-alive)
1550-------------------------------------------
1551Avec la version 1.2.7, il devient possible d'activer le maintien de session
1552TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1553d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1554externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1555aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1556time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1557positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1558vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1559pour activer le maintien de session TCP :
1560
1561 option tcpka # active le keep-alive côté client et côté serveur
1562 option clitcpka # active le keep-alive côté client
1563 option srvtcpka # active le keep-alive côté serveur
1564
willy tarreau0f7af912005-12-17 12:21:26 +01001565
willy tarreauc29948c2005-12-17 13:10:27 +010015664.2) Journalisation des connexions
1567----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001568
1569L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1570Il fournit probablement le plus fin niveau d'information disponible pour un
1571tel outil, ce qui est très important pour les diagnostics en environnements
1572complexes. En standard, les informations journalisées incluent le port client,
1573les chronométrages des états TCP/HTTP, des états de session précis au moment de
1574la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1575trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1576arbitraires.
1577
1578Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1579transparence sur les problèmes rencontrés, à la fois internes et externes, et
1580il est possible d'envoyer les logs vers des serveurs différents en même temps
1581avec des niveaux de filtrage différents :
1582
1583 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1584 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1585 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1586 - activité par instance (connexions clients), aussi bien lors de leur
1587 établissement qu'à leur terminaison.
1588
1589La possibilité de distribuer différents niveaux de logs à différents serveurs
1590permet à plusieurs équipes de production d'intéragir et de corriger leurs
1591problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1592occasionnellement les erreurs système, pendant que l'équipe application
1593surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1594que l'équipe sécurité analyse l'activité en différé d'une heure.
1595
1596
willy tarreauc1cae632005-12-17 14:12:23 +010015974.2.1) Niveaux de log
1598---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001599Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1600détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1601source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001602la requête HTTP, le code de retour, la quantité de données transmises, et même
1603dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1604Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1605la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001606est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001607
willy tarreau8337c6b2005-12-17 13:41:01 +01001608 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1609 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001610ou
1611 log global
1612
1613Remarque :
1614----------
1615La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1616paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001617
1618Exemple :
1619---------
1620 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001621 mode http
1622 log 192.168.2.200 local3
1623 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001624
willy tarreauc1cae632005-12-17 14:12:23 +010016254.2.2) Format des logs
1626----------------------
1627Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1628de la session entre le client et le relais. En précisant l'option 'tcplog',
1629la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1630sur son état lors de la déconnexion, ainsi que le temps de connexion et la
willy tarreau532bb552006-05-13 18:40:37 +02001631durée totale de la session. Le nombre de sessions restantes après la
1632déconnexion est également indiqué (pour le serveur, l'instance et le process).
willy tarreauc1cae632005-12-17 14:12:23 +01001633
willy tarreauc5f73ed2005-12-18 01:26:38 +01001634Exemple de journalisation TCP :
1635-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001636 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001637 mode tcp
1638 option tcplog
1639 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001640
willy tarreau532bb552006-05-13 18:40:37 +02001641>>> 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 +01001642
willy tarreau532bb552006-05-13 18:40:37 +02001643 Champ Format / Description Exemple
1644
1645 1 nom_processus '[' pid ']:' haproxy[18989]:
1646 2 ip_client ':' port_client 127.0.0.1:34550
1647 3 '[' date ']' [15/Oct/2003:15:24:28]
1648 4 nom_instance relais-tcp
1649 5 nom_serveur Srv1
1650 6 temps_file '/' temps_connect '/' temps_total 0/0/5007
1651 7 octets lus 0
1652 8 etat_terminaison --
1653 9 conn_srv '/' conns_inst '/' conns_processus 1/1/1
1654 10 position en file d'attente srv '/' globale 0/0
willy tarreau982249e2005-12-18 00:57:06 +01001655
willy tarreauc1cae632005-12-17 14:12:23 +01001656Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1657notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1658surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1659les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1660ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1661(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001662
willy tarreauc5f73ed2005-12-18 01:26:38 +01001663Exemple de journalisation HTTP :
1664--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001665 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001666 mode http
1667 option httplog
1668 option dontlognull
1669 log 192.168.2.200 local3
1670
willy tarreau532bb552006-05-13 18:40:37 +02001671>>> 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 +01001672
1673Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001674
willy tarreau532bb552006-05-13 18:40:37 +02001675 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 +01001676
willy tarreau532bb552006-05-13 18:40:37 +02001677 Champ Format / Description Exemple
1678
1679 1 nom_processus '[' pid ']:' haproxy[18989]:
1680 2 ip_client ':' port_client 10.0.0.1:34552
1681 3 '[' date ']' [15/Oct/2003:15:26:31]
1682 4 nom_instance relais-http
1683 5 nom_serveur Srv1
1684 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt 3183/-1/-1/-1/11215
1685 7 Code_retour_HTTP 503
1686 8 octets lus 0
1687 9 cookies_requête_capturés -
1688 10 cookies_reponse_capturés -
1689 11 etat_terminaison SC--
1690 12 conns_srv '/' conns_inst '/' conns_processus 137/202/205
1691 13 position file serveur '/' globale 0/0
1692 14 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1693 15 '{' entetes_reponse_capturés '}' {}
1694 16 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001695
1696Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1697 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001698
1699Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1700de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1701Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001702la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1703tôt possible, c'est à dire juste avant que ne débutent les transferts de
1704données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1705de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001706traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1707représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001708
willy tarreau64a3cc32005-12-18 01:13:11 +01001709Afin d'éviter toute confusion avec les logs normaux, le temps total de
1710transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001711rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001712
1713Exemple :
1714---------
1715
1716 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001717 mode http
1718 option httplog
1719 option dontlognull
1720 option logasap
1721 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001722
willy tarreauc5f73ed2005-12-18 01:26:38 +01001723>>> 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 +01001724
1725
willy tarreauc1cae632005-12-17 14:12:23 +010017264.2.3) Chronométrage des événements
1727-----------------------------------
1728Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1729événements sont d'une très grande utilité. Tous les temps sont mesurés en
1730millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
willy tarreau532bb552006-05-13 18:40:37 +02001731la forme Tq/Tw/Tc/Tr/Tt :
willy tarreauc1cae632005-12-17 14:12:23 +01001732
1733 - Tq: temps total de réception de la requête HTTP de la part du client.
1734 C'est le temps qui s'est écoulé entre le moment où le client a établi
1735 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1736 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1737 que la requête complète n'a jamais été reçue.
1738
willy tarreau532bb552006-05-13 18:40:37 +02001739 - Tw: temps total passé dans les files d'attente avant d'obtenir une place
1740 vers un serveur. Ceci tient compte à la fois de la file d'attente globale
1741 et de celle du serveur, et dépend du nombre de requêtes dans la file et du
1742 temps nécessaire au serveur pour compléter les sessions précédentes. La
1743 valeur '-1' indique que la requête a été détruite avant d'atteindre une
1744 file.
1745
willy tarreauc1cae632005-12-17 14:12:23 +01001746 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1747 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1748 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1749 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1750 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1751 vers le serveur.
1752
1753 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001754 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001755 la connexion. Ca représente exactement le temps de traitement de la
1756 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001757 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001758
1759 - Tt: durée de vie totale de la session, entre le moment où la demande de
1760 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001761 refermée aux deux extrémités (client et serveur). La signification change
1762 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
willy tarreau532bb552006-05-13 18:40:37 +02001763 uniquement à (Tq + Tw + Tc + Tr), et se trouve préfixé d'un signe '+'. On
1764 peut donc déduire Td, le temps de transfert des données, en excluant les
1765 autres temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001766
willy tarreau532bb552006-05-13 18:40:37 +02001767 Td = Tt - (Tq + Tw + Tc + Tr)
willy tarreauc1cae632005-12-17 14:12:23 +01001768
1769 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1770
willy tarreau532bb552006-05-13 18:40:37 +02001771En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
willy tarreauc1cae632005-12-17 14:12:23 +01001772rapportés.
1773
1774Ces temps fournissent de précieux renseignement sur des causes probables de
1775problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1776de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1777de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1778problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1779valeur de time-out dans la configuration, c'est souvent qu'une session a été
1780abandonnée sur expiration d'un time-out.
1781
1782Cas les plus fréquents :
1783
1784 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1785 le client et le relais.
1786 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1787 le relais et le serveur durant la phase de connexion. Cet indicateur
1788 devrait normalement toujours être très bas (moins de quelques dizaines).
1789 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1790 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1791 de pertes entre le relais et le serveur.
1792 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1793 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1794 session est maintenue après la fin des échanges. Voir plus loin pour
1795 savoir comment désactiver le keep-alive HTTP.
1796
1797Autres cas ('xx' représentant une valeur quelconque à ignorer) :
willy tarreau532bb552006-05-13 18:40:37 +02001798 -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 +01001799 a refermé sa connexion sans compléter la requête.
willy tarreau532bb552006-05-13 18:40:37 +02001800 Tq/-1/xx/xx/Tt: Il n'était pas possible de traiter la request, probablement
1801 parce que tous les serveurs étaient hors d'usage.
1802 Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'établir vers le serveur (refus ou
1803 time-out au bout de Tt-(Tq+Tw) ms).
1804 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 +01001805 les temps ou bien a refermé sa connexion trop tôt, au bout
willy tarreau532bb552006-05-13 18:40:37 +02001806 de Tt-(Tq+Tw+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001807
18084.2.4) Conditions de déconnexion
1809--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001810Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1811le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1812un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1813une signification précise :
1814
1815 - sur le premier caractère, un code précisant le premier événement qui a causé
1816 la terminaison de la session :
1817
1818 C : fermeture inattendue de la session TCP de la part du client.
1819
1820 S : fermeture inattendue de la session TCP de la part du serveur, ou
1821 refus explicite de connexion de la part de ce dernier.
1822
1823 P : terminaison prématurée des sessions par le proxy, pour cause
1824 d'imposition d'une limite sur le nombre de connexions, pour cause
1825 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1826 sécurité a détecté et bloqué une anomalie dans la réponse du
1827 serveur qui aurait pu causer une fuite d'informations (par exemple,
1828 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001829
willy tarreauc5f73ed2005-12-18 01:26:38 +01001830 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1831 source, ...). Généralement, cela arrive au cours de l'établissement
1832 d'une connexion, et les logs système doivent contenir une copie de
1833 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001834
willy tarreauc5f73ed2005-12-18 01:26:38 +01001835 I : une erreur interne a été identifiée par le proxy à la suite d'un
1836 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1837 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001838
willy tarreauc5f73ed2005-12-18 01:26:38 +01001839 c : le délai maximal d'attente du client a expiré (clitimeout).
1840
1841 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1842
1843 - : terminaison normale de session.
1844
1845 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1846 la fermeture :
1847
1848 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1849 été transmis au serveur.
1850
willy tarreau532bb552006-05-13 18:40:37 +02001851 Q : attente en file d'attente (QUEUE) d'une place pour avoir une
1852 connexion vers un serveur. Ne peut apparaître que sur un serveur
1853 possédant un paramètre 'maxconn'. Aucune connexion n'a été envoyée
1854 au serveur.
1855
willy tarreauc5f73ed2005-12-18 01:26:38 +01001856 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1857 serveur peut au plus avoir vu la tentative de connexion, mais
1858 aucune donnée n'a été échangée.
1859
1860 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1861
1862 D : transfert des DONNEES du serveur vers le client.
1863
1864 L : transfert des dernières ("LAST") données du proxy vers le client,
1865 alors que le serveur a déjà fini.
1866
Willy Tarreau2272dc12006-09-03 10:19:38 +02001867 T : requête bloquée en mode "tarpit" par le proxy. Elle a été maintenue
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001868 ouverte vers le client pendant toute la durée du contimeout ou
1869 jusqu'à l'abandon de la part du client.
Willy Tarreau2272dc12006-09-03 10:19:38 +02001870
willy tarreauc5f73ed2005-12-18 01:26:38 +01001871 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001872
1873 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001874 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001875
willy tarreauc5f73ed2005-12-18 01:26:38 +01001876 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1877 cas sur les NOUVELLES connexions clients.
1878
1879 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1880 serveur connu. Ceci peut être dû à un changement de configuration
1881 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1882 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001883
willy tarreauc5f73ed2005-12-18 01:26:38 +01001884 D : le client a présenté un cookie correspondant à un serveur hors
1885 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1886 un autre serveur ou a tout de même tenté de se connecter sur celui
1887 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001888
willy tarreauc5f73ed2005-12-18 01:26:38 +01001889 V : le client a présenté un cookie VALIDE et a pu se connecter au
1890 serveur correspondant.
1891
1892 - : non appliquable (pas de cookie positionné dans la configuration).
1893
1894 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1895 persistence retrourné par le serveur (uniquement en mode HTTP) :
1896
1897 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1898 n'a été inséré.
1899
1900 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1901 proxy en a INSERE un.
1902
willy tarreau197e8ec2005-12-17 14:10:59 +01001903 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001904 tel quel ("PASSIF").
1905
1906 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1907
1908 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1909 ne pas être retourné au client.
1910
1911 - : non appliquable
1912
1913
1914La combinaison des deux premiers indicateurs fournit une grande quantitié
1915d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1916peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1917des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001918
willy tarreauc5f73ed2005-12-18 01:26:38 +01001919Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1920
1921 Indic Raison
1922 CR Le client a abandonné avant d'émettre une requête complète. Il est
1923 très probable que la requête ait été tapée à la main dans un client
1924 telnet et abortée trop tôt.
1925
1926 cR Le temps imparti au client a expiré avant réception d'une requête
1927 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1928 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1929 transporter des paquets entiers, ou par des clients qui énvoient des
1930 requêtes à la main et ne tapent pas assez vite.
1931
1932 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1933 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1934 être la couche réseau qui indique au proxy que le serveur n'est pas
1935 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1936
1937 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1938
1939 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1940 nombre de connexions a atteint la limite 'maxconn' (global ou de
1941 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1942 augmenté, tout comme le paramètre 'maxconn' global.
1943
1944 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1945 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1946 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1947 consiste à affiner le paramétrage système.
1948
1949 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1950 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1951 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1952 paquets entiers.
1953
willy tarreau078c79a2006-05-13 12:23:58 +02001954 CH Le client a abandonné alors qu'il attendait un début de réponse de la
1955 part du serveur. Cela peut être causé par le serveur qui mettait trop
1956 de temps à répondre, ou par un client cliquant précipitamment sur le
1957 bouton 'Stop'.
1958
1959 CQ Le client a abandonné alors que sa session était mise en file
1960 d'attente pour obtenir un serveur avec suffisamment de connexions
1961 libres pour l'accepter. Cela signifie soit que l'ensemble des
1962 serveurs étaient saturés, soit que le serveur assigné a mis trop de
1963 temps à répondre.
1964
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001965 CT Le client a abandonné alors que sa session était bloquée en mode
1966 tarpit.
1967
willy tarreau078c79a2006-05-13 12:23:58 +02001968 sQ La session a attendu trop longtemps en file d'attente et a été
1969 expirée.
1970
willy tarreauc5f73ed2005-12-18 01:26:38 +01001971 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
1972 en-têtes. En général, cela indique qu'il a crashé.
1973
1974 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
1975 des transactions trop longues, probablement causées par un back-end
1976 saturé. Les seules solutions sont de corriger le problème sur
1977 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
1978 des attentes plus longues au risque que les clients abandonnent à
1979 leur tour, ou bien d'ajouter des serveurs.
1980
1981 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
1982 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
1983 soit à cause d'une requête validant un filtre d'interdiction, auquel
1984 cas le proxy a renvoyé une erreur HTTP 403.
1985
1986 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
1987 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
1988 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
1989 renvoyée au client.
1990
Willy Tarreau2272dc12006-09-03 10:19:38 +02001991 PT Le proxy a bloqué une requête du client et a maintenu sa connection
1992 ouverte avant de lui retourner une erreur "500 server error". Rien
1993 n'a été envoyé au serveur.
1994
willy tarreauc5f73ed2005-12-18 01:26:38 +01001995 cD Le client n'a pas lu de données pendant le temps qui lui était
1996 imparti. Ceci est souvent causé par des problèmes réseau côté client.
1997
1998 CD Le client a aborté sa connection de manière inattendue pendant le
1999 transfert des données. Ceci est provoqué soit par le crash d'un
2000 navigateur, ou par une session en HTTP keep-alive entre le serveur
2001 et le client terminée en premier par le client.
2002
2003 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
2004 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
2005 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
2006 situés entre le proxy et le serveur.
2007
20084.2.5) Caractères non-imprimables
2009---------------------------------
2010Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
2011tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
2012hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
2013dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
2014caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
2015est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
2016les en-têtes.
2017
20184.2.6) Capture d'en-têtes HTTP et de cookies
2019--------------------------------------------
2020La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
2021capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
2022
2023Les captures de cookies facilitent le suivi et la reconstitution d'une session
2024utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01002025
2026 capture cookie <préfixe_cookie> len <longueur_capture>
2027
willy tarreauc5f73ed2005-12-18 01:26:38 +01002028Ceci activera la capture de cookies à la fois dans les requêtes et dans les
2029réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
2030bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
2031nouveau cookie.
2032
willy tarreau8337c6b2005-12-17 13:41:01 +01002033Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
2034transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
2035caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
2036le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
2037place dans les logs.
2038
2039Exemples :
2040----------
2041 # capture du premier cookie dont le nom commence par "ASPSESSION"
2042 capture cookie ASPSESSION len 32
2043
2044 # capture du premier cookie dont le nom est exactement "vgnvisitor"
2045 capture cookie vgnvisitor= len 32
2046
willy tarreau036e1ce2005-12-17 13:46:33 +01002047Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01002048positionné par le serveur, précédé du cookie positionné par le client. Chacun
2049de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01002050par le client ou le serveur, ou lorsque l'option est désactivée..
2051
2052Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
2053pour suivre un identifiant de requête globalement unique positionné par un
2054autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
2055de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
2056peut chercher des informations relatives à la longueur annoncée de la réponse,
2057le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
2058de redirection. Tout comme pour les captures de cookies, il est possible
2059d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
2060la suivante :
2061
2062 capture request header <nom> len <longueur max>
2063 capture response header <nom> len <longueur max>
2064
2065Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01002066
willy tarreauc5f73ed2005-12-18 01:26:38 +01002067Exemples:
2068---------
2069 # conserver le nom du serveur virtuel accédé par le client
2070 capture request header Host len 20
2071 # noter la longueur des données envoyées dans un POST
2072 capture request header Content-Length len 10
2073
2074 # noter le fonctionnement attendu du cache par le serveur
2075 capture response header Cache-Control len 8
2076 # noter l'URL de redirection
2077 capture response header Location len 20
2078
2079Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
2080fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
2081regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
2082chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
2083réponse sont présentés de la même manière, mais après un espace suivant le bloc
2084d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
2085
2086 Config:
2087
2088 capture request header Host len 20
2089 capture request header Content-Length len 10
2090 capture request header Referer len 20
2091 capture response header Server len 20
2092 capture response header Content-Length len 10
2093 capture response header Cache-Control len 8
2094 capture response header Via len 20
2095 capture response header Location len 20
2096
2097 Log :
2098
willy tarreau532bb552006-05-13 18:40:37 +02002099 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/"
2100 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"
2101 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 +01002102
21034.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01002104-----------------------
willy tarreau532bb552006-05-13 18:40:37 +02002105- 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 +01002106 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
2107 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01002108
willy tarreau532bb552006-05-13 18:40:37 +02002109- 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"
2110 => Idem, mais la requête a été mise en attente dans la file globale derrière
2111 9 autres requêtes déjà présentes, et y a attendu 1230 ms.
2112
2113- 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 +01002114 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
2115 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 +01002116 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 +01002117 total entre l'accept() et le premier octet de donnée est de 30 ms.
2118
willy tarreau532bb552006-05-13 18:40:37 +02002119- 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 +01002120 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
2121 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
2122 d'informations risquant d'être cachées. Dans ce cas, la réponse est
2123 remplacée par '502 bad gateway'.
2124
willy tarreau532bb552006-05-13 18:40:37 +02002125- 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 +01002126 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01002127 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01002128 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01002129
willy tarreau532bb552006-05-13 18:40:37 +02002130- 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 +01002131 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01002132 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01002133 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
2134 pu renvoyer un message 408 au client.
2135
willy tarreauc5f73ed2005-12-18 01:26:38 +01002136- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
2137 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
2138 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01002139
willy tarreau532bb552006-05-13 18:40:37 +02002140- 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 +01002141 => La requête client met 3s à entrer (peut-être un problème réseau), et la
2142 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreau532bb552006-05-13 18:40:37 +02002143 secondes (retries 3 dans la conf), puis un code 503 est retourné au
2144 client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
2145 instance, et 205 sur l'ensemble des instances pour ce processus. Il est
2146 possible que le serveur ait refusé la connexion parce qu'il y en avait
2147 déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01002148
willy tarreau4302f492005-12-18 01:00:37 +01002149
willy tarreauc5f73ed2005-12-18 01:26:38 +010021504.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01002151----------------------------------
2152En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
2153requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01002154possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
2155de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01002156connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
2157comme faisant partie des échanges de données consécutifs à la première requête.
2158Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01002159
2160La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01002161 reqadd <string> pour ajouter un en-tête dans la requête
2162 reqrep <search> <replace> pour modifier la requête
2163 reqirep <search> <replace> idem sans distinction majuscules/minuscules
2164 reqdel <search> pour supprimer un en-tête dans la requête
2165 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002166 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01002167 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002168 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01002169 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002170 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01002171 reqipass <search> idem sans distinction majuscules/minuscules
Willy Tarreau2272dc12006-09-03 10:19:38 +02002172 reqtarpit <search> bloquer et maintenir une request validant <search>
2173 reqitarpit <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002174
willy tarreau036e1ce2005-12-17 13:46:33 +01002175 rspadd <string> pour ajouter un en-tête dans la réponse
2176 rsprep <search> <replace> pour modifier la réponse
2177 rspirep <search> <replace> idem sans distinction majuscules/minuscules
2178 rspdel <search> pour supprimer un en-tête dans la réponse
2179 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01002180 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01002181 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01002182 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002183
willy tarreau0f7af912005-12-17 12:21:26 +01002184
willy tarreau036e1ce2005-12-17 13:46:33 +01002185<search> est une expression régulière compatible POSIX regexp supportant le
2186groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
2187doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
2188chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
2189backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01002190
2191 \t pour une tabulation
2192 \r pour un retour charriot
2193 \n pour un saut de ligne
2194 \ pour différencier un espace d'un séparateur
2195 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01002196 \\ pour utiliser un backslash dans la regex
2197 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01002198 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01002199
willy tarreau0f7af912005-12-17 12:21:26 +01002200
willy tarreau5cbea6f2005-12-17 12:48:26 +01002201<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
2202Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
2203groupe délimité par des parenthèses dans l'expression régulière, par sa
Willy Tarreau2272dc12006-09-03 10:19:38 +02002204position numérale. Les positions vont de 0 à 9, et sont codées par un '\'
2205suivi du chiffre désiré (0 désignant la ligne complète). Il est également
2206possible d'insérer un caractère non imprimable (utile pour le saut de ligne)
2207inscrivant '\x' suivi du code hexadécimal de ce caractère (comme en C).
willy tarreau5cbea6f2005-12-17 12:48:26 +01002208
2209<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01002210dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002211
2212Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01002213-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002214 - 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 +01002215 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002216 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
2217 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
2218 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01002219 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
2220 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
2221 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01002222 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01002223 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
2224 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
Willy Tarreau2272dc12006-09-03 10:19:38 +02002225 - une requête bloquée par 'reqtarpit' sera maintenue pendant une durée égale
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002226 au paramètre 'contimeout', ou jusqu'à l'abandon du client. Rien ne sera
2227 envoyé au serveur. Lorsque le temps alloué expire, le proxy répondra avec
2228 une réponse "500 server error" de sorte que l'attaquant ne suspecte pas
2229 qu'il ait été bloqué. Les logs rapporteront aussi ce code 500, mais les
2230 flags de terminaison indiqueront "PT".
willy tarreau0f7af912005-12-17 12:21:26 +01002231
2232Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01002233----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01002234 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01002235
willy tarreauc5f73ed2005-12-18 01:26:38 +01002236 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
2237 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
2238 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002239
willy tarreauc5f73ed2005-12-18 01:26:38 +01002240 # force proxy connections to close
2241 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
2242 # rewrite locations
2243 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002244
willy tarreauc5f73ed2005-12-18 01:26:38 +01002245 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01002246
willy tarreau197e8ec2005-12-17 14:10:59 +01002247 # Every header should end with a colon followed by one space.
2248 reqideny ^[^:\ ]*[\ ]*$
2249
2250 # block Apache chunk exploit
2251 reqideny ^Transfer-Encoding:[\ ]*chunked
2252 reqideny ^Host:\ apache-
2253
2254 # block annoying worms that fill the logs...
2255 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
2256 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
2257 reqideny ^[^:\ ]*\ .*<script
2258 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
2259
Willy Tarreau2272dc12006-09-03 10:19:38 +02002260 # tarpit attacks on the login page.
2261 reqtarpit ^[^:\ ]*\ .*\.php?login=[^0-9]
2262
willy tarreau197e8ec2005-12-17 14:10:59 +01002263 # allow other syntactically valid requests, and block any other method
2264 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
2265 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
2266 reqideny ^[^:\ ]*\
2267
2268 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01002269 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01002270
willy tarreauc5f73ed2005-12-18 01:26:38 +01002271 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01002272 rspidel ^Server:\
2273 rspadd Server:\ Formilux/0.1.8
2274
willy tarreau0f7af912005-12-17 12:21:26 +01002275
willy tarreau982249e2005-12-18 00:57:06 +01002276De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01002277'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002278connaître l'adresse IP du client initial. Depuis la version 1.3.8, il est
2279possible de préciser le mot-clé "except" suivi d'une adresse ou un réseau
2280IP source pour lequel l'entête ne sera pas ajouté. C'est très pratique dans le
2281cas où un autre reverse-proxy ajoutant déjà l'entête est installé sur la même
2282machine ou dans une DMZ connue. Le cas le plus fréquent est lié à l'utilisation
2283de stunnel en local.
willy tarreauc1cae632005-12-17 14:12:23 +01002284
willy tarreau982249e2005-12-18 00:57:06 +01002285Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01002286en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01002287Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
2288méthode impliquant 4 règles.
2289
willy tarreauc1cae632005-12-17 14:12:23 +01002290Exemple :
2291---------
2292 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002293 mode http
2294 log global
2295 option httplog
2296 option dontlognull
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002297 option forwardfor except 127.0.0.1/8
willy tarreauc5f73ed2005-12-18 01:26:38 +01002298 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01002299
Willy TARREAU767ba712006-03-01 22:40:50 +01002300Notons que certains serveurs HTTP ne referment pas nécessairement la session
2301TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
2302ce qui se traduit par des grands nombres de sessions établies et des temps
2303globaux très longs sur les requêtes. Pour contourner ce problème, la version
23041.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
2305vers le serveur dès qu'il commence à répondre et seulement si le tampon de
2306requête est vide. Attention toutefois à ne PAS utiliser cette option si des
2307méthodes CONNECT sont attendues entre le client et le serveur. L'option
2308'forceclose' implique l'option 'httpclose'.
2309
2310Exemple :
2311---------
2312 listen http_proxy 0.0.0.0:80
2313 mode http
2314 log global
2315 option httplog
2316 option dontlognull
2317 option forwardfor
2318 option forceclose
2319
2320
willy tarreauc29948c2005-12-17 13:10:27 +010023214.4) Répartition avec persistence
2322---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002323La combinaison de l'insertion de cookie avec la répartition de charge interne
2324permet d'assurer une persistence dans les sessions HTTP d'une manière
2325pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01002326 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01002327 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01002328 - insérer un cookie dans les réponses issues d'une répartition uniquement,
2329 et faire en sorte que des caches ne mémorisent pas ce cookie.
2330 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002331
2332Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01002333---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002334 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002335 mode http
2336 cookie SERVERID insert nocache indirect
2337 balance roundrobin
2338 server srv1 192.168.1.1:80 cookie server01 check
2339 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01002340
willy tarreau0174f312005-12-18 01:02:42 +01002341L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
2342cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
2343Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
2344client et le serveur de travailler en mode "keep-alive" afin que le proxy
2345puisse corriger le nom du cookie dans toutes les futures requêtes.
2346
2347 listen application 0.0.0.0:80
2348 mode http
2349 cookie JSESSIONID prefix
2350 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002351 server srv1 192.168.1.1:80 cookie srv1 check
2352 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002353 option httpclose
2354
2355
willy tarreau982249e2005-12-18 00:57:06 +010023564.5) Protection contre les fuites d'informations du serveur
2357-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002358Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002359créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002360'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2361un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2362activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002363 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002364 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002365 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002366 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002367 un en-tête 'Cache-control: public' ;
2368 - celles qui ont un en-tête 'Pragma: no-cache' ;
2369 - celles qui ont un en-tête 'Cache-control: private' ;
2370 - celles qui ont un en-tête 'Cache-control: no-store' ;
2371 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2372 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2373 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2374 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2375 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002376 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002377
willy tarreau982249e2005-12-18 00:57:06 +01002378Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2379même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2380message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2381dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002382en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002383l'administrateur sache qu'il y a une action correctrice à entreprendre.
2384
23854.6) Personalisation des erreurs
2386--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002387Certaines situations conduisent à retourner une erreur HTTP au client :
2388 - requête invalide ou trop longue => code HTTP 400
2389 - requête mettant trop de temps à venir => code HTTP 408
2390 - requête interdite (bloquée par un reqideny) => code HTTP 403
2391 - erreur interne du proxy => code HTTP 500
2392 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2393 - aucun serveur disponible pour cette requête => code HTTP 503
2394 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2395
2396Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2397Cependant, en fonction du type de clientèle, on peut préférer retourner des
willy tarreau64a3cc32005-12-18 01:13:11 +01002398pages personnalisées. Ceci est possible par le biais de la commande "errorloc":
willy tarreau8337c6b2005-12-17 13:41:01 +01002399
2400 errorloc <code_HTTP> <location>
2401
2402Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2403le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2404d'une page précisée dans <location>. Cette adresse peut être relative au site,
2405ou absolue. Comme cette réponse est traîtée par le navigateur du client
2406lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2407
2408Exemple :
2409---------
2410 listen application 0.0.0.0:80
2411 errorloc 400 /badrequest.html
2412 errorloc 403 /forbidden.html
2413 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002414 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002415 errorloc 502 http://192.168.114.58/error50x.html
2416 errorloc 503 http://192.168.114.58/error50x.html
2417 errorloc 504 http://192.168.114.58/error50x.html
2418
willy tarreauc1f47532005-12-18 01:08:26 +01002419Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2420accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2421problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2422régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2423dans le champ Location avec la méthode GET uniquement. Seulement, certains
2424navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2425plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2426devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002427l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2428visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002429
2430Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2431utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2432dès que vous savez que vos clients supportent le code de retour HTTP 303.
2433
willy tarreau982249e2005-12-18 00:57:06 +010024344.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002435--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002436Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2437évite de répéter des paramètres communs à toutes les instances, tels que les
2438timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002439
2440Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2441précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2442'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2443section implique une annulation de tous les paramètres par défaut positionnés
2444précédemment, dans le but de les remplacer.
2445
2446La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2447paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2448un commentaire en guise paramètre.
2449
willy tarreau982249e2005-12-18 00:57:06 +01002450Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2451positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002452 - log (le premier et le second)
2453 - mode { tcp, http, health }
2454 - balance { roundrobin }
2455 - disabled (pour désactiver toutes les instances qui suivent)
2456 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2457 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002458 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2459 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002460 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002461 - cookie, capture
2462 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002463
2464Ne sont pas supportés dans cette version, les adresses de dispatch et les
2465configurations de serveurs, ainsi que tous les filtres basés sur les
2466expressions régulières :
2467 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002468 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002469
2470Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2471positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2472défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2473paramètres par défaut avant la déclaration de l'instance.
2474
2475Exemples :
2476----------
2477 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002478 log global
2479 mode tcp
2480 balance roundrobin
2481 clitimeout 180000
2482 srvtimeout 180000
2483 contimeout 4000
2484 retries 3
2485 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002486
2487 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002488 server srv1 192.168.1.1 check port 6000 inter 10000
2489 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002490
2491 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002492 server srv1 192.168.2.1 check port 6000 inter 10000
2493 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002494
2495 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002496 log global
2497 mode http
2498 option httplog
2499 option forwardfor
2500 option dontlognull
2501 balance roundrobin
2502 clitimeout 20000
2503 srvtimeout 20000
2504 contimeout 4000
2505 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002506
2507 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002508 cookie SERVERID postonly insert indirect
2509 capture cookie userid= len 10
2510 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2511 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002512
2513 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002514 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002515
willy tarreau8f635a42006-05-21 23:05:54 +02002516
25174.8) Rapport d'état sous forme de page HTML
2518-------------------------------------------
2519Avec la version 1.2.14, il devient possible pour haproxy d'interceptre des
2520requêtes pour une URI particulière et de retourner un rapport complet d'état de
2521l'activité du proxy, et des statistiques sur les serveurs. Ceci est disponible
2522via le mot clé "stats" associé à n'importe laquelle de ces options :
2523
2524 - stats enable
2525 - stats uri <uri prefix>
2526 - stats realm <authentication realm>
2527 - stats auth <user:password>
2528 - stats scope <proxy_id> | '.'
2529
2530
2531Par défaut, le rapport est désactivé. Le fait de spécifier une des combinaision
2532ci-dessus active le rapport pour l'instance de proxy qui le référence. La
2533solution la plus simple est d'utiliser "stats enable" qui activera le rapport
2534avec les paramètres par défaut suivant :
2535
2536 - default URI : "/haproxy?stats" (CONFIG_STATS_DEFAULT_URI)
2537 - default auth : non spécifié (pas d'authentication)
2538 - default realm : "HAProxy Statistics" (CONFIG_STATS_DEFAULT_REALM)
2539 - default scope : non specifié (accès à toutes les instances)
2540
2541L'option "stats uri <uri_prefix>" permet d'intercepter un autre préfixe d'URI
2542que celui par défaut. Noter que n'importe quelle URI qui COMMENCE avec cette
2543chaîne sera validée. Par exemple, une instance pourrait être dédiée à la page
2544d'état seulement et répondre à toute URI.
2545
2546Example :
2547---------
2548 # intercepte n'importe quelle URI et retourne la page d'état.
2549 listen stats :8080
2550 mode http
2551 stats uri /
2552
2553
2554L'option "stats auth <user:password>" active l'authentification "Basic" et
2555ajoute un couple "user:password" valide à la liste des comptes autorisés.
2556L'utilisateur <user> et le mot de passe <password> doivent être précisés
2557en clair dans le fichier de configuration, et comme ceci est de
2558l'authentification HTTP "Basic", il faut être conscient qu'ils transitent en
2559clair sur le réseau, donc il ne faut pas utiliser de compte sensible. La liste
2560est illimitée dans le but de pouvoir fournir des accès facilement à des
2561développeurs ou à des clients.
2562
2563L'option "stats realm <realm>" définit le "domaine" ("realm") de validité du
2564mot de passe qui sera présenté dans la boîte de dialogue du navigateur
2565lorsqu'il demandera un compte utilisateur et un mot de passe. Il est important
2566de s'assurer que celui-ci soit différent de ceux utilisés par l'application,
2567autrement le navigateur tentera d'en utiliser un caché depuis l'application.
2568Noter que les espaces dans le nom de "realm" doivent être protégés par un
2569backslash ('\').
2570
2571L'option "stats scope <proxy_id>" limite la portée du rapport d'état. Par
2572défaut, toutes les instances proxy sont listées. Mais dans certaines
2573circonstances, il serait préférable de ne lister que certains proxies ou
2574simplement le proxy courant. C'est ce que fait cette option. Le nom spécial "."
2575(un simple point) référence le proxy courant. Cette option peut être répétée
2576autant de fois que nécessaire pour autoriser d'autres proxies, même pour des
2577noms référencés plus loin dans la configuration ou bien des noms qui n'existent
2578pas encore. Le nom précisé est celui qui apparait après le mot clé "listen".
2579
2580Exemple :
2581---------
2582 # simple application embarquant la page d'état authentifiée
2583 listen app1 192.168.1.100:80
2584 mode http
2585 option httpclose
2586 balance roundrobin
2587 cookie SERVERID postonly insert indirect
2588 server srv1 192.168.1.1:8080 cookie srv1 check inter 1000
2589 server srv1 192.168.1.2:8080 cookie srv2 check inter 1000
2590 stats uri /my_stats
2591 stats realm Statistics\ for\ MyApp1-2
2592 stats auth guest:guest
2593 stats auth admin:AdMiN123
2594 stats scope .
2595 stats scope app2
2596
2597 # simple application embarquant la page d'état sans authentification
2598 listen app2 192.168.2.100:80
2599 mode http
2600 option httpclose
2601 balance roundrobin
2602 cookie SERVERID postonly insert indirect
2603 server srv1 192.168.2.1:8080 cookie srv1 check inter 1000
2604 server srv1 192.168.2.2:8080 cookie srv2 check inter 1000
2605 stats uri /my_stats
2606 stats realm Statistics\ for\ MyApp2
2607 stats scope .
2608
2609 listen admin_page :8080
2610 mode http
2611 stats uri /my_stats
2612 stats realm Global\ statistics
2613 stats auth admin:AdMiN123
2614
2615Notes :
2616-------
2617 - les options "stats" peuvent aussi être spécifiées dans une section
2618 "defaults", auquel cas la même configuration exactement sera fournie à
2619 toutes les instances suivantes, d'où l'utilité du scope ".". Toutefois, si
2620 une instance redéfinit n'importe quel paramètre "stats", alors les défauts
2621 ne lui seront pas appliqués.
2622
2623 - l'authentification "Basic" est très simpliste et non sécurisée contre la
2624 capture réseau. Aucun mot de passe sensible ne doit être utilisé, et il
2625 est bon de savoir qu'il n'existe pas de moyen de le supprimer du navigateur
2626 après usage, donc il sera envoyé tel quel à l'application au cours des
2627 accès successifs.
2628
2629 - Il est très important de préciser l'option "httpclose", sinon le proxy ne
2630 sera pas en mesure de détecter les URI dans les sessions keep-alive
2631 maintenues entre le navigateur et les serveurs, donc les URI de stats
2632 seront transmises telles quelles aux serveurs comme si l'option n'était
2633 pas précisée.
2634
2635
Willy Tarreau726c2bf2007-05-09 01:31:45 +020026365) Listes d'accès
2637=================
2638
2639Avec la version 1.3.10, un nouveau concept de listes d'accès (ACL) a vu le
2640jour. Comme il n'était pas nécessaire de réinventer la roue, et du fait que
2641toutes les réflexions passées aboutissaient à des propositions non
2642satisfaisantes, il a finalement été décidé que quelque chose de proche de ce
2643que Squid offre serait un bon compromis entre une richesse fonctionnelle et une
2644facilité d'utilisation
2645
2646Le principe est très simple : les ACLs sont déclarées avec un nom, un test et
2647une liste de valeurs valides à tester. Des conditions sont appliquées sur
2648diverses actions, et ces conditions effectuent un ET logique entre les ACLs. La
2649condition n'est donc validée que si toutes les ACLs sont vraies.
2650
2651Il est également possible d'utiliser le mot réservé "OR" dans les conditions,
2652et il est possible pour une ACL d'être spécifiée plusieurs fois, même avec des
2653tests différents, auquel cas le premier test réussi validera l'ACL.
2654
2655Au stade de la version 1.3.10, seuls les tests suivants ont été implémentés :
2656
2657 Niveaux 3/4 :
2658 src <ipv4_address>[/mask] ... : match IPv4 source address
2659 dst <ipv4_address>[/mask] ... : match IPv4 destination address
2660 src_port <low>[:<high>] ... : match source port range
2661 dst_port <low>[:<high>] ... : match destination port range
2662 dst_limit <max> : true if frontend has less than <max> connections
2663
2664 Niveau 7 :
2665 method <HTTP method> ... : match HTTP method
2666 req_ver <1.0|1.1> ... : match HTTP request version
2667 resp_ver <1.0|1.1> ... : match HTTP response version
2668 status <low>[:<high>] ... : match HTTP response status code in range
2669 url <string> ... : exact string match on URI
2670 url_reg <regex> ... : regex string match on URI
2671 url_beg <string> ... : true if URI begins with <string>
2672 url_end <string> ... : true if URI ends with <string>
2673 url_sub <string> ... : true if URI contains <string>
2674 url_dir <string> ... : true if URI contains <string> between slashes
2675 url_dom <string> ... : true if URI contains <string> between slashes or dots
2676
2677D'autres tests arrivent (entêtes, cookies, heure, authentification), c'est
2678juste une question de temps. Il est aussi prévu de permettre de lire les
2679valeurs depuis un fichier, ainsi que d'ignorer la casse pour certains tests.
2680
2681La seule commande supportant les conditions d'ACL à ce jour est la nouvelle
2682commande "block" qui bloque une requête et retourne un statut 403 si sa
2683condition est validée (cas du "if") ou invalidée (cas du "unless").
2684
2685Exemple :
2686---------
2687
2688 acl options_uris url *
2689 acl meth_option method OPTIONS
2690 acl http_1.1 req_ver 1.1
2691 acl allowed_meth method GET HEAD POST OPTIONS CONNECT
2692 acl connect_meth method CONNECT
2693 acl proxy_url url_beg http://
2694
2695 # block if reserved URI "*" used with a method other than "OPTIONS"
2696 block if options_uris !meth_option
2697
2698 # block if the OPTIONS method is used with HTTP 1.0
2699 block if meth_option !http_1.1
2700
2701 # allow non-proxy url with anything but the CONNECT method
2702 block if !connect_meth !proxy_url
2703
2704 # block all unknown methods
2705 block unless allowed_meth
2706
2707Note: Cette documentation est embryonnaire mais doit permettre de démarrer et
2708surtout d'avancer sur le projet sans être trop ralenti par la documentation.
2709
2710
willy tarreaub719f002005-12-17 12:55:07 +01002711=======================
2712| Paramétrage système |
2713=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002714
2715Sous Linux 2.4
2716==============
2717
willy tarreaub719f002005-12-17 12:55:07 +01002718-- cut here --
2719#!/bin/sh
2720# set this to about 256/4M (16384 for 256M machine)
2721MAXFILES=16384
2722echo $MAXFILES > /proc/sys/fs/file-max
2723ulimit -n $MAXFILES
2724
2725if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002726 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002727fi
2728
2729if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002730 # 30 seconds for fin, 15 for time wait
2731 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2732 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2733 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2734 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002735fi
2736
willy tarreau0f7af912005-12-17 12:21:26 +01002737echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002738echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2739echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002740echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002741echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2742echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002743echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2744echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002745echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002746echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002747echo 0 > /proc/sys/net/ipv4/tcp_dsack
2748
2749# auto-tuned on 2.4
2750#echo 262143 > /proc/sys/net/core/rmem_max
2751#echo 262143 > /proc/sys/net/core/rmem_default
2752
2753echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2754echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2755
2756-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002757
willy tarreau197e8ec2005-12-17 14:10:59 +01002758Sous FreeBSD
2759============
2760
2761Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2762Clement Laforet <sheepkiller@cultdeadsheep.org>.
2763
2764Pour plus d'informations :
2765http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2766http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2767http://www.freshports.org/net/haproxy
2768
2769
willy tarreau0f7af912005-12-17 12:21:26 +01002770-- fin --