blob: 36bd2ea3b484488a7a2793c7b026f2a03107b5ff [file] [log] [blame]
willy tarreau0f7af912005-12-17 12:21:26 +01001
2 H A - P r o x y
3 ---------------
4 version 1.0.0
5 willy tarreau
6 2001/12/16
7
8==============
9|Introduction|
10==============
11
12HA-Proxy est un relais TCP/HTTP offrant des facilités d'intégration en
13environnement hautement disponible. En effet, il est capable de :
14 - assurer un aiguillage statique défini par des cookies ;
15 - fournir une visibilité externe de son état de santé ;
16 - s'arrêter en douceur sans perte brutale de service.
17
18Il requiert peu de ressources, et son architecture événementielle
19mono-processus lui permet facilement de gérer plusieurs milliers de
20connexions simultanées sur plusieurs relais sans effondrer le système.
21
22===========================
23| Paramètres de lancement |
24===========================
25
26Les options de lancement sont peu nombreuses :
27
28 -f <fichier de configuration>
29 -n <nombre maximal total de connexions simultanées>
30 -N <nombre maximal de connexions simultanées par proxy>
31 -d active le mode debug
32 -D passe en daemon
33 -s affiche les statistiques (si option compilée)
34 -l ajoute des informations aux statistiques
35
36Le nombre maximal de connexion simultanées par proxy est le paramètre
37par défaut pour les proxies pour lesquels ce paramètre n'est pas
38précisé dans le fichier de configuration.
39
40Le nombre maximal total de connexions simultanées limite le nombre de
41connexions TCP utilisables à un instant par le processus, tous proxies
42confondus.
43
44============================
45| Fichier de configuration |
46============================
47
48
49Commentaires
50============
51
52L'analyseur du fichier de configuration ignore des lignes vides, les
53espaces, les tabulations, et tout ce qui est compris entre le symbole
54'#' et la fin de la ligne.
55
56
57Serveur
58=======
59
60Le fichier de configuration contient des sections repérées par le mot
61clé "listen" :
62
63 listen <nom_instance> <adresse_IP>:<port>
64
65<nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé
66dans les logs, donc il est souhaitable d'utiliser un nom relatif au
67service relayé. Aucun test n'est effectué concernant l'unicité de ce
68nom, qui n'est pas obligatoire, mais fortement recommandée.
69
70<adresse_IP> est l'adresse IP sur laquelle le relais attend ses
71connexions. L'adresse 0.0.0.0 signifie que les connexions pourront
72s'effectuer sur toutes les adresses de la machine.
73
74<port> est le numéro de port TCP sur lequel le relais attend ses
75connexions. Le couple <adresse_IP>:<port> doit être unique pour toutes
76les instances d'une même machine. L'attachement à un port inférieur à
771024 nécessite un niveau de privilège particulier.
78
79Exemple :
80---------
81 listen http_proxy 127.0.0.1:80
82
83
84Inhibition
85==========
86
87Un serveur peut être désactivé pour des besoins de maintenance, sans
88avoir à commenter toute une partie du fichier. Il suffit de
89positionner le mot clé "disabled" dans sa section :
90
91 listen smtp_proxy 0.0.0.0:25
92 disabled
93
94Mode
95====
96
97Un serveur peut fonctionner dans trois modes différents :
98 - TCP
99 - HTTP
100 - supervision
101
102Mode TCP
103--------
104Dans ce mode, le service relaye, dès leur établissement, les
105connexions TCP vers un unique serveur distant. Aucun traitement n'est
106effectué sur le flux. Il s'agit simplement d'une association
107<adresse_source:port_source> <adresse_destination:port_destination>.
108Pour l'utiliser, préciser le mode TCP sous la déclaration du relais :
109
110 listen smtp_proxy 0.0.0.0:25
111 mode tcp
112
113Mode HTTP
114---------
115Dans ce mode, le service relaye les connexions TCP vers un ou
116plusieurs serveurs, une fois qu'il dispose d'assez d'informations pour
117en prendre la décision. Les entêtes HTTP sont analysés pour y trouver
118un éventuel cookie, et certains d'entre-eux peuvent être modifiés par
119le biais d'expressions régulières. Pour activer ce mode, préciser le
120mode HTTP sous la déclaration du relais :
121
122 listen http_proxy 0.0.0.0:80
123 mode http
124
125Mode supervision
126----------------
127Il s'agit d'un mode offrant à un composant externe une visibilité de
128l'état de santé du service. Il se contente de retourner "OK" à tout
129client se connectant sur son port. Il peut être utilisé avec des
130répartiteurs de charge évolués pour déterminer quels sont les services
131utilisables. Pour activer ce mode, préciser le mode HEALTH sous la
132déclaration du relais :
133
134 listen health_check 0.0.0.0:60000
135 mode health
136
137
138Limitation du nombre de connexions simultanées
139==============================================
140
141Le paramètre "maxconn" permet de fixer la limite acceptable en nombre
142de connexions simultanées par proxy. Chaque proxy qui atteint cette
143valeur cesse d'écouter jusqu'à libération d'une connexion. Voir plus
144loin concernant les limitations liées au système. Exemple:
145
146 maxconn 16000
147
148
149Arrêt en douceur
150================
151
152Il est possible d'arrêter les services en douceur en envoyant un
153signal SIG_USR1 au processus relais. Tous les services seront alors
154mis en phase d'arrêt, mais pourront continuer d'accepter des connexions
155pendant un temps défini par le paramètre "grace" (en millisecondes).
156Cela permet par exemple, de faire savoir rapidement à un répartiteur
157de charge qu'il ne doit plus utiliser un relais, tout en continuant
158d'assurer le service le temps qu'il s'en rende compte. Remarque : les
159connexions actives ne sont jamais cassées. Dans le pire des cas, il
160faudra attendre en plus leur expiration avant l'arrêt total du
161processus. La valeur par défaut est 0 (pas de grâce).
162
163Exemple :
164---------
165
166 # le service tournera encore 10 secondes après la demande d'arrêt
167 listen http_proxy 0.0.0.0:80
168 mode http
169 grace 10000
170
171 listen health_check 0.0.0.0:60000
172 mode health
173 grace 0
174
175
176Temps d'expiration des connexions
177=================================
178
179Il est possible de paramétrer certaines durées d'expiration au niveau
180des connexions TCP. Trois temps indépendants sont configurables et
181acceptent des valeurs en millisecondes. Si l'une de ces trois
182temporisations est dépassée, la session est terminée à chaque
183extrémité.
184
185 - temps d'attente d'une donnée de la part du client, ou de la
186 possibilité de lui envoyer des données : "clitimeout" :
187
188 # time-out client à 2mn30.
189 clitimeout 150000
190
191 - temps d'attente d'une donnée de la part du serveur, ou de la
192 possibilité de lui envoyer des données : "srvtimeout" :
193
194 # time-out client à 30s.
195 srvtimeout 30000
196
197 - temps d'attente de l'établissement d'une connexion vers un serveur
198 "contimeout" :
199
200 # on abandonne si la connexion n'est pas établie après 3 secondes
201 contimeout 3000
202
203Remarque: "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas
204du serveur de type "health".
205
206Tentatives de reconnexion
207=========================
208
209Lors d'un échec de connexion vers un serveur, il est possible de
210retenter (potentiellement vers un autre serveur, en cas de répartition
211de charge). Le nombre de nouvelles tentatives infructueuses avant
212abandon est fourni par le paramètre "retries" :
213
214 # on essaie encore trois fois maxi
215 retries 3
216
217Adresse du serveur
218==================
219
220Le serveur vers lequel sont redirigées les connexions est défini par
221le paramètre "dispatch" sous la forme <adresse_ip>:<port> :
222
223 # on envoie toutes les nouvelles connexions ici
224 dispatch 192.168.1.2:80
225
226Remarque: ce paramètre n'a pas d'utilité pour un serveur en mode "health".
227
228Définition du nom du cookie
229===========================
230
231En mode HTTP, il est possible de rechercher la valeur d'un cookie pour
232savoir vers quel serveur aiguiller la requête utilisateur. Le nom du
233cookie est donné par le paramètre "cookie" :
234
235 listen http_proxy 0.0.0.0:80
236 mode http
237 cookie SERVERID
238
239
240Assignation d'un serveur à une valeur de cookie
241===============================================
242
243En mode HTTP, il est possible d'associer des serveurs à des valeurs de
244cookie par le paramètre "server". La syntaxe est :
245
246 server <valeur> <adresse_ip>:<port>
247
248<valeur> est la valeur trouvée dans le cookie,
249<adresse_ip>:<port> le couple adresse-port sur lequel le serveur écoute.
250
251Exemple : le cookie SERVERID peut contenir server01 ou server02
252-------
253 listen http_proxy 0.0.0.0:80
254 mode http
255 cookie SERVERID
256 dispatch 192.168.1.100:80
257 server server01 192.168.1.1:80
258 server server02 192.168.1.2:80
259
260
261Reconnexion vers le répartiteur
262===============================
263
264En mode HTTP, si un serveur défini par un cookie ne répond plus, les
265clients seront définitivement aiguillés dessus à cause de leur cookie,
266et de ce fait, définitivement privés de service. La spécification du
267paramètre "redisp" autorise dans ce cas à renvoyer les connexions
268échouées vers l'adresse de répartition (dispatch) afin d'assigner un
269nouveau serveur à ces clients.
270
271Exemple :
272-------
273 listen http_proxy 0.0.0.0:80
274 mode http
275 cookie SERVERID
276 dispatch 192.168.1.100:80
277 server server01 192.168.1.1:80
278 server server02 192.168.1.2:80
279 redisp # renvoyer vers dispatch si serveur HS.
280
281Journalisation des connexions
282=============================
283
284Les connexions TCP et HTTP peuvent donner lieu à une journalisation
285sommaire indiquant, pour chaque connexion, la date, l'heure, les adresses
286IP source et destination, et les ports source et destination qui la
287caractérisent. Ultérieurement, les URLs seront loguées en mode HTTP,
288tout comme les arrêts de service. Tous les messages sont envoyés en
289syslog vers un ou deux serveurs. La syntaxe est la suivante :
290
291 log <adresse_ip> <facility>
292
293Exemple :
294---------
295 listen http_proxy 0.0.0.0:80
296 mode http
297 log 192.168.2.200 local3
298 log 192.168.2.201 local4
299
300Les connexions sont envoyées en niveau "info". Les démarrages de
301service seront envoyés en "notice", les signaux d'arrêts en "warning"
302et les arrêts définitifs en "alert".
303
304Les catégories possibles sont :
305 kern, user, mail, daemon, auth, syslog, lpr, news,
306 uucp, cron, auth2, ftp, ntp, audit, alert, cron2,
307 local0, local1, local2, local3, local4, local5, local6, local7
308
309
310Remplacement d'entêtes par expressions régulières
311=================================================
312
313En mode HTTP uniquement, il est possible de remplacer certains entêtes
314client et/ou serveur à partir d'expressions régulières. Deux
315limitations cependant :
316 - il n'est pas encore possible de supprimer un entête ni d'en
317 ajouter un ; On peut en général s'en sortir avec des
318 modifications.
319 - les entêtes fournis au milieu de connexions persistentes
320 (keep-alive) ne sont pas vus.
321
322La syntaxe est :
323 cliexp <search> <replace> pour les entêtes client
324 srvexp <search> <replace> pour les entêtes serveur
325
326<search> est une expression régulière compatible GNU regexp supportant
327le groupage par parenthèses (sans les '\'). Les espaces et autres
328séparateurs doivent êtres précédés d'un '\' pour ne pas être confondus
329avec la fin de la chaîne.
330
331<replace> contient la chaîne remplaçant la portion vérifiée par
332l'expression. Elle peut inclure des espaces et tabulations précédés
333par un '\', faire référence à un groupe délimité par des parenthèses
334dans l'expression régulière, par sa position numérale. Les positions
335vont de 1 à 9, et sont codées par un '\' suivi du chiffre désiré. Il
336est également possible d'insérer un caractère non imprimable (utile
337pour le saut de ligne) inscrivant '\x' suivi du code hexadécimal de ce
338caractère (comme en C).
339
340Remarque : la première ligne de la requête et celle de la réponse sont
341traitées comme des entêtes, ce qui permet de réécrire des URL et des
342codes d'erreur.
343
344Exemples :
345----------
346 cliexp ^(GET.*)(.free.fr)(.*) \1.online.fr\3
347 cliexp ^(POST.*)(.free.fr)(.*) \1.online.fr\3
348 cliexp ^Proxy-Connection:.* Proxy-Connection:\ close
349 srvexp ^Proxy-Connection:.* Proxy-Connection:\ close
350 srvexp ^(Location:\ )([^:]*://[^/]*)(.*) \1\3
351
352
353=====================
354|Paramétrage système|
355=====================
356
357Sous Linux 2.4
358==============
359
360echo 131072 > /proc/sys/fs/file-max
361echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
362echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
363echo 16384 > /proc/sys/net/ipv4/ip_queue_maxlen
364echo 60 > /proc/sys/net/ipv4/tcp_fin_timeout
365echo 4096 > /proc/sys/net/ipv4/tcp_max_orphans
366echo 16384 > /proc/sys/net/ipv4/tcp_max_syn_backlog
367echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
368echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
369echo 0 > /proc/sys/net/ipv4/tcp_timestamps
370ulimit -n 65536
371
372-- fin --