willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 1 | |
| 2 | H A - P r o x y |
| 3 | --------------- |
willy tarreau | a159808 | 2005-12-17 13:08:06 +0100 | [diff] [blame^] | 4 | version 1.1.8 |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 5 | willy tarreau |
willy tarreau | a159808 | 2005-12-17 13:08:06 +0100 | [diff] [blame^] | 6 | 2002/04/16 |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 7 | |
willy tarreau | b719f00 | 2005-12-17 12:55:07 +0100 | [diff] [blame] | 8 | ================ |
| 9 | | Introduction | |
| 10 | ================ |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 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 ; |
willy tarreau | a159808 | 2005-12-17 13:08:06 +0100 | [diff] [blame^] | 15 | - assurer une répartition de charge avec création de cookies pour assurer la |
| 16 | persistence de session ; |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 17 | - fournir une visibilité externe de son état de santé ; |
| 18 | - s'arrêter en douceur sans perte brutale de service. |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 19 | - modifier/ajouter/supprimer des entêtes dans la requête et la réponse. |
willy tarreau | a159808 | 2005-12-17 13:08:06 +0100 | [diff] [blame^] | 20 | - interdire des requêtes qui vérifient certaines conditions. |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 21 | |
willy tarreau | a159808 | 2005-12-17 13:08:06 +0100 | [diff] [blame^] | 22 | Il requiert peu de ressources, et son architecture événementielle mono-processus |
| 23 | lui permet facilement de gérer plusieurs milliers de connexions simultanées sur |
| 24 | plusieurs relais sans effondrer le système. |
| 25 | |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 26 | |
| 27 | =========================== |
| 28 | | Paramètres de lancement | |
| 29 | =========================== |
| 30 | |
| 31 | Les 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 tarreau | a159808 | 2005-12-17 13:08:06 +0100 | [diff] [blame^] | 41 | Le nombre maximal de connexion simultanées par proxy est le paramètre par défaut |
| 42 | pour les proxies pour lesquels ce paramètre n'est pas précisé dans le fichier de |
| 43 | configuration. Il s'agit du paramètre 'maxconn' dans les sections 'listen'. |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 44 | |
willy tarreau | a159808 | 2005-12-17 13:08:06 +0100 | [diff] [blame^] | 45 | Le nombre maximal total de connexions simultanées limite le nombre de connexions |
| 46 | TCP utilisables à un instant par le processus, tous proxies confondus. Ce |
| 47 | paramètre remplace le paramètre 'maxconn' de la section 'global'. |
| 48 | |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 49 | |
| 50 | ============================ |
| 51 | | Fichier de configuration | |
| 52 | ============================ |
| 53 | |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 54 | Commentaires |
| 55 | ============ |
| 56 | |
willy tarreau | a159808 | 2005-12-17 13:08:06 +0100 | [diff] [blame^] | 57 | L'analyseur du fichier de configuration ignore des lignes vides, les espaces, |
| 58 | les tabulations, et tout ce qui est compris entre le symbole '#' (s'il n'est pas |
| 59 | précédé d'un '\'), et la fin de la ligne. |
| 60 | |
| 61 | Le fichier de configuration est découpé en sections répérées par des mots clés |
| 62 | tels que : |
| 63 | |
| 64 | - 'global' |
| 65 | - 'listen' |
| 66 | |
| 67 | Tous les paramètres font référence à la section définie par le dernier mot clé |
| 68 | reconnu. |
| 69 | |
| 70 | |
| 71 | 1) Paramètres généraux |
| 72 | ====================== |
| 73 | |
| 74 | Il s'agit des paramètres agissant sur le processus, ou bien sur l'ensemble des |
| 75 | proxies. Ils sont tous spécifiés dans la section 'global'. Les paramètres |
| 76 | supportés sont : |
| 77 | |
| 78 | - log <adresse> <catégorie> |
| 79 | - maxconn <nombre> |
| 80 | - uid <identifiant> |
| 81 | - gid <identifiant> |
| 82 | - chroot <répertoire> |
| 83 | - nbproc <nombre> |
| 84 | - daemon |
| 85 | - debug |
| 86 | - quiet |
| 87 | |
| 88 | 1.1) Journalisation des événements |
| 89 | ---------------------------------- |
| 90 | La plupart des événements sont journalisés : démarrages, arrêts, disparition et |
| 91 | apparition de serveurs, connexions, erreurs. Tous les messages sont envoyés en |
| 92 | syslog vers un ou deux serveurs. La syntaxe est la suivante : |
| 93 | |
| 94 | log <adresse_ip> <facility> |
| 95 | |
| 96 | Les connexions sont envoyées en niveau "info". Les démarrages de service et de |
| 97 | serveurs seront envoyés en "notice", les signaux d'arrêts en "warning" et les |
| 98 | arrêts définitifs de services et de serveurs en "alert". Ceci est valable aussi |
| 99 | bien pour les proxies que pour les serveurs testés au sein des proxies. |
| 100 | |
| 101 | Les catégories possibles sont : |
| 102 | kern, user, mail, daemon, auth, syslog, lpr, news, |
| 103 | uucp, cron, auth2, ftp, ntp, audit, alert, cron2, |
| 104 | local0, local1, local2, local3, local4, local5, local6, local7 |
| 105 | |
| 106 | Exemple : |
| 107 | --------- |
| 108 | global |
| 109 | log 192.168.2.200 local3 |
| 110 | log 192.168.2.201 local4 |
| 111 | |
| 112 | 1.2) limitation du nombre de connexions |
| 113 | --------------------------------------- |
| 114 | Il est possible et conseillé de limiter le nombre global de connexions par |
| 115 | processus. Les connexions sont comprises au sens 'acceptation de connexion', |
| 116 | donc il faut s'attendre en règle général à avoir un peu plus du double de |
| 117 | sessions TCP que le maximum de connexions fixé. C'est important pour fixer le |
| 118 | paramètre 'ulimit -n' avant de lancer le proxy. Pour comptabiliser le nombre |
| 119 | de sockets nécessaires, il faut prendre en compte ces paramètres : |
| 120 | - 1 socket par connexion entrante |
| 121 | - 1 socket par connexion sortante |
| 122 | - 1 socket par proxy |
| 123 | - 1 socket pour chaque serveur en cours de health-check |
| 124 | - 1 socket pour les logs |
| 125 | |
| 126 | Positionner la limite du nombre de descripteurs de fichiers (ulimit -n) à |
| 127 | 2 * maxconn + nbproxy + nbserveurs + 1. |
| 128 | |
| 129 | 1.3) Changement d'uid et de gid |
| 130 | ------------------------------- |
| 131 | |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 132 | |
| 133 | |
| 134 | Serveur |
| 135 | ======= |
| 136 | |
| 137 | Le fichier de configuration contient des sections repérées par le mot |
| 138 | clé "listen" : |
| 139 | |
| 140 | listen <nom_instance> <adresse_IP>:<port> |
| 141 | |
| 142 | <nom_instance> est le nom de l'instance décrite. Ce nom sera envoyé |
| 143 | dans les logs, donc il est souhaitable d'utiliser un nom relatif au |
| 144 | service relayé. Aucun test n'est effectué concernant l'unicité de ce |
| 145 | nom, qui n'est pas obligatoire, mais fortement recommandée. |
| 146 | |
| 147 | <adresse_IP> est l'adresse IP sur laquelle le relais attend ses |
| 148 | connexions. L'adresse 0.0.0.0 signifie que les connexions pourront |
| 149 | s'effectuer sur toutes les adresses de la machine. |
| 150 | |
| 151 | <port> est le numéro de port TCP sur lequel le relais attend ses |
| 152 | connexions. Le couple <adresse_IP>:<port> doit être unique pour toutes |
| 153 | les instances d'une même machine. L'attachement à un port inférieur à |
| 154 | 1024 nécessite un niveau de privilège particulier. |
| 155 | |
| 156 | Exemple : |
| 157 | --------- |
| 158 | listen http_proxy 127.0.0.1:80 |
| 159 | |
| 160 | |
| 161 | Inhibition |
| 162 | ========== |
| 163 | |
| 164 | Un serveur peut être désactivé pour des besoins de maintenance, sans |
| 165 | avoir à commenter toute une partie du fichier. Il suffit de |
| 166 | positionner le mot clé "disabled" dans sa section : |
| 167 | |
| 168 | listen smtp_proxy 0.0.0.0:25 |
| 169 | disabled |
| 170 | |
| 171 | Mode |
| 172 | ==== |
| 173 | |
| 174 | Un serveur peut fonctionner dans trois modes différents : |
| 175 | - TCP |
| 176 | - HTTP |
| 177 | - supervision |
| 178 | |
| 179 | Mode TCP |
| 180 | -------- |
| 181 | Dans ce mode, le service relaye, dès leur établissement, les |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 182 | connexions TCP vers un ou plusieurs serveurs. Aucun traitement n'est |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 183 | effectué sur le flux. Il s'agit simplement d'une association |
| 184 | <adresse_source:port_source> <adresse_destination:port_destination>. |
| 185 | Pour l'utiliser, préciser le mode TCP sous la déclaration du relais : |
| 186 | |
| 187 | listen smtp_proxy 0.0.0.0:25 |
| 188 | mode tcp |
| 189 | |
| 190 | Mode HTTP |
| 191 | --------- |
| 192 | Dans ce mode, le service relaye les connexions TCP vers un ou |
| 193 | plusieurs serveurs, une fois qu'il dispose d'assez d'informations pour |
| 194 | en prendre la décision. Les entêtes HTTP sont analysés pour y trouver |
| 195 | un éventuel cookie, et certains d'entre-eux peuvent être modifiés par |
| 196 | le biais d'expressions régulières. Pour activer ce mode, préciser le |
| 197 | mode HTTP sous la déclaration du relais : |
| 198 | |
| 199 | listen http_proxy 0.0.0.0:80 |
| 200 | mode http |
| 201 | |
| 202 | Mode supervision |
| 203 | ---------------- |
| 204 | Il s'agit d'un mode offrant à un composant externe une visibilité de |
| 205 | l'état de santé du service. Il se contente de retourner "OK" à tout |
| 206 | client se connectant sur son port. Il peut être utilisé avec des |
| 207 | répartiteurs de charge évolués pour déterminer quels sont les services |
| 208 | utilisables. Pour activer ce mode, préciser le mode HEALTH sous la |
| 209 | déclaration du relais : |
| 210 | |
| 211 | listen health_check 0.0.0.0:60000 |
| 212 | mode health |
| 213 | |
| 214 | |
| 215 | Limitation du nombre de connexions simultanées |
| 216 | ============================================== |
| 217 | |
| 218 | Le paramètre "maxconn" permet de fixer la limite acceptable en nombre |
| 219 | de connexions simultanées par proxy. Chaque proxy qui atteint cette |
| 220 | valeur cesse d'écouter jusqu'à libération d'une connexion. Voir plus |
| 221 | loin concernant les limitations liées au système. Exemple: |
| 222 | |
| 223 | maxconn 16000 |
| 224 | |
| 225 | |
| 226 | Arrêt en douceur |
| 227 | ================ |
| 228 | |
| 229 | Il est possible d'arrêter les services en douceur en envoyant un |
| 230 | signal SIG_USR1 au processus relais. Tous les services seront alors |
| 231 | mis en phase d'arrêt, mais pourront continuer d'accepter des connexions |
| 232 | pendant un temps défini par le paramètre "grace" (en millisecondes). |
| 233 | Cela permet par exemple, de faire savoir rapidement à un répartiteur |
| 234 | de charge qu'il ne doit plus utiliser un relais, tout en continuant |
| 235 | d'assurer le service le temps qu'il s'en rende compte. Remarque : les |
| 236 | connexions actives ne sont jamais cassées. Dans le pire des cas, il |
| 237 | faudra attendre en plus leur expiration avant l'arrêt total du |
| 238 | processus. La valeur par défaut est 0 (pas de grâce). |
| 239 | |
| 240 | Exemple : |
| 241 | --------- |
| 242 | |
| 243 | # le service tournera encore 10 secondes après la demande d'arrêt |
| 244 | listen http_proxy 0.0.0.0:80 |
| 245 | mode http |
| 246 | grace 10000 |
| 247 | |
| 248 | listen health_check 0.0.0.0:60000 |
| 249 | mode health |
| 250 | grace 0 |
| 251 | |
| 252 | |
| 253 | Temps d'expiration des connexions |
| 254 | ================================= |
| 255 | |
| 256 | Il est possible de paramétrer certaines durées d'expiration au niveau |
| 257 | des connexions TCP. Trois temps indépendants sont configurables et |
| 258 | acceptent des valeurs en millisecondes. Si l'une de ces trois |
| 259 | temporisations est dépassée, la session est terminée à chaque |
| 260 | extrémité. |
| 261 | |
| 262 | - temps d'attente d'une donnée de la part du client, ou de la |
| 263 | possibilité de lui envoyer des données : "clitimeout" : |
| 264 | |
| 265 | # time-out client à 2mn30. |
| 266 | clitimeout 150000 |
| 267 | |
| 268 | - temps d'attente d'une donnée de la part du serveur, ou de la |
| 269 | possibilité de lui envoyer des données : "srvtimeout" : |
| 270 | |
| 271 | # time-out client à 30s. |
| 272 | srvtimeout 30000 |
| 273 | |
| 274 | - temps d'attente de l'établissement d'une connexion vers un serveur |
| 275 | "contimeout" : |
| 276 | |
| 277 | # on abandonne si la connexion n'est pas établie après 3 secondes |
| 278 | contimeout 3000 |
| 279 | |
| 280 | Remarque: "contimeout" et "srvtimeout" n'ont pas d'utilité dans le cas |
| 281 | du serveur de type "health". |
| 282 | |
| 283 | Tentatives de reconnexion |
| 284 | ========================= |
| 285 | |
| 286 | Lors d'un échec de connexion vers un serveur, il est possible de |
| 287 | retenter (potentiellement vers un autre serveur, en cas de répartition |
| 288 | de charge). Le nombre de nouvelles tentatives infructueuses avant |
| 289 | abandon est fourni par le paramètre "retries" : |
| 290 | |
| 291 | # on essaie encore trois fois maxi |
| 292 | retries 3 |
| 293 | |
| 294 | Adresse du serveur |
| 295 | ================== |
| 296 | |
| 297 | Le serveur vers lequel sont redirigées les connexions est défini par |
| 298 | le paramètre "dispatch" sous la forme <adresse_ip>:<port> : |
| 299 | |
| 300 | # on envoie toutes les nouvelles connexions ici |
| 301 | dispatch 192.168.1.2:80 |
| 302 | |
| 303 | Remarque: ce paramètre n'a pas d'utilité pour un serveur en mode "health". |
| 304 | |
| 305 | Définition du nom du cookie |
| 306 | =========================== |
| 307 | |
| 308 | En mode HTTP, il est possible de rechercher la valeur d'un cookie pour |
| 309 | savoir vers quel serveur aiguiller la requête utilisateur. Le nom du |
| 310 | cookie est donné par le paramètre "cookie" : |
| 311 | |
| 312 | listen http_proxy 0.0.0.0:80 |
| 313 | mode http |
| 314 | cookie SERVERID |
| 315 | |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 316 | On peut modifier l'utilisation du cookie pour la rendre plus |
| 317 | intelligente vis-à-vis des applications relayées. Il est possible,notamment |
| 318 | de supprimer ou réécrire un cookie retourné par un serveur accédé en direct, |
| 319 | et d'insérer un cookie dans une réponse HTTP orientée vers un serveur |
| 320 | sélectionné en répartition de charge. |
| 321 | |
| 322 | Pour ne conserver le cookie qu'en accès indirect, donc à travers le |
| 323 | dispatcheur, et le supprimer lors des accès directs : |
| 324 | |
| 325 | cookie SERVERID indirect |
| 326 | |
| 327 | Pour réécrire le nom du serveur dans un cookie lors d'un accès direct : |
| 328 | |
| 329 | cookie SERVERID rewrite |
| 330 | |
| 331 | Pour créer un cookie comportant le nom du serveur lors d'un accès en |
| 332 | répartition de charge interne. Dans ce cas, il est indispensable que tous les |
| 333 | serveurs aient un cookie renseigné. |
| 334 | |
| 335 | cookie SERVERID insert |
| 336 | |
| 337 | Remarque: Il est possible de combiner 'insert' avec 'indirect' ou 'rewrite' |
| 338 | pour s'adapter à des applications générant déjà le cookie, avec un contenu |
| 339 | invalide. Il suffit pour cela de les spécifier sur la même ligne. |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 340 | |
| 341 | Assignation d'un serveur à une valeur de cookie |
| 342 | =============================================== |
| 343 | |
| 344 | En mode HTTP, il est possible d'associer des serveurs à des valeurs de |
| 345 | cookie par le paramètre "server". La syntaxe est : |
| 346 | |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 347 | server <identifiant> <adresse_ip>:<port> cookie <valeur> |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 348 | |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 349 | <identifiant> est un nom quelconque de serveur utilisé pour |
| 350 | l'identifier dans la configuration (erreurs...). |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 351 | <adresse_ip>:<port> le couple adresse-port sur lequel le serveur écoute. |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 352 | <valeur> est la valeur trouvée dans le cookie, |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 353 | |
| 354 | Exemple : le cookie SERVERID peut contenir server01 ou server02 |
| 355 | ------- |
| 356 | listen http_proxy 0.0.0.0:80 |
| 357 | mode http |
| 358 | cookie SERVERID |
| 359 | dispatch 192.168.1.100:80 |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 360 | server web1 192.168.1.1:80 cookie server01 |
| 361 | server web2 192.168.1.2:80 cookie server02 |
| 362 | |
| 363 | Attention : la syntaxe a changé depuis la version 1.0. |
| 364 | --------- |
| 365 | |
| 366 | Répartiteur de charge interne |
| 367 | ============================= |
| 368 | |
| 369 | Le relais peut effectuer lui-même la répartition de charge entre les |
| 370 | différents serveurs décrits pour un service donné, en mode TCP comme |
| 371 | en mode HTTP. Pour cela, on précise le mot clé 'balance' dans la |
| 372 | définition du service, éventuellement suivi du nom d'un algorithme de |
| 373 | répartition. En version 1.1.0, seul 'roundrobin' est géré, et c'est |
| 374 | aussi la valeur implicite par défaut. Il est évident qu'en cas |
| 375 | d'utilisation du répartiteur interne, il ne faudra pas spécifier |
| 376 | d'adresse de dispatch, et qu'il faudra au moins un serveur. |
| 377 | |
| 378 | Exemple : même que précédemment en répartition interne |
| 379 | ------- |
| 380 | |
| 381 | listen http_proxy 0.0.0.0:80 |
| 382 | mode http |
| 383 | cookie SERVERID |
| 384 | balance roundrobin |
| 385 | server web1 192.168.1.1:80 cookie server01 |
| 386 | server web2 192.168.1.2:80 cookie server02 |
| 387 | |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 388 | |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 389 | Surveillance des serveurs |
| 390 | ========================= |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 391 | |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 392 | A cette date, l'état des serveurs n'est testé que par établissement |
| 393 | de connexion TCP toutes les 2 secondes, avec 3 essais pour déclarer |
| 394 | un serveur en panne, 2 pour le déclarer utilisable. Un serveur hors |
| 395 | d'usage ne sera pas utilisé dans le processus de répartition de charge |
| 396 | interne. Pour activer la surveillance, ajouter le mot clé 'check' à la |
willy tarreau | e47c8d7 | 2005-12-17 12:55:52 +0100 | [diff] [blame] | 397 | fin de la déclaration du serveur. Il est possible de spécifier |
| 398 | l'intervalle (en millisecondes) séparant deux tests du serveur par le |
| 399 | paramètre "inter", le nombre d'échecs acceptés par le paramètre "fall", |
| 400 | et le nombre de succès avant reprise par le paramètre "rise". |
| 401 | Les paramètres non précisés prennent les valeurs suivantes par défaut : |
| 402 | - inter : 2000 |
| 403 | - rise : 2 |
| 404 | - fall : 3 |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 405 | |
| 406 | Exemple : même que précédemment avec surveillance |
| 407 | ------- |
| 408 | |
| 409 | listen http_proxy 0.0.0.0:80 |
| 410 | mode http |
| 411 | cookie SERVERID |
| 412 | balance roundrobin |
| 413 | server web1 192.168.1.1:80 cookie server01 check |
| 414 | server web2 192.168.1.2:80 cookie server02 check |
| 415 | |
| 416 | |
| 417 | Reconnexion vers un répartiteur en cas d'échec direct |
| 418 | ===================================================== |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 419 | |
| 420 | En mode HTTP, si un serveur défini par un cookie ne répond plus, les |
| 421 | clients seront définitivement aiguillés dessus à cause de leur cookie, |
| 422 | et de ce fait, définitivement privés de service. La spécification du |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 423 | paramètre "redispatch" autorise dans ce cas à renvoyer les connexions |
| 424 | échouées vers le répartiteur (externe ou interne) afin d'assigner un |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 425 | nouveau serveur à ces clients. |
| 426 | |
| 427 | Exemple : |
| 428 | ------- |
| 429 | listen http_proxy 0.0.0.0:80 |
| 430 | mode http |
| 431 | cookie SERVERID |
| 432 | dispatch 192.168.1.100:80 |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 433 | server web1 192.168.1.1:80 cookie server01 |
| 434 | server web2 192.168.1.2:80 cookie server02 |
| 435 | redispatch # renvoyer vers dispatch si serveur HS. |
| 436 | |
| 437 | Fonctionnement en mode transparent |
| 438 | ================================== |
| 439 | |
| 440 | En mode HTTP, le mot clé "transparent" permet d'intercepter des |
| 441 | sessions routées à travers la machine hébergeant le proxy. Dans |
| 442 | ce mode, on ne précise pas l'adresse de répartition "dispatch", |
| 443 | car celle-ci est tirée de l'adresse destination de la session |
| 444 | détournée. Le système doit permettre de rediriger les paquets |
| 445 | vers un processus local. |
| 446 | |
| 447 | Exemple : |
| 448 | ------- |
| 449 | listen http_proxy 0.0.0.0:65000 |
| 450 | mode http |
| 451 | transparent |
| 452 | cookie SERVERID |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 453 | server server01 192.168.1.1:80 |
| 454 | server server02 192.168.1.2:80 |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 455 | |
| 456 | # iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.100 \ |
| 457 | --dport 80 -j REDIRECT --to-ports 65000 |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 458 | |
| 459 | Journalisation des connexions |
| 460 | ============================= |
| 461 | |
| 462 | Les connexions TCP et HTTP peuvent donner lieu à une journalisation |
| 463 | sommaire indiquant, pour chaque connexion, la date, l'heure, les adresses |
| 464 | IP source et destination, et les ports source et destination qui la |
| 465 | caractérisent. Ultérieurement, les URLs seront loguées en mode HTTP, |
| 466 | tout comme les arrêts de service. Tous les messages sont envoyés en |
| 467 | syslog vers un ou deux serveurs. La syntaxe est la suivante : |
| 468 | |
| 469 | log <adresse_ip> <facility> |
| 470 | |
| 471 | Exemple : |
| 472 | --------- |
| 473 | listen http_proxy 0.0.0.0:80 |
| 474 | mode http |
| 475 | log 192.168.2.200 local3 |
| 476 | log 192.168.2.201 local4 |
| 477 | |
| 478 | Les connexions sont envoyées en niveau "info". Les démarrages de |
| 479 | service seront envoyés en "notice", les signaux d'arrêts en "warning" |
willy tarreau | 535ae7a | 2005-12-17 12:58:00 +0100 | [diff] [blame] | 480 | et les arrêts définitifs en "alert". Ceci est valable aussi bien |
| 481 | pour les proxies que pour les serveurs testés au sein des proxies. |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 482 | |
| 483 | Les catégories possibles sont : |
| 484 | kern, user, mail, daemon, auth, syslog, lpr, news, |
| 485 | uucp, cron, auth2, ftp, ntp, audit, alert, cron2, |
| 486 | local0, local1, local2, local3, local4, local5, local6, local7 |
| 487 | |
| 488 | |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 489 | Modification des entêtes HTTP |
| 490 | ============================= |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 491 | |
| 492 | En mode HTTP uniquement, il est possible de remplacer certains entêtes |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 493 | dans la requête et/ou la réponse à partir d'expressions régulières. Une |
| 494 | limitation cependant : les entêtes fournis au milieu de connexions |
| 495 | persistentes (keep-alive) ne sont pas vus. Les données ne sont pas |
| 496 | affectées, ceci ne s'applique qu'aux entêtes. |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 497 | |
| 498 | La syntaxe est : |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 499 | reqadd <string> pour ajouter un entête dans la requête |
| 500 | reqrep <search> <replace> pour modifier la requête |
| 501 | reqrep <search> pour supprimer un entête dans la requête |
| 502 | |
| 503 | rspadd <string> pour ajouter un entête dans la réponse |
| 504 | rsprep <search> <replace> pour modifier la réponse |
| 505 | rsprep <search> pour supprimer un entête dans la réponse |
| 506 | |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 507 | |
| 508 | <search> est une expression régulière compatible GNU regexp supportant |
| 509 | le groupage par parenthèses (sans les '\'). Les espaces et autres |
| 510 | séparateurs doivent êtres précédés d'un '\' pour ne pas être confondus |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 511 | avec la fin de la chaîne. De plus, certains caractères spéciaux peuvent |
| 512 | être précédés d'un backslach ('\') : |
| 513 | |
| 514 | \t pour une tabulation |
| 515 | \r pour un retour charriot |
| 516 | \n pour un saut de ligne |
| 517 | \ pour différencier un espace d'un séparateur |
| 518 | \# pour différencier un dièse d'un commentaire |
| 519 | \\ pour un backslash |
| 520 | \xXX pour un caractère spécifique XX (comme en C) |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 521 | |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 522 | |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 523 | <replace> contient la chaîne remplaçant la portion vérifiée par l'expression. |
| 524 | Elle peut inclure les caractères spéciaux ci-dessus, faire référence à un |
| 525 | groupe délimité par des parenthèses dans l'expression régulière, par sa |
| 526 | position numérale. Les positions vont de 1 à 9, et sont codées par un '\' |
| 527 | suivi du chiffre désiré. Il est également possible d'insérer un caractère non |
| 528 | imprimable (utile pour le saut de ligne) inscrivant '\x' suivi du code |
| 529 | hexadécimal de ce caractère (comme en C). |
| 530 | |
| 531 | <string> représente une chaîne qui sera ajoutée systématiquement après la |
| 532 | dernière ligne d'entête. |
| 533 | |
| 534 | Remarques : |
| 535 | --------- |
| 536 | - la première ligne de la requête et celle de la réponse sont traitées comme |
| 537 | des entêtes, ce qui permet de réécrire des URL et des codes d'erreur. |
| 538 | - 'reqrep' est l'équivalent de 'cliexp' en version 1.0, et 'rsprep' celui de |
| 539 | 'srvexp'. Ces noms sont toujours supportés mais déconseillés. |
| 540 | - pour des raisons de performances, le nombre total de caractères ajoutés sur |
willy tarreau | 535ae7a | 2005-12-17 12:58:00 +0100 | [diff] [blame] | 541 | une requête ou une réponse est limité à 4096 depuis la version 1.1.5 (cette |
| 542 | limite était à 256 auparavant). Cette valeur est modifiable dans le code. |
| 543 | Pour un usage temporaire, on peut gagner de la place en supprimant quelques |
| 544 | entêtes inutiles avant les ajouts. |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 545 | |
| 546 | Exemples : |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 547 | -------- |
| 548 | reqrep ^(GET.*)(.free.fr)(.*) \1.online.fr\3 |
| 549 | reqrep ^(POST.*)(.free.fr)(.*) \1.online.fr\3 |
| 550 | reqrep ^Proxy-Connection:.* Proxy-Connection:\ close |
| 551 | rsprep ^Server:.* Server:\ Tux-2.0 |
| 552 | rsprep ^(Location:\ )([^:]*://[^/]*)(.*) \1\3 |
| 553 | rspdel ^Connection:.* |
| 554 | rspadd Connection:\ close |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 555 | |
| 556 | |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 557 | Répartition avec persistence |
| 558 | ============================ |
| 559 | |
| 560 | La combinaison de l'insertion de cookie avec la répartition de charge interne |
| 561 | permet d'assurer une persistence dans les sessions HTTP d'une manière |
| 562 | pratiquement transparente pour les applications. Le principe est simple : |
| 563 | - assigner un cookie à chaque serveur |
| 564 | - effectuer une répartition interne |
| 565 | - insérer un cookie dans les réponses issues d'une répartition |
| 566 | |
| 567 | Exemple : |
| 568 | ------- |
| 569 | listen application 0.0.0.0:80 |
| 570 | mode http |
| 571 | cookie SERVERID insert indirect |
| 572 | balance roundrobin |
| 573 | server 192.168.1.1:80 cookie server01 check |
| 574 | server 192.168.1.2:80 cookie server02 check |
| 575 | |
willy tarreau | b719f00 | 2005-12-17 12:55:07 +0100 | [diff] [blame] | 576 | ======================= |
| 577 | | Paramétrage système | |
| 578 | ======================= |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 579 | |
| 580 | Sous Linux 2.4 |
| 581 | ============== |
| 582 | |
willy tarreau | b719f00 | 2005-12-17 12:55:07 +0100 | [diff] [blame] | 583 | -- cut here -- |
| 584 | #!/bin/sh |
| 585 | # set this to about 256/4M (16384 for 256M machine) |
| 586 | MAXFILES=16384 |
| 587 | echo $MAXFILES > /proc/sys/fs/file-max |
| 588 | ulimit -n $MAXFILES |
| 589 | |
| 590 | if [ -e /proc/sys/net/ipv4/ip_conntrack_max ]; then |
| 591 | echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max |
| 592 | fi |
| 593 | |
| 594 | if [ -e /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait ]; then |
| 595 | # 30 seconds for fin, 15 for time wait |
| 596 | echo 3000 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_fin_wait |
| 597 | echo 1500 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_timeout_time_wait |
| 598 | echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_invalid_scale |
| 599 | echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window |
| 600 | fi |
| 601 | |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 602 | echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 603 | echo 32768 > /proc/sys/net/ipv4/ip_queue_maxlen |
willy tarreau | b719f00 | 2005-12-17 12:55:07 +0100 | [diff] [blame] | 604 | echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout |
| 605 | echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 606 | echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets |
willy tarreau | b719f00 | 2005-12-17 12:55:07 +0100 | [diff] [blame] | 607 | echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans |
| 608 | echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 609 | echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle |
| 610 | echo 0 > /proc/sys/net/ipv4/tcp_timestamps |
willy tarreau | 5cbea6f | 2005-12-17 12:48:26 +0100 | [diff] [blame] | 611 | echo 0 > /proc/sys/net/ipv4/tcp_ecn |
willy tarreau | b719f00 | 2005-12-17 12:55:07 +0100 | [diff] [blame] | 612 | echo 0 > /proc/sys/net/ipv4/tcp_sack |
| 613 | echo 0 > /proc/sys/net/ipv4/tcp_dsack |
| 614 | |
| 615 | # auto-tuned on 2.4 |
| 616 | #echo 262143 > /proc/sys/net/core/rmem_max |
| 617 | #echo 262143 > /proc/sys/net/core/rmem_default |
| 618 | |
| 619 | echo 16384 65536 524288 > /proc/sys/net/ipv4/tcp_rmem |
| 620 | echo 16384 349520 699040 > /proc/sys/net/ipv4/tcp_wmem |
| 621 | |
| 622 | -- cut here -- |
willy tarreau | 0f7af91 | 2005-12-17 12:21:26 +0100 | [diff] [blame] | 623 | |
| 624 | -- fin -- |