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