willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame^] | 1 | |
| 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 | |
| 12 | HA-Proxy est un relais TCP/HTTP offrant des facilités d'intégration en |
| 13 | environnement 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 | |
| 18 | Il requiert peu de ressources, et son architecture événementielle |
| 19 | mono-processus lui permet facilement de gérer plusieurs milliers de |
| 20 | connexions simultanées sur plusieurs relais sans effondrer le système. |
| 21 | |
| 22 | =========================== |
| 23 | | Paramètres de lancement | |
| 24 | =========================== |
| 25 | |
| 26 | Les 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 | |
| 36 | Le nombre maximal de connexion simultanées par proxy est le paramètre |
| 37 | par défaut pour les proxies pour lesquels ce paramètre n'est pas |
| 38 | précisé dans le fichier de configuration. |
| 39 | |
| 40 | Le nombre maximal total de connexions simultanées limite le nombre de |
| 41 | connexions TCP utilisables à un instant par le processus, tous proxies |
| 42 | confondus. |
| 43 | |
| 44 | ============================ |
| 45 | | Fichier de configuration | |
| 46 | ============================ |
| 47 | |
| 48 | |
| 49 | Commentaires |
| 50 | ============ |
| 51 | |
| 52 | L'analyseur du fichier de configuration ignore des lignes vides, les |
| 53 | espaces, les tabulations, et tout ce qui est compris entre le symbole |
| 54 | '#' et la fin de la ligne. |
| 55 | |
| 56 | |
| 57 | Serveur |
| 58 | ======= |
| 59 | |
| 60 | Le fichier de configuration contient des sections repérées par le mot |
| 61 | clé "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é |
| 66 | dans les logs, donc il est souhaitable d'utiliser un nom relatif au |
| 67 | service relayé. Aucun test n'est effectué concernant l'unicité de ce |
| 68 | nom, qui n'est pas obligatoire, mais fortement recommandée. |
| 69 | |
| 70 | <adresse_IP> est l'adresse IP sur laquelle le relais attend ses |
| 71 | connexions. L'adresse 0.0.0.0 signifie que les connexions pourront |
| 72 | s'effectuer sur toutes les adresses de la machine. |
| 73 | |
| 74 | <port> est le numéro de port TCP sur lequel le relais attend ses |
| 75 | connexions. Le couple <adresse_IP>:<port> doit être unique pour toutes |
| 76 | les instances d'une même machine. L'attachement à un port inférieur à |
| 77 | 1024 nécessite un niveau de privilège particulier. |
| 78 | |
| 79 | Exemple : |
| 80 | --------- |
| 81 | listen http_proxy 127.0.0.1:80 |
| 82 | |
| 83 | |
| 84 | Inhibition |
| 85 | ========== |
| 86 | |
| 87 | Un serveur peut être désactivé pour des besoins de maintenance, sans |
| 88 | avoir à commenter toute une partie du fichier. Il suffit de |
| 89 | positionner le mot clé "disabled" dans sa section : |
| 90 | |
| 91 | listen smtp_proxy 0.0.0.0:25 |
| 92 | disabled |
| 93 | |
| 94 | Mode |
| 95 | ==== |
| 96 | |
| 97 | Un serveur peut fonctionner dans trois modes différents : |
| 98 | - TCP |
| 99 | - HTTP |
| 100 | - supervision |
| 101 | |
| 102 | Mode TCP |
| 103 | -------- |
| 104 | Dans ce mode, le service relaye, dès leur établissement, les |
| 105 | connexions TCP vers un unique serveur distant. Aucun traitement n'est |
| 106 | effectué sur le flux. Il s'agit simplement d'une association |
| 107 | <adresse_source:port_source> <adresse_destination:port_destination>. |
| 108 | Pour 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 | |
| 113 | Mode HTTP |
| 114 | --------- |
| 115 | Dans ce mode, le service relaye les connexions TCP vers un ou |
| 116 | plusieurs serveurs, une fois qu'il dispose d'assez d'informations pour |
| 117 | en prendre la décision. Les entêtes HTTP sont analysés pour y trouver |
| 118 | un éventuel cookie, et certains d'entre-eux peuvent être modifiés par |
| 119 | le biais d'expressions régulières. Pour activer ce mode, préciser le |
| 120 | mode HTTP sous la déclaration du relais : |
| 121 | |
| 122 | listen http_proxy 0.0.0.0:80 |
| 123 | mode http |
| 124 | |
| 125 | Mode supervision |
| 126 | ---------------- |
| 127 | Il s'agit d'un mode offrant à un composant externe une visibilité de |
| 128 | l'état de santé du service. Il se contente de retourner "OK" à tout |
| 129 | client se connectant sur son port. Il peut être utilisé avec des |
| 130 | répartiteurs de charge évolués pour déterminer quels sont les services |
| 131 | utilisables. Pour activer ce mode, préciser le mode HEALTH sous la |
| 132 | déclaration du relais : |
| 133 | |
| 134 | listen health_check 0.0.0.0:60000 |
| 135 | mode health |
| 136 | |
| 137 | |
| 138 | Limitation du nombre de connexions simultanées |
| 139 | ============================================== |
| 140 | |
| 141 | Le paramètre "maxconn" permet de fixer la limite acceptable en nombre |
| 142 | de connexions simultanées par proxy. Chaque proxy qui atteint cette |
| 143 | valeur cesse d'écouter jusqu'à libération d'une connexion. Voir plus |
| 144 | loin concernant les limitations liées au système. Exemple: |
| 145 | |
| 146 | maxconn 16000 |
| 147 | |
| 148 | |
| 149 | Arrêt en douceur |
| 150 | ================ |
| 151 | |
| 152 | Il est possible d'arrêter les services en douceur en envoyant un |
| 153 | signal SIG_USR1 au processus relais. Tous les services seront alors |
| 154 | mis en phase d'arrêt, mais pourront continuer d'accepter des connexions |
| 155 | pendant un temps défini par le paramètre "grace" (en millisecondes). |
| 156 | Cela permet par exemple, de faire savoir rapidement à un répartiteur |
| 157 | de charge qu'il ne doit plus utiliser un relais, tout en continuant |
| 158 | d'assurer le service le temps qu'il s'en rende compte. Remarque : les |
| 159 | connexions actives ne sont jamais cassées. Dans le pire des cas, il |
| 160 | faudra attendre en plus leur expiration avant l'arrêt total du |
| 161 | processus. La valeur par défaut est 0 (pas de grâce). |
| 162 | |
| 163 | Exemple : |
| 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 | |
| 176 | Temps d'expiration des connexions |
| 177 | ================================= |
| 178 | |
| 179 | Il est possible de paramétrer certaines durées d'expiration au niveau |
| 180 | des connexions TCP. Trois temps indépendants sont configurables et |
| 181 | acceptent des valeurs en millisecondes. Si l'une de ces trois |
| 182 | temporisations est dépassée, la session est terminée à chaque |
| 183 | extré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 | |
| 203 | Remarque: "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas |
| 204 | du serveur de type "health". |
| 205 | |
| 206 | Tentatives de reconnexion |
| 207 | ========================= |
| 208 | |
| 209 | Lors d'un échec de connexion vers un serveur, il est possible de |
| 210 | retenter (potentiellement vers un autre serveur, en cas de répartition |
| 211 | de charge). Le nombre de nouvelles tentatives infructueuses avant |
| 212 | abandon est fourni par le paramètre "retries" : |
| 213 | |
| 214 | # on essaie encore trois fois maxi |
| 215 | retries 3 |
| 216 | |
| 217 | Adresse du serveur |
| 218 | ================== |
| 219 | |
| 220 | Le serveur vers lequel sont redirigées les connexions est défini par |
| 221 | le 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 | |
| 226 | Remarque: ce paramètre n'a pas d'utilité pour un serveur en mode "health". |
| 227 | |
| 228 | Définition du nom du cookie |
| 229 | =========================== |
| 230 | |
| 231 | En mode HTTP, il est possible de rechercher la valeur d'un cookie pour |
| 232 | savoir vers quel serveur aiguiller la requête utilisateur. Le nom du |
| 233 | cookie 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 | |
| 240 | Assignation d'un serveur à une valeur de cookie |
| 241 | =============================================== |
| 242 | |
| 243 | En mode HTTP, il est possible d'associer des serveurs à des valeurs de |
| 244 | cookie 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 | |
| 251 | Exemple : 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 | |
| 261 | Reconnexion vers le répartiteur |
| 262 | =============================== |
| 263 | |
| 264 | En mode HTTP, si un serveur défini par un cookie ne répond plus, les |
| 265 | clients seront définitivement aiguillés dessus à cause de leur cookie, |
| 266 | et de ce fait, définitivement privés de service. La spécification du |
| 267 | paramètre "redisp" autorise dans ce cas à renvoyer les connexions |
| 268 | échouées vers l'adresse de répartition (dispatch) afin d'assigner un |
| 269 | nouveau serveur à ces clients. |
| 270 | |
| 271 | Exemple : |
| 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 | |
| 281 | Journalisation des connexions |
| 282 | ============================= |
| 283 | |
| 284 | Les connexions TCP et HTTP peuvent donner lieu à une journalisation |
| 285 | sommaire indiquant, pour chaque connexion, la date, l'heure, les adresses |
| 286 | IP source et destination, et les ports source et destination qui la |
| 287 | caractérisent. Ultérieurement, les URLs seront loguées en mode HTTP, |
| 288 | tout comme les arrêts de service. Tous les messages sont envoyés en |
| 289 | syslog vers un ou deux serveurs. La syntaxe est la suivante : |
| 290 | |
| 291 | log <adresse_ip> <facility> |
| 292 | |
| 293 | Exemple : |
| 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 | |
| 300 | Les connexions sont envoyées en niveau "info". Les démarrages de |
| 301 | service seront envoyés en "notice", les signaux d'arrêts en "warning" |
| 302 | et les arrêts définitifs en "alert". |
| 303 | |
| 304 | Les 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 | |
| 310 | Remplacement d'entêtes par expressions régulières |
| 311 | ================================================= |
| 312 | |
| 313 | En mode HTTP uniquement, il est possible de remplacer certains entêtes |
| 314 | client et/ou serveur à partir d'expressions régulières. Deux |
| 315 | limitations 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 | |
| 322 | La 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 |
| 327 | le groupage par parenthèses (sans les '\'). Les espaces et autres |
| 328 | séparateurs doivent êtres précédés d'un '\' pour ne pas être confondus |
| 329 | avec la fin de la chaîne. |
| 330 | |
| 331 | <replace> contient la chaîne remplaçant la portion vérifiée par |
| 332 | l'expression. Elle peut inclure des espaces et tabulations précédés |
| 333 | par un '\', faire référence à un groupe délimité par des parenthèses |
| 334 | dans l'expression régulière, par sa position numérale. Les positions |
| 335 | vont de 1 à 9, et sont codées par un '\' suivi du chiffre désiré. Il |
| 336 | est également possible d'insérer un caractère non imprimable (utile |
| 337 | pour le saut de ligne) inscrivant '\x' suivi du code hexadécimal de ce |
| 338 | caractère (comme en C). |
| 339 | |
| 340 | Remarque : la première ligne de la requête et celle de la réponse sont |
| 341 | traitées comme des entêtes, ce qui permet de réécrire des URL et des |
| 342 | codes d'erreur. |
| 343 | |
| 344 | Exemples : |
| 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 | |
| 357 | Sous Linux 2.4 |
| 358 | ============== |
| 359 | |
| 360 | echo 131072 > /proc/sys/fs/file-max |
| 361 | echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max |
| 362 | echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range |
| 363 | echo 16384 > /proc/sys/net/ipv4/ip_queue_maxlen |
| 364 | echo 60 > /proc/sys/net/ipv4/tcp_fin_timeout |
| 365 | echo 4096 > /proc/sys/net/ipv4/tcp_max_orphans |
| 366 | echo 16384 > /proc/sys/net/ipv4/tcp_max_syn_backlog |
| 367 | echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets |
| 368 | echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle |
| 369 | echo 0 > /proc/sys/net/ipv4/tcp_timestamps |
| 370 | ulimit -n 65536 |
| 371 | |
| 372 | -- fin -- |