blob: df10eaeb99aec424b05f25c57f803e608ce5bf63 [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 tarreau64a3cc32005-12-18 01:13:11 +010059 -de désactive l'utilisation de epoll()
60 -dp désactive l'utilisation de poll()
willy tarreau34f45302006-04-15 21:37:14 +020061 -db désactive la mise en arrière-plan (utile pour débugger)
62 -m <megs> applique une limitation de <megs> Mo d'utilisation mémoire
willy tarreau0f7af912005-12-17 12:21:26 +010063
willy tarreau64a3cc32005-12-18 01:13:11 +010064Le nombre maximal de connexion simultanées par proxy est le paramètre par
65défaut pour les proxies pour lesquels ce paramètre n'est pas précisé dans le
66fichier de configuration. Il s'agit du paramètre 'maxconn' dans les sections
67'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010068
willy tarreau64a3cc32005-12-18 01:13:11 +010069Le nombre maximal total de connexions simultanées limite le nombre de
70connexions TCP utilisables à un instant donné par le processus, tous proxies
71confondus. Ce paramètre remplace le paramètre 'maxconn' de la section 'global'.
willy tarreaua1598082005-12-17 13:08:06 +010072
willy tarreauc29948c2005-12-17 13:10:27 +010073Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
willy tarreauc5f73ed2005-12-18 01:26:38 +010074mode, toutes les connexions, déconnexions, et tous les échanges d'en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +010075sont affichés.
76
willy tarreau34f45302006-04-15 21:37:14 +020077Pour debugger, l'option '-db' est très pratique car elle désactive
78temporairement le mode daemon et le mode multi-processus. Le service peut alors
79être arrêté par un simple appui sur Ctrl-C, sans avoir à modifier la
80configuration ni à activer le mode debug complet.
81
willy tarreauc29948c2005-12-17 13:10:27 +010082Les statistiques ne sont disponibles que si le programme a été compilé avec
83l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
willy tarreau8f635a42006-05-21 23:05:54 +020084d'utilité que lors de benchmarks par exemple, et sont amenées à disparaitre.
willy tarreauc29948c2005-12-17 13:10:27 +010085
willy tarreau532bb552006-05-13 18:40:37 +020086Les paramètres '-st' et '-sf' sont utilisés pour la reconfiguration à chaud.
87Voir la section à ce sujet.
willy tarreau0f7af912005-12-17 12:21:26 +010088
89============================
90| Fichier de configuration |
91============================
92
willy tarreauc29948c2005-12-17 13:10:27 +010093Structure
94=========
willy tarreau0f7af912005-12-17 12:21:26 +010095
willy tarreaua1598082005-12-17 13:08:06 +010096L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
willy tarreau64a3cc32005-12-18 01:13:11 +010097les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est
98pas précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +010099
100Le fichier de configuration est découpé en sections répérées par des mots clés
101tels que :
102
103 - 'global'
104 - 'listen'
willy tarreaua41a8b42005-12-17 14:02:24 +0100105 - 'defaults'
willy tarreaua1598082005-12-17 13:08:06 +0100106
107Tous les paramètres font référence à la section définie par le dernier mot clé
108reconnu.
109
110
willy tarreauc29948c2005-12-17 13:10:27 +01001111) Paramètres globaux
112=====================
willy tarreaua1598082005-12-17 13:08:06 +0100113
114Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
115proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
116supportés sont :
117
willy tarreau8337c6b2005-12-17 13:41:01 +0100118 - log <adresse> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100119 - maxconn <nombre>
120 - uid <identifiant>
121 - gid <identifiant>
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200122 - user <nom d'utilisateur>
123 - group <nom de groupe>
willy tarreaua1598082005-12-17 13:08:06 +0100124 - chroot <répertoire>
125 - nbproc <nombre>
126 - daemon
127 - debug
willy tarreau64a3cc32005-12-18 01:13:11 +0100128 - noepoll
129 - nopoll
willy tarreaua1598082005-12-17 13:08:06 +0100130 - quiet
willy tarreaufe2c5c12005-12-17 14:14:34 +0100131 - pidfile <fichier>
willy tarreauc5f73ed2005-12-18 01:26:38 +0100132 - ulimit-n <nombre>
133
willy tarreaua1598082005-12-17 13:08:06 +0100134
1351.1) Journalisation des événements
136----------------------------------
137La plupart des événements sont journalisés : démarrages, arrêts, disparition et
138apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
139syslog vers un ou deux serveurs. La syntaxe est la suivante :
140
willy tarreau8337c6b2005-12-17 13:41:01 +0100141 log <adresse_ip> <catégorie> [niveau_max]
willy tarreaua1598082005-12-17 13:08:06 +0100142
143Les connexions sont envoyées en niveau "info". Les démarrages de service et de
144serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
145arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreau64a3cc32005-12-18 01:13:11 +0100146bien pour les proxies que pour les serveurs testés par les proxies. Le
147paramètre optionnel <niveau_max> définit le niveau maximal de traces émises
148parmi les 8 valeurs suivantes :
willy tarreau8337c6b2005-12-17 13:41:01 +0100149 emerg, alert, crit, err, warning, notice, info, debug
150
willy tarreaueedaa9f2005-12-17 14:08:03 +0100151Par compatibilité avec les versions 1.1.16 et antérieures, la valeur par défaut
willy tarreau8337c6b2005-12-17 13:41:01 +0100152est "debug" si l'option n'est pas précisée.
willy tarreaua1598082005-12-17 13:08:06 +0100153
154Les catégories possibles sont :
155 kern, user, mail, daemon, auth, syslog, lpr, news,
156 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
157 local0, local1, local2, local3, local4, local5, local6, local7
158
willy tarreau036e1ce2005-12-17 13:46:33 +0100159Conformément à la RFC3164, les messages émis sont limités à 1024 caractères.
160
willy tarreaua1598082005-12-17 13:08:06 +0100161Exemple :
162---------
163 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100164 log 192.168.2.200 local3
165 log 127.0.0.1 local4 notice
willy tarreaua1598082005-12-17 13:08:06 +0100166
1671.2) limitation du nombre de connexions
168---------------------------------------
169Il est possible et conseillé de limiter le nombre global de connexions par
willy tarreauc5f73ed2005-12-18 01:26:38 +0100170processus à l'aide du mot clé global 'maxconn'. Les connexions sont comprises
171au sens 'acceptation de connexion', donc il faut s'attendre en règle général à
172avoir un peu plus du double de sessions TCP que le maximum de connexions fixé.
173C'est important pour fixer le paramètre 'ulimit -n' avant de lancer le proxy.
174Pour comptabiliser le nombre de sockets nécessaires, il faut prendre en compte
175ces paramètres :
176
willy tarreaua1598082005-12-17 13:08:06 +0100177 - 1 socket par connexion entrante
178 - 1 socket par connexion sortante
willy tarreaueedaa9f2005-12-17 14:08:03 +0100179 - 1 socket par couple adresse/port d'écoute par proxy
willy tarreaua1598082005-12-17 13:08:06 +0100180 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100181 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100182
willy tarreau64a3cc32005-12-18 01:13:11 +0100183Dans le cas où chaque proxy n'écoute que sur un couple adresse/port,
willy tarreauc5f73ed2005-12-18 01:26:38 +0100184positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
185(2 * maxconn + nbproxy + nbserveurs + 1). A partir des versions 1.1.32/1.2.6,
186il est possible de spécifier cette limite dans la configuration à l'aide du
187mot-clé global 'ulimit-n', à condition bien entendu que le proxy ait été
188démarré sous le compte root (ou avec des droits suffisants pour élever le
189nombre de descripteurs de fichiers). Cette solution met un terme au problème
190récurrent d'incertitude de l'adéquation entre les limites systèmes lors de la
191dernière relance du proxessus et les limites en nombre de connexions. Noter que
192cette limite s'applique par processus.
193
194Exemple :
195---------
196 global
197 maxconn 32000
198 ulimit-n 65536
199
willy tarreauc29948c2005-12-17 13:10:27 +0100200
2011.3) Diminution des privilèges
202------------------------------
203Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
204serait exploitée, il est possible de diminuer les privilèges du processus, et
willy tarreau8337c6b2005-12-17 13:41:01 +0100205de l'isoler dans un répertoire sans risque.
willy tarreaua1598082005-12-17 13:08:06 +0100206
willy tarreauc29948c2005-12-17 13:10:27 +0100207Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
208numérique d'utilisateur. La valeur 0, correspondant normalement au super-
209utilisateur, possède ici une signification particulière car elle indique que
210l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
211C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
212un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200213changer. Dans le cas où il ne serait pas possible de spécifier un identifiant
214numérique pour l'uid, il est possible de spécifier un nom d'utilisateur après
215le mot-clé 'user'. De la même manière, il est possible de préciser un nom de
216groupe après le mot-clé 'group'.
217
218Il est particulièrement déconseillé d'utiliser des comptes génériques tels que
219'nobody' car cette pratique revient à utiliser 'root' si d'autres processus
220utilisent les mêmes identifiants.
willy tarreauc29948c2005-12-17 13:10:27 +0100221
222Le paramètre 'chroot' autorise à changer la racine du processus une fois le
223programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
willy tarreau8337c6b2005-12-17 13:41:01 +0100224puissent remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
willy tarreaueedaa9f2005-12-17 14:08:03 +0100225généralement contournable sur certains OS (Linux, Solaris) pour peu que
226l'attaquant possède des droits 'root' et soit en mesure d'utiliser ou de créer
227un répertoire. Aussi, il est important d'utiliser un répertoire spécifique au
228service pour cet usage, et de ne pas mutualiser un même répertoire pour
229plusieurs services de nature différente. Pour rendre l'isolement plus robuste,
230il est conseillé d'utiliser un répertoire vide, sans aucun droit, et de changer
231l'uid du processus de sorte qu'il ne puisse rien faire dans ledit répertoire.
willy tarreauc29948c2005-12-17 13:10:27 +0100232
willy tarreau64a3cc32005-12-18 01:13:11 +0100233Remarque importante :
234---------------------
235Dans le cas où une telle faille serait mise en évidence, il est fort probable
236que les premières tentatives de son exploitation provoquent un arrêt du
willy tarreauc29948c2005-12-17 13:10:27 +0100237programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
willy tarreau64a3cc32005-12-18 01:13:11 +0100238encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur
239en environnement limité réduit les risques d'intrusion, il est parfois bien
240utile dans ces circonstances de connaître les conditions d'apparition du
241problème, via l'obtention d'un fichier 'core'. La plupart des systèmes, pour
242des raisons de sécurité, désactivent la génération du fichier 'core' après un
243changement d'identifiant pour le processus. Il faudra donc soit lancer le
244processus à partir d'un compte utilisateur aux droits réduits (mais ne pouvant
245pas effectuer le chroot), ou bien le faire en root sans réduction des droits
246(uid 0). Dans ce cas, le fichier se trouvera soit dans le répertoire de
247lancement, soit dans le répertoire spécifié après l'option 'chroot'. Ne pas
248oublier la commande suivante pour autoriser la génération du fichier avant de
249lancer le programme :
willy tarreauc29948c2005-12-17 13:10:27 +0100250
251# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100252
willy tarreauc29948c2005-12-17 13:10:27 +0100253Exemple :
254---------
255
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200256 # with uid/gid
willy tarreauc29948c2005-12-17 13:10:27 +0100257 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100258 uid 30000
259 gid 30000
260 chroot /var/chroot/haproxy
willy tarreauc29948c2005-12-17 13:10:27 +0100261
Willy Tarreau95c20ac2007-03-25 15:39:23 +0200262 # with user/group
263 global
264 user haproxy
265 group public
266 chroot /var/chroot/haproxy
267
268
willy tarreaufe2c5c12005-12-17 14:14:34 +01002691.4) Modes de fonctionnement
willy tarreauc29948c2005-12-17 13:10:27 +0100270----------------------------
271Le service peut fonctionner dans plusieurs modes :
272 - avant- / arrière-plan
273 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100274
willy tarreau64a3cc32005-12-18 01:13:11 +0100275Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne
276rend pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci
277dans un script de démarrage du système, sinon le système ne finirait pas son
willy tarreauc29948c2005-12-17 13:10:27 +0100278initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
279au processus appelant. C'est ce que fait l'option 'daemon' de la section
280'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100281
willy tarreau34f45302006-04-15 21:37:14 +0200282Le paramètre de ligne de commande '-db' inhibe les options globales 'daemon'
283et 'nbproc' pour faire fonctionner le processus en mode normal, avant-plan.
284
willy tarreauc29948c2005-12-17 13:10:27 +0100285Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
286standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
287logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
288Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100289
willy tarreauc29948c2005-12-17 13:10:27 +0100290Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
291problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
292entre les clients et les serveurs. Ce mode est incompatible avec les options
293'daemon' et 'quiet' pour des raisons de bon sens.
294
willy tarreaufe2c5c12005-12-17 14:14:34 +01002951.5) Accroissement de la capacité de traitement
willy tarreauc29948c2005-12-17 13:10:27 +0100296-----------------------------------------------
297Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
298processeur pour effectuer les tâches de relayage, même si les charges
299nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
300grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
301programme sait démarrer plusieurs processus se répartissant la charge de
302travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
303section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
willy tarreau4302f492005-12-18 01:00:37 +0100304qu'en mode 'daemon'. Un usage déjà rencontré pour ce paramètre fut de dépasser
305la limite de nombre de descripteurs de fichiers allouée par processus sous
306Solaris.
willy tarreauc29948c2005-12-17 13:10:27 +0100307
308Exemple :
309---------
310
311 global
willy tarreauc5f73ed2005-12-18 01:26:38 +0100312 daemon
313 quiet
314 nbproc 2
willy tarreauc29948c2005-12-17 13:10:27 +0100315
willy tarreaufe2c5c12005-12-17 14:14:34 +01003161.6) Simplification de la gestion des processus
317-----------------------------------------------
318Haproxy supporte dorénavant la notion de fichiers de pid (-> pidfiles). Si le
319paramètre '-p' de ligne de commande, ou l'option globale 'pidfile' sont suivis
320d'un nom de fichier, alors ce fichier sera supprimé puis recréé et contiendra
321le numéro de PID des processus fils, à raison d'un par ligne (valable
322uniquement en mode démon). Ce fichier n'est PAS relatif au cloisonnement chroot
323afin de rester compatible avec un répertoire protégé en lecture seule. Il
324appartiendra à l'utilisateur ayant lancé le processus, et disposera des droits
3250644.
326
327Exemple :
328---------
329
330 global
331 daemon
332 quiet
333 nbproc 2
334 pidfile /var/run/haproxy-private.pid
335
336 # pour stopper seulement ces processus parmi d'autres :
337 # kill $(</var/run/haproxy-private.pid)
338
willy tarreau34f45302006-04-15 21:37:14 +0200339 # pour recharger une configuration avec un impact minimal sur le service,
340 # et sans casser les sessions existantes :
341 # haproxy -f haproxy.cfg -p $(</var/run/haproxy-private.pid) -st $(</var/run/haproxy-private.pid)
willy tarreauc29948c2005-12-17 13:10:27 +0100342
willy tarreau64a3cc32005-12-18 01:13:11 +01003431.7) Mécanismes de traitements des événements
344---------------------------------------------
345A partir de la version 1.2.5, haproxy supporte les mécanismes poll() et
346epoll(). Sur les systems où select() est limité par FD_SETSIZE (comme Solaris),
347poll() peut être une alternative intéressante. Des tests de performance
348montrent que les performances de poll() ne décroissent pas aussi vite que le
349nombre de sockets augmente, ce qui en fait une solution sûre pour les fortes
350charges. Cela dit, Soalris utilise déjà poll() pour émuler select(), donc tant
351que le nombre de sockets ne dépasse pas FD_SETSIZE, poll() ne devrait pas
352apporter de performances supplémentaires. Sur les systèmes à base Linux
353incluant le patch epoll() (ou tous les Linux 2.6), haproxy utilisera epoll()
354qui est extrèmement rapide indépendamment du nombre de sockets. Les tests sur
355haproxy ont montré une performance constante de 1 à 40000 sessions simultanées.
356
357Haproxy utilisera epoll() lorsqu'il est disponible, et se repliera sur poll(),
358puis en dernier lieu sur select(). Cependant, si pour une raison quelconque il
359s'avérait nécessaire de désactiver epoll() ou poll() (p.ex: à cause d'un bug ou
360juste pour comparer les performances), deux nouvelles options globales ont été
361ajoutées dans ce but : 'noepoll' et 'nopoll'.
362
363Exemple :
364---------
365 global
366 # utiliser seulement select()
367 noepoll
368 nopoll
369
370Remarque :
371----------
372Dans le but d'assurer une portabilité maximale des configurations, ces options
373sont acceptées et ignorées si les mécanismes poll() ou epoll() n'ont pas été
374activés lors de la compilation.
375
376Afin de simplifier la résolution de problèmes, le paramètre '-de' en ligne de
377commande désactive epoll() et le paramètre '-dp' désactive poll(). Ils sont
378respectivement équivalents à 'noepoll' et 'nopoll'.
379
380
willy tarreauc29948c2005-12-17 13:10:27 +01003812) Définition d'un service en écoute
382====================================
383
384Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100385
willy tarreaua41a8b42005-12-17 14:02:24 +0100386 listen <nom_instance> [ <adresse_IP>:<plage_ports>[,...] ]
willy tarreau0f7af912005-12-17 12:21:26 +0100387
willy tarreauc29948c2005-12-17 13:10:27 +0100388- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
willy tarreau64a3cc32005-12-18 01:13:11 +0100389 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé.
390 Aucun test n'est effectué concernant l'unicité de ce nom, qui n'est pas
391 obligatoire, mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100392
willy tarreaua41a8b42005-12-17 14:02:24 +0100393- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses connexions.
394 L'absence d'adresse ainsi que l'adresse 0.0.0.0 signifient que les connexions
395 pourront s'effectuer sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100396
willy tarreaua41a8b42005-12-17 14:02:24 +0100397- <plage_ports> correspond soit à un port, soit à une plage de ports sur
398 lesquels le relais acceptera des connexions pour l'adresse IP spécifiée.
399 Cette plage peut être :
400 - soit un port numérique (ex: '80')
401 - soit une plage constituée de deux valeurs séparées par un tiret
402 (ex: '2000-2100') représentant les extrémités incluses dans la
403 plage.
404 Il faut faire attention à l'usage des plages, car chaque combinaison
405 <adresse_IP>:<port> consomme une socket, donc un descripteur de fichier.
406 Le couple <adresse_IP>:<port> doit être unique pour toutes les instances
407 d'une même machine. L'attachement à un port inférieur à 1024 nécessite un
willy tarreau64a3cc32005-12-18 01:13:11 +0100408 niveau de privilège particulier lors du lancement du programme
409 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100410
willy tarreaua41a8b42005-12-17 14:02:24 +0100411- le couple <adresse_IP>:<plage_ports> peut être répété indéfiniment pour
412 demander au relais d'écouter également sur d'autres adresses et/ou d'autres
413 plages de ports. Pour cela, il suffit de séparer les couples par une virgule.
414
415Exemples :
willy tarreau0f7af912005-12-17 12:21:26 +0100416---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100417 listen http_proxy :80
418 listen x11_proxy 127.0.0.1:6000-6009
419 listen smtp_proxy 127.0.0.1:25,127.0.0.1:587
420 listen ldap_proxy :389,:663
willy tarreau0f7af912005-12-17 12:21:26 +0100421
willy tarreaua41a8b42005-12-17 14:02:24 +0100422Si toutes les adresses ne tiennent pas sur une ligne, il est possible d'en
423rajouter à l'aide du mot clé 'bind'. Dans ce cas, il n'est même pas nécessaire
424de spécifier la première adresse sur la ligne listen, ce qui facilite parfois
425l'écriture de configurations :
426
427 bind [ <adresse_IP>:<plage_ports>[,...] ]
428
429Exemples :
430----------
431 listen http_proxy
432 bind :80,:443
willy tarreauc5f73ed2005-12-18 01:26:38 +0100433 bind 10.0.0.1:10080,10.0.0.1:10443
willy tarreau0f7af912005-12-17 12:21:26 +0100434
willy tarreauc29948c2005-12-17 13:10:27 +01004352.1) Inhibition d'un service
436----------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100437Un service peut être désactivé pour des besoins de maintenance, sans avoir à
willy tarreauc29948c2005-12-17 13:10:27 +0100438commenter toute une partie du fichier. Il suffit de positionner le mot clé
439"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100440
441 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100442 disabled
willy tarreau0f7af912005-12-17 12:21:26 +0100443
willy tarreaueedaa9f2005-12-17 14:08:03 +0100444Remarque: le mot clé 'enabled' permet de réactiver un service préalablement
willy tarreauc5f73ed2005-12-18 01:26:38 +0100445 désactivé par le mot clé 'disabled', par exemple à cause d'une
446 configuration par défaut.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100447
willy tarreauc29948c2005-12-17 13:10:27 +01004482.2) Mode de fonctionnement
449---------------------------
willy tarreaueedaa9f2005-12-17 14:08:03 +0100450Un service peut fonctionner dans trois modes différents :
willy tarreau0f7af912005-12-17 12:21:26 +0100451 - TCP
452 - HTTP
willy tarreau532bb552006-05-13 18:40:37 +0200453 - état de santé
willy tarreau0f7af912005-12-17 12:21:26 +0100454
455Mode TCP
456--------
willy tarreau64a3cc32005-12-18 01:13:11 +0100457Dans ce mode, le service relaye, dès leur établissement, les connexions TCP
458vers un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il
459s'agit simplement d'une association
460 source<adresse:port> -> destination<adresse:port>.
willy tarreauc29948c2005-12-17 13:10:27 +0100461Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100462
willy tarreauc29948c2005-12-17 13:10:27 +0100463Exemple :
464---------
willy tarreau0f7af912005-12-17 12:21:26 +0100465 listen smtp_proxy 0.0.0.0:25
willy tarreauc5f73ed2005-12-18 01:26:38 +0100466 mode tcp
willy tarreau0f7af912005-12-17 12:21:26 +0100467
468Mode HTTP
469---------
willy tarreauc29948c2005-12-17 13:10:27 +0100470Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
471serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
willy tarreauc5f73ed2005-12-18 01:26:38 +0100472décision. Les en-têtes HTTP sont analysés pour y trouver un éventuel cookie, et
willy tarreauc29948c2005-12-17 13:10:27 +0100473certains d'entre-eux peuvent être modifiés par le biais d'expressions
474régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
475relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100476
willy tarreauc29948c2005-12-17 13:10:27 +0100477Exemple :
478---------
willy tarreau0f7af912005-12-17 12:21:26 +0100479 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100480 mode http
willy tarreau0f7af912005-12-17 12:21:26 +0100481
482Mode supervision
483----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100484Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
485santé du service. Il se contente de retourner "OK" à tout client se connectant
486sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
willy tarreau197e8ec2005-12-17 14:10:59 +0100487déterminer quels sont les services utilisables. Si l'option 'httpchk' est
488activée, alors la réponse changera en 'HTTP/1.0 200 OK' pour satisfaire les
489attentes de composants sachant tester en HTTP. Pour activer ce mode, préciser
willy tarreauc29948c2005-12-17 13:10:27 +0100490le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100491
willy tarreauc29948c2005-12-17 13:10:27 +0100492Exemple :
493---------
willy tarreau197e8ec2005-12-17 14:10:59 +0100494 # réponse simple : 'OK'
willy tarreau0f7af912005-12-17 12:21:26 +0100495 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100496 mode health
willy tarreau0f7af912005-12-17 12:21:26 +0100497
willy tarreau197e8ec2005-12-17 14:10:59 +0100498 # réponse HTTP : 'HTTP/1.0 200 OK'
499 listen http_health_check 0.0.0.0:60001
willy tarreauc5f73ed2005-12-18 01:26:38 +0100500 mode health
501 option httpchk
willy tarreau197e8ec2005-12-17 14:10:59 +0100502
willy tarreau0f7af912005-12-17 12:21:26 +0100503
willy tarreau532bb552006-05-13 18:40:37 +02005042.2.1 Supervision
505-----------------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100506Les versions 1.1.32 et 1.2.6 apportent une nouvelle solution pour valider le
507bon fonctionnement du proxy sans perturber le service. Le mot-clé 'monitor-net'
508a été créé dans le butd de spécifier un réseau d'équipements qui ne PEUVENT PAS
509utiliser le service pour autre chose que des tests de fonctionnement. C'est
510particulièrement adapté aux proxies TCP, car cela empêche le proxy de relayer
511des établissements de connexion émis par un outil de surveillance.
512
513Lorsque c'est utilisé sur un proxy TCP, la connexion est acceptée puis refermée
514et rien n'est logué. C'est suffisant pour qu'un répartiteur de charge en amont
515détecte que le service est disponible.
516
517Lorsque c'est utilisé sur un proxy HTTP, la connexion est acceptée, rien n'est
518logué, puis la réponse suivante est envoyée et la session refermée :
519"HTTP/1.0 200 OK". C'est normalement suffisant pour qu'un répartiteur de charge
520HTTP en amont détecte le service comme opérationnel, aussi bien à travers des
521tests TCP que HTTP.
522
523Les proxies utilisant le mot-clé 'monitor-net' peuvent accessoirement se passer
524de l'option 'dontlognull', ce qui permettra de loguer les connexions vides
525émises depuis d'autres adresses que celles du réseau de tests.
526
527Exemple :
528---------
529
530 listen tse-proxy
531 bind :3389,:1494,:5900 # TSE, ICA and VNC at once.
532 mode tcp
533 balance roundrobin
534 server tse-farm 192.168.1.10
535 monitor-net 192.168.1.252/31 # L4 load-balancers on .252 and .253
536
537
Willy Tarreau1c47f852006-07-09 08:22:27 +0200538Lorsque le système effectuant les tests est situé derrière un proxy, le mot-clé
539'monitor-net' n'est pas utilisable du fait que haproxy verra toujours la même
540adresse pour le proxy. Pour pallier à cette limitation, la version 1.2.15 a
541apporté le mot-clé 'monitor-uri'. Il définit une URI qui ne sera ni retransmise
542ni logée, mais pour laquelle haproxy retournera immédiatement une réponse
543"HTTP/1.0 200 OK". Cela rend possibles les tests de validité d'une chaîne
544reverse-proxy->haproxy en une requête HTTP. Cela peut être utilisé pour valider
545une combinaision de stunnel+haproxy à l'aide de tests HTTPS par exemple. Bien
546entendu, ce mot-clé n'est valide qu'en mode HTTP, sinon il n'y a pas de notion
547d'URI. Noter que la méthode et la version HTTP sont simplement ignorées.
548
549Exemple :
550---------
551
552 listen stunnel_backend :8080
553 mode http
554 balance roundrobin
555 server web1 192.168.1.10:80 check
556 server web2 192.168.1.11:80 check
557 monitor-uri /haproxy_test
558
559
willy tarreauc29948c2005-12-17 13:10:27 +01005602.3) Limitation du nombre de connexions simultanées
561---------------------------------------------------
562Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
563connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
564d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
565limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100566
willy tarreauc29948c2005-12-17 13:10:27 +0100567Exemple :
568---------
569 listen tiny_server 0.0.0.0:80
570 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100571
572
willy tarreauc29948c2005-12-17 13:10:27 +01005732.4) Arrêt en douceur
574---------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100575Il est possible d'arrêter les services en douceur en envoyant un signal
willy tarreau22739ef2006-01-20 20:43:32 +0100576SIGUSR1 au processus relais. Tous les services seront alors mis en phase
willy tarreau64a3cc32005-12-18 01:13:11 +0100577d'arrêt, mais pourront continuer d'accepter des connexions pendant un temps
578défini par le paramètre 'grace' (en millisecondes). Cela permet par exemple,
579de faire savoir rapidement à un répartiteur de charge qu'il ne doit plus
580utiliser un relais, tout en continuant d'assurer le service le temps qu'il
581s'en rende compte.
582
583Remarque :
584----------
585Les connexions actives ne sont jamais cassées. Dans le pire des cas, il faudra
willy tarreau22739ef2006-01-20 20:43:32 +0100586attendre en plus leur expiration avant l'arrêt total du processus, ou bien tuer
587manuellement le processus par l'envoi d'un signal SIGTERM. La valeur par défaut
588du paramètre 'grace' est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100589
590Exemple :
591---------
willy tarreauc29948c2005-12-17 13:10:27 +0100592 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100593 # le service tournera encore 10 secondes après la demande d'arrêt
594 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100595 mode http
596 grace 10000
willy tarreau0f7af912005-12-17 12:21:26 +0100597
willy tarreauc29948c2005-12-17 13:10:27 +0100598 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100599 listen health_check 0.0.0.0:60000
willy tarreauc5f73ed2005-12-18 01:26:38 +0100600 mode health
601 grace 0
willy tarreau0f7af912005-12-17 12:21:26 +0100602
willy tarreau39df2dc2006-01-29 21:56:05 +0100603A partir de la version 1.2.8, un nouveau mécanisme de reconfiguration à chaud
willy tarreau22739ef2006-01-20 20:43:32 +0100604a été introduit. Il est désormais possible de mettre les proxies en "pause" en
605envoyant un signal SIGTTOU aux processus. Cela désactivera les sockets d'écoute
606sans casser les sessions existantes. Suite à cela, l'envoi d'un signal SIGTTIN
607réactivera les sockets d'écoute. Ceci est très pratique pour tenter de charger
608une nouvelle configuration ou même une nouvelle version de haproxy sans casser
609les connexions existantes. Si le rechargement s'effectue correctement, il ne
610reste plus qu'à envoyer un signal SIGUSR1 aux anciens processus, ce qui
611provoquera leur arrêt immédiat dès que leurs connexions seront terminées ; en
612revanche, si le rechargement échoue, il suffit d'envoyer un signal SIGTTIN pour
613remettre les ports en écoute et rétablir le service immédiatement. Veuillez
614noter que le paramètre 'grace' est ignoré pour le signal SIGTTOU ainsi que le
615signal SIGUSR1 une fois le processus en pause. Aussi, il peut s'avérer très
616utile de sauver le fichier de pid avant de démarrer une nouvelle instance.
617
willy tarreau34f45302006-04-15 21:37:14 +0200618Ce mécanisme est pleinement exploité à partir de la version 1.2.11 avec les
willy tarreau532bb552006-05-13 18:40:37 +0200619options '-st' et '-sf' (voir ci-dessous).
620
6212.4) Reconfiguration à chaud
622----------------------------
623Les paramètres '-st' et '-sf' sont utilisés pour informer des processus
624existants que la configuration va être rechargée. Ils recevront le signal
625SIGTTOU, leur demandant de libérer les ports en écoute afin que le nouveau
626processus puisse les prendre. Si quoi que ce soit se passe mal, le nouveau
627processus leur enverra un signal SIGTTIN pour leur indiquer qu'ils peuvent
628se remettre en écoute et continuer leur travail. En revanche, si la
629configuration se charge correctement, alors ils recevront un signal de demande
630de fin de travail en douceur (-sf), ou de terminaison immédiate (-st) qui
631coupera les sessions en cours. Un usage typique tel que celui-ci permet de
632recharger une configuration sans interruption de service :
633
634 # haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
635
willy tarreau0f7af912005-12-17 12:21:26 +0100636
willy tarreauc29948c2005-12-17 13:10:27 +01006372.5) Temps d'expiration des connexions
638--------------------------------------
639Il est possible de paramétrer certaines durées d'expiration au niveau des
640connexions TCP. Trois temps indépendants sont configurables et acceptent des
641valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
642session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100643
644 - temps d'attente d'une donnée de la part du client, ou de la
645 possibilité de lui envoyer des données : "clitimeout" :
646
willy tarreauc5f73ed2005-12-18 01:26:38 +0100647 # time-out client à 2mn30.
648 clitimeout 150000
willy tarreau0f7af912005-12-17 12:21:26 +0100649
650 - temps d'attente d'une donnée de la part du serveur, ou de la
651 possibilité de lui envoyer des données : "srvtimeout" :
652
willy tarreauc5f73ed2005-12-18 01:26:38 +0100653 # time-out serveur à 30s.
654 srvtimeout 30000
willy tarreau0f7af912005-12-17 12:21:26 +0100655
656 - temps d'attente de l'établissement d'une connexion vers un serveur
657 "contimeout" :
658
willy tarreauc29948c2005-12-17 13:10:27 +0100659 # on abandonne si la connexion n'est pas établie après 4 secondes
willy tarreauc5f73ed2005-12-18 01:26:38 +0100660 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100661
willy tarreauc29948c2005-12-17 13:10:27 +0100662Remarques :
663-----------
664 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
665 type "health".
666 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
willy tarreau64a3cc32005-12-18 01:13:11 +0100667 possible de perdre des paquets. Du fait que la première retransmission
668 TCP n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion
669 inférieur à 3 secondes ne permet pas de se rattraper sur la perte
670 de paquets car la session aura été abandonnée avant la première
671 retransmission. Une valeur de 4 secondes réduira considérablement
672 le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100673
willy tarreauc29948c2005-12-17 13:10:27 +01006742.6) Tentatives de reconnexion
675------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100676Lors d'un échec de connexion vers un serveur, il est possible de
677retenter (potentiellement vers un autre serveur, en cas de répartition
678de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100679abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100680
willy tarreauc29948c2005-12-17 13:10:27 +0100681Exemple :
682---------
willy tarreauc5f73ed2005-12-18 01:26:38 +0100683 # on essaie encore trois fois maxi
684 retries 3
willy tarreau0f7af912005-12-17 12:21:26 +0100685
willy tarreau34f45302006-04-15 21:37:14 +0200686Il est à noter que la tentative de reconnexion peut amener à utiliser un autre
687serveur si le premier a disparu entre deux tentatives de connexion.
688
willy tarreau0f7af912005-12-17 12:21:26 +0100689
willy tarreauc29948c2005-12-17 13:10:27 +01006902.7) Adresse du serveur
691-----------------------
692Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
693le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
694serveur d'assignation de cookie dans le cas où le service consiste à assurer
695uniquement une persistence HTTP, ou bien simplement au serveur destination dans
willy tarreaua41a8b42005-12-17 14:02:24 +0100696le cas de relayage TCP simple. Cet ancien mode ne permet pas de tester l'état
697du serveur distant, et il est maintenant recommandé d'utiliser de préférence
698le mode 'balance'.
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 envoie toutes les nouvelles connexions ici
703 dispatch 192.168.1.2:80
willy tarreau0f7af912005-12-17 12:21:26 +0100704
willy tarreauc29948c2005-12-17 13:10:27 +0100705Remarque :
706----------
707Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
708'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100709
willy tarreau0f7af912005-12-17 12:21:26 +0100710
willy tarreau240afa62005-12-17 13:14:35 +01007112.8) Adresse de sortie
712----------------------
willy tarreaua41a8b42005-12-17 14:02:24 +0100713Il est possible de forcer l'adresse utilisée pour établir les connexions vers
714les serveurs à l'aide du paramètre "source". Il est même possible de forcer le
715port, bien que cette fonctionnalité se limite à des usages très spécifiques.
716C'est particulièrement utile en cas d'adressage multiple, et plus généralement
willy tarreau64a3cc32005-12-18 01:13:11 +0100717pour permettre aux serveurs de trouver le chemin de retour dans des contextes
718de routage difficiles. Si l'adresse est '0.0.0.0' ou '*' ou vide, elle sera
719choisie librement par le systeme. Si le port est '0' ou vide, il sera choisi
720librement par le système. Il est à noter que depuis la version 1.1.18, les
721tests de bon fonctionnement des serveurs seront aussi effectués à partir de la
722source spécifiée par ce paramètre.
willy tarreau240afa62005-12-17 13:14:35 +0100723
724Exemples :
725----------
willy tarreaua41a8b42005-12-17 14:02:24 +0100726 listen http_proxy *:80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100727 # toutes les connexions prennent l'adresse 192.168.1.200
728 source 192.168.1.200:0
willy tarreau240afa62005-12-17 13:14:35 +0100729
willy tarreaua41a8b42005-12-17 14:02:24 +0100730 listen rlogin_proxy *:513
willy tarreauc5f73ed2005-12-18 01:26:38 +0100731 # utiliser l'adresse 192.168.1.200 et le port réservé 900
732 source 192.168.1.200:900
willy tarreau240afa62005-12-17 13:14:35 +0100733
734
7352.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100736--------------------------------
737En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
738vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
739par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100740
willy tarreauc29948c2005-12-17 13:10:27 +0100741Exemple :
742---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100743 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100744 mode http
745 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100746
willy tarreauc29948c2005-12-17 13:10:27 +0100747On peut modifier l'utilisation du cookie pour la rendre plus intelligente
748vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
749réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
750cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100751de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
752inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100753
754Exemples :
755----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100756
757Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100758dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
759directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100760
willy tarreauc5f73ed2005-12-18 01:26:38 +0100761 cookie SERVERID indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100762
willy tarreauc29948c2005-12-17 13:10:27 +0100763Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
764lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100765
willy tarreauc5f73ed2005-12-18 01:26:38 +0100766 cookie SERVERID rewrite
willy tarreau5cbea6f2005-12-17 12:48:26 +0100767
willy tarreau64a3cc32005-12-18 01:13:11 +0100768Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un
769accès en répartition de charge interne. Dans ce cas, il est souhaitable que
770tous les serveurs aient un cookie renseigné. Un serveur non assigné d'un cookie
willy tarreau8337c6b2005-12-17 13:41:01 +0100771retournera un cookie vide (cookie de suppression) :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100772
willy tarreauc5f73ed2005-12-18 01:26:38 +0100773 cookie SERVERID insert
willy tarreau5cbea6f2005-12-17 12:48:26 +0100774
willy tarreau0174f312005-12-18 01:02:42 +0100775Pour réutiliser un cookie applicatif et lui préfixer l'identifiant du serveur,
776puis le supprimer dans les requêtes suivantes, utiliser l'option 'prefix'. Elle
777permet d'insérer une instance de haproxy devant une application sans risquer
778d'incompatibilités dûes à des clients qui ne supporteraient pas d'apprendre
779plus d'un cookie :
780
781 cookie JSESSIONID prefix
782
willy tarreau240afa62005-12-17 13:14:35 +0100783Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
784ajouter le mot clé 'nocache' après 'insert' :
785
willy tarreauc5f73ed2005-12-18 01:26:38 +0100786 cookie SERVERID insert nocache
willy tarreau240afa62005-12-17 13:14:35 +0100787
willy tarreau64a3cc32005-12-18 01:13:11 +0100788Pour insérer un cookie seulement suite aux requêtes de type POST, ajouter le
789mot clé 'postonly' après 'insert' :
willy tarreaucd878942005-12-17 13:27:43 +0100790
willy tarreauc5f73ed2005-12-18 01:26:38 +0100791 cookie SERVERID insert postonly
willy tarreaucd878942005-12-17 13:27:43 +0100792
willy tarreau240afa62005-12-17 13:14:35 +0100793
willy tarreau96d40372005-12-17 13:11:56 +0100794Remarques :
795-----------
willy tarreau64a3cc32005-12-18 01:13:11 +0100796- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour
797 s'adapter à des applications générant déjà le cookie, avec un contenu
798 invalide. Il suffit pour cela de les spécifier sur la même ligne.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100799
willy tarreau96d40372005-12-17 13:11:56 +0100800- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
801 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
802 comprendre.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100803
willy tarreau240afa62005-12-17 13:14:35 +0100804- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
805 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
806 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
807 cookie de persistence inséré, donc provoquer des changements de serveurs pour
808 des clients partageant le même cache.
willy tarreaueedaa9f2005-12-17 14:08:03 +0100809
willy tarreau0174f312005-12-18 01:02:42 +0100810- le mode 'prefix' ne nécessite pas d'utiliser 'indirect', 'nocache', ni
811 'postonly', car tout comme le mode 'rewrite', il s'appuie sur un cookie
812 présenté par l'application qui est censée savoir à quel moment il peut
813 être émis sans risque. Toutefois, comme il nécessite de rectifier le cookie
814 présenté par le client dans chaque requête ultérieure, il est indispensable
815 de s'assurer que le client et le serveur communiqueront sans "keep-alive
816 HTTP". Dans le doute, il est recommandé d'utiliser l'option "httpclose".
817
willy tarreaucd878942005-12-17 13:27:43 +0100818- lorsque l'application est bien connue, et que les parties nécessitant de la
819 persistence sont systématiquement accédées par un formulaire en mode POST,
820 il est plus efficace encore de combiner le mot clé "postonly" avec "insert"
821 et "indirect", car la page d'accueil reste cachable, et c'est l'application
822 qui gère le 'cache-control'.
willy tarreau0f7af912005-12-17 12:21:26 +0100823
willy tarreau240afa62005-12-17 13:14:35 +01008242.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100825----------------------------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +0100826En mode HTTP, il est possible d'associer des valeurs de cookie à des serveurs
827par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100828
willy tarreau5cbea6f2005-12-17 12:48:26 +0100829 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100830
willy tarreauc29948c2005-12-17 13:10:27 +0100831- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
832 configuration et les logs.
833- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
834- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100835
836Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100837---------
willy tarreaua41a8b42005-12-17 14:02:24 +0100838 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100839 mode http
840 cookie SERVERID
841 dispatch 192.168.1.100:80
842 server web1 192.168.1.1:80 cookie server01
843 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100844
845Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100846-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100847
willy tarreaua41a8b42005-12-17 14:02:24 +01008483) Répartiteur de charge autonome
willy tarreauc29948c2005-12-17 13:10:27 +0100849=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100850
willy tarreauc29948c2005-12-17 13:10:27 +0100851Le relais peut effectuer lui-même la répartition de charge entre les différents
852serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
853cela, on précise le mot clé 'balance' dans la définition du service,
willy tarreau34f45302006-04-15 21:37:14 +0200854éventuellement suivi du nom d'un algorithme de répartition. Jusqu'à la version
8551.2.11, seul 'roundrobin' était géré, et c'est aussi la valeur implicite par
856défaut. Avec la version 1.2.12, le nouveau mot clé 'source' est apparu. Il est
857évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
willy tarreauc29948c2005-12-17 13:10:27 +0100858spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100859
860Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100861---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100862
willy tarreaua41a8b42005-12-17 14:02:24 +0100863 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100864 mode http
865 cookie SERVERID
866 balance roundrobin
867 server web1 192.168.1.1:80 cookie server01
868 server web2 192.168.1.2:80 cookie server02
willy tarreau5cbea6f2005-12-17 12:48:26 +0100869
willy tarreaua41a8b42005-12-17 14:02:24 +0100870Depuis la version 1.1.22, il est possible de déterminer automatiquement le port
871du serveur vers lequel sera envoyée la connexion, en fonction du port d'écoute
872sur lequel le client s'est connecté. En effet, il y a 4 possibilités pour le
873champ <port> de l'adresse serveur :
874
875 - non spécifié ou nul :
876 la connexion sera envoyée au serveur sur le même port que celui sur
877 lequel le relais a reçu la connexion.
878
879 - valeur numérique (seul cas supporté pour les versions antérieures) :
880 le serveur recevra la connexion sur le port désigné.
881
882 - valeur numérique précédée d'un signe '+' :
883 la connexion sera envoyée au serveur sur le même port que celui sur
884 lequel le relais a reçu la connexion, auquel on ajoute la valeur désignée.
885
886 - valeur numérique précédée d'un signe '-' :
887 la connexion sera envoyée au serveur sur le même port que celui sur
888 lequel le relais a reçu la connexion, duquel on soustrait la valeur
889 désignée.
890
891Exemples :
892----------
893
894# même que précédemment
895
896 listen http_proxy :80
willy tarreauc5f73ed2005-12-18 01:26:38 +0100897 mode http
898 cookie SERVERID
899 balance roundrobin
900 server web1 192.168.1.1 cookie server01
901 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100902
903# relayage simultané des ports 80 et 81 et 8080-8089
904
905 listen http_proxy :80,:81,:8080-8089
willy tarreauc5f73ed2005-12-18 01:26:38 +0100906 mode http
907 cookie SERVERID
908 balance roundrobin
909 server web1 192.168.1.1 cookie server01
910 server web2 192.168.1.2 cookie server02
willy tarreaua41a8b42005-12-17 14:02:24 +0100911
912# relayage TCP des ports 25, 389 et 663 vers les ports 1025, 1389 et 1663
913
914 listen http_proxy :25,:389,:663
willy tarreauc5f73ed2005-12-18 01:26:38 +0100915 mode tcp
916 balance roundrobin
917 server srv1 192.168.1.1:+1000
918 server srv2 192.168.1.2:+1000
willy tarreaua41a8b42005-12-17 14:02:24 +0100919
willy tarreau34f45302006-04-15 21:37:14 +0200920Comme indiqué précédemment, la version 1.2.12 apporta le nouveau mot clé
921'source'. Lorsque celui-ci est utilisé, l'adresse IP du client est hachée et
922distribuée de manière homogène parmi les serveurs disponibles, de sorte qu'une
923même adresse IP aille toujours sur le même serveur tant qu'il n'y a aucun
924changement dans le nombre de serveurs disponibles. Ceci peut être utilisé par
925exemple pour attacher le HTTP et le HTTPS sur un même serveur pour un même
926client. Cela peut également être utilisé pour améliorer la persistance
927lorsqu'une partie de la population des clients n'accepte pas les cookies. Dans
928ce cas, seuls ces derniers seront perturbés par la perte d'un serveur.
929
930NOTE: il est important de prendre en compte le fait que beaucoup d'internautes
931 naviguent à travers des fermes de proxies qui assignent des adresses IP
932 différentes à chaque requête. D'autres internautes utilisent des liens à
933 la demande et obtiennent une adresse IP différente à chaque connexion. De
934 ce fait, le paramètre 'source' doit être utilisé avec une extrème
935 précaution.
936
937Exemples :
938----------
939
940# assurer qu'une même adresse IP ira sur le même serveur pour tout service
941
942 listen http_proxy
943 bind :80,:443
944 mode http
945 balance source
946 server web1 192.168.1.1
947 server web2 192.168.1.2
948
949# améliorer la persistance par l'utilisation de la source en plus du cookie :
950
951 listen http_proxy :80
952 mode http
953 cookie SERVERID
954 balance source
955 server web1 192.168.1.1 cookie server01
956 server web2 192.168.1.2 cookie server02
957
willy tarreau0f7af912005-12-17 12:21:26 +0100958
willy tarreauc29948c2005-12-17 13:10:27 +01009593.1) Surveillance des serveurs
960------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +0100961Il est possible de tester l'état des serveurs par établissement de connexion
962TCP ou par envoi d'une requête HTTP. Un serveur hors d'usage ne sera pas
963utilisé dans le processus de répartition de charge interne. Pour activer la
964surveillance, ajouter le mot clé 'check' à la fin de la déclaration du serveur.
965Il est possible de spécifier l'intervalle (en millisecondes) séparant deux
966tests du serveur par le paramètre "inter", le nombre d'échecs acceptés par le
967paramètre "fall", et le nombre de succès avant reprise par le paramètre "rise".
968Les paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreau34f45302006-04-15 21:37:14 +0200969
willy tarreaue47c8d72005-12-17 12:55:52 +0100970 - inter : 2000
971 - rise : 2
972 - fall : 3
willy tarreaua41a8b42005-12-17 14:02:24 +0100973 - port : port de connexion du serveur
Willy Tarreau2ea3abb2007-03-25 16:45:16 +0200974 - addr : adresse de connexion du serveur (par defaut: adresse du serveur)
975
willy tarreaubc4e1fb2005-12-17 13:32:07 +0100976Le mode par défaut consiste à établir des connexions TCP uniquement. Dans
willy tarreau64a3cc32005-12-18 01:13:11 +0100977certains cas de pannes, des serveurs peuvent continuer à accepter les
978connexions sans les traiter. Depuis la version 1.1.16, haproxy est en mesure
979d'envoyer des requêtes HTTP courtes et très peu coûteuses. Les versions 1.1.16
980et 1.1.17 utilisent "OPTIONS / HTTP/1.0". Dans les versions 1.1.18 à 1.1.20,
981les requêtes ont été changées en "OPTIONS * HTTP/1.0" pour des raisons de
982contrôle d'accès aux ressources. Cependant, cette requête documentée dans la
983RFC2068 n'est pas comprise par tous les serveurs. Donc à partir de la version
9841.1.21, la requête par défaut est revenue à "OPTIONS / HTTP/1.0", mais il est
985possible de paramétrer la partie URI. Les requêtes OPTIONS présentent
986l'avantage d'être facilement extractibles des logs, et de ne pas induire
987d'accès aux fichiers côté serveur. Seules les réponses 2xx et 3xx sont
988considérées valides, les autres (y compris non-réponses) aboutissent à un
989échec. Le temps maximal imparti pour une réponse est égal à l'intervalle entre
990deux tests (paramètre "inter"). Pour activer ce mode, spécifier l'option
991"httpchk", éventuellement suivie d'une méthode et d'une URI. L'option "httpchk"
992accepte donc 4 formes :
willy tarreau34f45302006-04-15 21:37:14 +0200993
willy tarreaueedaa9f2005-12-17 14:08:03 +0100994 - option httpchk -> OPTIONS / HTTP/1.0
995 - option httpchk URI -> OPTIONS <URI> HTTP/1.0
996 - option httpchk METH URI -> <METH> <URI> HTTP/1.0
997 - option httpchk METH URI VER -> <METH> <URI> <VER>
willy tarreau34f45302006-04-15 21:37:14 +0200998
Willy Tarreauf3c69202006-07-09 16:42:34 +0200999HAProxy est souvent utilisé pour relayer divers protocoles reposant sur TCP,
1000tels que HTTPS, SMTP ou LDAP, le plus commun étant HTTPS. Un problème assez
1001couramment rencontré dans les data centers est le besoin de relayer du trafic
1002vers des serveurs lointains tout en maintenant la possibilité de basculer sur
1003un serveur de secours. Les tests purement TCP ne suffisent pas toujours dans
1004ces situations car l'on trouve souvent, dans la chaîne, des proxies, firewalls
1005ou répartiteurs de charge qui peuvent acquitter la connexion avant qu'elle
1006n'atteigne le serveur. La seule solution à ce problème est d'envoyer des tests
1007applicatifs. Comme la demande pour les tests HTTPS est élevée, ce test a été
1008implémenté en version 1.2.15 sur la base de messages SSLv3 CLIENT HELLO. Pour
1009l'activer, utiliser "option ssl-hello-chk". Ceci enverra des messages SSLv3
1010CLIENT HELLO aux serveurs, en annonçant un support pour la majorité des
1011algorithmes de chiffrement. Si en retour, le serveur envoie ce qui ressemble à
1012une réponse SSLv3 SERVER HELLO ou ALERT (refus des algorithmes), alors la
1013réponse sera considérée comme valide. Noter qu'Apache ne produit pas de log
1014lorsqu'il reçoit des messages HELLO, ce qui en fait un type de message
1015parfaitement adapté à ce besoin.
1016
willy tarreauc5f73ed2005-12-18 01:26:38 +01001017Voir les exemples ci-après.
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001018
willy tarreau8337c6b2005-12-17 13:41:01 +01001019Depuis la version 1.1.17, il est possible de définir des serveurs de secours,
1020utilisés uniquement lorsqu'aucun des autres serveurs ne fonctionne. Pour cela,
1021ajouter le mot clé "backup" sur la ligne de définition du serveur. Un serveur
1022de secours n'est appelé que lorsque tous les serveurs normaux, ainsi que tous
1023les 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 +01001024de répartition de charge entre des serveurs de secours par défaut. A partir
1025de la version 1.2.9, il est possible de les utiliser simultanément grâce à
1026l'option 'allbackups'. Ce type de serveurs peut servir à retourner des pages
1027d'indisponibilité de service. Dans ce cas, il est préférable de ne pas affecter
1028de cookie, afin que les clients qui le rencontrent n'y soient pas affectés
1029définitivement. Le fait de ne pas mettre de cookie envoie un cookie vide, ce
1030qui a pour effet de supprimer un éventuel cookie affecté précédemment.
willy tarreau8337c6b2005-12-17 13:41:01 +01001031
willy tarreaua41a8b42005-12-17 14:02:24 +01001032Depuis la version 1.1.22, il est possible d'envoyer les tests de fonctionnement
1033vers un port différent de celui de service. C'est nécessaire principalement
1034pour les configurations où le serveur n'a pas de port prédéfini, par exemple
1035lorsqu'il est déduit du port d'acceptation de la connexion. Pour cela, utiliser
Willy Tarreau2ea3abb2007-03-25 16:45:16 +02001036le paramètre 'port' suivi du numéro de port devant répondre aux requêtes. Il
1037est possible d'envoyer les tests de fonctionnement vers une adresse différente
1038de celle de service. Cela permet d'utiliser, sur la machine faisant fonctionner
1039HAproxy, un démon permettant des tests specifiques ( REGEX sur un résultat et
1040basculement de plusieurs fermes en cas d'erreur sur l'une d'elles).
willy tarreaua41a8b42005-12-17 14:02:24 +01001041
willy tarreau64a3cc32005-12-18 01:13:11 +01001042Enfin, depuis la version 1.1.17, il est possible de visualiser rapidement
1043l'état courant de tous les serveurs. Pour cela, il suffit d'envoyer un signal
1044SIGHUP au processus proxy. L'état de tous les serveurs de tous les proxies est
1045envoyé dans les logs en niveau "notice", ainsi que sur la sortie d'erreurs si
1046elle est active. C'est une bonne raison pour avoir au moins un serveur de logs
1047local en niveau notice.
willy tarreau8337c6b2005-12-17 13:41:01 +01001048
willy tarreau982249e2005-12-18 00:57:06 +01001049Depuis la version 1.1.18 (et 1.2.1), un message d'urgence est envoyé dans les
1050logs en niveau 'emerg' si tous les serveurs d'une même instance sont tombés,
1051afin de notifier l'administrateur qu'il faut prendre une action immédiate.
1052
willy tarreau0174f312005-12-18 01:02:42 +01001053Depuis les versions 1.1.30 et 1.2.3, plusieurs serveurs peuvent partager la
1054même valeur de cookie. C'est particulièrement utile en mode backup, pour
1055sélectionner des chemins alternatifs pour un serveur donné, pour mettre en
1056oeuvre l'arrêt en douceur d'un serveur, ou pour diriger les clients
1057temporairement vers une page d'erreur en attendant le redémarrage d'une
1058application. Le principe est que lorsqu'un serveur est détecté comme inopérant,
1059le proxy cherchera le prochain serveur possédant la même valeur de cookie pour
1060chaque client qui le demandera. S'il ne trouve pas de serveur normal, alors il
1061le cherchera parmi les serveurs de backup. Consulter le guide d'architecture
1062pour plus d'informations.
1063
willy tarreauc29948c2005-12-17 13:10:27 +01001064Exemples :
1065----------
willy tarreaua41a8b42005-12-17 14:02:24 +01001066# conf du paragraphe 3) avec surveillance TCP
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001067 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001068 mode http
1069 cookie SERVERID
1070 balance roundrobin
1071 server web1 192.168.1.1:80 cookie server01 check
1072 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaubc4e1fb2005-12-17 13:32:07 +01001073
willy tarreau2f6ba652005-12-17 13:57:42 +01001074# même que précédemment avec surveillance HTTP par 'OPTIONS / HTTP/1.0'
willy tarreau5cbea6f2005-12-17 12:48:26 +01001075 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001076 mode http
1077 cookie SERVERID
1078 balance roundrobin
1079 option httpchk
1080 server web1 192.168.1.1:80 cookie server01 check
1081 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +01001082
willy tarreau2f6ba652005-12-17 13:57:42 +01001083# même que précédemment avec surveillance HTTP par 'OPTIONS /index.html HTTP/1.0'
1084 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001085 mode http
1086 cookie SERVERID
1087 balance roundrobin
1088 option httpchk /index.html
1089 server web1 192.168.1.1:80 cookie server01 check
1090 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau2f6ba652005-12-17 13:57:42 +01001091
willy tarreaueedaa9f2005-12-17 14:08:03 +01001092# idem avec surveillance HTTP par 'HEAD /index.jsp? HTTP/1.1\r\nHost: www'
1093 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001094 mode http
1095 cookie SERVERID
1096 balance roundrobin
1097 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1098 server web1 192.168.1.1:80 cookie server01 check
1099 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreaueedaa9f2005-12-17 14:08:03 +01001100
willy tarreau0174f312005-12-18 01:02:42 +01001101# répartition avec persistence basée sur le préfixe de cookie, et arrêt en
1102# douceur utilisant un second port (81) juste pour les health-checks.
1103 listen http_proxy 0.0.0.0:80
1104 mode http
1105 cookie JSESSIONID prefix
1106 balance roundrobin
1107 option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ www
1108 server web1-norm 192.168.1.1:80 cookie s1 check port 81
1109 server web2-norm 192.168.1.2:80 cookie s2 check port 81
1110 server web1-stop 192.168.1.1:80 cookie s1 check port 80 backup
1111 server web2-stop 192.168.1.2:80 cookie s2 check port 80 backup
1112
willy tarreau96d40372005-12-17 13:11:56 +01001113# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +01001114# automatique dans la requête, tout en indiquant aux caches de ne pas garder
1115# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +01001116 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001117 mode http
1118 cookie SERVERID insert nocache indirect
1119 balance roundrobin
1120 server web1 192.168.1.1:80 cookie server01 check
1121 server web2 192.168.1.2:80 cookie server02 check
willy tarreau8337c6b2005-12-17 13:41:01 +01001122
willy tarreaueedaa9f2005-12-17 14:08:03 +01001123# idem avec serveur applicatif de secours sur autre site, et serveur de pages d'erreurs
willy tarreau8337c6b2005-12-17 13:41:01 +01001124 listen web_appl 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001125 mode http
1126 cookie SERVERID insert nocache indirect
1127 balance roundrobin
1128 server web1 192.168.1.1:80 cookie server01 check
1129 server web2 192.168.1.2:80 cookie server02 check
1130 server web-backup 192.168.2.1:80 cookie server03 check backup
1131 server web-excuse 192.168.3.1:80 check backup
willy tarreau5cbea6f2005-12-17 12:48:26 +01001132
willy tarreaua41a8b42005-12-17 14:02:24 +01001133# relayage SMTP+TLS avec test du serveur et serveur de backup
1134
1135 listen http_proxy :25,:587
willy tarreauc5f73ed2005-12-18 01:26:38 +01001136 mode tcp
1137 balance roundrobin
1138 server srv1 192.168.1.1 check port 25 inter 30000 rise 1 fall 2
1139 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01001140
Willy Tarreauf3c69202006-07-09 16:42:34 +02001141# relayage HTTPS avec test du serveur et serveur de backup
1142
1143 listen http_proxy :443
1144 mode tcp
1145 option ssl-hello-chk
1146 balance roundrobin
1147 server srv1 192.168.1.1 check inter 30000 rise 1 fall 2
1148 server srv2 192.168.1.2 backup
1149
Willy TARREAU3481c462006-03-01 22:37:57 +01001150# Utilisation d'un groupe de serveurs pour le backup (nécessite haproxy 1.2.9)
1151 listen http_proxy 0.0.0.0:80
1152 mode http
1153 balance roundrobin
1154 option httpchk
1155 server inst1 192.168.1.1:80 cookie s1 check
1156 server inst2 192.168.1.2:80 cookie s2 check
1157 server inst3 192.168.1.3:80 cookie s3 check
1158 server back1 192.168.1.10:80 check backup
1159 server back2 192.168.1.11:80 check backup
1160 option allbackups # all backups will be used
1161
willy tarreau0f7af912005-12-17 12:21:26 +01001162
willy tarreauc29948c2005-12-17 13:10:27 +010011633.2) Reconnexion vers un répartiteur en cas d'échec direct
1164----------------------------------------------------------
1165En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
1166seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
1167définitivement privés de service. La spécification du paramètre 'redispatch'
1168autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
1169(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +01001170
1171Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001172---------
willy tarreau0f7af912005-12-17 12:21:26 +01001173 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001174 mode http
1175 cookie SERVERID
1176 dispatch 192.168.1.100:80
1177 server web1 192.168.1.1:80 cookie server01
1178 server web2 192.168.1.2:80 cookie server02
1179 redispatch # renvoyer vers dispatch si refus de connexion.
willy tarreau8337c6b2005-12-17 13:41:01 +01001180
willy tarreau64a3cc32005-12-18 01:13:11 +01001181Par défaut (et dans les versions 1.1.16 et antérieures), le paramètre
1182redispatch ne s'applique qu'aux échecs de connexion au serveur. Depuis la
1183version 1.1.17, il s'applique aussi aux connexions destinées à des serveurs
1184identifiés comme hors d'usage par la surveillance. Si l'on souhaite malgré
1185tout qu'un client disposant d'un cookie correspondant à un serveur défectueux
1186tente de s'y connecter, il faut préciser l'option "persist" :
willy tarreau8337c6b2005-12-17 13:41:01 +01001187
1188 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001189 mode http
1190 option persist
1191 cookie SERVERID
1192 dispatch 192.168.1.100:80
1193 server web1 192.168.1.1:80 cookie server01
1194 server web2 192.168.1.2:80 cookie server02
1195 redispatch # renvoyer vers dispatch si serveur HS.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001196
willy tarreauc29948c2005-12-17 13:10:27 +01001197
willy tarreau34f45302006-04-15 21:37:14 +020011983.3) Assignation de poids différents à des serveurs
1199---------------------------------------------------
1200Parfois il arrive d'ajouter de nouveaux serveurs pour accroître la capacité
1201d'une ferme de serveur, mais le nouveau serveur est soit beaucoup plus petit
1202que les autres (dans le cas d'un ajout d'urgence de matériel de récupération),
1203soit plus puissant (lors d'un investissement dans du matériel neuf). Pour cette
1204raison, il semble parfois judicieux de pouvoir envoyer plus de clients vers les
1205plus gros serveurs. Jusqu'à la version 1.2.11, il était nécessaire de répliquer
1206plusieurs fois les définitions des serveurs pour augmenter leur poids. Depuis
1207la version 1.2.12, l'option 'weight' est disponible. HAProxy construit alors
1208une vue des serveurs disponibles la plus homogène possible en se basant sur
1209leur poids de sorte que la charge se distribue de la manière la plus lisse
1210possible. Le poids compris entre 1 et 256 doit refléter la capacité d'un
willy tarreau532bb552006-05-13 18:40:37 +02001211serveur par rapport aux autres. Le poids de 1 donne la fréquence d'apparition
1212la plus faible, et 256 la fréquence la plus élevée. De cette manière, si un
1213serveur disparait, les capacités restantes sont toujours respectées.
willy tarreau34f45302006-04-15 21:37:14 +02001214
1215
1216Exemple :
1217---------
1218# distribution équitable sur 2 opteron and un ancien pentium3
1219
1220 listen web_appl 0.0.0.0:80
1221 mode http
1222 cookie SERVERID insert nocache indirect
1223 balance roundrobin
1224 server pentium3-800 192.168.1.1:80 cookie server01 weight 8 check
1225 server opteron-2.0G 192.168.1.2:80 cookie server02 weight 20 check
1226 server opteron-2.4G 192.168.1.3:80 cookie server03 weight 24 check
1227 server web-backup1 192.168.2.1:80 cookie server04 check backup
1228 server web-excuse 192.168.3.1:80 check backup
1229
1230Notes :
1231-------
1232 - lorsque le poids n'est pas spécifié, la valeur par défaut est à 1
1233
1234 - le poids n'impacte pas les tests de fonctionnement (health checks), donc il
1235 est plus propre d'utiliser les poids que de répliquer le même serveur
1236 plusieurs fois.
1237
1238 - les poids s'appliquent également aux serveurs de backup si l'option
1239 'allbackups' est positionnée.
1240
1241 - le poids s'applique aussi à la répartition selon la source
1242 ('balance source').
1243
1244 - quels que soient les poids, le premier serveur sera toujours assigné en
1245 premier. Cette règle facilite les diagnostics.
1246
1247 - pour les puristes, l'algorithme de calculation de la vue des serveurs donne
1248 une priorité aux premiers serveurs, donc la vue est la plus uniforme si les
1249 serveurs sont déclarés dans l'ordre croissant de leurs poids.
1250
willy tarreau532bb552006-05-13 18:40:37 +02001251La distribution du trafic suivra exactement le séquencement suivant :
1252
1253 Request| 1 1 1 1
1254 number | 1 2 3 4 5 6 7 8 9 0 1 2 3
1255 --------+---------------------------
1256 p3-800 | X . . . . . . X . . . . .
1257 opt-20 | . X . X . X . . . X . X .
1258 opt-24 | . . X . X . X . X . X . X
1259
1260
12613.4) Limitation du nombre de sessions concurrentes par serveur
1262--------------------------------------------------------------
1263Certains serveurs web multi-processus tels qu'Apache souffrent dès qu'il y a
1264trop de sessions concurrentes, parce qu'il est très coûteux de faire
1265fonctionner des centaines ou des milliers de processus sur un système. Une
1266solution consiste à augmenter le nombre de serveurs et de répartir la charge
1267entre eux, mais cela pose un problème lorsque le but est uniquement de résister
1268à des pics de charge occasionnels.
1269
1270Pour résoudre ce problème, une nouvelle fonctionnalité a été implémentée dans
1271HAProxy 1.2.13. Il s'agit d'une limite "maxconn" par serveur, associée à une
1272file d'attente par serveur et par proxy. Ceci transforme HAProxy en un tampon
1273entre des milliers de clients et quelques serveurs. Dans bien des cas, le fait
1274de diminuer la valeur maxconn améliorera notablement les performances des
1275serveurs et diminuera les temps de réponse simplement parce que les serveurs
1276seront moins congestionnés.
1277
1278Quand une requête cherche à joindre n'importe quel serveur, le premier serveur
1279non saturé est utilisé, en respectant l'algorithme de répartition de charge. Si
1280tous les serveurs sont saturés, alors la requête sera mise dans la file
1281d'attente globale de l'instance. Elle sortira de cette file d'attente lorsque
1282toutes les requêtes précédentes auront été libérées et qu'un serveur aura été
1283libéré d'une connexion pour la traiter.
1284
1285Si une requête fait référence à un serveur en particulier (p.ex: hachage d'IP
1286source, ou persistance par cookie), et que ce server est saturé, alors la
1287requête sera mise dans la file d'attente dédiée à ce serveur. Cette file
1288d'attente est prioritaire sur la file d'attente globale, de sorte qu'il soit
1289plus facile d'atteindre le site pour les utilisateurs qui s'y trouvent déjà
1290que pour les nouveaux utilisateurs.
1291
1292Pour cela, les logs ont dû être enrichis pour indiquer le nombre de sessions
1293par serveur, la position de la requête dans les files d'attentes, et le temps
1294passé en file d'attente. Ceci aide considérablement à faire de la prévision de
1295capacité. Voir la section 'logs' plus bas pour plus d'informations.
1296
1297Exemple :
1298---------
1299 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1300 listen web_appl 0.0.0.0:80
1301 maxconn 10000
1302 mode http
1303 cookie SERVERID insert nocache indirect
1304 balance roundrobin
1305 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 maxconn 100 check
1306 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 maxconn 300 check
1307 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 maxconn 300 check
1308 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1309 server web-excuse 192.168.3.1:80 check backup
1310
willy tarreau8f635a42006-05-21 23:05:54 +02001311Cette option se montra si efficace pour réduire les temps de réponse des
1312serveurs que certains utilisateurs voulaient utiliser des valeurs trop basses
1313pour améliorer les performances de leurs serveurs. Seulement, ils n'étaient
1314alors plus en mesure de supporter de très fortes charges parce qu'il n'était
1315plus possible de les saturer. Pour cette raison, la version 1.2.14 a apporté la
1316limitation dynamique de connexions avec l'addition du paramètre "minconn".
1317Lorsque ce paramètre est associé à "maxconn", il active la limitation dynamique
1318basée sur la charge de l'instance. Le nombre maximal de sessions concurrentes
1319sur un serveur devient alors proportionnel au nombre de sessions de l'instance
1320par rapport à son 'maxconn'. Un minimum de <minconn> sessions sera toujours
1321permis quelle que soit la charge. Ceci assurera que les serveurs travailleront
1322au meilleur de leurs performances sous des charges normales, et qu'ils seront
1323tout de même capables de supporter de fortes pointes lorsque nécessaire. La
1324limite dynamique est calculée comme ceci :
1325
1326 srv.dyn_limit = max(srv.minconn, srv.maxconn * inst.sess / inst.maxconn)
1327
1328Exemple :
1329---------
1330 # Prendre soin du P3 qui n'a que 256 Mo de RAM.
1331 listen web_appl 0.0.0.0:80
1332 maxconn 10000
1333 mode http
1334 cookie SERVERID insert nocache indirect
1335 balance roundrobin
1336 server pentium3-800 192.168.1.1:80 cookie s1 weight 8 minconn 10 maxconn 100 check
1337 server opteron-2.0G 192.168.1.2:80 cookie s2 weight 20 minconn 30 maxconn 300 check
1338 server opteron-2.4G 192.168.1.3:80 cookie s3 weight 24 minconn 30 maxconn 300 check
1339 server web-backup1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1340 server web-excuse 192.168.3.1:80 check backup
1341
1342Dans l'exemple ci-dessus, le serveur "pentium3-800' recevra au plus 100
1343connexions simultanées lorsque l'instance du proxy en atteindra 10000, et
1344recevra seulement 10 connexions simultanées tant que le proxy sera sous les 1000
1345sessions.
1346
willy tarreau532bb552006-05-13 18:40:37 +02001347Notes :
1348-------
1349 - la requête ne restera pas indéfiniment en file d'attente, elle est
1350 assujétie au paramètre 'contimeout', et si une requête ne peut pas
1351 sortir de la file avant ce time-out, soit parce que le serveur est
1352 saturé, soit parce qu'il y a trop de requêtes en file d'attente,
1353 alors elle expirera avec une erreur 503.
1354
willy tarreau8f635a42006-05-21 23:05:54 +02001355 - si seul <minconn> est spécifié, il a le même effet que <maxconn>
1356
willy tarreau532bb552006-05-13 18:40:37 +02001357 - positionner des valeurs trop basses pour 'maxconn' peut améliorer les
1358 performances mais aussi permettre à des utilisateurs trop lents de bloquer
1359 un serveur pour les autres utilisateurs.
1360
willy tarreau34f45302006-04-15 21:37:14 +02001361
willy tarreau8f635a42006-05-21 23:05:54 +020013623.5) Abandon des requêtes abortées
1363----------------------------------
1364En présence de très fortes charges, les serveurs mettront un certain temps à
1365répondre. La file d'attente du proxy se remplira, et les temps de réponse
1366suivront une croissance proportionnelle à la taille de file d'attente fois
1367le temps moyen de réponse par session. Lorsque les clients attendront plus de
1368quelques secondes, ils cliqueront souvent sur le bouton 'STOP' de leur
1369navigateur, laissant des requêtes inutiles en file d'attente et ralentissant
1370donc les autres utilisateurs.
1371
1372Comme il n'y a aucun moyen de distinguer un vrai clic sur STOP d'une simple
1373fermeture du canal de sortie sur le client (shutdown(SHUT_WR)), les agents HTTP
1374doivent être conservateurs et considérer que le client n'a probablement fermé
1375que le canal de sortie en attendant la réponse. Toutefois, ceci introduit des
1376risques de congestion lorsque beaucoup d'utilisateurs font de même, et s'avère
1377aujourd'hui complètement inutile car probablement aucun client ne referme la
1378session en attendant la réponse. Certains agents HTTP supportent ceci (Squid,
1379Apache, HAProxy), et d'autres ne le supportent pas (TUX, et la plupart des
1380répartiteurs de charge matériels). Donc la probabilité pour qu'une notification
1381de fermeture d'un canal d'entrée côté client représente un utilisateur cliquant
1382sur 'STOP' est proche de 100%, et il est vraiment tentant d'abandonner la
1383requête prématurément sans polluer les serveurs.
1384
1385Pour cette raison, une nouvelle option "abortonclose" a été introduite en
1386version 1.2.14. Par défaut (sans l'option), le comportement reste conforme à
1387HTTP. Mais lorsque l'option est spécifiée, une session dont le canal entrant
1388est fermé sera abortée si cela est possible, c'est à dire que la requête est
1389soit en file d'attente, soit en tentative de connexion. Ceci réduit
1390considérablement la longueur des files d'attentes et la charge sur les serveurs
1391saturés lorsque les utilisateurs sont tentés de cliquer sur 'STOP', ce qui à
1392son tour, réduit les temps de réponse pour les autres utilisateurs.
1393
1394Exemple :
1395---------
1396 listen web_appl 0.0.0.0:80
1397 maxconn 10000
1398 mode http
1399 cookie SERVERID insert nocache indirect
1400 balance roundrobin
1401 server web1 192.168.1.1:80 cookie s1 weight 10 maxconn 100 check
1402 server web2 192.168.1.2:80 cookie s2 weight 10 maxconn 100 check
1403 server web3 192.168.1.3:80 cookie s3 weight 10 maxconn 100 check
1404 server bck1 192.168.2.1:80 cookie s4 check maxconn 200 backup
1405 option abortonclose
1406
1407
willy tarreauc29948c2005-12-17 13:10:27 +010014084) Fonctionnalités additionnelles
1409=================================
1410
1411D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
willy tarreau8f635a42006-05-21 23:05:54 +02001412principalement du mode transparent, de la journalisation des connexions, de la
1413réécriture des en-têtes, et du statut sous forme de page HTML.
1414
willy tarreau5cbea6f2005-12-17 12:48:26 +01001415
willy tarreau0174f312005-12-18 01:02:42 +010014164.1) Fonctionnalités réseau
1417---------------------------
14184.1.1) Fonctionnement en mode transparent
willy tarreauc29948c2005-12-17 13:10:27 +01001419---------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01001420En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions
1421routées à travers la machine hébergeant le proxy. Dans ce mode, on ne précise
1422pas l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
willy tarreauc29948c2005-12-17 13:10:27 +01001423destination de la session détournée. Le système doit permettre de rediriger les
1424paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +01001425
1426Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +01001427---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01001428 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001429 mode http
1430 transparent
1431 cookie SERVERID
1432 server server01 192.168.1.1:80
1433 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +01001434
1435 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1436 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +01001437
willy tarreaua41a8b42005-12-17 14:02:24 +01001438Remarque :
1439----------
willy tarreau64a3cc32005-12-18 01:13:11 +01001440Si le port n'est pas spécifié sur le serveur, c'est le port auquel s'est
1441adressé le client qui sera utilisé. Cela permet de relayer tous les ports TCP
1442d'une même adresse avec une même instance et sans utiliser directement le mode
1443transparent.
willy tarreaua41a8b42005-12-17 14:02:24 +01001444
1445Exemple :
1446---------
1447 listen http_proxy 0.0.0.0:65000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001448 mode tcp
1449 server server01 192.168.1.1 check port 60000
1450 server server02 192.168.1.2 check port 60000
willy tarreaua41a8b42005-12-17 14:02:24 +01001451
1452 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
1453 -j REDIRECT --to-ports 65000
1454
willy tarreau0174f312005-12-18 01:02:42 +01001455
14564.1.2) Choix d'une adresse source par serveur
1457---------------------------------------------------
1458Avec les versions 1.1.30 et 1.2.3, il devient possible de spécifier une adresse
1459IP source pour joindre chaque serveur. C'est utile pour joindre des serveurs de
1460backup à partir d'un LAN différent, ou pour utiliser des chemins alternatifs
1461pour joindre le même serveur. C'est également utilisable pour faciliter une
1462répartition de charge selon l'adresse IP source pour des connexions sortantes.
1463Bien entendu, la même adresse est utilisée pour les health-checks.
1464
1465Exemple :
1466---------
1467 # utiliser une adresse particulière pour joindre les 2 serveur
1468 listen http_proxy 0.0.0.0:65000
1469 mode http
1470 balance roundrobin
1471 server server01 192.168.1.1:80 source 192.168.2.13
1472 server server02 192.168.1.2:80 source 192.168.2.13
1473
1474Exemple :
1475---------
1476 # utiliser une adresse particulière pour joindre chaque serveur
1477 listen http_proxy 0.0.0.0:65000
1478 mode http
1479 balance roundrobin
1480 server server01 192.168.1.1:80 source 192.168.1.1
1481 server server02 192.168.2.1:80 source 192.168.2.1
1482
1483Exemple :
1484---------
1485 # faire une répartition d'adresse sources pour joindre le même proxy à
1486 # travers deux liens WAN
1487 listen http_proxy 0.0.0.0:65000
1488 mode http
1489 balance roundrobin
1490 server remote-proxy-way1 192.168.1.1:3128 source 192.168.2.1
1491 server remote-proxy-way2 192.168.1.1:3128 source 192.168.3.1
1492
1493Exemple :
1494---------
1495 # forcer une connexion TCP à s'attacher à un port particulier
1496 listen http_proxy 0.0.0.0:2000
1497 mode tcp
1498 balance roundrobin
1499 server srv1 192.168.1.1:80 source 192.168.2.1:20
1500 server srv2 192.168.1.2:80 source 192.168.2.1:20
1501
willy tarreaub952e1d2005-12-18 01:31:20 +010015024.1.3) Maintien de session TCP (keep-alive)
1503-------------------------------------------
1504Avec la version 1.2.7, il devient possible d'activer le maintien de session
1505TCP (TCP keep-alive) à la fois côté client et côté serveur. Cela permet
1506d'empêcher des sessions longues d'expirer sur des équipements de niveau 4
1507externes tels que des firewalls ou des répartiteurs de charge. Cela permet
1508aussi au système de détecter et terminer des sessions figées lorsqu'aucun
1509time-out n'a été positionné (fortement déconseillé). Le proxy ne peut pas
1510positionner l'intervalle entre les annonces ni le nombre maximal, veuillez
1511vous référer au manuel du système d'exploitation pour cela. Il existe 3 options
1512pour activer le maintien de session TCP :
1513
1514 option tcpka # active le keep-alive côté client et côté serveur
1515 option clitcpka # active le keep-alive côté client
1516 option srvtcpka # active le keep-alive côté serveur
1517
willy tarreau0f7af912005-12-17 12:21:26 +01001518
willy tarreauc29948c2005-12-17 13:10:27 +010015194.2) Journalisation des connexions
1520----------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001521
1522L'un des points forts de HAProxy est indéniablement la précision de ses logs.
1523Il fournit probablement le plus fin niveau d'information disponible pour un
1524tel outil, ce qui est très important pour les diagnostics en environnements
1525complexes. En standard, les informations journalisées incluent le port client,
1526les chronométrages des états TCP/HTTP, des états de session précis au moment de
1527la terminaison et sa cause, des informations sur les décisions d'aiguillage du
1528trafic vers un serveur, et bien sûr la possibilité de capturer des en-têtes
1529arbitraires.
1530
1531Dans le but d'améliorer la réactivité des administrateurs, il offre une grande
1532transparence sur les problèmes rencontrés, à la fois internes et externes, et
1533il est possible d'envoyer les logs vers des serveurs différents en même temps
1534avec des niveaux de filtrage différents :
1535
1536 - logs globaux au niveau processus (erreurs système, arrêts/démarrages, ...)
1537 - erreurs système et internes par instance (manque de ressources, bugs, ...)
1538 - problèmes externes par instance (arrêts/relance serveurs, limites, ...)
1539 - activité par instance (connexions clients), aussi bien lors de leur
1540 établissement qu'à leur terminaison.
1541
1542La possibilité de distribuer différents niveaux de logs à différents serveurs
1543permet à plusieurs équipes de production d'intéragir et de corriger leurs
1544problèmes le plus tôt possible. Par exemple, l'équipe système peut surveiller
1545occasionnellement les erreurs système, pendant que l'équipe application
1546surveille les alertes d'arrêts/démarrages de ses serveurs en temps réel, et
1547que l'équipe sécurité analyse l'activité en différé d'une heure.
1548
1549
willy tarreauc1cae632005-12-17 14:12:23 +010015504.2.1) Niveaux de log
1551---------------------
willy tarreauc29948c2005-12-17 13:10:27 +01001552Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
1553détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
1554source, le serveur destination, la durée de la connexion, les temps de réponse,
willy tarreau8337c6b2005-12-17 13:41:01 +01001555la requête HTTP, le code de retour, la quantité de données transmises, et même
1556dans certains cas, la valeur d'un cookie permettant de suivre les sessions.
1557Tous les messages sont envoyés en syslog vers un ou deux serveurs. Se référer à
1558la section 1.1 pour plus d'information sur les catégories de logs. La syntaxe
willy tarreauc29948c2005-12-17 13:10:27 +01001559est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +01001560
willy tarreau8337c6b2005-12-17 13:41:01 +01001561 log <adresse_ip_1> <catégorie_1> [niveau_max_1]
1562 log <adresse_ip_2> <catégorie_2> [niveau_max_2]
willy tarreauc29948c2005-12-17 13:10:27 +01001563ou
1564 log global
1565
1566Remarque :
1567----------
1568La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
1569paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +01001570
1571Exemple :
1572---------
1573 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001574 mode http
1575 log 192.168.2.200 local3
1576 log 192.168.2.201 local4
willy tarreau0f7af912005-12-17 12:21:26 +01001577
willy tarreauc1cae632005-12-17 14:12:23 +010015784.2.2) Format des logs
1579----------------------
1580Par défaut, les connexions sont journalisées au niveau TCP dès l'établissement
1581de la session entre le client et le relais. En précisant l'option 'tcplog',
1582la connexion ne sera journalisée qu'en fin de session, ajoutant des précisions
1583sur son état lors de la déconnexion, ainsi que le temps de connexion et la
willy tarreau532bb552006-05-13 18:40:37 +02001584durée totale de la session. Le nombre de sessions restantes après la
1585déconnexion est également indiqué (pour le serveur, l'instance et le process).
willy tarreauc1cae632005-12-17 14:12:23 +01001586
willy tarreauc5f73ed2005-12-18 01:26:38 +01001587Exemple de journalisation TCP :
1588-------------------------------
willy tarreau982249e2005-12-18 00:57:06 +01001589 listen relais-tcp 0.0.0.0:8000
willy tarreauc5f73ed2005-12-18 01:26:38 +01001590 mode tcp
1591 option tcplog
1592 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001593
willy tarreau532bb552006-05-13 18:40:37 +02001594>>> 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 +01001595
willy tarreau532bb552006-05-13 18:40:37 +02001596 Champ Format / Description Exemple
1597
1598 1 nom_processus '[' pid ']:' haproxy[18989]:
1599 2 ip_client ':' port_client 127.0.0.1:34550
1600 3 '[' date ']' [15/Oct/2003:15:24:28]
1601 4 nom_instance relais-tcp
1602 5 nom_serveur Srv1
1603 6 temps_file '/' temps_connect '/' temps_total 0/0/5007
1604 7 octets lus 0
1605 8 etat_terminaison --
1606 9 conn_srv '/' conns_inst '/' conns_processus 1/1/1
1607 10 position en file d'attente srv '/' globale 0/0
willy tarreau982249e2005-12-18 00:57:06 +01001608
willy tarreauc1cae632005-12-17 14:12:23 +01001609Une autre option, 'httplog', fournit plus de détails sur le protocole HTTP,
1610notamment la requête et l'état des cookies. Dans les cas où un mécanisme de
1611surveillance effectuant des connexions et déconnexions fréquentes, polluerait
1612les logs, il suffit d'ajouter l'option 'dontlognull', pour ne plus obtenir une
1613ligne de log pour les sessions n'ayant pas donné lieu à un échange de données
1614(requête ou réponse).
willy tarreauc29948c2005-12-17 13:10:27 +01001615
willy tarreauc5f73ed2005-12-18 01:26:38 +01001616Exemple de journalisation HTTP :
1617--------------------------------
willy tarreau036e1ce2005-12-17 13:46:33 +01001618 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001619 mode http
1620 option httplog
1621 option dontlognull
1622 log 192.168.2.200 local3
1623
willy tarreau532bb552006-05-13 18:40:37 +02001624>>> 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 +01001625
1626Exemple plus complet :
willy tarreau036e1ce2005-12-17 13:46:33 +01001627
willy tarreau532bb552006-05-13 18:40:37 +02001628 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 +01001629
willy tarreau532bb552006-05-13 18:40:37 +02001630 Champ Format / Description Exemple
1631
1632 1 nom_processus '[' pid ']:' haproxy[18989]:
1633 2 ip_client ':' port_client 10.0.0.1:34552
1634 3 '[' date ']' [15/Oct/2003:15:26:31]
1635 4 nom_instance relais-http
1636 5 nom_serveur Srv1
1637 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt 3183/-1/-1/-1/11215
1638 7 Code_retour_HTTP 503
1639 8 octets lus 0
1640 9 cookies_requête_capturés -
1641 10 cookies_reponse_capturés -
1642 11 etat_terminaison SC--
1643 12 conns_srv '/' conns_inst '/' conns_processus 137/202/205
1644 13 position file serveur '/' globale 0/0
1645 14 '{' entetes_requête_capturés '}' {w.ods.org|Mozilla}
1646 15 '{' entetes_reponse_capturés '}' {}
1647 16 '"' requête_HTTP '"' "HEAD / HTTP/1.0"
willy tarreauc5f73ed2005-12-18 01:26:38 +01001648
1649Note pour les analyseurs de logs : l'URI est TOUJOURS le dernier champ de la ligne, et
1650 commence par un guillemet '"'.
willy tarreau982249e2005-12-18 00:57:06 +01001651
1652Le problème de loguer uniquement en fin de session, c'est qu'il est impossible
1653de savoir ce qui se passe durant de gros transferts ou des sessions longues.
1654Pour pallier à ce problème, une nouvelle option 'logasap' a été introduite dans
willy tarreau64a3cc32005-12-18 01:13:11 +01001655la version 1.1.28 (1.2.1). Lorsqu'elle est activée, le proxy loguera le plus
1656tôt possible, c'est à dire juste avant que ne débutent les transferts de
1657données. Cela signifie, dans le cas du TCP, qu'il loguera toujours le résultat
1658de la connexion vers le serveur, et dans le cas HTTP, qu'il loguera en fin de
willy tarreauc5f73ed2005-12-18 01:26:38 +01001659traitement des en-têtes de la réponse du serveur, auquel cas le nombre d'octets
1660représentera la taille des en-têtes retournés au client.
willy tarreau982249e2005-12-18 00:57:06 +01001661
willy tarreau64a3cc32005-12-18 01:13:11 +01001662Afin d'éviter toute confusion avec les logs normaux, le temps total de
1663transfert et le nombre d'octets transférés sont préfixés d'un signe '+'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001664rappelant que les valeurs réelles sont certainement plus élevées.
willy tarreau982249e2005-12-18 00:57:06 +01001665
1666Exemple :
1667---------
1668
1669 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01001670 mode http
1671 option httplog
1672 option dontlognull
1673 option logasap
1674 log 192.168.2.200 local3
willy tarreau982249e2005-12-18 00:57:06 +01001675
willy tarreauc5f73ed2005-12-18 01:26:38 +01001676>>> 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 +01001677
1678
willy tarreauc1cae632005-12-17 14:12:23 +010016794.2.3) Chronométrage des événements
1680-----------------------------------
1681Pour déceler des problèmes réseau, les mesures du temps écoulé entre certains
1682événements sont d'une très grande utilité. Tous les temps sont mesurés en
1683millisecondes (ms). En mode HTTP, quatre points de mesure sont rapportés sous
willy tarreau532bb552006-05-13 18:40:37 +02001684la forme Tq/Tw/Tc/Tr/Tt :
willy tarreauc1cae632005-12-17 14:12:23 +01001685
1686 - Tq: temps total de réception de la requête HTTP de la part du client.
1687 C'est le temps qui s'est écoulé entre le moment où le client a établi
1688 sa connexion vers le relais, et le moment où ce dernier a reçu le dernier
1689 en-tête HTTP validant la fin de la requête. Une valeur '-1' ici indique
1690 que la requête complète n'a jamais été reçue.
1691
willy tarreau532bb552006-05-13 18:40:37 +02001692 - Tw: temps total passé dans les files d'attente avant d'obtenir une place
1693 vers un serveur. Ceci tient compte à la fois de la file d'attente globale
1694 et de celle du serveur, et dépend du nombre de requêtes dans la file et du
1695 temps nécessaire au serveur pour compléter les sessions précédentes. La
1696 valeur '-1' indique que la requête a été détruite avant d'atteindre une
1697 file.
1698
willy tarreauc1cae632005-12-17 14:12:23 +01001699 - Tc: temps d'établissement de la connexion TCP du relais vers le serveur.
1700 C'est le temps écoulé entre le moment ou le relais a initié la demande de
1701 connexion vers le serveur, et le moment où ce dernier l'a acquittée, c'est
1702 à dire le temps entre l'envoi du paquet TCP SYN la réception du SYN/ACK.
1703 Une valeur '-1' ici indique que la connexion n'a jamais pu être établie
1704 vers le serveur.
1705
1706 - Tr: temps de réponse du serveur. C'est le temps que le serveur a mis pour
willy tarreauc5f73ed2005-12-18 01:26:38 +01001707 renvoyer la totalité des en-têtes HTTP à partir du moment où il a acquitté
willy tarreauc1cae632005-12-17 14:12:23 +01001708 la connexion. Ca représente exactement le temps de traitement de la
1709 transaction sans le transfert des données associées. Une valeur '-1'
willy tarreauc5f73ed2005-12-18 01:26:38 +01001710 indique que le serveur n'a pas envoyé la totalité de l'en-tête HTTP.
willy tarreauc1cae632005-12-17 14:12:23 +01001711
1712 - Tt: durée de vie totale de la session, entre le moment où la demande de
1713 connexion du client a été acquittée et le moment où la connexion a été
willy tarreau982249e2005-12-18 00:57:06 +01001714 refermée aux deux extrémités (client et serveur). La signification change
1715 un peu si l'option 'logasap' est présente. Dans ce cas, le temps correspond
willy tarreau532bb552006-05-13 18:40:37 +02001716 uniquement à (Tq + Tw + Tc + Tr), et se trouve préfixé d'un signe '+'. On
1717 peut donc déduire Td, le temps de transfert des données, en excluant les
1718 autres temps :
willy tarreauc1cae632005-12-17 14:12:23 +01001719
willy tarreau532bb552006-05-13 18:40:37 +02001720 Td = Tt - (Tq + Tw + Tc + Tr)
willy tarreauc1cae632005-12-17 14:12:23 +01001721
1722 Les temps rapportés à '-1' sont simplement à éliminer de cette équation.
1723
willy tarreau532bb552006-05-13 18:40:37 +02001724En mode TCP ('option tcplog'), seuls les deux indicateurs Tw, Tc et Tt sont
willy tarreauc1cae632005-12-17 14:12:23 +01001725rapportés.
1726
1727Ces temps fournissent de précieux renseignement sur des causes probables de
1728problèmes. Du fait que le protocole TCP définisse des temps de retransmission
1729de 3 secondes, puis 6, 12, etc..., l'observation de temps proches de multiples
1730de 3 secondes indique pratiquement toujours des pertes de paquets liés à un
1731problème réseau (câble ou négociation). De plus, si <Tt> est proche d'une
1732valeur de time-out dans la configuration, c'est souvent qu'une session a été
1733abandonnée sur expiration d'un time-out.
1734
1735Cas les plus fréquents :
1736
1737 - Si Tq est proche de 3000, un paquet a très certainement été perdu entre
1738 le client et le relais.
1739 - Si Tc est proche de 3000, un paquet a très certainement été perdu entre
1740 le relais et le serveur durant la phase de connexion. Cet indicateur
1741 devrait normalement toujours être très bas (moins de quelques dizaines).
1742 - Si Tr est presque toujours inférieur à 3000, et que certaines valeurs
1743 semblent proches de la valeur moyenne majorée de 3000, il y a peut-être
1744 de pertes entre le relais et le serveur.
1745 - Si Tt est légèrement supérieur au time-out, c'est souvent parce que le
1746 client et le serveur utilisent du keep-alive HTTP entre eux et que la
1747 session est maintenue après la fin des échanges. Voir plus loin pour
1748 savoir comment désactiver le keep-alive HTTP.
1749
1750Autres cas ('xx' représentant une valeur quelconque à ignorer) :
willy tarreau532bb552006-05-13 18:40:37 +02001751 -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 +01001752 a refermé sa connexion sans compléter la requête.
willy tarreau532bb552006-05-13 18:40:37 +02001753 Tq/-1/xx/xx/Tt: Il n'était pas possible de traiter la request, probablement
1754 parce que tous les serveurs étaient hors d'usage.
1755 Tq/Tw/-1/xx/Tt: la connexion n'a pas pu s'établir vers le serveur (refus ou
1756 time-out au bout de Tt-(Tq+Tw) ms).
1757 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 +01001758 les temps ou bien a refermé sa connexion trop tôt, au bout
willy tarreau532bb552006-05-13 18:40:37 +02001759 de Tt-(Tq+Tw+Tc) ms.
willy tarreauc1cae632005-12-17 14:12:23 +01001760
17614.2.4) Conditions de déconnexion
1762--------------------------------
willy tarreauc5f73ed2005-12-18 01:26:38 +01001763Les logs TCP et HTTP fournissent un indicateur de complétude de la session dans
1764le champ 'etat_terminaison', juste avant le nombre de connexions actives. C'est
1765un champ long de 2 caractères en TCP et de 4 caractères en HTTP, chacun ayant
1766une signification précise :
1767
1768 - sur le premier caractère, un code précisant le premier événement qui a causé
1769 la terminaison de la session :
1770
1771 C : fermeture inattendue de la session TCP de la part du client.
1772
1773 S : fermeture inattendue de la session TCP de la part du serveur, ou
1774 refus explicite de connexion de la part de ce dernier.
1775
1776 P : terminaison prématurée des sessions par le proxy, pour cause
1777 d'imposition d'une limite sur le nombre de connexions, pour cause
1778 de configuration (ex: filtre d'URL), ou parce qu'un contrôle de
1779 sécurité a détecté et bloqué une anomalie dans la réponse du
1780 serveur qui aurait pu causer une fuite d'informations (par exemple,
1781 un cookie cachable).
willy tarreau036e1ce2005-12-17 13:46:33 +01001782
willy tarreauc5f73ed2005-12-18 01:26:38 +01001783 R : une ressource sur le proxy a été épuisée (mémoire, sockets, ports
1784 source, ...). Généralement, cela arrive au cours de l'établissement
1785 d'une connexion, et les logs système doivent contenir une copie de
1786 l'érreur précise.
willy tarreau036e1ce2005-12-17 13:46:33 +01001787
willy tarreauc5f73ed2005-12-18 01:26:38 +01001788 I : une erreur interne a été identifiée par le proxy à la suite d'un
1789 auto-contrôle. Ceci ne doit JAMAIS arriver, et vous êtes encouragés
1790 à remonter n'importe quel log contenant ceci car il s'agira un bug.
willy tarreau036e1ce2005-12-17 13:46:33 +01001791
willy tarreauc5f73ed2005-12-18 01:26:38 +01001792 c : le délai maximal d'attente du client a expiré (clitimeout).
1793
1794 s : le délai maximal d'attente du serveur a expiré (srvtimeout et contimeout)
1795
1796 - : terminaison normale de session.
1797
1798 - sur le second caractère, l'état d'avancement de la session TCP/HTTP lors de
1799 la fermeture :
1800
1801 R : attente d'une REQUETE HTTP complète de la part du client. Rien n'a
1802 été transmis au serveur.
1803
willy tarreau532bb552006-05-13 18:40:37 +02001804 Q : attente en file d'attente (QUEUE) d'une place pour avoir une
1805 connexion vers un serveur. Ne peut apparaître que sur un serveur
1806 possédant un paramètre 'maxconn'. Aucune connexion n'a été envoyée
1807 au serveur.
1808
willy tarreauc5f73ed2005-12-18 01:26:38 +01001809 C : attente de l'établissement d'une CONNEXION vers le serveur. Le
1810 serveur peut au plus avoir vu la tentative de connexion, mais
1811 aucune donnée n'a été échangée.
1812
1813 H : attente, réception ou traitement des en-têtes HTTP ("HEADERS").
1814
1815 D : transfert des DONNEES du serveur vers le client.
1816
1817 L : transfert des dernières ("LAST") données du proxy vers le client,
1818 alors que le serveur a déjà fini.
1819
Willy Tarreau2272dc12006-09-03 10:19:38 +02001820 T : requête bloquée en mode "tarpit" par le proxy. Elle a été maintenue
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001821 ouverte vers le client pendant toute la durée du contimeout ou
1822 jusqu'à l'abandon de la part du client.
Willy Tarreau2272dc12006-09-03 10:19:38 +02001823
willy tarreauc5f73ed2005-12-18 01:26:38 +01001824 - : terminaison normale, après fin de transfert des données.
willy tarreau036e1ce2005-12-17 13:46:33 +01001825
1826 - le troisième caractère indique l'éventuelle identification d'un cookie de
willy tarreauc1cae632005-12-17 14:12:23 +01001827 persistence (uniquement en mode HTTP) :
willy tarreau036e1ce2005-12-17 13:46:33 +01001828
willy tarreauc5f73ed2005-12-18 01:26:38 +01001829 N : aucun cookie de persistence n'a été présenté. C'est généralement le
1830 cas sur les NOUVELLES connexions clients.
1831
1832 I : le client a présenté un cookie INVALIDE ne correspondant à aucun
1833 serveur connu. Ceci peut être dû à un changement de configuration
1834 récent, à des mélanges de noms de cookies entre sites HTTP/HTTPS,
1835 ou à une attaque.
willy tarreau036e1ce2005-12-17 13:46:33 +01001836
willy tarreauc5f73ed2005-12-18 01:26:38 +01001837 D : le client a présenté un cookie correspondant à un serveur hors
1838 d'usage ("DOWN"). Suivant l'option 'persist', il a été renvoyé vers
1839 un autre serveur ou a tout de même tenté de se connecter sur celui
1840 correspondant au cookie.
willy tarreau036e1ce2005-12-17 13:46:33 +01001841
willy tarreauc5f73ed2005-12-18 01:26:38 +01001842 V : le client a présenté un cookie VALIDE et a pu se connecter au
1843 serveur correspondant.
1844
1845 - : non appliquable (pas de cookie positionné dans la configuration).
1846
1847 - le dernier caractère indique l'éventuel traitement effectué sur un cookie de
1848 persistence retrourné par le serveur (uniquement en mode HTTP) :
1849
1850 N : aucun cookie de persistance n'a été fourni par le serveur, et aucun
1851 n'a été inséré.
1852
1853 I : aucun cookie de persistance n'a été fourni par le serveur, et le
1854 proxy en a INSERE un.
1855
willy tarreau197e8ec2005-12-17 14:10:59 +01001856 P : un cookie de persistence a été fourni par le serveur et transmis
willy tarreauc5f73ed2005-12-18 01:26:38 +01001857 tel quel ("PASSIF").
1858
1859 R : le cookie retourné par le serveur a été REECRIT par le proxy.
1860
1861 D : le cookie présenté par le serveur a été DETRUIT par le proxy pour
1862 ne pas être retourné au client.
1863
1864 - : non appliquable
1865
1866
1867La combinaison des deux premiers indicateurs fournit une grande quantitié
1868d'informations sur ce qui se passait lorsque la session s'est terminée. Cela
1869peut notamment aider à détecter une saturation de serveur, des troubles réseau,
1870des épuisements de ressources système locales, des attaques, etc...
willy tarreau036e1ce2005-12-17 13:46:33 +01001871
willy tarreauc5f73ed2005-12-18 01:26:38 +01001872Les combinaisons d'indicateurs les plus fréquentes sont énumérées ici.
1873
1874 Indic Raison
1875 CR Le client a abandonné avant d'émettre une requête complète. Il est
1876 très probable que la requête ait été tapée à la main dans un client
1877 telnet et abortée trop tôt.
1878
1879 cR Le temps imparti au client a expiré avant réception d'une requête
1880 complète. Ceci est parfois causé par un paramètre TCP MSS trop élevé
1881 sur le client pour des réseaux PPPoE sur ADSL qui ne peuvent pas
1882 transporter des paquets entiers, ou par des clients qui énvoient des
1883 requêtes à la main et ne tapent pas assez vite.
1884
1885 SC Le serveur a explicitement refusé la connexion (le proxy a reçu un
1886 RST TCP ou un message ICMP en retour). Dans certains cas, cela peut
1887 être la couche réseau qui indique au proxy que le serveur n'est pas
1888 joignable (p.ex: pas de route, pas de réponse ARP en local, etc...)
1889
1890 sC La connexion au serveur n'a pas pu s'établir dans le temps imparti.
1891
1892 PC Le proxy a refusé d'établir une connexion au serveur parce que le
1893 nombre de connexions a atteint la limite 'maxconn' (global ou de
1894 l'instance). Le paramètre 'maxconn' de l'instance pourrait être
1895 augmenté, tout comme le paramètre 'maxconn' global.
1896
1897 RC Une ressource locale a été épuisée (mémoire, sockets, ports source),
1898 empêchant la connexion au serveur de s'établir. Les logs d'erreurs
1899 diront précisément ce qui manquait. Dans tous les cas, le seul remède
1900 consiste à affiner le paramétrage système.
1901
1902 cH Le temps imparti au client a expiré au cours d'une requête POST. Ceci
1903 est parfois causé par un paramètre TCP MSS trop élevé sur le client
1904 pour des réseaux PPPoE sur ADSL qui ne peuvent pas transporter des
1905 paquets entiers.
1906
willy tarreau078c79a2006-05-13 12:23:58 +02001907 CH Le client a abandonné alors qu'il attendait un début de réponse de la
1908 part du serveur. Cela peut être causé par le serveur qui mettait trop
1909 de temps à répondre, ou par un client cliquant précipitamment sur le
1910 bouton 'Stop'.
1911
1912 CQ Le client a abandonné alors que sa session était mise en file
1913 d'attente pour obtenir un serveur avec suffisamment de connexions
1914 libres pour l'accepter. Cela signifie soit que l'ensemble des
1915 serveurs étaient saturés, soit que le serveur assigné a mis trop de
1916 temps à répondre.
1917
Willy Tarreau08fa2e32006-09-03 10:47:37 +02001918 CT Le client a abandonné alors que sa session était bloquée en mode
1919 tarpit.
1920
willy tarreau078c79a2006-05-13 12:23:58 +02001921 sQ La session a attendu trop longtemps en file d'attente et a été
1922 expirée.
1923
willy tarreauc5f73ed2005-12-18 01:26:38 +01001924 SH Le serveur a aborté brutalement alors qu'il devait envoyer ses
1925 en-têtes. En général, cela indique qu'il a crashé.
1926
1927 sH Le serveur n'a pas pu répondre durant le temps imparti, ce qui montre
1928 des transactions trop longues, probablement causées par un back-end
1929 saturé. Les seules solutions sont de corriger le problème sur
1930 l'application, d'accroître le paramètre 'srvtimeout' pour supporter
1931 des attentes plus longues au risque que les clients abandonnent à
1932 leur tour, ou bien d'ajouter des serveurs.
1933
1934 PR Le proxy a bloqué une requête du client, soit à cause d'une syntaxe
1935 HTTP invalide, auquel cas il a renvoyé une erreur HTTP 400 au client,
1936 soit à cause d'une requête validant un filtre d'interdiction, auquel
1937 cas le proxy a renvoyé une erreur HTTP 403.
1938
1939 PH Le proxy a bloqué la réponse du serveur parce qu'elle était invalide,
1940 incomplète, dangereuse ('cache control'), ou parce qu'elle validait
1941 un filtre de sécurité. Dans tous les cas, une erreur HTTP 502 est
1942 renvoyée au client.
1943
Willy Tarreau2272dc12006-09-03 10:19:38 +02001944 PT Le proxy a bloqué une requête du client et a maintenu sa connection
1945 ouverte avant de lui retourner une erreur "500 server error". Rien
1946 n'a été envoyé au serveur.
1947
willy tarreauc5f73ed2005-12-18 01:26:38 +01001948 cD Le client n'a pas lu de données pendant le temps qui lui était
1949 imparti. Ceci est souvent causé par des problèmes réseau côté client.
1950
1951 CD Le client a aborté sa connection de manière inattendue pendant le
1952 transfert des données. Ceci est provoqué soit par le crash d'un
1953 navigateur, ou par une session en HTTP keep-alive entre le serveur
1954 et le client terminée en premier par le client.
1955
1956 sD Le serveur n'a rien fait durant le temps imparti par le paramètre
1957 'srvtimeout'. Ceci est souvent causé par des timeouts trop courts
1958 sur des équipements de niveau 4 (firewalls, répartiteurs de charge)
1959 situés entre le proxy et le serveur.
1960
19614.2.5) Caractères non-imprimables
1962---------------------------------
1963Depuis la version 1.1.29, les caractères non-imprimables ne sont plus envoyés
1964tels quels dans les lignes de logs, mais inscrits sous la forme de deux chiffres
1965hexadécimaux, préfixés du caractère d'échappement '#'. Les seuls caractères
1966dorénavant logués tels quels sont compris entre 32 et 126. Bien évidemment, le
1967caractère d'échappement '#' est lui-même encodé afin de lever l'ambiguité. Il en
1968est de même pour le caractère '"', ainsi que les caractères '{', '|' et '}' pour
1969les en-têtes.
1970
19714.2.6) Capture d'en-têtes HTTP et de cookies
1972--------------------------------------------
1973La version 1.1.23 a apporté la capture des cookies, et la version 1.1.29 la
1974capture d'en-têtes. Tout ceci est effectué en utilisant le mot-clé 'capture'.
1975
1976Les captures de cookies facilitent le suivi et la reconstitution d'une session
1977utilisateur. La syntaxe est la suivante :
willy tarreau8337c6b2005-12-17 13:41:01 +01001978
1979 capture cookie <préfixe_cookie> len <longueur_capture>
1980
willy tarreauc5f73ed2005-12-18 01:26:38 +01001981Ceci activera la capture de cookies à la fois dans les requêtes et dans les
1982réponses. De cette manière, il devient facile de détecter lorsqu'un utilisateur
1983bascule sur une nouvelle session par exemple, car le serveur lui réassignera un
1984nouveau cookie.
1985
willy tarreau8337c6b2005-12-17 13:41:01 +01001986Le premier cookie dont le nom commencera par <préfixe_cookie> sera capturé, et
1987transmis sous la forme "NOM=valeur", sans toutefois, excéder <longueur_capture>
1988caractères (64 au maximum). Lorsque le nom du cookie est fixe et connu, on peut
1989le suffixer du signe "=" pour s'assurer qu'aucun autre cookie ne prendra sa
1990place dans les logs.
1991
1992Exemples :
1993----------
1994 # capture du premier cookie dont le nom commence par "ASPSESSION"
1995 capture cookie ASPSESSION len 32
1996
1997 # capture du premier cookie dont le nom est exactement "vgnvisitor"
1998 capture cookie vgnvisitor= len 32
1999
willy tarreau036e1ce2005-12-17 13:46:33 +01002000Dans les logs, le champ précédant l'indicateur de complétude contient le cookie
willy tarreau64a3cc32005-12-18 01:13:11 +01002001positionné par le serveur, précédé du cookie positionné par le client. Chacun
2002de ces champs est remplacé par le signe "-" lorsqu'aucun cookie n'est fourni
willy tarreauc5f73ed2005-12-18 01:26:38 +01002003par le client ou le serveur, ou lorsque l'option est désactivée..
2004
2005Les captures d'en-têtes ont un rôle complètement différent. Elles sont utiles
2006pour suivre un identifiant de requête globalement unique positionné par un
2007autre proxy en amont, pour journaliser les noms de serveurs virtuels, les types
2008de clients web, la longueur des POST, les 'referrers', etc. Dans la réponse, on
2009peut chercher des informations relatives à la longueur annoncée de la réponse,
2010le fonctionnement attendu du cache, ou encore la localisation d'un objet en cas
2011de redirection. Tout comme pour les captures de cookies, il est possible
2012d'inclure les en-têtes de requêtes et de réponse simultanément. La syntaxe est
2013la suivante :
2014
2015 capture request header <nom> len <longueur max>
2016 capture response header <nom> len <longueur max>
2017
2018Note: Les noms d'en-têtes ne sont pas sensibles à la casse.
willy tarreau8337c6b2005-12-17 13:41:01 +01002019
willy tarreauc5f73ed2005-12-18 01:26:38 +01002020Exemples:
2021---------
2022 # conserver le nom du serveur virtuel accédé par le client
2023 capture request header Host len 20
2024 # noter la longueur des données envoyées dans un POST
2025 capture request header Content-Length len 10
2026
2027 # noter le fonctionnement attendu du cache par le serveur
2028 capture response header Cache-Control len 8
2029 # noter l'URL de redirection
2030 capture response header Location len 20
2031
2032Les en-têtes non trouvés sont logués à vide, et si un en-tête apparait plusieurs
2033fois, seule la dernière occurence sera conservée. Les en-têtes de requête sont
2034regroupés entre deux accolades '{' et '}' dans l'ordre de leur déclaration, et
2035chacun séparés par une barre verticale '|', sans aucun espace. Les en-têtes de
2036réponse sont présentés de la même manière, mais après un espace suivant le bloc
2037d'en-tête de requête. Le tout précède la requête HTTP. Exemple :
2038
2039 Config:
2040
2041 capture request header Host len 20
2042 capture request header Content-Length len 10
2043 capture request header Referer len 20
2044 capture response header Server len 20
2045 capture response header Content-Length len 10
2046 capture response header Cache-Control len 8
2047 capture response header Via len 20
2048 capture response header Location len 20
2049
2050 Log :
2051
willy tarreau532bb552006-05-13 18:40:37 +02002052 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/"
2053 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"
2054 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 +01002055
20564.2.7) Exemples de logs
willy tarreauc1cae632005-12-17 14:12:23 +01002057-----------------------
willy tarreau532bb552006-05-13 18:40:37 +02002058- 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 +01002059 => requête longue (6.5s) saisie à la main avec un client telnet. Le serveur a
2060 répondu en 147 ms et la session s'est terminée normalement ('----')
willy tarreauc29948c2005-12-17 13:10:27 +01002061
willy tarreau532bb552006-05-13 18:40:37 +02002062- 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"
2063 => Idem, mais la requête a été mise en attente dans la file globale derrière
2064 9 autres requêtes déjà présentes, et y a attendu 1230 ms.
2065
2066- 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 +01002067 => requête pour un long transfert. L'option 'logasap' était spécifiée donc le
2068 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 +01002069 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 +01002070 total entre l'accept() et le premier octet de donnée est de 30 ms.
2071
willy tarreau532bb552006-05-13 18:40:37 +02002072- 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 +01002073 => le proxy a bloqué une réponse du serveur soit à cause d'un filtre 'rspdeny'
2074 ou 'rspideny', soit parce qu'il a détecté un risque de fuite sensible
2075 d'informations risquant d'être cachées. Dans ce cas, la réponse est
2076 remplacée par '502 bad gateway'.
2077
willy tarreau532bb552006-05-13 18:40:37 +02002078- 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 +01002079 => Le client n'a pas envoyé sa requête et a refermé la connexion lui-même
willy tarreauc5f73ed2005-12-18 01:26:38 +01002080 ('C---') au bout de 8.5s, alors que le relais attendait l'en-tête ('-R--').
willy tarreauc1cae632005-12-17 14:12:23 +01002081 Aucune connexion n'a été envoyée vers le serveur.
willy tarreau0f7af912005-12-17 12:21:26 +01002082
willy tarreau532bb552006-05-13 18:40:37 +02002083- 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 +01002084 => Le client n'a pas envoyé sa requête et son time-out a expiré ('c---') au
willy tarreauc5f73ed2005-12-18 01:26:38 +01002085 bout de 50s, alors que le relais attendait l'en-tête ('-R--'). Aucune
willy tarreauc1cae632005-12-17 14:12:23 +01002086 connexion n'a été envoyée vers le serveur, mais le relais a tout de même
2087 pu renvoyer un message 408 au client.
2088
willy tarreauc5f73ed2005-12-18 01:26:38 +01002089- haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28] relais-tcp Srv1 0/5007 0 cD
2090 => log en mode 'tcplog'. Expiration du time-out côté client ('cD') au bout de
2091 5s.
willy tarreauc1cae632005-12-17 14:12:23 +01002092
willy tarreau532bb552006-05-13 18:40:37 +02002093- 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 +01002094 => La requête client met 3s à entrer (peut-être un problème réseau), et la
2095 connexion ('SC--') vers le serveur échoue au bout de 4 tentatives de 2
willy tarreau532bb552006-05-13 18:40:37 +02002096 secondes (retries 3 dans la conf), puis un code 503 est retourné au
2097 client. Il y avait 115 connexions sur ce serveur, 202 connexions sur cette
2098 instance, et 205 sur l'ensemble des instances pour ce processus. Il est
2099 possible que le serveur ait refusé la connexion parce qu'il y en avait
2100 déjà trop d'établies.
willy tarreau4302f492005-12-18 01:00:37 +01002101
willy tarreau4302f492005-12-18 01:00:37 +01002102
willy tarreauc5f73ed2005-12-18 01:26:38 +010021034.3) Modification des en-têtes HTTP
willy tarreauc29948c2005-12-17 13:10:27 +01002104----------------------------------
2105En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
2106requête et/ou la réponse à partir d'expressions régulières. Il est également
willy tarreau64a3cc32005-12-18 01:13:11 +01002107possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou
2108de la requête. Une limitation cependant : les en-têtes fournis au milieu de
willy tarreauc29948c2005-12-17 13:10:27 +01002109connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
2110comme faisant partie des échanges de données consécutifs à la première requête.
2111Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +01002112
2113La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +01002114 reqadd <string> pour ajouter un en-tête dans la requête
2115 reqrep <search> <replace> pour modifier la requête
2116 reqirep <search> <replace> idem sans distinction majuscules/minuscules
2117 reqdel <search> pour supprimer un en-tête dans la requête
2118 reqidel <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002119 reqallow <search> autoriser la requête si un en-tête valide <search>
willy tarreauc29948c2005-12-17 13:10:27 +01002120 reqiallow <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002121 reqdeny <search> interdire la requête si un en-tête valide <search>
willy tarreau240afa62005-12-17 13:14:35 +01002122 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreauc5f73ed2005-12-18 01:26:38 +01002123 reqpass <search> inhibe ces actions sur les en-têtes validant <search>
willy tarreau036e1ce2005-12-17 13:46:33 +01002124 reqipass <search> idem sans distinction majuscules/minuscules
Willy Tarreau2272dc12006-09-03 10:19:38 +02002125 reqtarpit <search> bloquer et maintenir une request validant <search>
2126 reqitarpit <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002127
willy tarreau036e1ce2005-12-17 13:46:33 +01002128 rspadd <string> pour ajouter un en-tête dans la réponse
2129 rsprep <search> <replace> pour modifier la réponse
2130 rspirep <search> <replace> idem sans distinction majuscules/minuscules
2131 rspdel <search> pour supprimer un en-tête dans la réponse
2132 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau982249e2005-12-18 00:57:06 +01002133 rspdeny <search> remplace la réponse par un HTTP 502 si un
willy tarreauc5f73ed2005-12-18 01:26:38 +01002134 en-tête valide <search>
willy tarreau982249e2005-12-18 00:57:06 +01002135 rspideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +01002136
willy tarreau0f7af912005-12-17 12:21:26 +01002137
willy tarreau036e1ce2005-12-17 13:46:33 +01002138<search> est une expression régulière compatible POSIX regexp supportant le
2139groupage par parenthèses (sans les '\'). Les espaces et autres séparateurs
2140doivent êtres précédés d'un '\' pour ne pas être confondus avec la fin de la
2141chaîne. De plus, certains caractères spéciaux peuvent être précédés d'un
2142backslach ('\') :
willy tarreau5cbea6f2005-12-17 12:48:26 +01002143
2144 \t pour une tabulation
2145 \r pour un retour charriot
2146 \n pour un saut de ligne
2147 \ pour différencier un espace d'un séparateur
2148 \# pour différencier un dièse d'un commentaire
willy tarreau036e1ce2005-12-17 13:46:33 +01002149 \\ pour utiliser un backslash dans la regex
2150 \\\\ pour utiliser un backslash dans le texte
willy tarreau5cbea6f2005-12-17 12:48:26 +01002151 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +01002152
willy tarreau0f7af912005-12-17 12:21:26 +01002153
willy tarreau5cbea6f2005-12-17 12:48:26 +01002154<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
2155Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
2156groupe délimité par des parenthèses dans l'expression régulière, par sa
Willy Tarreau2272dc12006-09-03 10:19:38 +02002157position numérale. Les positions vont de 0 à 9, et sont codées par un '\'
2158suivi du chiffre désiré (0 désignant la ligne complète). Il est également
2159possible d'insérer un caractère non imprimable (utile pour le saut de ligne)
2160inscrivant '\x' suivi du code hexadécimal de ce caractère (comme en C).
willy tarreau5cbea6f2005-12-17 12:48:26 +01002161
2162<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +01002163dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002164
2165Remarques :
willy tarreau197e8ec2005-12-17 14:10:59 +01002166-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002167 - 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 +01002168 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002169 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
2170 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
2171 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +01002172 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
2173 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
2174 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
willy tarreauc5f73ed2005-12-18 01:26:38 +01002175 en-têtes inutiles avant les ajouts.
willy tarreau982249e2005-12-18 00:57:06 +01002176 - une requête bloquée produira une réponse "HTTP 403 forbidden" tandis qu'une
2177 réponse bloquée produira une réponse "HTTP 502 Bad gateway".
Willy Tarreau2272dc12006-09-03 10:19:38 +02002178 - une requête bloquée par 'reqtarpit' sera maintenue pendant une durée égale
Willy Tarreau08fa2e32006-09-03 10:47:37 +02002179 au paramètre 'contimeout', ou jusqu'à l'abandon du client. Rien ne sera
2180 envoyé au serveur. Lorsque le temps alloué expire, le proxy répondra avec
2181 une réponse "500 server error" de sorte que l'attaquant ne suspecte pas
2182 qu'il ait été bloqué. Les logs rapporteront aussi ce code 500, mais les
2183 flags de terminaison indiqueront "PT".
willy tarreau0f7af912005-12-17 12:21:26 +01002184
2185Exemples :
willy tarreau197e8ec2005-12-17 14:10:59 +01002186----------
willy tarreauc5f73ed2005-12-18 01:26:38 +01002187 ###### a few examples ######
willy tarreau197e8ec2005-12-17 14:10:59 +01002188
willy tarreauc5f73ed2005-12-18 01:26:38 +01002189 # rewrite 'online.fr' instead of 'free.fr' for GET and POST requests
2190 reqrep ^(GET\ .*)(.free.fr)(.*) \1.online.fr\3
2191 reqrep ^(POST\ .*)(.free.fr)(.*) \1.online.fr\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002192
willy tarreauc5f73ed2005-12-18 01:26:38 +01002193 # force proxy connections to close
2194 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
2195 # rewrite locations
2196 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
willy tarreau197e8ec2005-12-17 14:10:59 +01002197
willy tarreauc5f73ed2005-12-18 01:26:38 +01002198 ###### A full configuration being used on production ######
willy tarreau0f7af912005-12-17 12:21:26 +01002199
willy tarreau197e8ec2005-12-17 14:10:59 +01002200 # Every header should end with a colon followed by one space.
2201 reqideny ^[^:\ ]*[\ ]*$
2202
2203 # block Apache chunk exploit
2204 reqideny ^Transfer-Encoding:[\ ]*chunked
2205 reqideny ^Host:\ apache-
2206
2207 # block annoying worms that fill the logs...
2208 reqideny ^[^:\ ]*\ .*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)
2209 reqideny ^[^:\ ]*\ ([^\ ]*\ [^\ ]*\ |.*%00)
2210 reqideny ^[^:\ ]*\ .*<script
2211 reqideny ^[^:\ ]*\ .*/(root\.exe\?|cmd\.exe\?|default\.ida\?)
2212
Willy Tarreau2272dc12006-09-03 10:19:38 +02002213 # tarpit attacks on the login page.
2214 reqtarpit ^[^:\ ]*\ .*\.php?login=[^0-9]
2215
willy tarreau197e8ec2005-12-17 14:10:59 +01002216 # allow other syntactically valid requests, and block any other method
2217 reqipass ^(GET|POST|HEAD|OPTIONS)\ /.*\ HTTP/1\.[01]$
2218 reqipass ^OPTIONS\ \\*\ HTTP/1\.[01]$
2219 reqideny ^[^:\ ]*\
2220
2221 # force connection:close, thus disabling HTTP keep-alive
willy tarreauc5f73ed2005-12-18 01:26:38 +01002222 option httpclos
willy tarreau197e8ec2005-12-17 14:10:59 +01002223
willy tarreauc5f73ed2005-12-18 01:26:38 +01002224 # change the server name
willy tarreau197e8ec2005-12-17 14:10:59 +01002225 rspidel ^Server:\
2226 rspadd Server:\ Formilux/0.1.8
2227
willy tarreau0f7af912005-12-17 12:21:26 +01002228
willy tarreau982249e2005-12-18 00:57:06 +01002229De plus, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
willy tarreauc1cae632005-12-17 14:12:23 +01002230'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002231connaître l'adresse IP du client initial. Depuis la version 1.3.8, il est
2232possible de préciser le mot-clé "except" suivi d'une adresse ou un réseau
2233IP source pour lequel l'entête ne sera pas ajouté. C'est très pratique dans le
2234cas où un autre reverse-proxy ajoutant déjà l'entête est installé sur la même
2235machine ou dans une DMZ connue. Le cas le plus fréquent est lié à l'utilisation
2236de stunnel en local.
willy tarreauc1cae632005-12-17 14:12:23 +01002237
willy tarreau982249e2005-12-18 00:57:06 +01002238Enfin, l'option 'httpclose' apparue dans la version 1.1.28/1.2.1 supprime tout
willy tarreauc5f73ed2005-12-18 01:26:38 +01002239en-tête de type 'Connection:' et ajoute 'Connection: close' dans les deux sens.
willy tarreau982249e2005-12-18 00:57:06 +01002240Ceci simplifie la désactivation du keep-alive HTTP par rapport à l'ancienne
2241méthode impliquant 4 règles.
2242
willy tarreauc1cae632005-12-17 14:12:23 +01002243Exemple :
2244---------
2245 listen http_proxy 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002246 mode http
2247 log global
2248 option httplog
2249 option dontlognull
Willy Tarreau7ac51f62007-03-25 16:00:04 +02002250 option forwardfor except 127.0.0.1/8
willy tarreauc5f73ed2005-12-18 01:26:38 +01002251 option httpclose
willy tarreauc1cae632005-12-17 14:12:23 +01002252
Willy TARREAU767ba712006-03-01 22:40:50 +01002253Notons que certains serveurs HTTP ne referment pas nécessairement la session
2254TCP en fin de traitement lorsqu'ils reçoivent un entête 'Connection: close',
2255ce qui se traduit par des grands nombres de sessions établies et des temps
2256globaux très longs sur les requêtes. Pour contourner ce problème, la version
22571.2.9 apporte une nouvelle option 'forceclose' qui referme la connexion sortant
2258vers le serveur dès qu'il commence à répondre et seulement si le tampon de
2259requête est vide. Attention toutefois à ne PAS utiliser cette option si des
2260méthodes CONNECT sont attendues entre le client et le serveur. L'option
2261'forceclose' implique l'option 'httpclose'.
2262
2263Exemple :
2264---------
2265 listen http_proxy 0.0.0.0:80
2266 mode http
2267 log global
2268 option httplog
2269 option dontlognull
2270 option forwardfor
2271 option forceclose
2272
2273
willy tarreauc29948c2005-12-17 13:10:27 +010022744.4) Répartition avec persistence
2275---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002276La combinaison de l'insertion de cookie avec la répartition de charge interne
2277permet d'assurer une persistence dans les sessions HTTP d'une manière
2278pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +01002279 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +01002280 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +01002281 - insérer un cookie dans les réponses issues d'une répartition uniquement,
2282 et faire en sorte que des caches ne mémorisent pas ce cookie.
2283 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +01002284
2285Exemple :
willy tarreau8337c6b2005-12-17 13:41:01 +01002286---------
willy tarreau5cbea6f2005-12-17 12:48:26 +01002287 listen application 0.0.0.0:80
willy tarreauc5f73ed2005-12-18 01:26:38 +01002288 mode http
2289 cookie SERVERID insert nocache indirect
2290 balance roundrobin
2291 server srv1 192.168.1.1:80 cookie server01 check
2292 server srv2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +01002293
willy tarreau0174f312005-12-18 01:02:42 +01002294L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un
2295cookie en provenance du serveur et de lui préfixer l'identifiant du serveur.
2296Dans ce cas, ne pas oublier de forcer le mode "httpclose" pour empêcher le
2297client et le serveur de travailler en mode "keep-alive" afin que le proxy
2298puisse corriger le nom du cookie dans toutes les futures requêtes.
2299
2300 listen application 0.0.0.0:80
2301 mode http
2302 cookie JSESSIONID prefix
2303 balance roundrobin
willy tarreau598da412005-12-18 01:07:29 +01002304 server srv1 192.168.1.1:80 cookie srv1 check
2305 server srv2 192.168.1.2:80 cookie srv2 check
willy tarreau0174f312005-12-18 01:02:42 +01002306 option httpclose
2307
2308
willy tarreau982249e2005-12-18 00:57:06 +010023094.5) Protection contre les fuites d'informations du serveur
2310-----------------------------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002311Dans les versions 1.1.28 et 1.2.1, une nouvelle option 'checkcache' a été
willy tarreauc5f73ed2005-12-18 01:26:38 +01002312créée. Elle sert à inspecter minutieusement les en-têtes 'Cache-control',
willy tarreau64a3cc32005-12-18 01:13:11 +01002313'Pragma', et 'Set-cookie' dans les réponses serveur pour déterminer s'il y a
2314un risque de cacher un cookie sur un proxy côté client. Quand cette option est
2315activée, les seules réponses qui peuvent être retournées au client sont :
willy tarreauc5f73ed2005-12-18 01:26:38 +01002316 - toutes celles qui n'ont pas d'en-tête 'Set-cookie' ;
willy tarreau982249e2005-12-18 00:57:06 +01002317 - toutes celles qui ont un code de retour autre que 200, 203, 206, 300, 301,
willy tarreauc5f73ed2005-12-18 01:26:38 +01002318 410, sauf si le serveur a positionné un en-tête 'Cache-control: public' ;
willy tarreau982249e2005-12-18 00:57:06 +01002319 - celles qui font suite à une requête POST, sauf si le serveur a positionné
willy tarreauc5f73ed2005-12-18 01:26:38 +01002320 un en-tête 'Cache-control: public' ;
2321 - celles qui ont un en-tête 'Pragma: no-cache' ;
2322 - celles qui ont un en-tête 'Cache-control: private' ;
2323 - celles qui ont un en-tête 'Cache-control: no-store' ;
2324 - celles qui ont un en-tête 'Cache-control: max-age=0' ;
2325 - celles qui ont un en-tête 'Cache-control: s-maxage=0' ;
2326 - celles qui ont un en-tête 'Cache-control: no-cache' ;
2327 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie"' ;
2328 - celles qui ont un en-tête 'Cache-control: no-cache="set-cookie,'
willy tarreau982249e2005-12-18 00:57:06 +01002329 (autorisant d'autres champs après set-cookie).
willy tarreau8337c6b2005-12-17 13:41:01 +01002330
willy tarreau982249e2005-12-18 00:57:06 +01002331Si une réponse ne respecte pas ces pré-requis, alors elle sera bloquée de la
2332même manière que s'il s'agissait d'un filtre 'rspdeny', avec en retour un
2333message "HTTP 502 bad gateway". L'état de session montre "PH--" ce qui veut
2334dire que c'est le proxy qui a bloqué la réponse durant le traitement des
willy tarreauc5f73ed2005-12-18 01:26:38 +01002335en-têtes. De plus, un message d'alerte sera envoyé dans les logs de sorte que
willy tarreau982249e2005-12-18 00:57:06 +01002336l'administrateur sache qu'il y a une action correctrice à entreprendre.
2337
23384.6) Personalisation des erreurs
2339--------------------------------
willy tarreau8337c6b2005-12-17 13:41:01 +01002340Certaines situations conduisent à retourner une erreur HTTP au client :
2341 - requête invalide ou trop longue => code HTTP 400
2342 - requête mettant trop de temps à venir => code HTTP 408
2343 - requête interdite (bloquée par un reqideny) => code HTTP 403
2344 - erreur interne du proxy => code HTTP 500
2345 - le serveur a retourné une réponse incomplète ou invalide => code HTTP 502
2346 - aucun serveur disponible pour cette requête => code HTTP 503
2347 - le serveur n'a pas répondu dans le temps imparti => code HTTP 504
2348
2349Un message d'erreur succint tiré de la RFC accompagne ces codes de retour.
2350Cependant, en fonction du type de clientèle, on peut préférer retourner des
willy tarreau64a3cc32005-12-18 01:13:11 +01002351pages personnalisées. Ceci est possible par le biais de la commande "errorloc":
willy tarreau8337c6b2005-12-17 13:41:01 +01002352
2353 errorloc <code_HTTP> <location>
2354
2355Au lieu de générer une erreur HTTP <code_HTTP> parmi les codes cités ci-dessus,
2356le proxy génèrera un code de redirection temporaire (HTTP 302) vers l'adresse
2357d'une page précisée dans <location>. Cette adresse peut être relative au site,
2358ou absolue. Comme cette réponse est traîtée par le navigateur du client
2359lui-même, il est indispensable que l'adresse fournie lui soit accessible.
2360
2361Exemple :
2362---------
2363 listen application 0.0.0.0:80
2364 errorloc 400 /badrequest.html
2365 errorloc 403 /forbidden.html
2366 errorloc 408 /toolong.html
willy tarreauc5f73ed2005-12-18 01:26:38 +01002367 errorloc 500 http://haproxy.domain.net/bugreport.html
willy tarreau8337c6b2005-12-17 13:41:01 +01002368 errorloc 502 http://192.168.114.58/error50x.html
2369 errorloc 503 http://192.168.114.58/error50x.html
2370 errorloc 504 http://192.168.114.58/error50x.html
2371
willy tarreauc1f47532005-12-18 01:08:26 +01002372Note: la RFC2616 stipule qu'un client doit réutiliser la même méthode pour
2373accéder à l'URL de redirection que celle qui l'a retournée, ce qui pose des
2374problèmes avec les requêtes POST. Le code de retour 303 a été créé exprès pour
2375régler ce problème, indiquant au client qu'il doit accéder à l'URL retournée
2376dans le champ Location avec la méthode GET uniquement. Seulement, certains
2377navigateurs antérieurs à HTTP/1.1 ne connaissent pas ce code de retour. De
2378plus, la plupart des navigateurs se comportent déjà avec le code 302 comme ils
2379devraient le faire avec le 303. Donc, dans le but de laisser le choix à
willy tarreauc5f73ed2005-12-18 01:26:38 +01002380l'utilisateur, les versions 1.1.31 et 1.2.5 apportent deux nouvelles commandes
2381visant à remplacer 'errorloc' : 'errorloc302' et 'errorloc303'.
willy tarreauc1f47532005-12-18 01:08:26 +01002382
2383Leur usage non ambigü est recommandé à la place de la commande 'errorloc' (qui
2384utilise toujours 302). Dans le doute, préférez l'utilisation de 'errorloc303'
2385dès que vous savez que vos clients supportent le code de retour HTTP 303.
2386
willy tarreau982249e2005-12-18 00:57:06 +010023874.7) Changement des valeurs par défaut
willy tarreaua41a8b42005-12-17 14:02:24 +01002388--------------------------------------
willy tarreau64a3cc32005-12-18 01:13:11 +01002389Dans la version 1.1.22 est apparue la notion de valeurs par défaut, ce qui
2390évite de répéter des paramètres communs à toutes les instances, tels que les
2391timeouts, adresses de log, modes de fonctionnement, etc.
willy tarreaua41a8b42005-12-17 14:02:24 +01002392
2393Les valeurs par défaut sont positionnées dans la dernière section 'defaults'
2394précédent l'instance qui les utilisera. On peut donc mettre autant de sections
2395'defaults' que l'on veut. Il faut juste se rappeler que la présence d'une telle
2396section implique une annulation de tous les paramètres par défaut positionnés
2397précédemment, dans le but de les remplacer.
2398
2399La section 'defaults' utilise la même syntaxe que la section 'listen', aux
2400paramètres près qui ne sont pas supportés. Le mot clé 'defaults' peut accepter
2401un commentaire en guise paramètre.
2402
willy tarreau982249e2005-12-18 00:57:06 +01002403Dans la version 1.1.28/1.2.1, seuls les paramètres suivants peuvent être
2404positionnés dans une section 'defaults' :
willy tarreaua41a8b42005-12-17 14:02:24 +01002405 - log (le premier et le second)
2406 - mode { tcp, http, health }
2407 - balance { roundrobin }
2408 - disabled (pour désactiver toutes les instances qui suivent)
2409 - enabled (pour faire l'opération inverse, mais c'est le cas par défaut)
2410 - contimeout, clitimeout, srvtimeout, grace, retries, maxconn
willy tarreau982249e2005-12-18 00:57:06 +01002411 - option { redispatch, transparent, keepalive, forwardfor, logasap, httpclose,
2412 checkcache, httplog, tcplog, dontlognull, persist, httpchk }
willy tarreaua41a8b42005-12-17 14:02:24 +01002413 - redispatch, redisp, transparent, source { addr:port }
willy tarreaua41a8b42005-12-17 14:02:24 +01002414 - cookie, capture
2415 - errorloc
willy tarreaueedaa9f2005-12-17 14:08:03 +01002416
2417Ne sont pas supportés dans cette version, les adresses de dispatch et les
2418configurations de serveurs, ainsi que tous les filtres basés sur les
2419expressions régulières :
2420 - dispatch, server,
willy tarreau197e8ec2005-12-17 14:10:59 +01002421 - req*, rsp*
willy tarreaua41a8b42005-12-17 14:02:24 +01002422
2423Enfin, il n'y a pas le moyen, pour le moment, d'invalider un paramètre booléen
2424positionné par défaut. Donc si une option est spécifiée dans les paramètres par
2425défaut, le seul moyen de la désactiver pour une instance, c'est de changer les
2426paramètres par défaut avant la déclaration de l'instance.
2427
2428Exemples :
2429----------
2430 defaults applications TCP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002431 log global
2432 mode tcp
2433 balance roundrobin
2434 clitimeout 180000
2435 srvtimeout 180000
2436 contimeout 4000
2437 retries 3
2438 redispatch
willy tarreaua41a8b42005-12-17 14:02:24 +01002439
2440 listen app_tcp1 10.0.0.1:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002441 server srv1 192.168.1.1 check port 6000 inter 10000
2442 server srv2 192.168.1.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002443
2444 listen app_tcp2 10.0.0.2:6000-6063
willy tarreauc5f73ed2005-12-18 01:26:38 +01002445 server srv1 192.168.2.1 check port 6000 inter 10000
2446 server srv2 192.168.2.2 backup
willy tarreaua41a8b42005-12-17 14:02:24 +01002447
2448 defaults applications HTTP
willy tarreauc5f73ed2005-12-18 01:26:38 +01002449 log global
2450 mode http
2451 option httplog
2452 option forwardfor
2453 option dontlognull
2454 balance roundrobin
2455 clitimeout 20000
2456 srvtimeout 20000
2457 contimeout 4000
2458 retries 3
willy tarreaua41a8b42005-12-17 14:02:24 +01002459
2460 listen app_http1 10.0.0.1:80-81
willy tarreauc5f73ed2005-12-18 01:26:38 +01002461 cookie SERVERID postonly insert indirect
2462 capture cookie userid= len 10
2463 server srv1 192.168.1.1:+8000 cookie srv1 check port 8080 inter 1000
2464 server srv1 192.168.1.2:+8000 cookie srv2 check port 8080 inter 1000
willy tarreaua41a8b42005-12-17 14:02:24 +01002465
2466 defaults
willy tarreauc5f73ed2005-12-18 01:26:38 +01002467 # section vide qui annule tous les paramètes par défaut.
willy tarreau8337c6b2005-12-17 13:41:01 +01002468
willy tarreau8f635a42006-05-21 23:05:54 +02002469
24704.8) Rapport d'état sous forme de page HTML
2471-------------------------------------------
2472Avec la version 1.2.14, il devient possible pour haproxy d'interceptre des
2473requêtes pour une URI particulière et de retourner un rapport complet d'état de
2474l'activité du proxy, et des statistiques sur les serveurs. Ceci est disponible
2475via le mot clé "stats" associé à n'importe laquelle de ces options :
2476
2477 - stats enable
2478 - stats uri <uri prefix>
2479 - stats realm <authentication realm>
2480 - stats auth <user:password>
2481 - stats scope <proxy_id> | '.'
2482
2483
2484Par défaut, le rapport est désactivé. Le fait de spécifier une des combinaision
2485ci-dessus active le rapport pour l'instance de proxy qui le référence. La
2486solution la plus simple est d'utiliser "stats enable" qui activera le rapport
2487avec les paramètres par défaut suivant :
2488
2489 - default URI : "/haproxy?stats" (CONFIG_STATS_DEFAULT_URI)
2490 - default auth : non spécifié (pas d'authentication)
2491 - default realm : "HAProxy Statistics" (CONFIG_STATS_DEFAULT_REALM)
2492 - default scope : non specifié (accès à toutes les instances)
2493
2494L'option "stats uri <uri_prefix>" permet d'intercepter un autre préfixe d'URI
2495que celui par défaut. Noter que n'importe quelle URI qui COMMENCE avec cette
2496chaîne sera validée. Par exemple, une instance pourrait être dédiée à la page
2497d'état seulement et répondre à toute URI.
2498
2499Example :
2500---------
2501 # intercepte n'importe quelle URI et retourne la page d'état.
2502 listen stats :8080
2503 mode http
2504 stats uri /
2505
2506
2507L'option "stats auth <user:password>" active l'authentification "Basic" et
2508ajoute un couple "user:password" valide à la liste des comptes autorisés.
2509L'utilisateur <user> et le mot de passe <password> doivent être précisés
2510en clair dans le fichier de configuration, et comme ceci est de
2511l'authentification HTTP "Basic", il faut être conscient qu'ils transitent en
2512clair sur le réseau, donc il ne faut pas utiliser de compte sensible. La liste
2513est illimitée dans le but de pouvoir fournir des accès facilement à des
2514développeurs ou à des clients.
2515
2516L'option "stats realm <realm>" définit le "domaine" ("realm") de validité du
2517mot de passe qui sera présenté dans la boîte de dialogue du navigateur
2518lorsqu'il demandera un compte utilisateur et un mot de passe. Il est important
2519de s'assurer que celui-ci soit différent de ceux utilisés par l'application,
2520autrement le navigateur tentera d'en utiliser un caché depuis l'application.
2521Noter que les espaces dans le nom de "realm" doivent être protégés par un
2522backslash ('\').
2523
2524L'option "stats scope <proxy_id>" limite la portée du rapport d'état. Par
2525défaut, toutes les instances proxy sont listées. Mais dans certaines
2526circonstances, il serait préférable de ne lister que certains proxies ou
2527simplement le proxy courant. C'est ce que fait cette option. Le nom spécial "."
2528(un simple point) référence le proxy courant. Cette option peut être répétée
2529autant de fois que nécessaire pour autoriser d'autres proxies, même pour des
2530noms référencés plus loin dans la configuration ou bien des noms qui n'existent
2531pas encore. Le nom précisé est celui qui apparait après le mot clé "listen".
2532
2533Exemple :
2534---------
2535 # simple application embarquant la page d'état authentifiée
2536 listen app1 192.168.1.100:80
2537 mode http
2538 option httpclose
2539 balance roundrobin
2540 cookie SERVERID postonly insert indirect
2541 server srv1 192.168.1.1:8080 cookie srv1 check inter 1000
2542 server srv1 192.168.1.2:8080 cookie srv2 check inter 1000
2543 stats uri /my_stats
2544 stats realm Statistics\ for\ MyApp1-2
2545 stats auth guest:guest
2546 stats auth admin:AdMiN123
2547 stats scope .
2548 stats scope app2
2549
2550 # simple application embarquant la page d'état sans authentification
2551 listen app2 192.168.2.100:80
2552 mode http
2553 option httpclose
2554 balance roundrobin
2555 cookie SERVERID postonly insert indirect
2556 server srv1 192.168.2.1:8080 cookie srv1 check inter 1000
2557 server srv1 192.168.2.2:8080 cookie srv2 check inter 1000
2558 stats uri /my_stats
2559 stats realm Statistics\ for\ MyApp2
2560 stats scope .
2561
2562 listen admin_page :8080
2563 mode http
2564 stats uri /my_stats
2565 stats realm Global\ statistics
2566 stats auth admin:AdMiN123
2567
2568Notes :
2569-------
2570 - les options "stats" peuvent aussi être spécifiées dans une section
2571 "defaults", auquel cas la même configuration exactement sera fournie à
2572 toutes les instances suivantes, d'où l'utilité du scope ".". Toutefois, si
2573 une instance redéfinit n'importe quel paramètre "stats", alors les défauts
2574 ne lui seront pas appliqués.
2575
2576 - l'authentification "Basic" est très simpliste et non sécurisée contre la
2577 capture réseau. Aucun mot de passe sensible ne doit être utilisé, et il
2578 est bon de savoir qu'il n'existe pas de moyen de le supprimer du navigateur
2579 après usage, donc il sera envoyé tel quel à l'application au cours des
2580 accès successifs.
2581
2582 - Il est très important de préciser l'option "httpclose", sinon le proxy ne
2583 sera pas en mesure de détecter les URI dans les sessions keep-alive
2584 maintenues entre le navigateur et les serveurs, donc les URI de stats
2585 seront transmises telles quelles aux serveurs comme si l'option n'était
2586 pas précisée.
2587
2588
willy tarreaub719f002005-12-17 12:55:07 +01002589=======================
2590| Paramétrage système |
2591=======================
willy tarreau0f7af912005-12-17 12:21:26 +01002592
2593Sous Linux 2.4
2594==============
2595
willy tarreaub719f002005-12-17 12:55:07 +01002596-- cut here --
2597#!/bin/sh
2598# set this to about 256/4M (16384 for 256M machine)
2599MAXFILES=16384
2600echo $MAXFILES > /proc/sys/fs/file-max
2601ulimit -n $MAXFILES
2602
2603if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002604 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
willy tarreaub719f002005-12-17 12:55:07 +01002605fi
2606
2607if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
willy tarreauc5f73ed2005-12-18 01:26:38 +01002608 # 30 seconds for fin, 15 for time wait
2609 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
2610 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
2611 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
2612 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
willy tarreaub719f002005-12-17 12:55:07 +01002613fi
2614
willy tarreau0f7af912005-12-17 12:21:26 +01002615echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +01002616echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2617echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +01002618echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +01002619echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
2620echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +01002621echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
2622echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +01002623echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreauc5f73ed2005-12-18 01:26:38 +01002624echo 1 > /proc/sys/net/ipv4/tcp_sack
willy tarreaub719f002005-12-17 12:55:07 +01002625echo 0 > /proc/sys/net/ipv4/tcp_dsack
2626
2627# auto-tuned on 2.4
2628#echo 262143 > /proc/sys/net/core/rmem_max
2629#echo 262143 > /proc/sys/net/core/rmem_default
2630
2631echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
2632echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
2633
2634-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +01002635
willy tarreau197e8ec2005-12-17 14:10:59 +01002636Sous FreeBSD
2637============
2638
2639Un port de HA-Proxy sous FreeBSD est désormais disponible, grâce à
2640Clement Laforet <sheepkiller@cultdeadsheep.org>.
2641
2642Pour plus d'informations :
2643http://www.freebsd.org/cgi/url.cgi?ports/net/haproxy/pkg-descr
2644http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/haproxy/
2645http://www.freshports.org/net/haproxy
2646
2647
willy tarreau0f7af912005-12-17 12:21:26 +01002648-- fin --