blob: 23c2a0e5b24369425808d3d022643a02ac0871b9 [file] [log] [blame]
willy tarreau0f7af912005-12-17 12:21:26 +01001
2 H A - P r o x y
3 ---------------
willy tarreau240afa62005-12-17 13:14:35 +01004 version 1.1.11
willy tarreau0f7af912005-12-17 12:21:26 +01005 willy tarreau
willy tarreau240afa62005-12-17 13:14:35 +01006 2002/06/11
willy tarreau0f7af912005-12-17 12:21:26 +01007
willy tarreaub719f002005-12-17 12:55:07 +01008================
9| Introduction |
10================
willy tarreau0f7af912005-12-17 12:21:26 +010011
12HA-Proxy est un relais TCP/HTTP offrant des facilités d'intégration en
13environnement hautement disponible. En effet, il est capable de :
willy tarreauc29948c2005-12-17 13:10:27 +010014 - effectuer un aiguillage statique défini par des cookies ;
15 - effectuer une répartition de charge avec création de cookies pour assurer la
willy tarreaua1598082005-12-17 13:08:06 +010016 persistence de session ;
willy tarreau0f7af912005-12-17 12:21:26 +010017 - fournir une visibilité externe de son état de santé ;
18 - s'arrêter en douceur sans perte brutale de service.
willy tarreau5cbea6f2005-12-17 12:48:26 +010019 - modifier/ajouter/supprimer des entêtes dans la requête et la réponse.
willy tarreaua1598082005-12-17 13:08:06 +010020 - interdire des requêtes qui vérifient certaines conditions.
willy tarreau0f7af912005-12-17 12:21:26 +010021
willy tarreaua1598082005-12-17 13:08:06 +010022Il requiert peu de ressources, et son architecture événementielle mono-processus
23lui permet facilement de gérer plusieurs milliers de connexions simultanées sur
24plusieurs relais sans effondrer le système.
25
willy tarreau0f7af912005-12-17 12:21:26 +010026
27===========================
28| Paramètres de lancement |
29===========================
30
31Les options de lancement sont peu nombreuses :
32
33 -f <fichier de configuration>
34 -n <nombre maximal total de connexions simultanées>
35 -N <nombre maximal de connexions simultanées par proxy>
36 -d active le mode debug
37 -D passe en daemon
38 -s affiche les statistiques (si option compilée)
39 -l ajoute des informations aux statistiques
40
willy tarreaua1598082005-12-17 13:08:06 +010041Le nombre maximal de connexion simultanées par proxy est le paramètre par défaut
42pour les proxies pour lesquels ce paramètre n'est pas précisé dans le fichier de
43configuration. Il s'agit du paramètre 'maxconn' dans les sections 'listen'.
willy tarreau0f7af912005-12-17 12:21:26 +010044
willy tarreaua1598082005-12-17 13:08:06 +010045Le nombre maximal total de connexions simultanées limite le nombre de connexions
willy tarreauc29948c2005-12-17 13:10:27 +010046TCP utilisables à un instant donné par le processus, tous proxies confondus. Ce
willy tarreaua1598082005-12-17 13:08:06 +010047paramètre remplace le paramètre 'maxconn' de la section 'global'.
48
willy tarreauc29948c2005-12-17 13:10:27 +010049Le mode debug correspond à l'option 'debug' de la section 'global'. Dans ce
50mode, toutes les connexions, déconnexions, et tous les échanges d'entêtes HTTP
51sont affichés.
52
53Les statistiques ne sont disponibles que si le programme a été compilé avec
54l'option "STATTIME". Il s'agit principalement de données brutes n'ayant
55d'utilité que lors de benchmarks par exemple.
56
willy tarreau0f7af912005-12-17 12:21:26 +010057
58============================
59| Fichier de configuration |
60============================
61
willy tarreauc29948c2005-12-17 13:10:27 +010062Structure
63=========
willy tarreau0f7af912005-12-17 12:21:26 +010064
willy tarreaua1598082005-12-17 13:08:06 +010065L'analyseur du fichier de configuration ignore des lignes vides, les espaces,
66les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est pas
willy tarreauc29948c2005-12-17 13:10:27 +010067précédé d'un '\'), et la fin de la ligne, ce qui constitue un commentaire.
willy tarreaua1598082005-12-17 13:08:06 +010068
69Le fichier de configuration est découpé en sections répérées par des mots clés
70tels que :
71
72 - 'global'
73 - 'listen'
74
75Tous les paramètres font référence à la section définie par le dernier mot clé
76reconnu.
77
78
willy tarreauc29948c2005-12-17 13:10:27 +0100791) Paramètres globaux
80=====================
willy tarreaua1598082005-12-17 13:08:06 +010081
82Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des
83proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres
84supportés sont :
85
86 - log <adresse> <catégorie>
87 - maxconn <nombre>
88 - uid <identifiant>
89 - gid <identifiant>
90 - chroot <répertoire>
91 - nbproc <nombre>
92 - daemon
93 - debug
94 - quiet
95
961.1) Journalisation des événements
97----------------------------------
98La plupart des événements sont journalisés : démarrages, arrêts, disparition et
99apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en
100syslog vers un ou deux serveurs. La syntaxe est la suivante :
101
102 log <adresse_ip> <facility>
103
104Les connexions sont envoyées en niveau "info". Les démarrages de service et de
105serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les
106arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi
willy tarreauc29948c2005-12-17 13:10:27 +0100107bien pour les proxies que pour les serveurs testés par les proxies.
willy tarreaua1598082005-12-17 13:08:06 +0100108
109Les catégories possibles sont :
110 kern, user, mail, daemon, auth, syslog, lpr, news,
111 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
112 local0, local1, local2, local3, local4, local5, local6, local7
113
114Exemple :
115---------
116 global
117 log 192.168.2.200 local3
118 log 192.168.2.201 local4
119
1201.2) limitation du nombre de connexions
121---------------------------------------
122Il est possible et conseillé de limiter le nombre global de connexions par
123processus. Les connexions sont comprises au sens 'acceptation de connexion',
124donc il faut s'attendre en règle général à avoir un peu plus du double de
125sessions TCP que le maximum de connexions fixé. C'est important pour fixer le
126paramètre 'ulimit -n' avant de lancer le proxy. Pour comptabiliser le nombre
127de sockets nécessaires, il faut prendre en compte ces paramètres :
128 - 1 socket par connexion entrante
129 - 1 socket par connexion sortante
130 - 1 socket par proxy
131 - 1 socket pour chaque serveur en cours de health-check
willy tarreauc29948c2005-12-17 13:10:27 +0100132 - 1 socket pour les logs (tous serveurs confondus)
willy tarreaua1598082005-12-17 13:08:06 +0100133
134Positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à
willy tarreauc29948c2005-12-17 13:10:27 +01001352 * maxconn + nbproxy + nbserveurs + 1. Dans une future version, haproxy sera
136capable de positionner lui-même cette limite.
137
1381.3) Diminution des privilèges
139------------------------------
140Afin de réduire les risques d'attaques dans le cas où une faille non identifiée
141serait exploitée, il est possible de diminuer les privilèges du processus, et
142de le cloisonner.
willy tarreaua1598082005-12-17 13:08:06 +0100143
willy tarreauc29948c2005-12-17 13:10:27 +0100144Dans la section 'global', le paramètre 'uid' permet de spécifier un identifiant
145numérique d'utilisateur. La valeur 0, correspondant normalement au super-
146utilisateur, possède ici une signification particulière car elle indique que
147l'on ne souhaite pas changer cet identifiant et conserver la valeur courante.
148C'est la valeur par défaut. De la même manière, le paramètre 'gid' correspond à
149un identifiant de groupe, et utilise par défaut la valeur 0 pour ne rien
150changer. Il est particulièrement déconseillé d'utiliser des comptes génériques
151tels que 'nobody' car cette pratique revient à utiliser 'root' si d'autres
152processus utilisent les mêmes identifiants.
153
154Le paramètre 'chroot' autorise à changer la racine du processus une fois le
155programme lancé, de sorte que ni le processus, ni l'un de ses descendants ne
156puisse remonter de nouveau à la racine. Ce type de cloisonnement (chroot) est
157parfois contournable sur certains OS (Linux 2.2, Solaris), mais visiblement
158fiable sur d'autres (Linux 2.4). Aussi, il est important d'utiliser un
159répertoire spécifique au service pour cet usage, et de ne pas mutualiser un même
160répertoire pour plusieurs services de nature différente.
161
162Remarque: dans le cas où une telle faille serait mise en évidence, il est fort
163probable que les premières tentatives de son exploitation provoquent un arrêt du
164programme, à cause d'un signal de type 'Segmentation Fault', 'Bus Error' ou
165encore 'Illegal Instruction'. Même s'il est vrai que faire tourner le serveur en
166environnement limité réduit les risques d'intrusion, il est parfois bien utile
167dans ces circonstances de connaître les conditions d'apparition du problème, via
168l'obtention d'un fichier 'core'. La plupart des systèmes, pour des raisons de
169sécurité, désactivent la génération du fichier 'core' après un changement
170d'identifiant pour le processus. Il faudra donc soit lancer le processus à
171partir d'un compte utilisateur aux droits réduits (mais ne pouvant pas effectuer
172le chroot), ou bien le faire en root sans réduction des droits (uid 0). Dans ce
173cas, le fichier se trouvera soit dans le répertoire de lancement, soit dans le
174répertoire spécifié après l'option 'chroot'. Ne pas oublier la commande suivante
175pour autoriser la génération du fichier avant de lancer le programme :
176
177# ulimit -c unlimited
willy tarreaua1598082005-12-17 13:08:06 +0100178
willy tarreauc29948c2005-12-17 13:10:27 +0100179Exemple :
180---------
181
182 global
183 uid 30000
184 gid 30000
185 chroot /var/chroot/haproxy
186
1871.4) modes de fonctionnement
188----------------------------
189Le service peut fonctionner dans plusieurs modes :
190 - avant- / arrière-plan
191 - silencieux / normal / debug
willy tarreau0f7af912005-12-17 12:21:26 +0100192
willy tarreauc29948c2005-12-17 13:10:27 +0100193Le mode par défaut est normal, avant-plan, c'est à dire que le programme ne rend
194pas la main une fois lancé. Il ne faut surtout pas le lancer comme ceci dans un
195script de démarrage du système, sinon le système ne finirait pas son
196initialisation. Il faut le mettre en arrière-plan, de sorte qu'il rende la main
197au processus appelant. C'est ce que fait l'option 'daemon' de la section
198'global', et qui est l'équivalent du paramètre '-D' de la ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100199
willy tarreauc29948c2005-12-17 13:10:27 +0100200Par ailleurs, certains messages d'alerte sont toujours envoyés sur la sortie
201standard, même en mode 'daemon'. Pour ne plus les voir ailleurs que dans les
202logs, il suffit de passer en mode silencieux par l'ajout de l'option 'quiet'.
203Cette option n'a pas d'équivalent en ligne de commande.
willy tarreau0f7af912005-12-17 12:21:26 +0100204
willy tarreauc29948c2005-12-17 13:10:27 +0100205Enfin, le mode 'debug' permet de diagnostiquer les origines de certains
206problèmes en affichant les connexions, déconnexions et échanges d'en-têtes HTTP
207entre les clients et les serveurs. Ce mode est incompatible avec les options
208'daemon' et 'quiet' pour des raisons de bon sens.
209
2101.5) accroissement de la capacité de traitement
211-----------------------------------------------
212Sur des machines multi-processeurs, il peut sembler gâché de n'utiliser qu'un
213processeur pour effectuer les tâches de relayage, même si les charges
214nécessaires à saturer un processeur actuel sont bien au-delà des ordres de
215grandeur couramment rencontrés. Cependant, pour des besoins particuliers, le
216programme sait démarrer plusieurs processus se répartissant la charge de
217travail. Ce nombre de processus est spécifié par le paramètre 'nbproc' de la
218section 'global'. Sa valeur par défaut est naturellement 1. Ceci ne fonctionne
219qu'en mode 'daemon'.
220
221Exemple :
222---------
223
224 global
225 daemon
226 quiet
227 nbproc 2
228
229
2302) Définition d'un service en écoute
231====================================
232
233Les sections de service débutent par le mot clé "listen" :
willy tarreau0f7af912005-12-17 12:21:26 +0100234
235 listen <nom_instance> <adresse_IP>:<port>
236
willy tarreauc29948c2005-12-17 13:10:27 +0100237- <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé dans les
238 logs, donc il est souhaitable d'utiliser un nom relatif au service relayé. Aucun
239 test n'est effectué concernant l'unicité de ce nom, qui n'est pas obligatoire,
240 mais fortement recommandée.
willy tarreau0f7af912005-12-17 12:21:26 +0100241
willy tarreauc29948c2005-12-17 13:10:27 +0100242- <adresse_IP> est l'adresse IP sur laquelle le relais attend ses
243 connexions. L'adresse 0.0.0.0 signifie que les connexions pourront s'effectuer
244 sur toutes les adresses de la machine.
willy tarreau0f7af912005-12-17 12:21:26 +0100245
willy tarreauc29948c2005-12-17 13:10:27 +0100246- <port> est le numéro de port TCP sur lequel le relais attend ses
247 connexions. Le couple <adresse_IP>:<port> doit être unique pour toutes les
248 instances d'une même machine. L'attachement à un port inférieur à 1024
249 nécessite un niveau de privilège particulier lors du lancement du programme
250 (indépendamment du paramètre 'uid' de la section 'global').
willy tarreau0f7af912005-12-17 12:21:26 +0100251
252Exemple :
253---------
254 listen http_proxy 127.0.0.1:80
255
willy tarreau0f7af912005-12-17 12:21:26 +0100256
willy tarreauc29948c2005-12-17 13:10:27 +01002572.1) Inhibition d'un service
258----------------------------
259Un serveur peut être désactivé pour des besoins de maintenance, sans avoir à
260commenter toute une partie du fichier. Il suffit de positionner le mot clé
261"disabled" dans sa section :
willy tarreau0f7af912005-12-17 12:21:26 +0100262
263 listen smtp_proxy 0.0.0.0:25
264 disabled
265
willy tarreauc29948c2005-12-17 13:10:27 +01002662.2) Mode de fonctionnement
267---------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100268Un serveur peut fonctionner dans trois modes différents :
269 - TCP
270 - HTTP
271 - supervision
272
273Mode TCP
274--------
willy tarreauc29948c2005-12-17 13:10:27 +0100275Dans ce mode, le service relaye, dès leur établissement, les connexions TCP vers
276un ou plusieurs serveurs. Aucun traitement n'est effectué sur le flux. Il s'agit
277simplement d'une association source<adresse:port> -> destination<adresse:port>.
278Pour l'utiliser, préciser le mode TCP sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100279
willy tarreauc29948c2005-12-17 13:10:27 +0100280Exemple :
281---------
willy tarreau0f7af912005-12-17 12:21:26 +0100282 listen smtp_proxy 0.0.0.0:25
283 mode tcp
284
285Mode HTTP
286---------
willy tarreauc29948c2005-12-17 13:10:27 +0100287Dans ce mode, le service relaye les connexions TCP vers un ou plusieurs
288serveurs, une fois qu'il dispose d'assez d'informations pour en prendre la
289décision. Les entêtes HTTP sont analysés pour y trouver un éventuel cookie, et
290certains d'entre-eux peuvent être modifiés par le biais d'expressions
291régulières. Pour activer ce mode, préciser le mode HTTP sous la déclaration du
292relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100293
willy tarreauc29948c2005-12-17 13:10:27 +0100294Exemple :
295---------
willy tarreau0f7af912005-12-17 12:21:26 +0100296 listen http_proxy 0.0.0.0:80
297 mode http
298
299Mode supervision
300----------------
willy tarreauc29948c2005-12-17 13:10:27 +0100301Il s'agit d'un mode offrant à un composant externe une visibilité de l'état de
302santé du service. Il se contente de retourner "OK" à tout client se connectant
303sur son port. Il peut être utilisé avec des répartiteurs de charge évolués pour
304déterminer quels sont les services utilisables. Pour activer ce mode, préciser
305le mode HEALTH sous la déclaration du relais.
willy tarreau0f7af912005-12-17 12:21:26 +0100306
willy tarreauc29948c2005-12-17 13:10:27 +0100307Exemple :
308---------
willy tarreau0f7af912005-12-17 12:21:26 +0100309 listen health_check 0.0.0.0:60000
310 mode health
311
312
willy tarreauc29948c2005-12-17 13:10:27 +01003132.3) Limitation du nombre de connexions simultanées
314---------------------------------------------------
315Le paramètre "maxconn" permet de fixer la limite acceptable en nombre de
316connexions simultanées par proxy. Chaque proxy qui atteint cette valeur cesse
317d'écouter jusqu'à libération d'une connexion. Voir plus loin concernant les
318limitations liées au système.
willy tarreau0f7af912005-12-17 12:21:26 +0100319
willy tarreauc29948c2005-12-17 13:10:27 +0100320Exemple :
321---------
322 listen tiny_server 0.0.0.0:80
323 maxconn 10
willy tarreau0f7af912005-12-17 12:21:26 +0100324
325
willy tarreauc29948c2005-12-17 13:10:27 +01003262.4) Arrêt en douceur
327---------------------
328Il est possible d'arrêter les services en douceur en envoyant un signal SIG_USR1
329au processus relais. Tous les services seront alors mis en phase d'arrêt, mais
330pourront continuer d'accepter des connexions pendant un temps défini par le
331paramètre 'grace' (en millisecondes). Cela permet par exemple, de faire savoir
332rapidement à un répartiteur de charge qu'il ne doit plus utiliser un relais,
333tout en continuant d'assurer le service le temps qu'il s'en rende compte.
334Remarque : les connexions actives ne sont jamais cassées. Dans le pire des cas,
335il faudra attendre en plus leur expiration avant l'arrêt total du processus. La
336valeur par défaut est 0 (pas de grâce, arrêt immédiat de l'écoute).
willy tarreau0f7af912005-12-17 12:21:26 +0100337
338Exemple :
339---------
willy tarreauc29948c2005-12-17 13:10:27 +0100340 # arrêter en douceur par 'killall -USR1 haproxy'
willy tarreau0f7af912005-12-17 12:21:26 +0100341 # le service tournera encore 10 secondes après la demande d'arrêt
342 listen http_proxy 0.0.0.0:80
343 mode http
344 grace 10000
345
willy tarreauc29948c2005-12-17 13:10:27 +0100346 # ce port n'est testé que par un répartiteur de charge.
willy tarreau0f7af912005-12-17 12:21:26 +0100347 listen health_check 0.0.0.0:60000
348 mode health
349 grace 0
350
351
willy tarreauc29948c2005-12-17 13:10:27 +01003522.5) Temps d'expiration des connexions
353--------------------------------------
354Il est possible de paramétrer certaines durées d'expiration au niveau des
355connexions TCP. Trois temps indépendants sont configurables et acceptent des
356valeurs en millisecondes. Si l'une de ces trois temporisations est dépassée, la
357session est terminée à chaque extrémité.
willy tarreau0f7af912005-12-17 12:21:26 +0100358
359 - temps d'attente d'une donnée de la part du client, ou de la
360 possibilité de lui envoyer des données : "clitimeout" :
361
362 # time-out client à 2mn30.
363 clitimeout 150000
364
365 - temps d'attente d'une donnée de la part du serveur, ou de la
366 possibilité de lui envoyer des données : "srvtimeout" :
367
willy tarreauc29948c2005-12-17 13:10:27 +0100368 # time-out serveur à 30s.
willy tarreau0f7af912005-12-17 12:21:26 +0100369 srvtimeout 30000
370
371 - temps d'attente de l'établissement d'une connexion vers un serveur
372 "contimeout" :
373
willy tarreauc29948c2005-12-17 13:10:27 +0100374 # on abandonne si la connexion n'est pas établie après 4 secondes
375 contimeout 4000
willy tarreau0f7af912005-12-17 12:21:26 +0100376
willy tarreauc29948c2005-12-17 13:10:27 +0100377Remarques :
378-----------
379 - "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas du serveur de
380 type "health".
381 - sous de fortes charges, ou sur un réseau saturé ou défectueux, il est
382 possible de perdre des paquets. Du fait que la première retransmission TCP
383 n'ait lieu qu'au bout de 3 secoudes, fixer un timeout de connexion inférieur
384 à 3 secondes ne permet pas de se rattraper sur la perte de paquets car la
385 session aura été abandonnée avant la première retransmission. Une valeur de
386 4 secondes réduira considérablement le nombre d'échecs de connexion.
willy tarreau0f7af912005-12-17 12:21:26 +0100387
willy tarreauc29948c2005-12-17 13:10:27 +01003882.6) Tentatives de reconnexion
389------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100390Lors d'un échec de connexion vers un serveur, il est possible de
391retenter (potentiellement vers un autre serveur, en cas de répartition
392de charge). Le nombre de nouvelles tentatives infructueuses avant
willy tarreauc29948c2005-12-17 13:10:27 +0100393abandon est fourni par le paramètre "retries".
willy tarreau0f7af912005-12-17 12:21:26 +0100394
willy tarreauc29948c2005-12-17 13:10:27 +0100395Exemple :
396---------
willy tarreau0f7af912005-12-17 12:21:26 +0100397 # on essaie encore trois fois maxi
398 retries 3
399
willy tarreau0f7af912005-12-17 12:21:26 +0100400
willy tarreauc29948c2005-12-17 13:10:27 +01004012.7) Adresse du serveur
402-----------------------
403Le serveur vers lequel sont redirigées les nouvelles connexions est défini par
404le paramètre "dispatch" sous la forme <adresse_ip>:<port>. Il correspond à un
405serveur d'assignation de cookie dans le cas où le service consiste à assurer
406uniquement une persistence HTTP, ou bien simplement au serveur destination dans
407le cas de relayage TCP simple.
willy tarreau0f7af912005-12-17 12:21:26 +0100408
willy tarreauc29948c2005-12-17 13:10:27 +0100409Exemple :
410---------
willy tarreau0f7af912005-12-17 12:21:26 +0100411 # on envoie toutes les nouvelles connexions ici
412 dispatch 192.168.1.2:80
413
willy tarreauc29948c2005-12-17 13:10:27 +0100414Remarque :
415----------
416Ce paramètre n'a pas d'utilité pour un serveur en mode 'health', ni en mode
417'balance'.
willy tarreau0f7af912005-12-17 12:21:26 +0100418
willy tarreau0f7af912005-12-17 12:21:26 +0100419
willy tarreau240afa62005-12-17 13:14:35 +01004202.8) Adresse de sortie
421----------------------
422Il est possible de forcer l'adresse utilisée pour établir les connexions
423vers les serveurs à l'aide du paramètre "source". Il est même possible de
424forcer le port, bien que cette fonctionnalité se limite à des usages très
425spécifiques. C'est particulièrement utile en cas d'adressage multiple, et
426plus généralement pour permettre aux serveurs de trouver le chemin de
427retour dans des contextes de routage difficiles. Si l'adresse est 0.0.0.0,
428elle sera choisie librement par le systeme. Si le port est 0, il
429sera choisi librement par le système.
430
431Exemples :
432----------
433 listen http_proxy 0.0.0.0:80
434 # toutes les connexions prennent l'adresse 192.168.1.200
435 source 192.168.1.200:0
436
437 listen rlogin_proxy 0.0.0.0:513
438 # utiliser l'adresse 192.168.1.200 et le port réservé 900
439 source 192.168.1.200:900
440
441
4422.9) Définition du nom du cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100443--------------------------------
444En mode HTTP, il est possible de rechercher la valeur d'un cookie pour savoir
445vers quel serveur aiguiller la requête utilisateur. Le nom du cookie est donné
446par le paramètre "cookie".
willy tarreau0f7af912005-12-17 12:21:26 +0100447
willy tarreauc29948c2005-12-17 13:10:27 +0100448Exemple :
449---------
willy tarreau0f7af912005-12-17 12:21:26 +0100450 listen http_proxy 0.0.0.0:80
451 mode http
452 cookie SERVERID
453
willy tarreauc29948c2005-12-17 13:10:27 +0100454On peut modifier l'utilisation du cookie pour la rendre plus intelligente
455vis-à-vis des applications relayées. Il est possible, notamment de supprimer ou
456réécrire un cookie retourné par un serveur accédé en direct, et d'insérer un
457cookie dans une réponse HTTP adressée à un serveur sélectionné en répartition
willy tarreau240afa62005-12-17 13:14:35 +0100458de charge, et même de signaler aux proxies amont de ne pas cacher le cookie
459inséré.
willy tarreauc29948c2005-12-17 13:10:27 +0100460
461Exemples :
462----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100463
464Pour ne conserver le cookie qu'en accès indirect, donc à travers le
willy tarreauc29948c2005-12-17 13:10:27 +0100465dispatcheur, et supprimer toutes ses éventuelles occurences lors des accès
466directs :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100467
468 cookie SERVERID indirect
469
willy tarreauc29948c2005-12-17 13:10:27 +0100470Pour remplacer la valeur d'un cookie existant par celle attribuée à un serveur,
471lors d'un accès direct :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100472
473 cookie SERVERID rewrite
474
willy tarreauc29948c2005-12-17 13:10:27 +0100475Pour créer un cookie comportant la valeur attribuée à un serveur lors d'un accès
476en répartition de charge interne. Dans ce cas, il est indispensable que tous les
477serveurs aient un cookie renseigné :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100478
479 cookie SERVERID insert
480
willy tarreau240afa62005-12-17 13:14:35 +0100481Pour insérer un cookie, en s'assurant qu'un cache en amont ne le stockera pas,
482ajouter le mot clé 'nocache' après 'insert' :
483
484 cookie SERVERID insert nocache
485
486
willy tarreau96d40372005-12-17 13:11:56 +0100487Remarques :
488-----------
489- Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' pour s'adapter
490 à des applications générant déjà le cookie, avec un contenu invalide. Il suffit
491 pour cela de les spécifier sur la même ligne.
492- dans le cas où 'insert' et 'indirect' sont spécifiés, le cookie n'est jamais
493 transmis au serveur vu qu'il n'en a pas connaissance et ne pourrait pas le
494 comprendre.
willy tarreau240afa62005-12-17 13:14:35 +0100495- il est particulièrement recommandé d'utiliser 'nocache' en mode insertion si
496 des caches peuvent se trouver entre les clients et l'instance du proxy. Dans
497 le cas contraire, un cache HTTP 1.0 pourrait cacher la réponse, incluant le
498 cookie de persistence inséré, donc provoquer des changements de serveurs pour
499 des clients partageant le même cache.
willy tarreau0f7af912005-12-17 12:21:26 +0100500
willy tarreau240afa62005-12-17 13:14:35 +01005012.10) Assignation d'un serveur à une valeur de cookie
willy tarreauc29948c2005-12-17 13:10:27 +0100502----------------------------------------------------
willy tarreau0f7af912005-12-17 12:21:26 +0100503En mode HTTP, il est possible d'associer des serveurs à des valeurs de
willy tarreauc29948c2005-12-17 13:10:27 +0100504cookie par le paramètre 'server'. La syntaxe est :
willy tarreau0f7af912005-12-17 12:21:26 +0100505
willy tarreau5cbea6f2005-12-17 12:48:26 +0100506 server <identifiant> <adresse_ip>:<port> cookie <valeur>
willy tarreau0f7af912005-12-17 12:21:26 +0100507
willy tarreauc29948c2005-12-17 13:10:27 +0100508- <identifiant> est un nom quelconque de serveur utilisé pour l'identifier dans la
509 configuration et les logs.
510- <adresse_ip>:<port> est le couple adresse-port sur lequel le serveur écoute.
511- <valeur> est la valeur à reconnaître ou positionner dans le cookie.
willy tarreau0f7af912005-12-17 12:21:26 +0100512
513Exemple : le cookie SERVERID peut contenir server01 ou server02
willy tarreauc29948c2005-12-17 13:10:27 +0100514---------
willy tarreau0f7af912005-12-17 12:21:26 +0100515 listen http_proxy 0.0.0.0:80
516 mode http
517 cookie SERVERID
518 dispatch 192.168.1.100:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100519 server web1 192.168.1.1:80 cookie server01
520 server web2 192.168.1.2:80 cookie server02
521
522Attention : la syntaxe a changé depuis la version 1.0.
willy tarreauc29948c2005-12-17 13:10:27 +0100523-----------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100524
willy tarreauc29948c2005-12-17 13:10:27 +01005253) Répartiteur de charge interne
526=================================
willy tarreau5cbea6f2005-12-17 12:48:26 +0100527
willy tarreauc29948c2005-12-17 13:10:27 +0100528Le relais peut effectuer lui-même la répartition de charge entre les différents
529serveurs définis pour un service donné, en mode TCP comme en mode HTTP. Pour
530cela, on précise le mot clé 'balance' dans la définition du service,
531éventuellement suivi du nom d'un algorithme de répartition. En version 1.1.9,
532seul 'roundrobin' est géré, et c'est aussi la valeur implicite par défaut. Il
533est évident qu'en cas d'utilisation du répartiteur interne, il ne faudra pas
534spécifier d'adresse de dispatch, et qu'il faudra au moins un serveur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100535
536Exemple : même que précédemment en répartition interne
willy tarreauc29948c2005-12-17 13:10:27 +0100537---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100538
539 listen http_proxy 0.0.0.0:80
540 mode http
541 cookie SERVERID
542 balance roundrobin
543 server web1 192.168.1.1:80 cookie server01
544 server web2 192.168.1.2:80 cookie server02
545
willy tarreau0f7af912005-12-17 12:21:26 +0100546
willy tarreauc29948c2005-12-17 13:10:27 +01005473.1) Surveillance des serveurs
548------------------------------
549A cette date, l'état des serveurs n'est testé que par établissement de connexion
550TCP toutes les 2 secondes, avec 3 essais pour déclarer un serveur en panne, 2
551pour le déclarer utilisable. Un serveur hors d'usage ne sera pas utilisé dans le
552processus de répartition de charge interne. Pour activer la surveillance,
553ajouter le mot clé 'check' à la fin de la déclaration du serveur. Il est
554possible de spécifier l'intervalle (en millisecondes) séparant deux tests du
555serveur par le paramètre "inter", le nombre d'échecs acceptés par le paramètre
556"fall", et le nombre de succès avant reprise par le paramètre "rise". Les
557paramètres non précisés prennent les valeurs suivantes par défaut :
willy tarreaue47c8d72005-12-17 12:55:52 +0100558 - inter : 2000
559 - rise : 2
560 - fall : 3
willy tarreau5cbea6f2005-12-17 12:48:26 +0100561
willy tarreauc29948c2005-12-17 13:10:27 +0100562Exemples :
563----------
564# même que précédemment avec surveillance
willy tarreau5cbea6f2005-12-17 12:48:26 +0100565 listen http_proxy 0.0.0.0:80
566 mode http
567 cookie SERVERID
568 balance roundrobin
569 server web1 192.168.1.1:80 cookie server01 check
willy tarreauc29948c2005-12-17 13:10:27 +0100570 server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
willy tarreau5cbea6f2005-12-17 12:48:26 +0100571
willy tarreau96d40372005-12-17 13:11:56 +0100572# Insertion automatique de cookie dans la réponse du serveur, et suppression
willy tarreau240afa62005-12-17 13:14:35 +0100573# automatique dans la requête, tout en indiquant aux caches de ne pas garder
574# ce cookie.
willy tarreauc29948c2005-12-17 13:10:27 +0100575 listen web_appl 0.0.0.0:80
576 mode http
willy tarreau240afa62005-12-17 13:14:35 +0100577 cookie SERVERID insert nocache indirect
willy tarreauc29948c2005-12-17 13:10:27 +0100578 balance roundrobin
579 server web1 192.168.1.1:80 cookie server01 check
580 server web2 192.168.1.2:80 cookie server02 check
willy tarreau5cbea6f2005-12-17 12:48:26 +0100581
willy tarreau0f7af912005-12-17 12:21:26 +0100582
willy tarreauc29948c2005-12-17 13:10:27 +01005833.2) Reconnexion vers un répartiteur en cas d'échec direct
584----------------------------------------------------------
585En mode HTTP, si un serveur défini par un cookie ne répond plus, les clients
586seront définitivement aiguillés dessus à cause de leur cookie, et de ce fait,
587définitivement privés de service. La spécification du paramètre 'redispatch'
588autorise dans ce cas à renvoyer les connexions échouées vers le répartiteur
589(externe ou interne) afin d'assigner un nouveau serveur à ces clients.
willy tarreau0f7af912005-12-17 12:21:26 +0100590
591Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +0100592---------
willy tarreau0f7af912005-12-17 12:21:26 +0100593 listen http_proxy 0.0.0.0:80
594 mode http
595 cookie SERVERID
596 dispatch 192.168.1.100:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100597 server web1 192.168.1.1:80 cookie server01
598 server web2 192.168.1.2:80 cookie server02
599 redispatch # renvoyer vers dispatch si serveur HS.
600
willy tarreauc29948c2005-12-17 13:10:27 +0100601
6024) Fonctionnalités additionnelles
603=================================
604
605D'autres fonctionnalités d'usage moins courant sont disponibles. Il s'agit
606principalement du mode transparent, de la journalisation des connexions, et de
607la réécriture des entêtes.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100608
willy tarreauc29948c2005-12-17 13:10:27 +01006094.1) Fonctionnement en mode transparent
610---------------------------------------
611En mode HTTP, le mot clé 'transparent' permet d'intercepter des sessions routées
612à travers la machine hébergeant le proxy. Dans ce mode, on ne précise pas
613l'adresse de répartition 'dispatch', car celle-ci est tirée de l'adresse
614destination de la session détournée. Le système doit permettre de rediriger les
615paquets vers un processus local.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100616
617Exemple :
willy tarreauc29948c2005-12-17 13:10:27 +0100618---------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100619 listen http_proxy 0.0.0.0:65000
620 mode http
621 transparent
622 cookie SERVERID
willy tarreau0f7af912005-12-17 12:21:26 +0100623 server server01 192.168.1.1:80
624 server server02 192.168.1.2:80
willy tarreau5cbea6f2005-12-17 12:48:26 +0100625
626 # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \
627 --dport 80 -j REDIRECT --to-ports 65000
willy tarreau0f7af912005-12-17 12:21:26 +0100628
willy tarreau0f7af912005-12-17 12:21:26 +0100629
willy tarreauc29948c2005-12-17 13:10:27 +01006304.2) Journalisation des connexions
631----------------------------------
632Les connexions TCP et HTTP peuvent donner lieu à une journalisation sommaire ou
633détaillée indiquant, pour chaque connexion, la date, l'heure, l'adresse IP
634source, le serveur destination, la durée de la connexion, les temps de réponse,
635la requête HTTP, le code de retour, la quantité de données transmise.
636Tous les messages sont envoyés en syslog vers un ou deux serveurs. La syntaxe
637est la suivante :
willy tarreau0f7af912005-12-17 12:21:26 +0100638
639 log <adresse_ip> <facility>
willy tarreauc29948c2005-12-17 13:10:27 +0100640 log <adresse_ip> <facility>
641ou
642 log global
643
644Remarque :
645----------
646La syntaxe spécifique 'log global' indique que l'on souhaite utiliser les
647paramètres de journalisation définis dans la section 'global'.
willy tarreau0f7af912005-12-17 12:21:26 +0100648
649Exemple :
650---------
651 listen http_proxy 0.0.0.0:80
652 mode http
653 log 192.168.2.200 local3
654 log 192.168.2.201 local4
655
willy tarreauc29948c2005-12-17 13:10:27 +0100656Les connexions sont envoyées en niveau "info". Les démarrages de service seront
657envoyés en "notice", les signaux d'arrêts en "warning" et les arrêts définitifs
658en "alert". Ceci est valable aussi bien pour les proxies que pour les serveurs
659testés au sein des proxies. Les catégories possibles sont :
willy tarreau0f7af912005-12-17 12:21:26 +0100660
willy tarreau0f7af912005-12-17 12:21:26 +0100661 kern, user, mail, daemon, auth, syslog, lpr, news,
662 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
663 local0, local1, local2, local3, local4, local5, local6, local7
664
willy tarreauc29948c2005-12-17 13:10:27 +0100665Par défaut, les informations contenues dans les logs se situent au niveau TCP
666uniquement. Il faut préciser l'option 'httplog' pour obtenir les détails du
667protocole HTTP. Dans les cas où un mécanisme de surveillance effectuant des
668connexions et déconnexions fréquentes, polluerait les logs, il suffit d'ajouter
669l'option 'dontlognull', pour ne plus obtenir une ligne de log pour les sessions
670n'ayant pas donné lieu à un échange de données (requête ou réponse).
671
672Enfin, l'option 'forwardfor' ajoute l'adresse IP du client dans un champ
673'X-Forwarded-For' de la requête, ce qui permet à un serveur web final de
674connaître l'adresse IP du client initial.
675
676Exemple :
677---------
678 listen http_proxy 0.0.0.0:80
679 mode http
680 log global
681 option httplog
682 option dontlognull
683 option forwardfor
willy tarreau0f7af912005-12-17 12:21:26 +0100684
willy tarreau0f7af912005-12-17 12:21:26 +0100685
willy tarreauc29948c2005-12-17 13:10:27 +01006864.3) Modification des entêtes HTTP
687----------------------------------
688En mode HTTP uniquement, il est possible de remplacer certains en-têtes dans la
689requête et/ou la réponse à partir d'expressions régulières. Il est également
690possible de bloquer certaines requêtes en fonction du contenu des en-têtes ou de
691la requête. Une limitation cependant : les en-têtes fournis au milieu de
692connexions persistentes (keep-alive) ne sont pas vus car ils sont considérés
693comme faisant partie des échanges de données consécutifs à la première requête.
694Les données ne sont pas affectées, ceci ne s'applique qu'aux en-têtes.
willy tarreau0f7af912005-12-17 12:21:26 +0100695
696La syntaxe est :
willy tarreauc29948c2005-12-17 13:10:27 +0100697 reqadd <string> pour ajouter un en-tête dans la requête
698 reqrep <search> <replace> pour modifier la requête
699 reqirep <search> <replace> idem sans distinction majuscules/minuscules
700 reqdel <search> pour supprimer un en-tête dans la requête
701 reqidel <search> idem sans distinction majuscules/minuscules
702 reqallow <search> autoriser une requête qui valide <search>
703 reqiallow <search> idem sans distinction majuscules/minuscules
704 reqdeny <search> interdire une requête qui valide <search>
willy tarreau240afa62005-12-17 13:14:35 +0100705 reqideny <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +0100706
willy tarreauc29948c2005-12-17 13:10:27 +0100707 rspadd <string> pour ajouter un en-tête dans la réponse
708 rsprep <search> <replace> pour modifier la réponse
709 rspirep <search> <replace> idem sans distinction majuscules/minuscules
710 rspdel <search> pour supprimer un en-tête dans la réponse
711 rspidel <search> idem sans distinction majuscules/minuscules
willy tarreau5cbea6f2005-12-17 12:48:26 +0100712
willy tarreau0f7af912005-12-17 12:21:26 +0100713
714<search> est une expression régulière compatible GNU regexp supportant
715le groupage par parenthèses (sans les '\'). Les espaces et autres
716séparateurs doivent êtres précédés d'un '\' pour ne pas être confondus
willy tarreau5cbea6f2005-12-17 12:48:26 +0100717avec la fin de la chaîne. De plus, certains caractères spéciaux peuvent
718être précédés d'un backslach ('\') :
719
720 \t pour une tabulation
721 \r pour un retour charriot
722 \n pour un saut de ligne
723 \ pour différencier un espace d'un séparateur
724 \# pour différencier un dièse d'un commentaire
725 \\ pour un backslash
726 \xXX pour un caractère spécifique XX (comme en C)
willy tarreau0f7af912005-12-17 12:21:26 +0100727
willy tarreau0f7af912005-12-17 12:21:26 +0100728
willy tarreau5cbea6f2005-12-17 12:48:26 +0100729<replace> contient la chaîne remplaçant la portion vérifiée par l'expression.
730Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un
731groupe délimité par des parenthèses dans l'expression régulière, par sa
732position numérale. Les positions vont de 1 à 9, et sont codées par un '\'
733suivi du chiffre désiré. Il est également possible d'insérer un caractère non
734imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code
735hexadécimal de ce caractère (comme en C).
736
737<string> représente une chaîne qui sera ajoutée systématiquement après la
willy tarreauc29948c2005-12-17 13:10:27 +0100738dernière ligne d'en-tête.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100739
740Remarques :
741---------
742 - 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 +0100743 des en-têtes, ce qui permet de réécrire des URL et des codes d'erreur.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100744 - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de
745 'srvexp'. Ces noms sont toujours supportés mais déconseillés.
746 - pour des raisons de performances, le nombre total de caractères ajoutés sur
willy tarreau535ae7a2005-12-17 12:58:00 +0100747 une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette
748 limite était à 256 auparavant). Cette valeur est modifiable dans le code.
749 Pour un usage temporaire, on peut gagner de la place en supprimant quelques
750 entêtes inutiles avant les ajouts.
willy tarreau0f7af912005-12-17 12:21:26 +0100751
752Exemples :
willy tarreau5cbea6f2005-12-17 12:48:26 +0100753--------
754 reqrep ^(GET.*)(.free.fr)(.*) \1.online.fr\3
755 reqrep ^(POST.*)(.free.fr)(.*) \1.online.fr\3
willy tarreauc29948c2005-12-17 13:10:27 +0100756 reqirep ^Proxy-Connection:.* Proxy-Connection:\ close
757 rspirep ^Server:.* Server:\ Tux-2.0
758 rspirep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
759 rspidel ^Connection:
willy tarreau5cbea6f2005-12-17 12:48:26 +0100760 rspadd Connection:\ close
willy tarreau0f7af912005-12-17 12:21:26 +0100761
762
willy tarreauc29948c2005-12-17 13:10:27 +01007634.4) Répartition avec persistence
764---------------------------------
willy tarreau5cbea6f2005-12-17 12:48:26 +0100765
766La combinaison de l'insertion de cookie avec la répartition de charge interne
767permet d'assurer une persistence dans les sessions HTTP d'une manière
768pratiquement transparente pour les applications. Le principe est simple :
willy tarreau96d40372005-12-17 13:11:56 +0100769 - attribuer une valeur d'un cookie à chaque serveur
willy tarreau5cbea6f2005-12-17 12:48:26 +0100770 - effectuer une répartition interne
willy tarreau240afa62005-12-17 13:14:35 +0100771 - insérer un cookie dans les réponses issues d'une répartition uniquement,
772 et faire en sorte que des caches ne mémorisent pas ce cookie.
773 - cacher ce cookie à l'application lors des requêtes ultérieures.
willy tarreau5cbea6f2005-12-17 12:48:26 +0100774
775Exemple :
776-------
777 listen application 0.0.0.0:80
778 mode http
willy tarreau240afa62005-12-17 13:14:35 +0100779 cookie SERVERID insert nocache indirect
willy tarreau5cbea6f2005-12-17 12:48:26 +0100780 balance roundrobin
781 server 192.168.1.1:80 cookie server01 check
782 server 192.168.1.2:80 cookie server02 check
783
willy tarreaub719f002005-12-17 12:55:07 +0100784=======================
785| Paramétrage système |
786=======================
willy tarreau0f7af912005-12-17 12:21:26 +0100787
788Sous Linux 2.4
789==============
790
willy tarreaub719f002005-12-17 12:55:07 +0100791-- cut here --
792#!/bin/sh
793# set this to about 256/4M (16384 for 256M machine)
794MAXFILES=16384
795echo $MAXFILES > /proc/sys/fs/file-max
796ulimit -n $MAXFILES
797
798if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then
799 echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
800fi
801
802if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then
803 # 30 seconds for fin, 15 for time wait
804 echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait
805 echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait
806 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale
807 echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
808fi
809
willy tarreau0f7af912005-12-17 12:21:26 +0100810echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
willy tarreaub719f002005-12-17 12:55:07 +0100811echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
812echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
willy tarreau0f7af912005-12-17 12:21:26 +0100813echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
willy tarreaub719f002005-12-17 12:55:07 +0100814echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
815echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
willy tarreau0f7af912005-12-17 12:21:26 +0100816echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
817echo 0 > /proc/sys/net/ipv4/tcp_timestamps
willy tarreau5cbea6f2005-12-17 12:48:26 +0100818echo 0 > /proc/sys/net/ipv4/tcp_ecn
willy tarreaub719f002005-12-17 12:55:07 +0100819echo 0 > /proc/sys/net/ipv4/tcp_sack
820echo 0 > /proc/sys/net/ipv4/tcp_dsack
821
822# auto-tuned on 2.4
823#echo 262143 > /proc/sys/net/core/rmem_max
824#echo 262143 > /proc/sys/net/core/rmem_default
825
826echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem
827echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem
828
829-- cut here --
willy tarreau0f7af912005-12-17 12:21:26 +0100830
831-- fin --