Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 1 | ---------------------- |
| 2 | HAProxy |
| 3 | Configuration Manual |
| 4 | ---------------------- |
Krzysztof Oledzki | d9db927 | 2007-10-15 10:05:11 +0200 | [diff] [blame] | 5 | version 1.3.13 |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 6 | willy tarreau |
Willy Tarreau | fbee713 | 2007-10-18 13:53:22 +0200 | [diff] [blame] | 7 | 2007/10/18 |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 8 | |
| 9 | |
| 10 | This document covers the configuration language as implemented in the version |
| 11 | specified above. It does not provide any hint, example or advice. For such |
| 12 | docuemntation, please refer to the Reference Manual or the Architecture Manual. |
| 13 | |
| 14 | |
| 15 | HAProxy's configuration process involves 3 major sources of parameters : |
| 16 | |
| 17 | - the arguments from the command-line, which always take precedence |
| 18 | - the "global" section, which sets process-wide parameters |
| 19 | - the proxies sections which can take form of "defaults", "listen", |
| 20 | "frontend" and "backend". |
| 21 | |
| 22 | 1. Global parameters |
| 23 | -------------------- |
| 24 | |
| 25 | Parameters in the "global" section are process-wide and often OS-specific. They |
| 26 | are generally set once for all and do not need being changed once correct. Some |
| 27 | of them have command-line equivalents. |
| 28 | |
| 29 | The following keywords are supported in the "global" section : |
| 30 | |
| 31 | * Process management and security |
| 32 | - chroot |
| 33 | - daemon |
| 34 | - gid |
| 35 | - group |
| 36 | - log |
| 37 | - nbproc |
| 38 | - pidfile |
| 39 | - uid |
| 40 | - ulimit-n |
| 41 | - user |
Willy Tarreau | fbee713 | 2007-10-18 13:53:22 +0200 | [diff] [blame] | 42 | - stats |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 43 | |
| 44 | * Performance tuning |
| 45 | - maxconn |
| 46 | - noepoll |
| 47 | - nokqueue |
| 48 | - nopoll |
| 49 | - nosepoll |
| 50 | - tune.maxpollevents |
Willy Tarreau | fe255b7 | 2007-10-14 23:09:26 +0200 | [diff] [blame] | 51 | - spread-checks |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 52 | |
| 53 | * Debugging |
| 54 | - debug |
| 55 | - quiet |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 56 | |
| 57 | |
| 58 | 1.1) Process management and security |
| 59 | ------------------------------------ |
| 60 | |
| 61 | chroot <jail dir> |
| 62 | Changes current directory to <jail dir> and performs a chroot() there before |
| 63 | dropping privileges. This increases the security level in case an unknown |
| 64 | vulnerability would be exploited, since it would make it very hard for the |
| 65 | attacker to exploit the system. This only works when the process is started |
| 66 | with superuser privileges. It is important to ensure that <jail_dir> is both |
| 67 | empty and unwritable to anyone. |
| 68 | |
| 69 | daemon |
| 70 | Makes the process fork into background. This is the recommended mode of |
| 71 | operation. It is equivalent to the command line "-D" argument. It can be |
| 72 | disabled by the command line "-db" argument. |
| 73 | |
| 74 | gid <number> |
| 75 | Changes the process' group ID to <number>. It is recommended that the group |
| 76 | ID is dedicated to HAProxy or to a small set of similar daemons. HAProxy must |
| 77 | be started with a user belonging to this group, or with superuser privileges. |
| 78 | See also "group" and "uid". |
| 79 | |
| 80 | group <group name> |
| 81 | Similar to "gid" but uses the GID of group name <group name> from /etc/group. |
| 82 | See also "gid" and "user". |
| 83 | |
| 84 | log <address> <facility> [max level] |
| 85 | Adds a global syslog server. Up to two global servers can be defined. They |
| 86 | will receive logs for startups and exits, as well as all logs from proxies |
| 87 | configured with "log global". <address> is an IPv4 address optionally |
| 88 | followed by a colon and an UDP port. If no port is specified, 514 is used |
| 89 | by default (the standard syslog port). <facility> must be one of the 24 |
| 90 | standard syslog facilities : |
| 91 | |
| 92 | kern user mail daemon auth syslog lpr news |
| 93 | uucp cron auth2 ftp ntp audit alert cron2 |
| 94 | local0 local1 local2 local3 local4 local5 local6 local7 |
| 95 | |
| 96 | An optional level can be specified to filter outgoing messages. By default, |
| 97 | all messages are sent. If a level is specified, only messages with a severity |
| 98 | at least as important as this level will be sent. 8 levels are known : |
| 99 | |
| 100 | emerg alert crit err warning notice info debug |
| 101 | |
| 102 | nbproc <number> |
| 103 | Creates <number> processes when going daemon. This requires the "daemon" |
| 104 | mode. By default, only one process is created, which is the recommended mode |
| 105 | of operation. For systems limited to small sets of file descriptors per |
| 106 | process, it may be needed to fork multiple daemons. USING MULTIPLE PROCESSES |
| 107 | IS HARDER TO DEBUG AND IS REALLY DISCOURAGED. See also "daemon". |
| 108 | |
| 109 | pidfile <pidfile> |
| 110 | Writes pids of all daemons into file <pidfile>. This option is equivalent to |
| 111 | the "-p" command line argument. The file must be accessible to the user |
| 112 | starting the process. See also "daemon". |
| 113 | |
Willy Tarreau | fbee713 | 2007-10-18 13:53:22 +0200 | [diff] [blame] | 114 | stats socket <path> [{uid | user} <uid>] [{gid | group} <gid>] [mode <mode>] |
| 115 | Creates a UNIX socket in stream mode at location <path>. Any previously |
| 116 | existing socket will be backed up then replaced. Connections to this socket |
| 117 | will get a CSV-formated output of the process statistics in response to the |
| 118 | "show stat" command followed by a line feed. On platforms which support it, |
| 119 | it is possible to restrict access to this socket by specifying numerical IDs |
| 120 | after "uid" and "gid", or valid user and group names after the "user" and |
| 121 | "group" keywords. It is also possible to restrict permissions on the socket |
| 122 | by passing an octal value after the "mode" keyword (same syntax as chmod). |
| 123 | Depending on the platform, the permissions on the socket will be inherited |
| 124 | from the directory which hosts it, or from the user the process is started |
| 125 | with. |
| 126 | |
| 127 | stats timeout <timeout, in milliseconds> |
| 128 | The default timeout on the stats socket is set to 10 seconds. It is possible |
| 129 | to change this value with "stats timeout". The value must be passed in |
| 130 | milliseconds. |
| 131 | |
| 132 | stats maxconn <connections> |
| 133 | By default, the stats socket is limited to 10 concurrent connections. It is |
| 134 | possible to change this value with "stats maxconn". |
| 135 | |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 136 | uid <number> |
| 137 | Changes the process' user ID to <number>. It is recommended that the user ID |
| 138 | is dedicated to HAProxy or to a small set of similar daemons. HAProxy must |
| 139 | be started with superuser privileges in order to be able to switch to another |
| 140 | one. See also "gid" and "user". |
| 141 | |
| 142 | ulimit-n <number> |
| 143 | Sets the maximum number of per-process file-descriptors to <number>. By |
| 144 | default, it is automatically computed, so it is recommended not to use this |
| 145 | option. |
| 146 | |
| 147 | user <user name> |
| 148 | Similar to "uid" but uses the UID of user name <user name> from /etc/passwd. |
| 149 | See also "uid" and "group". |
| 150 | |
| 151 | |
| 152 | 1.2) Performance tuning |
| 153 | ----------------------- |
| 154 | |
| 155 | maxconn <number> |
| 156 | Sets the maximum per-process number of concurrent connections to <number>. It |
| 157 | is equivalent to the command-line argument "-n". Proxies will stop accepting |
| 158 | connections when this limit is reached. The "ulimit-n" parameter is |
| 159 | automatically adjusted according to this value. See also "ulimit-n". |
| 160 | |
| 161 | noepoll |
| 162 | Disables the use of the "epoll" event polling system on Linux. It is |
| 163 | equivalent to the command-line argument "-de". The next polling system |
| 164 | used will generally be "poll". See also "nosepoll", and "nopoll". |
| 165 | |
| 166 | nokqueue |
| 167 | Disables the use of the "kqueue" event polling system on BSD. It is |
| 168 | equivalent to the command-line argument "-dk". The next polling system |
| 169 | used will generally be "poll". See also "nopoll". |
| 170 | |
| 171 | nopoll |
| 172 | Disables the use of the "poll" event polling system. It is equivalent to the |
| 173 | command-line argument "-dp". The next polling system used will be "select". |
| 174 | It should never be needed to didsable "poll" since it's available on all |
| 175 | platforms supported by HAProxy. See also "nosepoll", and "nopoll" and |
| 176 | "nokqueue". |
| 177 | |
| 178 | nosepoll |
| 179 | Disables the use of the "speculative epoll" event polling system on Linux. It |
| 180 | is equivalent to the command-line argument "-ds". The next polling system |
| 181 | used will generally be "epoll". See also "nosepoll", and "nopoll". |
| 182 | |
| 183 | tune.maxpollevents <number> |
| 184 | Sets the maximum amount of events that can be processed at once in a call to |
| 185 | the polling system. The default value is adapted to the operating system. It |
| 186 | has been noticed that reducing it below 200 tends to slightly decrease |
| 187 | latency at the expense of network bandwidth, and increasing it above 200 |
| 188 | tends to trade latency for slightly increased bandwidth. |
| 189 | |
Willy Tarreau | fe255b7 | 2007-10-14 23:09:26 +0200 | [diff] [blame] | 190 | spread-checks <0..50, in percent> |
| 191 | Sometimes it is desirable to avoid sending health checks to servers at exact |
| 192 | intervals, for instance when many logical servers are located on the same |
| 193 | physical server. With the help of this parameter, it becomes possible to add |
| 194 | some randomness in the check interval between 0 and +/- 50%. A value between |
| 195 | 2 and 5 seems to show good results. The default value remains at 0. |
| 196 | |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 197 | |
| 198 | 1.3) Debugging |
| 199 | --------------- |
| 200 | |
| 201 | debug |
| 202 | Enables debug mode which dumps to stdout all exchanges, and disables forking |
| 203 | into background. It is the equivalent of the command-line argument "-d". It |
| 204 | should never be used in a production configuration since it may prevent full |
| 205 | system startup. |
| 206 | |
| 207 | quiet |
| 208 | Do not display any message during startup. It is equivalent to the command- |
| 209 | line argument "-q". |
| 210 | |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 211 | |
| 212 | 2) Proxies |
| 213 | ---------- |
| 214 | Proxy configuration can be located in a set of sections : |
| 215 | - defaults <name> |
| 216 | - frontend <name> |
| 217 | - backend <name> |
| 218 | - listen <name> |
| 219 | |
| 220 | A "defaults" section sets default parameters for all other sections following |
| 221 | its declaration. Those default parameters are reset by the next "defaults" |
| 222 | section. See below for the list of parameters which can be set in a "defaults" |
| 223 | section. |
| 224 | |
| 225 | A "frontend" section describes a set of listening sockets accepting client |
| 226 | connections. |
| 227 | |
| 228 | A "backend" section describes a set of servers to which the proxy will connect |
| 229 | to forward incoming connections. |
| 230 | |
| 231 | A "listen" section defines a complete proxy with its frontend and backend |
| 232 | parts combined in one section. It is generally useful for TCP-only traffic. |
| 233 | |
| 234 | The following list of keywords is supported. Most of them may only be used in a |
| 235 | limited set of section types. |
| 236 | |
| 237 | keyword defaults frontend listen backend |
| 238 | ----------------------+----------+----------+---------+--------- |
| 239 | acl - X X X |
| 240 | appsession - - X X |
| 241 | balance - - X X |
| 242 | bind - X X - |
| 243 | block - X X X |
| 244 | capture cookie X X X X |
| 245 | capture request header X X X X |
| 246 | capture response header X X X X |
| 247 | clitimeout X X X - |
| 248 | contimeout X X X X |
| 249 | cookie X - X X |
| 250 | default_backend - X X - |
| 251 | disabled - X X X |
| 252 | dispatch - - X X |
| 253 | enabled - X X X |
| 254 | errorfile X X X X |
| 255 | errorloc X X X X |
| 256 | errorloc302 X X X X |
| 257 | errorloc303 X X X X |
| 258 | fullconn X - X X |
| 259 | grace - X X X |
Willy Tarreau | dbc36f6 | 2007-11-30 12:29:11 +0100 | [diff] [blame] | 260 | http-check disable-on-404 X - X X |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 261 | log X X X X |
| 262 | maxconn X X X - |
| 263 | mode X X X X |
Willy Tarreau | c7246fc | 2007-12-02 17:31:20 +0100 | [diff] [blame] | 264 | monitor fail - X X - |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 265 | monitor-net X X X - |
| 266 | monitor-uri X X X - |
| 267 | option abortonclose X - X X |
| 268 | option allbackups X - X X |
| 269 | option checkcache X - X X |
| 270 | option clitcpka X X X - |
Krzysztof Piotr Oledzki | 583bc96 | 2007-11-24 22:12:47 +0100 | [diff] [blame] | 271 | option contstats X X X - |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 272 | option dontlognull X X X - |
| 273 | option forceclose X - X X |
| 274 | option forwardfor X X X X |
| 275 | option httpchk X - X X |
| 276 | option httpclose X X X X |
| 277 | option httplog X X X X |
| 278 | option logasap X X X - |
Alexandre Cassen | 87ea548 | 2007-10-11 20:48:58 +0200 | [diff] [blame] | 279 | option nolinger X X X X |
Alexandre Cassen | 5eb1a90 | 2007-11-29 15:43:32 +0100 | [diff] [blame] | 280 | option http_proxy X X X X |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 281 | option persist X - X X |
| 282 | option redispatch X - X X |
| 283 | option smtpchk X - X X |
| 284 | option srvtcpka X - X X |
| 285 | option ssl-hello-chk X - X X |
| 286 | option tcpka X X X X |
| 287 | option tcplog X X X X |
| 288 | option tcpsplice X X X X |
| 289 | option transparent X X X - |
| 290 | redisp X - X X |
| 291 | redispatch X - X X |
| 292 | reqadd - X X X |
| 293 | reqallow - X X X |
| 294 | reqdel - X X X |
| 295 | reqdeny - X X X |
| 296 | reqiallow - X X X |
| 297 | reqidel - X X X |
| 298 | reqideny - X X X |
| 299 | reqipass - X X X |
| 300 | reqirep - X X X |
| 301 | reqisetbe - X X X |
| 302 | reqitarpit - X X X |
| 303 | reqpass - X X X |
| 304 | reqrep - X X X |
| 305 | reqsetbe - X X X |
| 306 | reqtarpit - X X X |
| 307 | retries X - X X |
| 308 | rspadd - X X X |
| 309 | rspdel - X X X |
| 310 | rspdeny - X X X |
| 311 | rspidel - X X X |
| 312 | rspideny - X X X |
| 313 | rspirep - X X X |
| 314 | rsprep - X X X |
| 315 | server - - X X |
| 316 | source X - X X |
| 317 | srvtimeout X - X X |
Willy Tarreau | 24e779b | 2007-07-24 23:43:37 +0200 | [diff] [blame] | 318 | stats auth X - X X |
| 319 | stats enable X - X X |
| 320 | stats realm X - X X |
Willy Tarreau | bbd4212 | 2007-07-25 07:26:38 +0200 | [diff] [blame] | 321 | stats refresh X - X X |
Willy Tarreau | 24e779b | 2007-07-24 23:43:37 +0200 | [diff] [blame] | 322 | stats scope X - X X |
| 323 | stats uri X - X X |
Krzysztof Oledzki | d9db927 | 2007-10-15 10:05:11 +0200 | [diff] [blame] | 324 | stats hide-version X - X X |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 325 | transparent X X X - |
| 326 | use_backend - X X - |
| 327 | usesrc X - X X |
| 328 | ----------------------+----------+----------+---------+--------- |
| 329 | keyword defaults frontend listen backend |
| 330 | |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 331 | |
| 332 | 2.1) using ACLs |
| 333 | --------------- |
| 334 | |
| 335 | The use of Access Control Lists (ACL) provides a flexible solution to perform |
| 336 | content switching. The principle is simple : |
| 337 | |
| 338 | - define test criteria with sets of values |
| 339 | - perform actions only if a set of tests is valid |
| 340 | |
| 341 | The actions generally consist in blocking the request, or selecting a backend. |
| 342 | |
| 343 | In order to define a test, the "acl" keyword is used. The syntax is : |
| 344 | |
| 345 | acl <aclname> <criterion> [flags] [operator] <value> ... |
| 346 | |
| 347 | This creates an ACL <aclname> or completes an existing one with new |
| 348 | tests. Those tests apply to the portion of request specified in <criterion> |
| 349 | and may be adjusted with optional flags [flags]. Some criteria also support |
| 350 | an operator which may be specified before the set of values. The values are |
| 351 | of the type supported by the criterion, and are separated by spaces. |
| 352 | |
| 353 | There is no limit to the number of ACLs. The unused ones do not affect |
| 354 | performance, they just consume a small amount of memory. |
| 355 | |
| 356 | The current flags are currently supported : |
| 357 | |
| 358 | -i : ignore case during matching. |
| 359 | -- : force end of flags. Useful when a string looks like one of the flags. |
| 360 | |
| 361 | Supported types of values are : |
| 362 | - integers or integer ranges |
| 363 | - strings |
| 364 | - regular expressions |
| 365 | - IP addresses and networks |
| 366 | |
| 367 | |
| 368 | 2.1.1) Matching integers |
| 369 | ------------------------ |
| 370 | |
| 371 | Matching integers is special in that ranges and operators are permitted. Note |
| 372 | that integer matching only applies to positive values. A range is a value |
| 373 | expressed with a lower and an upper bound separated with a colon, both of which |
| 374 | may be omitted. |
| 375 | |
| 376 | For instance, "1024:65535" is a valid range to represent a range of |
| 377 | unprivileged ports, and "1024:" would also work. "0:1023" is a valid |
| 378 | representation of privileged ports, and ":1023" would also work. |
| 379 | |
| 380 | For an easier usage, comparison operators are also supported. Note that using |
| 381 | operators with ranges does not make much sense and is discouraged. Also, it |
| 382 | does not make much sense to perform order comparisons with a set of values. |
| 383 | |
| 384 | Available operators are : |
| 385 | |
| 386 | eq : true if the tested value equals at least one value |
| 387 | ge : true if the tested value is greater than or equal to at least one value |
| 388 | gt : true if the tested value is greater than at least one value |
| 389 | le : true if the tested value is less than or equal to at least one value |
| 390 | lt : true if the tested value is less than at least one value |
| 391 | |
| 392 | For instance, the following ACL matches negative Content-Length headers : |
| 393 | |
| 394 | acl negative-length hdr_val(content-length) lt 0 |
| 395 | |
| 396 | |
| 397 | 2.1.2) Matching strings |
| 398 | ----------------------- |
| 399 | |
| 400 | String matching applies to verbatim strings as they are passed, with the |
| 401 | exception of the backslash ("\") which makes it possible to escape some |
| 402 | characters such as the space. If the "-i" flag is passed before the first |
| 403 | string, then the matching will be performed ignoring the case. In order |
| 404 | to match the string "-i", either set it second, or pass the "--" flag |
| 405 | before the first string. |
| 406 | |
| 407 | |
| 408 | 2.1.3) Matching regular expressions (regexes) |
| 409 | --------------------------------------------- |
| 410 | |
| 411 | Just like with string matching, regex matching applies to verbatim strings as |
| 412 | they are passed, with the exception of the backslash ("\") which makes it |
| 413 | possible to escape some characters such as the space. If the "-i" flag is |
| 414 | passed before the first regex, then the matching will be performed ignoring |
| 415 | the case. In order to match the string "-i", either set it second, or pass |
| 416 | the "--" flag before the first string. |
| 417 | |
| 418 | |
| 419 | 2.1.4) Matching IPv4 addresses |
| 420 | ---------------------------- |
| 421 | |
| 422 | IPv4 addresses values can be specified either as plain addresses or with a |
| 423 | netmask appended, in which case the IPv4 address matches whenever it is |
| 424 | within the network. Plain addresses may also be replaced with a resolvable |
| 425 | host name, but this practise is generally discouraged as it makes it more |
| 426 | difficult to read configurations. |
| 427 | |
| 428 | |
| 429 | 2.1.5) Available matching criteria |
| 430 | ---------------------------------- |
| 431 | |
| 432 | always_false |
| 433 | This one never matches. All values and flags are ignored. It may be used as |
| 434 | a temporary replacement for another one when adjusting configurations. |
| 435 | |
| 436 | always_true |
| 437 | This one always matches. All values and flags are ignored. It may be used as |
| 438 | a temporary replacement for another one when adjusting configurations. |
| 439 | |
| 440 | src <ip_address> |
| 441 | Applies to the client's IP address. It is usually used to limit access to |
| 442 | certain resources such as statistics. Note that it is the TCP-level source |
| 443 | address which is used, and not the address of a client behind a proxy. |
| 444 | |
| 445 | src_port <integer> |
| 446 | Applies to the client's TCP source port. This has a very limited usage. |
| 447 | |
| 448 | dst <ip_address> |
| 449 | Applies to the local IP address the client connected to. It can be used to |
| 450 | switch to a different backend for some alternative addresses. |
| 451 | |
| 452 | dst_port <integer> |
| 453 | Applies to the local port the client connected to. It can be used to switch |
| 454 | to a different backend for some alternative ports. |
| 455 | |
| 456 | dst_conn <integer> |
| 457 | Applies to the number of currently established connections on the frontend, |
| 458 | including the one being evaluated. It can be used to either return a sorry |
| 459 | page before hard-blocking, or to use a specific backend to drain the requests |
| 460 | when the farm is considered saturated. |
| 461 | |
| 462 | method <string> |
| 463 | Applies to the method in the HTTP request, eg: "GET". Some predefined ACL |
| 464 | already check for most common methods. |
| 465 | |
| 466 | req_ver <string> |
| 467 | Applies to the version string in the HTTP request, eg: "1.0". Some predefined |
| 468 | ACL already check for versions 1.0 and 1.1. |
| 469 | |
| 470 | path <string> |
| 471 | Returns true when the path part of the request, which starts at the first |
| 472 | slash and ends before the question mark, equals one of the strings. It may be |
| 473 | used to match known files, such as /favicon.ico. |
| 474 | |
| 475 | path_beg <string> |
| 476 | Returns true when the path begins with one of the strings. This can be used to |
| 477 | send certain directory names to alternative backends. |
| 478 | |
| 479 | path_end <string> |
| 480 | Returns true when the path ends with one of the strings. This may be used to |
| 481 | control file name extension. |
| 482 | |
| 483 | path_sub <string> |
| 484 | Returns true when the path contains one of the strings. It can be used to |
| 485 | detect particular patterns in paths, such as "../" for example. See also |
| 486 | "path_dir". |
| 487 | |
| 488 | path_dir <string> |
| 489 | Returns true when one of the strings is found isolated or delimited with |
| 490 | slashes in the path. This is used to perform filename or directory name |
| 491 | matching without the risk of wrong match due to colliding prefixes. See also |
| 492 | "url_dir" and "path_sub". |
| 493 | |
| 494 | path_dom <string> |
| 495 | Returns true when one of the strings is found isolated or delimited with dots |
| 496 | in the path. This may be used to perform domain name matching in proxy |
| 497 | requests. See also "path_sub" and "url_dom". |
| 498 | |
| 499 | path_reg <regex> |
| 500 | Returns true when the path matches one of the regular expressions. It can be |
| 501 | used any time, but it is important to remember that regex matching is slower |
| 502 | than other methods. See also "url_reg" and all "path_" criteria. |
| 503 | |
| 504 | url <string> |
| 505 | Applies to the whole URL passed in the request. The only real use is to match |
| 506 | "*", for which there already is a predefined ACL. |
| 507 | |
| 508 | url_beg <string> |
| 509 | Returns true when the URL begins with one of the strings. This can be used to |
| 510 | check whether a URL begins with a slash or with a protocol scheme. |
| 511 | |
| 512 | url_end <string> |
| 513 | Returns true when the URL ends with one of the strings. It has very limited |
| 514 | use. "path_end" should be used instead for filename matching. |
| 515 | |
| 516 | url_sub <string> |
| 517 | Returns true when the URL contains one of the strings. It can be used to |
| 518 | detect particular patterns in query strings for example. See also "path_sub". |
| 519 | |
| 520 | url_dir <string> |
| 521 | Returns true when one of the strings is found isolated or delimited with |
| 522 | slashes in the URL. This is used to perform filename or directory name |
| 523 | matching without the risk of wrong match due to colliding prefixes. See also |
| 524 | "path_dir" and "url_sub". |
| 525 | |
| 526 | url_dom <string> |
| 527 | Returns true when one of the strings is found isolated or delimited with dots |
| 528 | in the URL. This is used to perform domain name matching without the risk of |
| 529 | wrong match due to colliding prefixes. See also "url_sub". |
| 530 | |
| 531 | url_reg <regex> |
| 532 | Returns true when the URL matches one of the regular expressions. It can be |
| 533 | used any time, but it is important to remember that regex matching is slower |
| 534 | than other methods. See also "path_reg" and all "url_" criteria. |
| 535 | |
Alexandre Cassen | 5eb1a90 | 2007-11-29 15:43:32 +0100 | [diff] [blame] | 536 | url_ip <ip_address> |
| 537 | Applies to the IP address parsed in HTTP request. It can be used to |
| 538 | prevent access to certain resources such as local network. It is useful |
| 539 | with option 'http_proxy'. |
| 540 | |
| 541 | url_port <integer> |
| 542 | Applies to the port parsed in HTTP request. It can be used to |
| 543 | prevent access to certain resources. It is useful with option 'http_proxy'. |
| 544 | |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 545 | hdr <string> |
| 546 | hdr(header) <string> |
| 547 | Note: all the "hdr*" matching criteria either apply to all headers, or to a |
| 548 | particular header whose name is passed between parenthesis and without any |
| 549 | space. The header matching complies with RFC2616, and treats as separate |
| 550 | headers all values delimited by comas. |
| 551 | |
| 552 | The "hdr" criteria returns true if any of the headers matching the criteria |
| 553 | match any of the strings. This can be used to check exact values. For |
| 554 | instance, checking that "connection: close" is set : |
| 555 | |
| 556 | hdr(Connection) -i close |
| 557 | |
| 558 | hdr_beg <string> |
| 559 | hdr_beg(header) <string> |
| 560 | Returns true when one of the headers begins with one of the strings. See |
| 561 | "hdr" for more information on header matching. |
| 562 | |
| 563 | hdr_end <string> |
| 564 | hdr_end(header) <string> |
| 565 | Returns true when one of the headers ends with one of the strings. See "hdr" |
| 566 | for more information on header matching. |
| 567 | |
| 568 | hdr_sub <string> |
| 569 | hdr_sub(header) <string> |
| 570 | Returns true when one of the headers contains one of the strings. See "hdr" |
| 571 | for more information on header matching. |
| 572 | |
| 573 | hdr_dir <string> |
| 574 | hdr_dir(header) <string> |
| 575 | Returns true when one of the headers contains one of the strings either |
| 576 | isolated or delimited by slashes. This is used to perform filename or |
| 577 | directory name matching, and may be used with Referer. See "hdr" for more |
| 578 | information on header matching. |
| 579 | |
| 580 | hdr_dom <string> |
| 581 | hdr_dom(header) <string> |
| 582 | Returns true when one of the headers contains one of the strings either |
| 583 | isolated or delimited by dots. This is used to perform domain name matching, |
| 584 | and may be used with the Host header. See "hdr" for more information on |
| 585 | header matching. |
| 586 | |
| 587 | hdr_reg <regex> |
| 588 | hdr_reg(header) <regex> |
| 589 | Returns true when one of the headers matches of the regular expressions. It |
| 590 | can be used at any time, but it is important to remember that regex matching |
| 591 | is slower than other methods. See also other "hdr_" criteria, as well as |
| 592 | "hdr" for more information on header matching. |
| 593 | |
| 594 | hdr_val <integer> |
| 595 | hdr_val(header) <integer> |
| 596 | Returns true when one of the headers starts with a number which matches the |
| 597 | values or ranges specified. This may be used to limit content-length to |
| 598 | acceptable values for example. See "hdr" for more information on header |
| 599 | matching. |
| 600 | |
| 601 | hdr_cnt <integer> |
| 602 | hdr_cnt(header) <integer> |
| 603 | Returns true when the count of the headers which matches the values or ranges |
| 604 | specified. This is used to detect presence or absence of a specific header, |
| 605 | as well as to block request smugling attacks by rejecting requests which |
| 606 | contain more than one of certain headers. See "hdr" for more information on |
| 607 | header matching. |
| 608 | |
Willy Tarreau | c7246fc | 2007-12-02 17:31:20 +0100 | [diff] [blame] | 609 | nbsrv <integer> |
| 610 | nbsrv(backend) <integer> |
| 611 | Returns true when the number of usable servers of either the current backend |
| 612 | or the named backend matches the values or ranges specified. This is used to |
| 613 | switch to an alternate backend when the number of servers is too low to |
| 614 | to handle some load. It is useful to report a failure when combined with |
| 615 | "monitor fail". |
Willy Tarreau | 6a06a40 | 2007-07-15 20:15:28 +0200 | [diff] [blame] | 616 | |
| 617 | 2.1.6) Pre-defined ACLs |
| 618 | ----------------------- |
| 619 | |
| 620 | Some predefined ACLs are hard-coded so that they do not have to be declared in |
| 621 | every frontend which needs them. They all have their names in upper case in |
| 622 | order to avoid confusion. Their equivalence is provided below : |
| 623 | |
| 624 | ACL name Equivalent to Usage |
| 625 | ---------------+-----------------------------+--------------------------------- |
| 626 | TRUE always_true 1 always match |
| 627 | FALSE always_false 0 never match |
| 628 | LOCALHOST src 127.0.0.1/8 match connection from local host |
| 629 | HTTP_1.0 req_ver 1.0 match HTTP version 1.0 |
| 630 | HTTP_1.1 req_ver 1.1 match HTTP version 1.1 |
| 631 | METH_CONNECT method CONNECT match HTTP CONNECT method |
| 632 | METH_GET method GET HEAD match HTTP GET or HEAD method |
| 633 | METH_HEAD method HEAD match HTTP HEAD method |
| 634 | METH_OPTIONS method OPTIONS match HTTP OPTIONS method |
| 635 | METH_POST method POST match HTTP POST method |
| 636 | METH_TRACE method TRACE match HTTP TRACE method |
| 637 | HTTP_URL_ABS url_reg ^[^/:]*:// match absolute URL with scheme |
| 638 | HTTP_URL_SLASH url_beg / match URL begining with "/" |
| 639 | HTTP_URL_STAR url * match URL equal to "*" |
| 640 | HTTP_CONTENT hdr_val(content-length) gt 0 match an existing content-length |
| 641 | ---------------+-----------------------------+--------------------------------- |
| 642 | |
| 643 | |
| 644 | 2.1.7) Using ACLs to form conditions |
| 645 | ------------------------------------ |
| 646 | |
| 647 | Some actions are only performed upon a valid condition. A condition is a |
| 648 | combination of ACLs with operators. 3 operators are supported : |
| 649 | |
| 650 | - AND (implicit) |
| 651 | - OR (explicit with the "or" keyword or the "||" operator) |
| 652 | - Negation with the exclamation mark ("!") |
| 653 | |
| 654 | A condition is formed as a disjonctive form : |
| 655 | |
| 656 | [!]acl1 [!]acl2 ... [!]acln { or [!]acl1 [!]acl2 ... [!]acln } ... |
| 657 | |
| 658 | Such conditions are generally used after an "if" or "unless" statement, |
| 659 | indicating when the condition will trigger the action. |
| 660 | |
| 661 | For instance, to block HTTP requests to the "*" URL with methods other than |
| 662 | "OPTIONS", as well as POST requests without content-length, and GET/HEAD |
| 663 | requests with a content-length greater than 0, and finally every request |
| 664 | which is not either GET/HEAD/POST/OPTIONS ! |
| 665 | |
| 666 | acl missing_cl hdr_cnt(Content-length) eq 0 |
| 667 | block if HTTP_URL_STAR !METH_OPTIONS || METH_POST missing_cl |
| 668 | block if METH_GET HTTP_CONTENT |
| 669 | block unless METH_GET or METH_POST or METH_OPTIONS |
| 670 | |
| 671 | To select a different backend for requests to static contents on the "www" site |
| 672 | and to every request on the "img", "video", "download" and "ftp" hosts : |
| 673 | |
| 674 | acl url_static path_beg /static /images /img /css |
| 675 | acl url_static path_end .gif .png .jpg .css .js |
| 676 | acl host_www hdr_beg(host) -i www |
| 677 | acl host_static hdr_beg(host) -i img. video. download. ftp. |
| 678 | |
| 679 | # now use backend "static" for all static-only hosts, and for static urls |
| 680 | # of host "www". Use backend "www" for the rest. |
| 681 | use_backend static if host_static or host_www url_static |
| 682 | use_backend www if host_www |
| 683 | |
| 684 | See below for the detailed help on the "block" and "use_backend" keywords. |
Willy Tarreau | dbc36f6 | 2007-11-30 12:29:11 +0100 | [diff] [blame] | 685 | |
| 686 | |
Willy Tarreau | c7246fc | 2007-12-02 17:31:20 +0100 | [diff] [blame] | 687 | 2.2) Instance-specific keywords and statements |
| 688 | ---------------------------------------------- |
| 689 | |
| 690 | monitor fail [if | unless] <condition> |
| 691 | [ supported in: frontend, listen ] |
| 692 | |
| 693 | This statement adds a condition which can force the response to a monitor |
| 694 | request to report a failure. By default, when an external component queries |
| 695 | the URI dedicated to monitoring, a 200 response is returned. When one of the |
| 696 | conditions above is met, haproxy will return 503 instead of 200. This is |
| 697 | very useful to report a site failure to an external component which may base |
| 698 | routing advertisements between multiple sites on the availability reported by |
| 699 | haproxy. In this case, one would rely on an ACL involving the "nbsrv" |
| 700 | criterion. |
| 701 | |
| 702 | Example: |
| 703 | |
| 704 | frontend www |
| 705 | acl site_dead nbsrv(dynamic) lt 2 |
| 706 | acl site_dead nbsrv(static) lt 2 |
| 707 | monitor-uri /site_alive |
| 708 | monitor fail if site_dead |
| 709 | |
| 710 | |
| 711 | 2.3) Options |
Willy Tarreau | dbc36f6 | 2007-11-30 12:29:11 +0100 | [diff] [blame] | 712 | ------------ |
| 713 | |
| 714 | A handful of options affect the way the load balancing is performed or reaction |
| 715 | to state changes. |
| 716 | |
| 717 | http-check disable-on-404 |
| 718 | When this option is set, a server which returns an HTTP code 404 will be |
| 719 | excluded from further load-balancing, but will still receive persistent |
| 720 | connections. This provides a very convenient method for Web administrators |
| 721 | to perform a graceful shutdown of their servers. It is also important to note |
| 722 | that a server which is detected as failed while it was in this mode will not |
| 723 | generate an alert, just a notice. If the server responds 2xx or 3xx again, it |
| 724 | will immediately be reinserted into the farm. The status on the stats page |
| 725 | reports "NOLB" for a server in this mode. It is important to note that this |
| 726 | option only works in conjunction with the "httpchk" option. |
| 727 | |
| 728 | option contstats |
| 729 | By default, counters used for statistics calculation are incremented |
| 730 | only when a session finishes. It works quite well when serving small |
| 731 | objects, but with big ones (for example large images or archives) or |
| 732 | with A/V streaming, a graph generated from haproxy counters looks like |
| 733 | a hedgehog. With this option enabled counters get incremented continuously, |
| 734 | during a whole session. Recounting touches a hotpath directly so |
| 735 | it is not enabled by default, as it has small performance impact (~0.5%). |
| 736 | |
| 737 | |
Willy Tarreau | c7246fc | 2007-12-02 17:31:20 +0100 | [diff] [blame] | 738 | 2.4) Server options |
Willy Tarreau | 5764b38 | 2007-11-30 17:46:49 +0100 | [diff] [blame] | 739 | ------------------- |
| 740 | |
| 741 | slowstart <start_time_in_ms> |
| 742 | The 'slowstart' parameter for a server accepts a value in milliseconds which |
| 743 | indicates after how long a server which has just come back up will run at |
| 744 | full speed. The speed grows linearly from 0 to 100% during this time. The |
| 745 | limitation applies to two parameters : |
| 746 | |
| 747 | - maxconn: the number of connections accepted by the server will grow from 1 |
| 748 | to 100% of the usual dynamic limit defined by (minconn,maxconn,fullconn). |
| 749 | |
| 750 | - weight: when the backend uses a dynamic weighted algorithm, the weight |
| 751 | grows linearly from 1 to 100%. In this case, the weight is updated at every |
| 752 | health-check. For this reason, it is important that the 'inter' parameter |
| 753 | is smaller than the 'slowstart', in order to maximize the number of steps. |
| 754 | |
| 755 | The slowstart never applies when haproxy starts, otherwise it would cause |
| 756 | trouble to running servers. It only applies when a server has been previously |
| 757 | seen as failed. |
| 758 | |
| 759 | |