blob: ce40b00ce04f60c812fba7aa61168f77023fb21f [file] [log] [blame]
Willy Tarreau6a06a402007-07-15 20:15:28 +02001 ----------------------
2 HAProxy
3 Configuration Manual
4 ----------------------
Willy Tarreau21475e32010-05-23 08:46:08 +02005 version 1.5
Willy Tarreau6a06a402007-07-15 20:15:28 +02006 willy tarreau
Willy Tarreau37242fa2010-08-28 19:21:00 +02007 2010/08/28
Willy Tarreau6a06a402007-07-15 20:15:28 +02008
9
10This document covers the configuration language as implemented in the version
11specified above. It does not provide any hint, example or advice. For such
Willy Tarreau0ba27502007-12-24 16:55:16 +010012documentation, please refer to the Reference Manual or the Architecture Manual.
Willy Tarreauc57f0e22009-05-10 13:12:33 +020013The summary below is meant to help you search sections by name and navigate
14through the document.
Willy Tarreau6a06a402007-07-15 20:15:28 +020015
Willy Tarreauc57f0e22009-05-10 13:12:33 +020016Note to documentation contributors :
17 This document is formated with 80 columns per line, with even number of
18 spaces for indentation and without tabs. Please follow these rules strictly
19 so that it remains easily printable everywhere. If a line needs to be
20 printed verbatim and does not fit, please end each line with a backslash
Willy Tarreau62a36c42010-08-17 15:53:10 +020021 ('\') and continue on next line, indented by two characters. It is also
22 sometimes useful to prefix all output lines (logs, console outs) with 3
23 closing angle brackets ('>>>') in order to help get the difference between
24 inputs and outputs when it can become ambiguous. If you add sections,
25 please update the summary below for easier searching.
Willy Tarreauc57f0e22009-05-10 13:12:33 +020026
27
28Summary
29-------
30
311. Quick reminder about HTTP
321.1. The HTTP transaction model
331.2. HTTP request
341.2.1. The Request line
351.2.2. The request headers
361.3. HTTP response
371.3.1. The Response line
381.3.2. The response headers
39
402. Configuring HAProxy
412.1. Configuration file format
422.2. Time format
Patrick Mezard35da19c2010-06-12 17:02:47 +0200432.3. Examples
Willy Tarreauc57f0e22009-05-10 13:12:33 +020044
453. Global parameters
463.1. Process management and security
473.2. Performance tuning
483.3. Debugging
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +0100493.4. Userlists
Willy Tarreauc57f0e22009-05-10 13:12:33 +020050
514. Proxies
524.1. Proxy keywords matrix
534.2. Alphabetically sorted keywords reference
54
Krzysztof Piotr Oledzkic6df0662010-01-05 16:38:49 +0100555. Server and default-server options
Willy Tarreauc57f0e22009-05-10 13:12:33 +020056
576. HTTP header manipulation
58
Cyril Bonté7d38afb2010-02-03 20:41:26 +0100597. Using ACLs and pattern extraction
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200607.1. Matching integers
617.2. Matching strings
627.3. Matching regular expressions (regexes)
637.4. Matching IPv4 addresses
647.5. Available matching criteria
657.5.1. Matching at Layer 4 and below
667.5.2. Matching contents at Layer 4
677.5.3. Matching at Layer 7
687.6. Pre-defined ACLs
697.7. Using ACLs to form conditions
Cyril Bonté7d38afb2010-02-03 20:41:26 +0100707.8. Pattern extraction
Willy Tarreauc57f0e22009-05-10 13:12:33 +020071
728. Logging
738.1. Log levels
748.2. Log formats
758.2.1. Default log format
768.2.2. TCP log format
778.2.3. HTTP log format
788.3. Advanced logging options
798.3.1. Disabling logging of external tests
808.3.2. Logging before waiting for the session to terminate
818.3.3. Raising log level upon errors
828.3.4. Disabling logging of successful connections
838.4. Timing events
848.5. Session state at disconnection
858.6. Non-printable characters
868.7. Capturing HTTP cookies
878.8. Capturing HTTP headers
888.9. Examples of logs
89
909. Statistics and monitoring
919.1. CSV format
929.2. Unix Socket commands
93
94
951. Quick reminder about HTTP
96----------------------------
97
98When haproxy is running in HTTP mode, both the request and the response are
99fully analyzed and indexed, thus it becomes possible to build matching criteria
100on almost anything found in the contents.
101
102However, it is important to understand how HTTP requests and responses are
103formed, and how HAProxy decomposes them. It will then become easier to write
104correct rules and to debug existing configurations.
105
106
1071.1. The HTTP transaction model
108-------------------------------
109
110The HTTP protocol is transaction-driven. This means that each request will lead
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +0100111to one and only one response. Traditionally, a TCP connection is established
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200112from the client to the server, a request is sent by the client on the
113connection, the server responds and the connection is closed. A new request
114will involve a new connection :
115
116 [CON1] [REQ1] ... [RESP1] [CLO1] [CON2] [REQ2] ... [RESP2] [CLO2] ...
117
118In this mode, called the "HTTP close" mode, there are as many connection
119establishments as there are HTTP transactions. Since the connection is closed
120by the server after the response, the client does not need to know the content
121length.
122
123Due to the transactional nature of the protocol, it was possible to improve it
124to avoid closing a connection between two subsequent transactions. In this mode
125however, it is mandatory that the server indicates the content length for each
126response so that the client does not wait indefinitely. For this, a special
127header is used: "Content-length". This mode is called the "keep-alive" mode :
128
129 [CON] [REQ1] ... [RESP1] [REQ2] ... [RESP2] [CLO] ...
130
131Its advantages are a reduced latency between transactions, and less processing
132power required on the server side. It is generally better than the close mode,
133but not always because the clients often limit their concurrent connections to
Patrick Mezard9ec2ec42010-06-12 17:02:45 +0200134a smaller value.
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200135
136A last improvement in the communications is the pipelining mode. It still uses
137keep-alive, but the client does not wait for the first response to send the
138second request. This is useful for fetching large number of images composing a
139page :
140
141 [CON] [REQ1] [REQ2] ... [RESP1] [RESP2] [CLO] ...
142
143This can obviously have a tremendous benefit on performance because the network
144latency is eliminated between subsequent requests. Many HTTP agents do not
145correctly support pipelining since there is no way to associate a response with
146the corresponding request in HTTP. For this reason, it is mandatory for the
Cyril Bonté78caf842010-03-10 22:41:43 +0100147server to reply in the exact same order as the requests were received.
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200148
Patrick Mezard9ec2ec42010-06-12 17:02:45 +0200149By default HAProxy operates in a tunnel-like mode with regards to persistent
150connections: for each connection it processes the first request and forwards
151everything else (including additional requests) to selected server. Once
152established, the connection is persisted both on the client and server
153sides. Use "option http-server-close" to preserve client persistent connections
154while handling every incoming request individually, dispatching them one after
155another to servers, in HTTP close mode. Use "option httpclose" to switch both
156sides to HTTP close mode. "option forceclose" and "option
157http-pretend-keepalive" help working around servers misbehaving in HTTP close
158mode.
159
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200160
1611.2. HTTP request
162-----------------
163
164First, let's consider this HTTP request :
165
166 Line Contents
Willy Tarreaud72758d2010-01-12 10:42:19 +0100167 number
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200168 1 GET /serv/login.php?lang=en&profile=2 HTTP/1.1
169 2 Host: www.mydomain.com
170 3 User-agent: my small browser
171 4 Accept: image/jpeg, image/gif
172 5 Accept: image/png
173
174
1751.2.1. The Request line
176-----------------------
177
178Line 1 is the "request line". It is always composed of 3 fields :
179
180 - a METHOD : GET
181 - a URI : /serv/login.php?lang=en&profile=2
182 - a version tag : HTTP/1.1
183
184All of them are delimited by what the standard calls LWS (linear white spaces),
185which are commonly spaces, but can also be tabs or line feeds/carriage returns
186followed by spaces/tabs. The method itself cannot contain any colon (':') and
187is limited to alphabetic letters. All those various combinations make it
188desirable that HAProxy performs the splitting itself rather than leaving it to
189the user to write a complex or inaccurate regular expression.
190
191The URI itself can have several forms :
192
193 - A "relative URI" :
194
195 /serv/login.php?lang=en&profile=2
196
197 It is a complete URL without the host part. This is generally what is
198 received by servers, reverse proxies and transparent proxies.
199
200 - An "absolute URI", also called a "URL" :
201
202 http://192.168.0.12:8080/serv/login.php?lang=en&profile=2
203
204 It is composed of a "scheme" (the protocol name followed by '://'), a host
205 name or address, optionally a colon (':') followed by a port number, then
206 a relative URI beginning at the first slash ('/') after the address part.
207 This is generally what proxies receive, but a server supporting HTTP/1.1
208 must accept this form too.
209
210 - a star ('*') : this form is only accepted in association with the OPTIONS
211 method and is not relayable. It is used to inquiry a next hop's
212 capabilities.
Willy Tarreaud72758d2010-01-12 10:42:19 +0100213
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200214 - an address:port combination : 192.168.0.12:80
215 This is used with the CONNECT method, which is used to establish TCP
216 tunnels through HTTP proxies, generally for HTTPS, but sometimes for
217 other protocols too.
218
219In a relative URI, two sub-parts are identified. The part before the question
220mark is called the "path". It is typically the relative path to static objects
221on the server. The part after the question mark is called the "query string".
222It is mostly used with GET requests sent to dynamic scripts and is very
223specific to the language, framework or application in use.
224
225
2261.2.2. The request headers
227--------------------------
228
229The headers start at the second line. They are composed of a name at the
230beginning of the line, immediately followed by a colon (':'). Traditionally,
231an LWS is added after the colon but that's not required. Then come the values.
232Multiple identical headers may be folded into one single line, delimiting the
233values with commas, provided that their order is respected. This is commonly
234encountered in the "Cookie:" field. A header may span over multiple lines if
235the subsequent lines begin with an LWS. In the example in 1.2, lines 4 and 5
236define a total of 3 values for the "Accept:" header.
237
238Contrary to a common mis-conception, header names are not case-sensitive, and
239their values are not either if they refer to other header names (such as the
240"Connection:" header).
241
242The end of the headers is indicated by the first empty line. People often say
243that it's a double line feed, which is not exact, even if a double line feed
244is one valid form of empty line.
245
246Fortunately, HAProxy takes care of all these complex combinations when indexing
247headers, checking values and counting them, so there is no reason to worry
248about the way they could be written, but it is important not to accuse an
249application of being buggy if it does unusual, valid things.
250
251Important note:
252 As suggested by RFC2616, HAProxy normalizes headers by replacing line breaks
253 in the middle of headers by LWS in order to join multi-line headers. This
254 is necessary for proper analysis and helps less capable HTTP parsers to work
255 correctly and not to be fooled by such complex constructs.
256
257
2581.3. HTTP response
259------------------
260
261An HTTP response looks very much like an HTTP request. Both are called HTTP
262messages. Let's consider this HTTP response :
263
264 Line Contents
Willy Tarreaud72758d2010-01-12 10:42:19 +0100265 number
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200266 1 HTTP/1.1 200 OK
267 2 Content-length: 350
268 3 Content-Type: text/html
269
Willy Tarreau816b9792009-09-15 21:25:21 +0200270As a special case, HTTP supports so called "Informational responses" as status
271codes 1xx. These messages are special in that they don't convey any part of the
272response, they're just used as sort of a signaling message to ask a client to
Willy Tarreau5843d1a2010-02-01 15:13:32 +0100273continue to post its request for instance. In the case of a status 100 response
274the requested information will be carried by the next non-100 response message
275following the informational one. This implies that multiple responses may be
276sent to a single request, and that this only works when keep-alive is enabled
277(1xx messages are HTTP/1.1 only). HAProxy handles these messages and is able to
278correctly forward and skip them, and only process the next non-100 response. As
279such, these messages are neither logged nor transformed, unless explicitly
280state otherwise. Status 101 messages indicate that the protocol is changing
281over the same connection and that haproxy must switch to tunnel mode, just as
282if a CONNECT had occurred. Then the Upgrade header would contain additional
283information about the type of protocol the connection is switching to.
Willy Tarreau816b9792009-09-15 21:25:21 +0200284
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200285
2861.3.1. The Response line
287------------------------
288
289Line 1 is the "response line". It is always composed of 3 fields :
290
291 - a version tag : HTTP/1.1
292 - a status code : 200
293 - a reason : OK
294
295The status code is always 3-digit. The first digit indicates a general status :
Willy Tarreau816b9792009-09-15 21:25:21 +0200296 - 1xx = informational message to be skipped (eg: 100, 101)
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200297 - 2xx = OK, content is following (eg: 200, 206)
298 - 3xx = OK, no content following (eg: 302, 304)
299 - 4xx = error caused by the client (eg: 401, 403, 404)
300 - 5xx = error caused by the server (eg: 500, 502, 503)
301
302Please refer to RFC2616 for the detailed meaning of all such codes. The
Willy Tarreaud72758d2010-01-12 10:42:19 +0100303"reason" field is just a hint, but is not parsed by clients. Anything can be
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200304found there, but it's a common practice to respect the well-established
305messages. It can be composed of one or multiple words, such as "OK", "Found",
306or "Authentication Required".
307
308Haproxy may emit the following status codes by itself :
309
310 Code When / reason
311 200 access to stats page, and when replying to monitoring requests
312 301 when performing a redirection, depending on the configured code
313 302 when performing a redirection, depending on the configured code
314 303 when performing a redirection, depending on the configured code
315 400 for an invalid or too large request
316 401 when an authentication is required to perform the action (when
317 accessing the stats page)
318 403 when a request is forbidden by a "block" ACL or "reqdeny" filter
319 408 when the request timeout strikes before the request is complete
320 500 when haproxy encounters an unrecoverable internal error, such as a
321 memory allocation failure, which should never happen
322 502 when the server returns an empty, invalid or incomplete response, or
323 when an "rspdeny" filter blocks the response.
324 503 when no server was available to handle the request, or in response to
325 monitoring requests which match the "monitor fail" condition
326 504 when the response timeout strikes before the server responds
327
328The error 4xx and 5xx codes above may be customized (see "errorloc" in section
3294.2).
330
331
3321.3.2. The response headers
333---------------------------
334
335Response headers work exactly like request headers, and as such, HAProxy uses
336the same parsing function for both. Please refer to paragraph 1.2.2 for more
337details.
338
339
3402. Configuring HAProxy
341----------------------
342
3432.1. Configuration file format
344------------------------------
Willy Tarreau6a06a402007-07-15 20:15:28 +0200345
346HAProxy's configuration process involves 3 major sources of parameters :
347
348 - the arguments from the command-line, which always take precedence
349 - the "global" section, which sets process-wide parameters
350 - the proxies sections which can take form of "defaults", "listen",
351 "frontend" and "backend".
352
Willy Tarreau0ba27502007-12-24 16:55:16 +0100353The configuration file syntax consists in lines beginning with a keyword
354referenced in this manual, optionally followed by one or several parameters
355delimited by spaces. If spaces have to be entered in strings, then they must be
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +0100356preceded by a backslash ('\') to be escaped. Backslashes also have to be
Willy Tarreau0ba27502007-12-24 16:55:16 +0100357escaped by doubling them.
358
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200359
3602.2. Time format
361----------------
362
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +0100363Some parameters involve values representing time, such as timeouts. These
Willy Tarreau0ba27502007-12-24 16:55:16 +0100364values are generally expressed in milliseconds (unless explicitly stated
365otherwise) but may be expressed in any other unit by suffixing the unit to the
366numeric value. It is important to consider this because it will not be repeated
367for every keyword. Supported units are :
368
369 - us : microseconds. 1 microsecond = 1/1000000 second
370 - ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.
371 - s : seconds. 1s = 1000ms
372 - m : minutes. 1m = 60s = 60000ms
373 - h : hours. 1h = 60m = 3600s = 3600000ms
374 - d : days. 1d = 24h = 1440m = 86400s = 86400000ms
375
376
Patrick Mezard35da19c2010-06-12 17:02:47 +02003772.3. Examples
378-------------
379
380 # Simple configuration for an HTTP proxy listening on port 80 on all
381 # interfaces and forwarding requests to a single backend "servers" with a
382 # single server "server1" listening on 127.0.0.1:8000
383 global
384 daemon
385 maxconn 256
386
387 defaults
388 mode http
389 timeout connect 5000ms
390 timeout client 50000ms
391 timeout server 50000ms
392
393 frontend http-in
394 bind *:80
395 default_backend servers
396
397 backend servers
398 server server1 127.0.0.1:8000 maxconn 32
399
400
401 # The same configuration defined with a single listen block. Shorter but
402 # less expressive, especially in HTTP mode.
403 global
404 daemon
405 maxconn 256
406
407 defaults
408 mode http
409 timeout connect 5000ms
410 timeout client 50000ms
411 timeout server 50000ms
412
413 listen http-in
414 bind *:80
415 server server1 127.0.0.1:8000 maxconn 32
416
417
418Assuming haproxy is in $PATH, test these configurations in a shell with:
419
420 $ sudo haproxy -f configuration.conf -d
421
422
Willy Tarreauc57f0e22009-05-10 13:12:33 +02004233. Global parameters
Willy Tarreau6a06a402007-07-15 20:15:28 +0200424--------------------
425
426Parameters in the "global" section are process-wide and often OS-specific. They
427are generally set once for all and do not need being changed once correct. Some
428of them have command-line equivalents.
429
430The following keywords are supported in the "global" section :
431
432 * Process management and security
433 - chroot
434 - daemon
435 - gid
436 - group
437 - log
438 - nbproc
439 - pidfile
440 - uid
441 - ulimit-n
442 - user
Willy Tarreaufbee7132007-10-18 13:53:22 +0200443 - stats
Krzysztof Piotr Oledzki48cb2ae2009-10-02 22:51:14 +0200444 - node
445 - description
Willy Tarreauceb24bc2010-11-09 12:46:41 +0100446 - unix-bind
Willy Tarreaud72758d2010-01-12 10:42:19 +0100447
Willy Tarreau6a06a402007-07-15 20:15:28 +0200448 * Performance tuning
449 - maxconn
Willy Tarreauff4f82d2009-02-06 11:28:13 +0100450 - maxpipes
Willy Tarreau6a06a402007-07-15 20:15:28 +0200451 - noepoll
452 - nokqueue
453 - nopoll
454 - nosepoll
Willy Tarreauff4f82d2009-02-06 11:28:13 +0100455 - nosplice
Willy Tarreaufe255b72007-10-14 23:09:26 +0200456 - spread-checks
Willy Tarreau27a674e2009-08-17 07:23:33 +0200457 - tune.bufsize
Willy Tarreau43961d52010-10-04 20:39:20 +0200458 - tune.chksize
Willy Tarreaua0250ba2008-01-06 11:22:57 +0100459 - tune.maxaccept
460 - tune.maxpollevents
Willy Tarreau27a674e2009-08-17 07:23:33 +0200461 - tune.maxrewrite
Willy Tarreaue803de22010-01-21 17:43:04 +0100462 - tune.rcvbuf.client
463 - tune.rcvbuf.server
464 - tune.sndbuf.client
465 - tune.sndbuf.server
Willy Tarreaud72758d2010-01-12 10:42:19 +0100466
Willy Tarreau6a06a402007-07-15 20:15:28 +0200467 * Debugging
468 - debug
469 - quiet
Willy Tarreau6a06a402007-07-15 20:15:28 +0200470
471
Willy Tarreauc57f0e22009-05-10 13:12:33 +02004723.1. Process management and security
Willy Tarreau6a06a402007-07-15 20:15:28 +0200473------------------------------------
474
475chroot <jail dir>
476 Changes current directory to <jail dir> and performs a chroot() there before
477 dropping privileges. This increases the security level in case an unknown
478 vulnerability would be exploited, since it would make it very hard for the
479 attacker to exploit the system. This only works when the process is started
480 with superuser privileges. It is important to ensure that <jail_dir> is both
481 empty and unwritable to anyone.
Willy Tarreaud72758d2010-01-12 10:42:19 +0100482
Willy Tarreau6a06a402007-07-15 20:15:28 +0200483daemon
484 Makes the process fork into background. This is the recommended mode of
485 operation. It is equivalent to the command line "-D" argument. It can be
486 disabled by the command line "-db" argument.
487
488gid <number>
489 Changes the process' group ID to <number>. It is recommended that the group
490 ID is dedicated to HAProxy or to a small set of similar daemons. HAProxy must
491 be started with a user belonging to this group, or with superuser privileges.
492 See also "group" and "uid".
Willy Tarreaud72758d2010-01-12 10:42:19 +0100493
Willy Tarreau6a06a402007-07-15 20:15:28 +0200494group <group name>
495 Similar to "gid" but uses the GID of group name <group name> from /etc/group.
496 See also "gid" and "user".
Willy Tarreaud72758d2010-01-12 10:42:19 +0100497
Willy Tarreauf7edefa2009-05-10 17:20:05 +0200498log <address> <facility> [max level [min level]]
Willy Tarreau6a06a402007-07-15 20:15:28 +0200499 Adds a global syslog server. Up to two global servers can be defined. They
500 will receive logs for startups and exits, as well as all logs from proxies
Robert Tsai81ae1952007-12-05 10:47:29 +0100501 configured with "log global".
502
503 <address> can be one of:
504
Willy Tarreau2769aa02007-12-27 18:26:09 +0100505 - An IPv4 address optionally followed by a colon and a UDP port. If
Robert Tsai81ae1952007-12-05 10:47:29 +0100506 no port is specified, 514 is used by default (the standard syslog
507 port).
508
509 - A filesystem path to a UNIX domain socket, keeping in mind
510 considerations for chroot (be sure the path is accessible inside
511 the chroot) and uid/gid (be sure the path is appropriately
512 writeable).
513
514 <facility> must be one of the 24 standard syslog facilities :
Willy Tarreau6a06a402007-07-15 20:15:28 +0200515
516 kern user mail daemon auth syslog lpr news
517 uucp cron auth2 ftp ntp audit alert cron2
518 local0 local1 local2 local3 local4 local5 local6 local7
519
520 An optional level can be specified to filter outgoing messages. By default,
Willy Tarreauf7edefa2009-05-10 17:20:05 +0200521 all messages are sent. If a maximum level is specified, only messages with a
522 severity at least as important as this level will be sent. An optional minimum
523 level can be specified. If it is set, logs emitted with a more severe level
524 than this one will be capped to this level. This is used to avoid sending
525 "emerg" messages on all terminals on some default syslog configurations.
526 Eight levels are known :
Willy Tarreau6a06a402007-07-15 20:15:28 +0200527
528 emerg alert crit err warning notice info debug
529
530nbproc <number>
531 Creates <number> processes when going daemon. This requires the "daemon"
532 mode. By default, only one process is created, which is the recommended mode
533 of operation. For systems limited to small sets of file descriptors per
534 process, it may be needed to fork multiple daemons. USING MULTIPLE PROCESSES
535 IS HARDER TO DEBUG AND IS REALLY DISCOURAGED. See also "daemon".
536
537pidfile <pidfile>
538 Writes pids of all daemons into file <pidfile>. This option is equivalent to
539 the "-p" command line argument. The file must be accessible to the user
540 starting the process. See also "daemon".
541
Willy Tarreaufbee7132007-10-18 13:53:22 +0200542stats socket <path> [{uid | user} <uid>] [{gid | group} <gid>] [mode <mode>]
Willy Tarreau6162db22009-10-10 17:13:00 +0200543 [level <level>]
544
Willy Tarreaufbee7132007-10-18 13:53:22 +0200545 Creates a UNIX socket in stream mode at location <path>. Any previously
546 existing socket will be backed up then replaced. Connections to this socket
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +0100547 will return various statistics outputs and even allow some commands to be
Willy Tarreau6162db22009-10-10 17:13:00 +0200548 issued. Please consult section 9.2 "Unix Socket commands" for more details.
549
550 An optional "level" parameter can be specified to restrict the nature of
551 the commands that can be issued on the socket :
552 - "user" is the least privileged level ; only non-sensitive stats can be
553 read, and no change is allowed. It would make sense on systems where it
554 is not easy to restrict access to the socket.
555
556 - "operator" is the default level and fits most common uses. All data can
557 be read, and only non-sensible changes are permitted (eg: clear max
558 counters).
559
560 - "admin" should be used with care, as everything is permitted (eg: clear
561 all counters).
Willy Tarreaua8efd362008-01-03 10:19:15 +0100562
563 On platforms which support it, it is possible to restrict access to this
564 socket by specifying numerical IDs after "uid" and "gid", or valid user and
565 group names after the "user" and "group" keywords. It is also possible to
566 restrict permissions on the socket by passing an octal value after the "mode"
567 keyword (same syntax as chmod). Depending on the platform, the permissions on
568 the socket will be inherited from the directory which hosts it, or from the
569 user the process is started with.
Willy Tarreaufbee7132007-10-18 13:53:22 +0200570
571stats timeout <timeout, in milliseconds>
572 The default timeout on the stats socket is set to 10 seconds. It is possible
573 to change this value with "stats timeout". The value must be passed in
Willy Tarreaubefdff12007-12-02 22:27:38 +0100574 milliseconds, or be suffixed by a time unit among { us, ms, s, m, h, d }.
Willy Tarreaufbee7132007-10-18 13:53:22 +0200575
576stats maxconn <connections>
577 By default, the stats socket is limited to 10 concurrent connections. It is
578 possible to change this value with "stats maxconn".
579
Willy Tarreau6a06a402007-07-15 20:15:28 +0200580uid <number>
581 Changes the process' user ID to <number>. It is recommended that the user ID
582 is dedicated to HAProxy or to a small set of similar daemons. HAProxy must
583 be started with superuser privileges in order to be able to switch to another
584 one. See also "gid" and "user".
585
586ulimit-n <number>
587 Sets the maximum number of per-process file-descriptors to <number>. By
588 default, it is automatically computed, so it is recommended not to use this
589 option.
590
Willy Tarreauceb24bc2010-11-09 12:46:41 +0100591unix-bind [ prefix <prefix> ] [ mode <mode> ] [ user <user> ] [ uid <uid> ]
592 [ group <group> ] [ gid <gid> ]
593
594 Fixes common settings to UNIX listening sockets declared in "bind" statements.
595 This is mainly used to simplify declaration of those UNIX sockets and reduce
596 the risk of errors, since those settings are most commonly required but are
597 also process-specific. The <prefix> setting can be used to force all socket
598 path to be relative to that directory. This might be needed to access another
599 component's chroot. Note that those paths are resolved before haproxy chroots
600 itself, so they are absolute. The <mode>, <user>, <uid>, <group> and <gid>
601 all have the same meaning as their homonyms used by the "bind" statement. If
602 both are specified, the "bind" statement has priority, meaning that the
603 "unix-bind" settings may be seen as process-wide default settings.
604
Willy Tarreau6a06a402007-07-15 20:15:28 +0200605user <user name>
606 Similar to "uid" but uses the UID of user name <user name> from /etc/passwd.
607 See also "uid" and "group".
608
Krzysztof Piotr Oledzki48cb2ae2009-10-02 22:51:14 +0200609node <name>
610 Only letters, digits, hyphen and underscore are allowed, like in DNS names.
611
612 This statement is useful in HA configurations where two or more processes or
613 servers share the same IP address. By setting a different node-name on all
614 nodes, it becomes easy to immediately spot what server is handling the
615 traffic.
616
617description <text>
618 Add a text that describes the instance.
619
620 Please note that it is required to escape certain characters (# for example)
621 and this text is inserted into a html page so you should avoid using
622 "<" and ">" characters.
623
Willy Tarreau6a06a402007-07-15 20:15:28 +0200624
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006253.2. Performance tuning
Willy Tarreau6a06a402007-07-15 20:15:28 +0200626-----------------------
627
628maxconn <number>
629 Sets the maximum per-process number of concurrent connections to <number>. It
630 is equivalent to the command-line argument "-n". Proxies will stop accepting
631 connections when this limit is reached. The "ulimit-n" parameter is
632 automatically adjusted according to this value. See also "ulimit-n".
633
Willy Tarreauff4f82d2009-02-06 11:28:13 +0100634maxpipes <number>
635 Sets the maximum per-process number of pipes to <number>. Currently, pipes
636 are only used by kernel-based tcp splicing. Since a pipe contains two file
637 descriptors, the "ulimit-n" value will be increased accordingly. The default
638 value is maxconn/4, which seems to be more than enough for most heavy usages.
639 The splice code dynamically allocates and releases pipes, and can fall back
640 to standard copy, so setting this value too low may only impact performance.
641
Willy Tarreau6a06a402007-07-15 20:15:28 +0200642noepoll
643 Disables the use of the "epoll" event polling system on Linux. It is
644 equivalent to the command-line argument "-de". The next polling system
645 used will generally be "poll". See also "nosepoll", and "nopoll".
646
647nokqueue
648 Disables the use of the "kqueue" event polling system on BSD. It is
649 equivalent to the command-line argument "-dk". The next polling system
650 used will generally be "poll". See also "nopoll".
651
652nopoll
653 Disables the use of the "poll" event polling system. It is equivalent to the
654 command-line argument "-dp". The next polling system used will be "select".
Willy Tarreau0ba27502007-12-24 16:55:16 +0100655 It should never be needed to disable "poll" since it's available on all
Willy Tarreau6a06a402007-07-15 20:15:28 +0200656 platforms supported by HAProxy. See also "nosepoll", and "nopoll" and
657 "nokqueue".
658
659nosepoll
660 Disables the use of the "speculative epoll" event polling system on Linux. It
661 is equivalent to the command-line argument "-ds". The next polling system
662 used will generally be "epoll". See also "nosepoll", and "nopoll".
663
Willy Tarreauff4f82d2009-02-06 11:28:13 +0100664nosplice
665 Disables the use of kernel tcp splicing between sockets on Linux. It is
666 equivalent to the command line argument "-dS". Data will then be copied
667 using conventional and more portable recv/send calls. Kernel tcp splicing is
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +0100668 limited to some very recent instances of kernel 2.6. Most versions between
Willy Tarreauff4f82d2009-02-06 11:28:13 +0100669 2.6.25 and 2.6.28 are buggy and will forward corrupted data, so they must not
670 be used. This option makes it easier to globally disable kernel splicing in
671 case of doubt. See also "option splice-auto", "option splice-request" and
672 "option splice-response".
673
Willy Tarreaufe255b72007-10-14 23:09:26 +0200674spread-checks <0..50, in percent>
675 Sometimes it is desirable to avoid sending health checks to servers at exact
676 intervals, for instance when many logical servers are located on the same
677 physical server. With the help of this parameter, it becomes possible to add
678 some randomness in the check interval between 0 and +/- 50%. A value between
679 2 and 5 seems to show good results. The default value remains at 0.
680
Willy Tarreau27a674e2009-08-17 07:23:33 +0200681tune.bufsize <number>
682 Sets the buffer size to this size (in bytes). Lower values allow more
683 sessions to coexist in the same amount of RAM, and higher values allow some
684 applications with very large cookies to work. The default value is 16384 and
685 can be changed at build time. It is strongly recommended not to change this
686 from the default value, as very low values will break some services such as
687 statistics, and values larger than default size will increase memory usage,
688 possibly causing the system to run out of memory. At least the global maxconn
689 parameter should be decreased by the same factor as this one is increased.
690
Willy Tarreau43961d52010-10-04 20:39:20 +0200691tune.chksize <number>
692 Sets the check buffer size to this size (in bytes). Higher values may help
693 find string or regex patterns in very large pages, though doing so may imply
694 more memory and CPU usage. The default value is 16384 and can be changed at
695 build time. It is not recommended to change this value, but to use better
696 checks whenever possible.
697
Willy Tarreaua0250ba2008-01-06 11:22:57 +0100698tune.maxaccept <number>
699 Sets the maximum number of consecutive accepts that a process may perform on
700 a single wake up. High values give higher priority to high connection rates,
701 while lower values give higher priority to already established connections.
Willy Tarreauf49d1df2009-03-01 08:35:41 +0100702 This value is limited to 100 by default in single process mode. However, in
Willy Tarreaua0250ba2008-01-06 11:22:57 +0100703 multi-process mode (nbproc > 1), it defaults to 8 so that when one process
704 wakes up, it does not take all incoming connections for itself and leaves a
Willy Tarreauf49d1df2009-03-01 08:35:41 +0100705 part of them to other processes. Setting this value to -1 completely disables
Willy Tarreaua0250ba2008-01-06 11:22:57 +0100706 the limitation. It should normally not be needed to tweak this value.
707
708tune.maxpollevents <number>
709 Sets the maximum amount of events that can be processed at once in a call to
710 the polling system. The default value is adapted to the operating system. It
711 has been noticed that reducing it below 200 tends to slightly decrease
712 latency at the expense of network bandwidth, and increasing it above 200
713 tends to trade latency for slightly increased bandwidth.
714
Willy Tarreau27a674e2009-08-17 07:23:33 +0200715tune.maxrewrite <number>
716 Sets the reserved buffer space to this size in bytes. The reserved space is
717 used for header rewriting or appending. The first reads on sockets will never
718 fill more than bufsize-maxrewrite. Historically it has defaulted to half of
719 bufsize, though that does not make much sense since there are rarely large
720 numbers of headers to add. Setting it too high prevents processing of large
721 requests or responses. Setting it too low prevents addition of new headers
722 to already large requests or to POST requests. It is generally wise to set it
723 to about 1024. It is automatically readjusted to half of bufsize if it is
724 larger than that. This means you don't have to worry about it when changing
725 bufsize.
726
Willy Tarreaue803de22010-01-21 17:43:04 +0100727tune.rcvbuf.client <number>
728tune.rcvbuf.server <number>
729 Forces the kernel socket receive buffer size on the client or the server side
730 to the specified value in bytes. This value applies to all TCP/HTTP frontends
731 and backends. It should normally never be set, and the default size (0) lets
732 the kernel autotune this value depending on the amount of available memory.
733 However it can sometimes help to set it to very low values (eg: 4096) in
734 order to save kernel memory by preventing it from buffering too large amounts
735 of received data. Lower values will significantly increase CPU usage though.
736
737tune.sndbuf.client <number>
738tune.sndbuf.server <number>
739 Forces the kernel socket send buffer size on the client or the server side to
740 the specified value in bytes. This value applies to all TCP/HTTP frontends
741 and backends. It should normally never be set, and the default size (0) lets
742 the kernel autotune this value depending on the amount of available memory.
743 However it can sometimes help to set it to very low values (eg: 4096) in
744 order to save kernel memory by preventing it from buffering too large amounts
745 of received data. Lower values will significantly increase CPU usage though.
746 Another use case is to prevent write timeouts with extremely slow clients due
747 to the kernel waiting for a large part of the buffer to be read before
748 notifying haproxy again.
749
Willy Tarreau6a06a402007-07-15 20:15:28 +0200750
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007513.3. Debugging
752--------------
Willy Tarreau6a06a402007-07-15 20:15:28 +0200753
754debug
755 Enables debug mode which dumps to stdout all exchanges, and disables forking
756 into background. It is the equivalent of the command-line argument "-d". It
757 should never be used in a production configuration since it may prevent full
758 system startup.
759
760quiet
761 Do not display any message during startup. It is equivalent to the command-
762 line argument "-q".
763
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +01007643.4. Userlists
765--------------
766It is possible to control access to frontend/backend/listen sections or to
767http stats by allowing only authenticated and authorized users. To do this,
768it is required to create at least one userlist and to define users.
769
770userlist <listname>
Cyril Bonté78caf842010-03-10 22:41:43 +0100771 Creates new userlist with name <listname>. Many independent userlists can be
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +0100772 used to store authentication & authorization data for independent customers.
773
774group <groupname> [users <user>,<user>,(...)]
Cyril Bonté78caf842010-03-10 22:41:43 +0100775 Adds group <groupname> to the current userlist. It is also possible to
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +0100776 attach users to this group by using a comma separated list of names
777 proceeded by "users" keyword.
778
Cyril Bontéf0c60612010-02-06 14:44:47 +0100779user <username> [password|insecure-password <password>]
780 [groups <group>,<group>,(...)]
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +0100781 Adds user <username> to the current userlist. Both secure (encrypted) and
782 insecure (unencrypted) passwords can be used. Encrypted passwords are
Cyril Bonté78caf842010-03-10 22:41:43 +0100783 evaluated using the crypt(3) function so depending of the system's
784 capabilities, different algorithms are supported. For example modern Glibc
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +0100785 based Linux system supports MD5, SHA-256, SHA-512 and of course classic,
786 DES-based method of crypting passwords.
787
788
789 Example:
Cyril Bontéf0c60612010-02-06 14:44:47 +0100790 userlist L1
791 group G1 users tiger,scott
792 group G2 users xdb,scott
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +0100793
Cyril Bontéf0c60612010-02-06 14:44:47 +0100794 user tiger password $6$k6y3o.eP$JlKBx9za9667qe4(...)xHSwRv6J.C0/D7cV91
795 user scott insecure-password elgato
796 user xdb insecure-password hello
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +0100797
Cyril Bontéf0c60612010-02-06 14:44:47 +0100798 userlist L2
799 group G1
800 group G2
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +0100801
Cyril Bontéf0c60612010-02-06 14:44:47 +0100802 user tiger password $6$k6y3o.eP$JlKBx(...)xHSwRv6J.C0/D7cV91 groups G1
803 user scott insecure-password elgato groups G1,G2
804 user xdb insecure-password hello groups G2
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +0100805
806 Please note that both lists are functionally identical.
Willy Tarreau6a06a402007-07-15 20:15:28 +0200807
Willy Tarreauc57f0e22009-05-10 13:12:33 +02008084. Proxies
Willy Tarreau6a06a402007-07-15 20:15:28 +0200809----------
Willy Tarreau0ba27502007-12-24 16:55:16 +0100810
Willy Tarreau6a06a402007-07-15 20:15:28 +0200811Proxy configuration can be located in a set of sections :
812 - defaults <name>
813 - frontend <name>
814 - backend <name>
815 - listen <name>
816
817A "defaults" section sets default parameters for all other sections following
818its declaration. Those default parameters are reset by the next "defaults"
819section. See below for the list of parameters which can be set in a "defaults"
Willy Tarreau0ba27502007-12-24 16:55:16 +0100820section. The name is optional but its use is encouraged for better readability.
Willy Tarreau6a06a402007-07-15 20:15:28 +0200821
822A "frontend" section describes a set of listening sockets accepting client
823connections.
824
825A "backend" section describes a set of servers to which the proxy will connect
826to forward incoming connections.
827
828A "listen" section defines a complete proxy with its frontend and backend
829parts combined in one section. It is generally useful for TCP-only traffic.
830
Willy Tarreau0ba27502007-12-24 16:55:16 +0100831All proxy names must be formed from upper and lower case letters, digits,
832'-' (dash), '_' (underscore) , '.' (dot) and ':' (colon). ACL names are
833case-sensitive, which means that "www" and "WWW" are two different proxies.
834
835Historically, all proxy names could overlap, it just caused troubles in the
836logs. Since the introduction of content switching, it is mandatory that two
837proxies with overlapping capabilities (frontend/backend) have different names.
838However, it is still permitted that a frontend and a backend share the same
839name, as this configuration seems to be commonly encountered.
840
841Right now, two major proxy modes are supported : "tcp", also known as layer 4,
842and "http", also known as layer 7. In layer 4 mode, HAProxy simply forwards
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +0100843bidirectional traffic between two sides. In layer 7 mode, HAProxy analyzes the
Willy Tarreau0ba27502007-12-24 16:55:16 +0100844protocol, and can interact with it by allowing, blocking, switching, adding,
845modifying, or removing arbitrary contents in requests or responses, based on
846arbitrary criteria.
847
Willy Tarreau0ba27502007-12-24 16:55:16 +0100848
Willy Tarreauc57f0e22009-05-10 13:12:33 +02008494.1. Proxy keywords matrix
850--------------------------
Willy Tarreau0ba27502007-12-24 16:55:16 +0100851
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200852The following list of keywords is supported. Most of them may only be used in a
853limited set of section types. Some of them are marked as "deprecated" because
854they are inherited from an old syntax which may be confusing or functionally
855limited, and there are new recommended keywords to replace them. Keywords
Willy Tarreau5c6f7b32010-02-26 13:34:29 +0100856marked with "(*)" can be optionally inverted using the "no" prefix, eg. "no
Willy Tarreauc57f0e22009-05-10 13:12:33 +0200857option contstats". This makes sense when the option has been enabled by default
Willy Tarreau3842f002009-06-14 11:39:52 +0200858and must be disabled for a specific instance. Such options may also be prefixed
859with "default" in order to restore default settings regardless of what has been
860specified in a previous "defaults" section.
Willy Tarreau0ba27502007-12-24 16:55:16 +0100861
Willy Tarreau6a06a402007-07-15 20:15:28 +0200862
Willy Tarreau5c6f7b32010-02-26 13:34:29 +0100863 keyword defaults frontend listen backend
864------------------------------------+----------+----------+---------+---------
865acl - X X X
866appsession - - X X
867backlog X X X -
868balance X - X X
869bind - X X -
870bind-process X X X X
871block - X X X
872capture cookie - X X -
873capture request header - X X -
874capture response header - X X -
875clitimeout (deprecated) X X X -
876contimeout (deprecated) X - X X
877cookie X - X X
878default-server X - X X
879default_backend X X X -
880description - X X X
881disabled X X X X
882dispatch - - X X
883enabled X X X X
884errorfile X X X X
885errorloc X X X X
886errorloc302 X X X X
887-- keyword -------------------------- defaults - frontend - listen -- backend -
888errorloc303 X X X X
Cyril Bonté0d4bf012010-04-25 23:21:46 +0200889force-persist - X X X
Willy Tarreau5c6f7b32010-02-26 13:34:29 +0100890fullconn X - X X
891grace X X X X
892hash-type X - X X
893http-check disable-on-404 X - X X
Willy Tarreaubd741542010-03-16 18:46:54 +0100894http-check expect - - X X
Willy Tarreau7ab6aff2010-10-12 06:30:16 +0200895http-check send-state X - X X
Willy Tarreau5c6f7b32010-02-26 13:34:29 +0100896http-request - X X X
897id - X X X
Cyril Bonté0d4bf012010-04-25 23:21:46 +0200898ignore-persist - X X X
Willy Tarreau5c6f7b32010-02-26 13:34:29 +0100899log X X X X
900maxconn X X X -
901mode X X X X
902monitor fail - X X -
903monitor-net X X X -
904monitor-uri X X X -
905option abortonclose (*) X - X X
906option accept-invalid-http-request (*) X X X -
907option accept-invalid-http-response (*) X - X X
908option allbackups (*) X - X X
909option checkcache (*) X - X X
910option clitcpka (*) X X X -
911option contstats (*) X X X -
912option dontlog-normal (*) X X X -
913option dontlognull (*) X X X -
914option forceclose (*) X X X X
915-- keyword -------------------------- defaults - frontend - listen -- backend -
916option forwardfor X X X X
Willy Tarreau8a8e1d92010-04-05 16:15:16 +0200917option http-pretend-keepalive (*) X X X X
Willy Tarreau5c6f7b32010-02-26 13:34:29 +0100918option http-server-close (*) X X X X
919option http-use-proxy-header (*) X X X -
920option httpchk X - X X
921option httpclose (*) X X X X
922option httplog X X X X
923option http_proxy (*) X X X X
924option independant-streams (*) X X X X
Gabor Lekenyb4c81e42010-09-29 18:17:05 +0200925option ldap-check X - X X
Willy Tarreau5c6f7b32010-02-26 13:34:29 +0100926option log-health-checks (*) X - X X
927option log-separate-errors (*) X X X -
928option logasap (*) X X X -
929option mysql-check X - X X
930option nolinger (*) X X X X
931option originalto X X X X
932option persist (*) X - X X
933option redispatch (*) X - X X
934option smtpchk X - X X
935option socket-stats (*) X X X -
936option splice-auto (*) X X X X
937option splice-request (*) X X X X
938option splice-response (*) X X X X
939option srvtcpka (*) X - X X
940option ssl-hello-chk X - X X
941-- keyword -------------------------- defaults - frontend - listen -- backend -
942option tcp-smart-accept (*) X X X -
943option tcp-smart-connect (*) X - X X
944option tcpka X X X X
945option tcplog X X X X
946option transparent (*) X - X X
947persist rdp-cookie X - X X
948rate-limit sessions X X X -
949redirect - X X X
950redisp (deprecated) X - X X
951redispatch (deprecated) X - X X
952reqadd - X X X
953reqallow - X X X
954reqdel - X X X
955reqdeny - X X X
956reqiallow - X X X
957reqidel - X X X
958reqideny - X X X
959reqipass - X X X
960reqirep - X X X
961reqisetbe - X X X
962reqitarpit - X X X
963reqpass - X X X
964reqrep - X X X
965-- keyword -------------------------- defaults - frontend - listen -- backend -
966reqsetbe - X X X
967reqtarpit - X X X
968retries X - X X
969rspadd - X X X
970rspdel - X X X
971rspdeny - X X X
972rspidel - X X X
973rspideny - X X X
974rspirep - X X X
975rsprep - X X X
976server - - X X
977source X - X X
978srvtimeout (deprecated) X - X X
Cyril Bonté66c327d2010-10-12 00:14:37 +0200979stats admin - - X X
Willy Tarreau5c6f7b32010-02-26 13:34:29 +0100980stats auth X - X X
981stats enable X - X X
982stats hide-version X - X X
Cyril Bonté2be1b3f2010-09-30 23:46:30 +0200983stats http-request - - X X
Willy Tarreau5c6f7b32010-02-26 13:34:29 +0100984stats realm X - X X
985stats refresh X - X X
986stats scope X - X X
987stats show-desc X - X X
988stats show-legends X - X X
989stats show-node X - X X
990stats uri X - X X
991-- keyword -------------------------- defaults - frontend - listen -- backend -
992stick match - - X X
993stick on - - X X
994stick store-request - - X X
995stick-table - - X X
Willy Tarreaue9656522010-08-17 15:40:09 +0200996tcp-request connection - X X -
997tcp-request content - X X X
Willy Tarreaua56235c2010-09-14 11:31:36 +0200998tcp-request inspect-delay - X X X
Emeric Brun0a3b67f2010-09-24 15:34:53 +0200999tcp-response content - - X X
1000tcp-response inspect-delay - - X X
Willy Tarreau5c6f7b32010-02-26 13:34:29 +01001001timeout check X - X X
1002timeout client X X X -
1003timeout clitimeout (deprecated) X X X -
1004timeout connect X - X X
1005timeout contimeout (deprecated) X - X X
1006timeout http-keep-alive X X X X
1007timeout http-request X X X X
1008timeout queue X - X X
1009timeout server X - X X
1010timeout srvtimeout (deprecated) X - X X
1011timeout tarpit X X X X
1012transparent (deprecated) X - X X
1013use_backend - X X -
1014------------------------------------+----------+----------+---------+---------
1015 keyword defaults frontend listen backend
Willy Tarreau6a06a402007-07-15 20:15:28 +02001016
Willy Tarreau0ba27502007-12-24 16:55:16 +01001017
Willy Tarreauc57f0e22009-05-10 13:12:33 +020010184.2. Alphabetically sorted keywords reference
1019---------------------------------------------
Willy Tarreau0ba27502007-12-24 16:55:16 +01001020
1021This section provides a description of each keyword and its usage.
1022
1023
1024acl <aclname> <criterion> [flags] [operator] <value> ...
1025 Declare or complete an access list.
1026 May be used in sections : defaults | frontend | listen | backend
1027 no | yes | yes | yes
1028 Example:
1029 acl invalid_src src 0.0.0.0/7 224.0.0.0/3
1030 acl invalid_src src_port 0:1023
1031 acl local_dst hdr(host) -i localhost
1032
Willy Tarreauc57f0e22009-05-10 13:12:33 +02001033 See section 7 about ACL usage.
Willy Tarreau0ba27502007-12-24 16:55:16 +01001034
1035
Cyril Bontéb21570a2009-11-29 20:04:48 +01001036appsession <cookie> len <length> timeout <holdtime>
1037 [request-learn] [prefix] [mode <path-parameters|query-string>]
Willy Tarreau0ba27502007-12-24 16:55:16 +01001038 Define session stickiness on an existing application cookie.
1039 May be used in sections : defaults | frontend | listen | backend
1040 no | no | yes | yes
1041 Arguments :
1042 <cookie> this is the name of the cookie used by the application and which
1043 HAProxy will have to learn for each new session.
1044
Cyril Bontéb21570a2009-11-29 20:04:48 +01001045 <length> this is the max number of characters that will be memorized and
Willy Tarreau0ba27502007-12-24 16:55:16 +01001046 checked in each cookie value.
1047
1048 <holdtime> this is the time after which the cookie will be removed from
1049 memory if unused. If no unit is specified, this time is in
1050 milliseconds.
1051
Cyril Bontébf47aeb2009-10-15 00:15:40 +02001052 request-learn
1053 If this option is specified, then haproxy will be able to learn
1054 the cookie found in the request in case the server does not
1055 specify any in response. This is typically what happens with
1056 PHPSESSID cookies, or when haproxy's session expires before
1057 the application's session and the correct server is selected.
1058 It is recommended to specify this option to improve reliability.
1059
Cyril Bontéb21570a2009-11-29 20:04:48 +01001060 prefix When this option is specified, haproxy will match on the cookie
1061 prefix (or URL parameter prefix). The appsession value is the
1062 data following this prefix.
1063
1064 Example :
1065 appsession ASPSESSIONID len 64 timeout 3h prefix
1066
1067 This will match the cookie ASPSESSIONIDXXXX=XXXXX,
1068 the appsession value will be XXXX=XXXXX.
1069
1070 mode This option allows to change the URL parser mode.
1071 2 modes are currently supported :
1072 - path-parameters :
1073 The parser looks for the appsession in the path parameters
1074 part (each parameter is separated by a semi-colon), which is
1075 convenient for JSESSIONID for example.
1076 This is the default mode if the option is not set.
1077 - query-string :
1078 In this mode, the parser will look for the appsession in the
1079 query string.
1080
Willy Tarreau0ba27502007-12-24 16:55:16 +01001081 When an application cookie is defined in a backend, HAProxy will check when
1082 the server sets such a cookie, and will store its value in a table, and
1083 associate it with the server's identifier. Up to <length> characters from
1084 the value will be retained. On each connection, haproxy will look for this
Cyril Bontéb21570a2009-11-29 20:04:48 +01001085 cookie both in the "Cookie:" headers, and as a URL parameter (depending on
1086 the mode used). If a known value is found, the client will be directed to the
1087 server associated with this value. Otherwise, the load balancing algorithm is
Willy Tarreau0ba27502007-12-24 16:55:16 +01001088 applied. Cookies are automatically removed from memory when they have been
1089 unused for a duration longer than <holdtime>.
1090
1091 The definition of an application cookie is limited to one per backend.
1092
1093 Example :
1094 appsession JSESSIONID len 52 timeout 3h
1095
Cyril Bontéa8e7bbc2010-04-25 22:29:29 +02001096 See also : "cookie", "capture cookie", "balance", "stick", "stick-table"
Cyril Bonté0d4bf012010-04-25 23:21:46 +02001097 and "ignore-persist"
Willy Tarreau0ba27502007-12-24 16:55:16 +01001098
1099
Willy Tarreauc73ce2b2008-01-06 10:55:10 +01001100backlog <conns>
1101 Give hints to the system about the approximate listen backlog desired size
1102 May be used in sections : defaults | frontend | listen | backend
1103 yes | yes | yes | no
1104 Arguments :
1105 <conns> is the number of pending connections. Depending on the operating
1106 system, it may represent the number of already acknowledged
1107 connections, of non-acknowledged ones, or both.
1108
1109 In order to protect against SYN flood attacks, one solution is to increase
1110 the system's SYN backlog size. Depending on the system, sometimes it is just
1111 tunable via a system parameter, sometimes it is not adjustable at all, and
1112 sometimes the system relies on hints given by the application at the time of
1113 the listen() syscall. By default, HAProxy passes the frontend's maxconn value
1114 to the listen() syscall. On systems which can make use of this value, it can
1115 sometimes be useful to be able to specify a different value, hence this
1116 backlog parameter.
1117
1118 On Linux 2.4, the parameter is ignored by the system. On Linux 2.6, it is
1119 used as a hint and the system accepts up to the smallest greater power of
1120 two, and never more than some limits (usually 32768).
1121
1122 See also : "maxconn" and the target operating system's tuning guide.
1123
1124
Willy Tarreau0ba27502007-12-24 16:55:16 +01001125balance <algorithm> [ <arguments> ]
matt.farnsworth@nokia.com1c2ab962008-04-14 20:47:37 +02001126balance url_param <param> [check_post [<max_wait>]]
Willy Tarreau0ba27502007-12-24 16:55:16 +01001127 Define the load balancing algorithm to be used in a backend.
1128 May be used in sections : defaults | frontend | listen | backend
1129 yes | no | yes | yes
1130 Arguments :
1131 <algorithm> is the algorithm used to select a server when doing load
1132 balancing. This only applies when no persistence information
1133 is available, or when a connection is redispatched to another
1134 server. <algorithm> may be one of the following :
1135
1136 roundrobin Each server is used in turns, according to their weights.
1137 This is the smoothest and fairest algorithm when the server's
1138 processing time remains equally distributed. This algorithm
1139 is dynamic, which means that server weights may be adjusted
Willy Tarreau9757a382009-10-03 12:56:50 +02001140 on the fly for slow starts for instance. It is limited by
1141 design to 4128 active servers per backend. Note that in some
1142 large farms, when a server becomes up after having been down
1143 for a very short time, it may sometimes take a few hundreds
1144 requests for it to be re-integrated into the farm and start
1145 receiving traffic. This is normal, though very rare. It is
1146 indicated here in case you would have the chance to observe
1147 it, so that you don't worry.
1148
1149 static-rr Each server is used in turns, according to their weights.
1150 This algorithm is as similar to roundrobin except that it is
1151 static, which means that changing a server's weight on the
1152 fly will have no effect. On the other hand, it has no design
1153 limitation on the number of servers, and when a server goes
1154 up, it is always immediately reintroduced into the farm, once
1155 the full map is recomputed. It also uses slightly less CPU to
1156 run (around -1%).
Willy Tarreau0ba27502007-12-24 16:55:16 +01001157
Willy Tarreau2d2a7f82008-03-17 12:07:56 +01001158 leastconn The server with the lowest number of connections receives the
1159 connection. Round-robin is performed within groups of servers
1160 of the same load to ensure that all servers will be used. Use
1161 of this algorithm is recommended where very long sessions are
1162 expected, such as LDAP, SQL, TSE, etc... but is not very well
1163 suited for protocols using short sessions such as HTTP. This
1164 algorithm is dynamic, which means that server weights may be
1165 adjusted on the fly for slow starts for instance.
1166
Willy Tarreau0ba27502007-12-24 16:55:16 +01001167 source The source IP address is hashed and divided by the total
1168 weight of the running servers to designate which server will
1169 receive the request. This ensures that the same client IP
1170 address will always reach the same server as long as no
1171 server goes down or up. If the hash result changes due to the
1172 number of running servers changing, many clients will be
1173 directed to a different server. This algorithm is generally
1174 used in TCP mode where no cookie may be inserted. It may also
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01001175 be used on the Internet to provide a best-effort stickiness
Willy Tarreau0ba27502007-12-24 16:55:16 +01001176 to clients which refuse session cookies. This algorithm is
Willy Tarreau6b2e11b2009-10-01 07:52:15 +02001177 static by default, which means that changing a server's
1178 weight on the fly will have no effect, but this can be
1179 changed using "hash-type".
Willy Tarreau0ba27502007-12-24 16:55:16 +01001180
1181 uri The left part of the URI (before the question mark) is hashed
1182 and divided by the total weight of the running servers. The
1183 result designates which server will receive the request. This
1184 ensures that a same URI will always be directed to the same
1185 server as long as no server goes up or down. This is used
1186 with proxy caches and anti-virus proxies in order to maximize
1187 the cache hit rate. Note that this algorithm may only be used
Willy Tarreau6b2e11b2009-10-01 07:52:15 +02001188 in an HTTP backend. This algorithm is static by default,
1189 which means that changing a server's weight on the fly will
1190 have no effect, but this can be changed using "hash-type".
Willy Tarreau0ba27502007-12-24 16:55:16 +01001191
Marek Majkowski9c30fc12008-04-27 23:25:55 +02001192 This algorithm support two optional parameters "len" and
1193 "depth", both followed by a positive integer number. These
1194 options may be helpful when it is needed to balance servers
1195 based on the beginning of the URI only. The "len" parameter
1196 indicates that the algorithm should only consider that many
1197 characters at the beginning of the URI to compute the hash.
1198 Note that having "len" set to 1 rarely makes sense since most
1199 URIs start with a leading "/".
1200
1201 The "depth" parameter indicates the maximum directory depth
1202 to be used to compute the hash. One level is counted for each
1203 slash in the request. If both parameters are specified, the
1204 evaluation stops when either is reached.
1205
Willy Tarreau0ba27502007-12-24 16:55:16 +01001206 url_param The URL parameter specified in argument will be looked up in
matt.farnsworth@nokia.com1c2ab962008-04-14 20:47:37 +02001207 the query string of each HTTP GET request.
1208
1209 If the modifier "check_post" is used, then an HTTP POST
1210 request entity will be searched for the parameter argument,
1211 when the question mark indicating a query string ('?') is not
1212 present in the URL. Optionally, specify a number of octets to
1213 wait for before attempting to search the message body. If the
1214 entity can not be searched, then round robin is used for each
1215 request. For instance, if your clients always send the LB
1216 parameter in the first 128 bytes, then specify that. The
1217 default is 48. The entity data will not be scanned until the
1218 required number of octets have arrived at the gateway, this
1219 is the minimum of: (default/max_wait, Content-Length or first
1220 chunk length). If Content-Length is missing or zero, it does
1221 not need to wait for more data than the client promised to
1222 send. When Content-Length is present and larger than
1223 <max_wait>, then waiting is limited to <max_wait> and it is
1224 assumed that this will be enough data to search for the
1225 presence of the parameter. In the unlikely event that
1226 Transfer-Encoding: chunked is used, only the first chunk is
1227 scanned. Parameter values separated by a chunk boundary, may
1228 be randomly balanced if at all.
1229
1230 If the parameter is found followed by an equal sign ('=') and
1231 a value, then the value is hashed and divided by the total
1232 weight of the running servers. The result designates which
1233 server will receive the request.
1234
1235 This is used to track user identifiers in requests and ensure
1236 that a same user ID will always be sent to the same server as
1237 long as no server goes up or down. If no value is found or if
1238 the parameter is not found, then a round robin algorithm is
1239 applied. Note that this algorithm may only be used in an HTTP
Willy Tarreau6b2e11b2009-10-01 07:52:15 +02001240 backend. This algorithm is static by default, which means
1241 that changing a server's weight on the fly will have no
1242 effect, but this can be changed using "hash-type".
Willy Tarreau0ba27502007-12-24 16:55:16 +01001243
Benoitaffb4812009-03-25 13:02:10 +01001244 hdr(name) The HTTP header <name> will be looked up in each HTTP request.
1245 Just as with the equivalent ACL 'hdr()' function, the header
1246 name in parenthesis is not case sensitive. If the header is
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01001247 absent or if it does not contain any value, the roundrobin
Benoitaffb4812009-03-25 13:02:10 +01001248 algorithm is applied instead.
1249
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01001250 An optional 'use_domain_only' parameter is available, for
Benoitaffb4812009-03-25 13:02:10 +01001251 reducing the hash algorithm to the main domain part with some
1252 specific headers such as 'Host'. For instance, in the Host
1253 value "haproxy.1wt.eu", only "1wt" will be considered.
1254
Willy Tarreau6b2e11b2009-10-01 07:52:15 +02001255 This algorithm is static by default, which means that
1256 changing a server's weight on the fly will have no effect,
1257 but this can be changed using "hash-type".
1258
Emeric Brun736aa232009-06-30 17:56:00 +02001259 rdp-cookie
1260 rdp-cookie(name)
1261 The RDP cookie <name> (or "mstshash" if omitted) will be
1262 looked up and hashed for each incoming TCP request. Just as
1263 with the equivalent ACL 'req_rdp_cookie()' function, the name
1264 is not case-sensitive. This mechanism is useful as a degraded
1265 persistence mode, as it makes it possible to always send the
1266 same user (or the same session ID) to the same server. If the
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01001267 cookie is not found, the normal roundrobin algorithm is
Emeric Brun736aa232009-06-30 17:56:00 +02001268 used instead.
1269
1270 Note that for this to work, the frontend must ensure that an
1271 RDP cookie is already present in the request buffer. For this
1272 you must use 'tcp-request content accept' rule combined with
1273 a 'req_rdp_cookie_cnt' ACL.
1274
Willy Tarreau6b2e11b2009-10-01 07:52:15 +02001275 This algorithm is static by default, which means that
1276 changing a server's weight on the fly will have no effect,
1277 but this can be changed using "hash-type".
1278
Willy Tarreau0ba27502007-12-24 16:55:16 +01001279 <arguments> is an optional list of arguments which may be needed by some
Marek Majkowski9c30fc12008-04-27 23:25:55 +02001280 algorithms. Right now, only "url_param" and "uri" support an
1281 optional argument.
matt.farnsworth@nokia.com1c2ab962008-04-14 20:47:37 +02001282
Marek Majkowski9c30fc12008-04-27 23:25:55 +02001283 balance uri [len <len>] [depth <depth>]
matt.farnsworth@nokia.com1c2ab962008-04-14 20:47:37 +02001284 balance url_param <param> [check_post [<max_wait>]]
Willy Tarreau0ba27502007-12-24 16:55:16 +01001285
Willy Tarreau3cd9af22009-03-15 14:06:41 +01001286 The load balancing algorithm of a backend is set to roundrobin when no other
1287 algorithm, mode nor option have been set. The algorithm may only be set once
1288 for each backend.
Willy Tarreau0ba27502007-12-24 16:55:16 +01001289
1290 Examples :
1291 balance roundrobin
1292 balance url_param userid
matt.farnsworth@nokia.com1c2ab962008-04-14 20:47:37 +02001293 balance url_param session_id check_post 64
Benoitaffb4812009-03-25 13:02:10 +01001294 balance hdr(User-Agent)
1295 balance hdr(host)
1296 balance hdr(Host) use_domain_only
matt.farnsworth@nokia.com1c2ab962008-04-14 20:47:37 +02001297
1298 Note: the following caveats and limitations on using the "check_post"
1299 extension with "url_param" must be considered :
1300
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01001301 - all POST requests are eligible for consideration, because there is no way
matt.farnsworth@nokia.com1c2ab962008-04-14 20:47:37 +02001302 to determine if the parameters will be found in the body or entity which
1303 may contain binary data. Therefore another method may be required to
1304 restrict consideration of POST requests that have no URL parameters in
1305 the body. (see acl reqideny http_end)
1306
1307 - using a <max_wait> value larger than the request buffer size does not
1308 make sense and is useless. The buffer size is set at build time, and
1309 defaults to 16 kB.
1310
1311 - Content-Encoding is not supported, the parameter search will probably
1312 fail; and load balancing will fall back to Round Robin.
1313
1314 - Expect: 100-continue is not supported, load balancing will fall back to
1315 Round Robin.
1316
1317 - Transfer-Encoding (RFC2616 3.6.1) is only supported in the first chunk.
1318 If the entire parameter value is not present in the first chunk, the
1319 selection of server is undefined (actually, defined by how little
1320 actually appeared in the first chunk).
1321
1322 - This feature does not support generation of a 100, 411 or 501 response.
1323
1324 - In some cases, requesting "check_post" MAY attempt to scan the entire
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01001325 contents of a message body. Scanning normally terminates when linear
matt.farnsworth@nokia.com1c2ab962008-04-14 20:47:37 +02001326 white space or control characters are found, indicating the end of what
1327 might be a URL parameter list. This is probably not a concern with SGML
1328 type message bodies.
Willy Tarreau0ba27502007-12-24 16:55:16 +01001329
Willy Tarreau6b2e11b2009-10-01 07:52:15 +02001330 See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and
1331 "http_proxy".
Willy Tarreau0ba27502007-12-24 16:55:16 +01001332
1333
Willy Tarreauc5011ca2010-03-22 11:53:56 +01001334bind [<address>]:<port_range> [, ...]
1335bind [<address>]:<port_range> [, ...] interface <interface>
1336bind [<address>]:<port_range> [, ...] mss <maxseg>
1337bind [<address>]:<port_range> [, ...] transparent
1338bind [<address>]:<port_range> [, ...] id <id>
1339bind [<address>]:<port_range> [, ...] name <name>
1340bind [<address>]:<port_range> [, ...] defer-accept
Willy Tarreau71c814e2010-10-29 21:56:16 +02001341bind [<address>]:<port_range> [, ...] accept-proxy
Willy Tarreauceb24bc2010-11-09 12:46:41 +01001342bind /<path> [, ...]
1343bind /<path> [, ...] mode <mode>
1344bind /<path> [, ...] [ user <user> | uid <uid> ]
1345bind /<path> [, ...] [ group <user> | gid <gid> ]
Willy Tarreau0ba27502007-12-24 16:55:16 +01001346 Define one or several listening addresses and/or ports in a frontend.
1347 May be used in sections : defaults | frontend | listen | backend
1348 no | yes | yes | no
1349 Arguments :
Willy Tarreaub1e52e82008-01-13 14:49:51 +01001350 <address> is optional and can be a host name, an IPv4 address, an IPv6
1351 address, or '*'. It designates the address the frontend will
1352 listen on. If unset, all IPv4 addresses of the system will be
1353 listened on. The same will apply for '*' or the system's
1354 special address "0.0.0.0".
1355
Willy Tarreauc5011ca2010-03-22 11:53:56 +01001356 <port_range> is either a unique TCP port, or a port range for which the
1357 proxy will accept connections for the IP address specified
Willy Tarreauceb24bc2010-11-09 12:46:41 +01001358 above. The port is mandatory for TCP listeners. Note that in
1359 the case of an IPv6 address, the port is always the number
1360 after the last colon (':'). A range can either be :
Willy Tarreauc5011ca2010-03-22 11:53:56 +01001361 - a numerical port (ex: '80')
1362 - a dash-delimited ports range explicitly stating the lower
1363 and upper bounds (ex: '2000-2100') which are included in
1364 the range.
1365
1366 Particular care must be taken against port ranges, because
1367 every <address:port> couple consumes one socket (= a file
1368 descriptor), so it's easy to consume lots of descriptors
1369 with a simple range, and to run out of sockets. Also, each
1370 <address:port> couple must be used only once among all
1371 instances running on a same system. Please note that binding
1372 to ports lower than 1024 generally require particular
1373 privileges to start the program, which are independant of
1374 the 'uid' parameter.
Willy Tarreau0ba27502007-12-24 16:55:16 +01001375
Willy Tarreauceb24bc2010-11-09 12:46:41 +01001376 <path> is a UNIX socket path beginning with a slash ('/'). This is
1377 alternative to the TCP listening port. Haproxy will then
1378 receive UNIX connections on the socket located at this place.
1379 The path must begin with a slash and by default is absolute.
1380 It can be relative to the prefix defined by "unix-bind" in
1381 the global section. Note that the total length of the prefix
1382 followed by the socket path cannot exceed some system limits
1383 for UNIX sockets, which commonly are set to 107 characters.
1384
Willy Tarreau5e6e2042009-02-04 17:19:29 +01001385 <interface> is an optional physical interface name. This is currently
1386 only supported on Linux. The interface must be a physical
1387 interface, not an aliased interface. When specified, all
1388 addresses on the same line will only be accepted if the
1389 incoming packet physically come through the designated
1390 interface. It is also possible to bind multiple frontends to
1391 the same address if they are bound to different interfaces.
1392 Note that binding to a physical interface requires root
Willy Tarreauceb24bc2010-11-09 12:46:41 +01001393 privileges. This parameter is only compatible with TCP
1394 sockets.
Willy Tarreau5e6e2042009-02-04 17:19:29 +01001395
Willy Tarreaube1b9182009-06-14 18:48:19 +02001396 <maxseg> is an optional TCP Maximum Segment Size (MSS) value to be
1397 advertised on incoming connections. This can be used to force
1398 a lower MSS for certain specific ports, for instance for
1399 connections passing through a VPN. Note that this relies on a
1400 kernel feature which is theorically supported under Linux but
1401 was buggy in all versions prior to 2.6.28. It may or may not
1402 work on other operating systems. The commonly advertised
1403 value on Ethernet networks is 1460 = 1500(MTU) - 40(IP+TCP).
Willy Tarreauceb24bc2010-11-09 12:46:41 +01001404 This parameter is only compatible with TCP sockets.
Willy Tarreaube1b9182009-06-14 18:48:19 +02001405
Willy Tarreau53fb4ae2009-10-04 23:04:08 +02001406 <id> is a persistent value for socket ID. Must be positive and
1407 unique in the proxy. An unused value will automatically be
1408 assigned if unset. Can only be used when defining only a
1409 single socket.
Krzysztof Piotr Oledzkiaeebf9b2009-10-04 15:43:17 +02001410
1411 <name> is an optional name provided for stats
1412
Willy Tarreauceb24bc2010-11-09 12:46:41 +01001413 <mode> is the octal mode used to define access permissions on the
1414 UNIX socket. It can also be set by default in the global
1415 section's "unix-bind" statement. Note that some platforms
1416 simply ignore this.
1417
1418 <user> is the name of user that will be marked owner of the UNIX
1419 socket. It can also be set by default in the global
1420 section's "unix-bind" statement. Note that some platforms
1421 simply ignore this.
1422
1423 <group> is the name of a group that will be used to create the UNIX
1424 socket. It can also be set by default in the global section's
1425 "unix-bind" statement. Note that some platforms simply ignore
1426 this.
1427
1428 <uid> is the uid of user that will be marked owner of the UNIX
1429 socket. It can also be set by default in the global section's
1430 "unix-bind" statement. Note that some platforms simply ignore
1431 this.
1432
1433 <gid> is the gid of a group that will be used to create the UNIX
1434 socket. It can also be set by default in the global section's
1435 "unix-bind" statement. Note that some platforms simply ignore
1436 this.
1437
Willy Tarreaub1e52e82008-01-13 14:49:51 +01001438 transparent is an optional keyword which is supported only on certain
1439 Linux kernels. It indicates that the addresses will be bound
1440 even if they do not belong to the local machine. Any packet
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01001441 targeting any of these addresses will be caught just as if
Willy Tarreaub1e52e82008-01-13 14:49:51 +01001442 the address was locally configured. This normally requires
1443 that IP forwarding is enabled. Caution! do not use this with
1444 the default address '*', as it would redirect any traffic for
1445 the specified port. This keyword is available only when
Willy Tarreauceb24bc2010-11-09 12:46:41 +01001446 HAProxy is built with USE_LINUX_TPROXY=1. This parameter is
1447 only compatible with TCP sockets.
Willy Tarreau0ba27502007-12-24 16:55:16 +01001448
Willy Tarreau59f89202010-10-02 11:54:00 +02001449 defer-accept is an optional keyword which is supported only on certain
Willy Tarreaucb6cd432009-10-13 07:34:14 +02001450 Linux kernels. It states that a connection will only be
1451 accepted once some data arrive on it, or at worst after the
1452 first retransmit. This should be used only on protocols for
1453 which the client talks first (eg: HTTP). It can slightly
1454 improve performance by ensuring that most of the request is
1455 already available when the connection is accepted. On the
1456 other hand, it will not be able to detect connections which
1457 don't talk. It is important to note that this option is
1458 broken in all kernels up to 2.6.31, as the connection is
1459 never accepted until the client talks. This can cause issues
1460 with front firewalls which would see an established
1461 connection while the proxy will only see it in SYN_RECV.
1462
Willy Tarreau71c814e2010-10-29 21:56:16 +02001463 accept-proxy is an optional keyword which enforces use of the PROXY
1464 protocol over any connection accepted by this listener. The
1465 PROXY protocol dictates the layer 3/4 addresses of the
1466 incoming connection to be used everywhere an address is used,
1467 with the only exception of "tcp-request connection" rules
1468 which will only see the real connection address. Logs will
1469 reflect the addresses indicated in the protocol, unless it is
1470 violated, in which case the real address will still be used.
1471 This keyword combined with support from external components
1472 can be used as an efficient and reliable alternative to the
1473 X-Forwarded-For mechanism which is not always reliable and
1474 not even always usable.
1475
Willy Tarreau0ba27502007-12-24 16:55:16 +01001476 It is possible to specify a list of address:port combinations delimited by
1477 commas. The frontend will then listen on all of these addresses. There is no
1478 fixed limit to the number of addresses and ports which can be listened on in
1479 a frontend, as well as there is no limit to the number of "bind" statements
1480 in a frontend.
1481
1482 Example :
1483 listen http_proxy
1484 bind :80,:443
1485 bind 10.0.0.1:10080,10.0.0.1:10443
Willy Tarreauceb24bc2010-11-09 12:46:41 +01001486 bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
Willy Tarreau0ba27502007-12-24 16:55:16 +01001487
Willy Tarreauceb24bc2010-11-09 12:46:41 +01001488 See also : "source", "option forwardfor", "unix-bind" and the PROXY protocol
Willy Tarreau71c814e2010-10-29 21:56:16 +02001489 documentation.
Willy Tarreau0ba27502007-12-24 16:55:16 +01001490
1491
Willy Tarreau0b9c02c2009-02-04 22:05:05 +01001492bind-process [ all | odd | even | <number 1-32> ] ...
1493 Limit visibility of an instance to a certain set of processes numbers.
1494 May be used in sections : defaults | frontend | listen | backend
1495 yes | yes | yes | yes
1496 Arguments :
1497 all All process will see this instance. This is the default. It
1498 may be used to override a default value.
1499
1500 odd This instance will be enabled on processes 1,3,5,...31. This
1501 option may be combined with other numbers.
1502
1503 even This instance will be enabled on processes 2,4,6,...32. This
1504 option may be combined with other numbers. Do not use it
1505 with less than 2 processes otherwise some instances might be
1506 missing from all processes.
1507
1508 number The instance will be enabled on this process number, between
1509 1 and 32. You must be careful not to reference a process
1510 number greater than the configured global.nbproc, otherwise
1511 some instances might be missing from all processes.
1512
1513 This keyword limits binding of certain instances to certain processes. This
1514 is useful in order not to have too many processes listening to the same
1515 ports. For instance, on a dual-core machine, it might make sense to set
1516 'nbproc 2' in the global section, then distributes the listeners among 'odd'
1517 and 'even' instances.
1518
1519 At the moment, it is not possible to reference more than 32 processes using
1520 this keyword, but this should be more than enough for most setups. Please
1521 note that 'all' really means all processes and is not limited to the first
1522 32.
1523
1524 If some backends are referenced by frontends bound to other processes, the
1525 backend automatically inherits the frontend's processes.
1526
1527 Example :
1528 listen app_ip1
1529 bind 10.0.0.1:80
Willy Tarreaubfcd3112010-10-23 11:22:08 +02001530 bind-process odd
Willy Tarreau0b9c02c2009-02-04 22:05:05 +01001531
1532 listen app_ip2
1533 bind 10.0.0.2:80
Willy Tarreaubfcd3112010-10-23 11:22:08 +02001534 bind-process even
Willy Tarreau0b9c02c2009-02-04 22:05:05 +01001535
1536 listen management
1537 bind 10.0.0.3:80
Willy Tarreaubfcd3112010-10-23 11:22:08 +02001538 bind-process 1 2 3 4
Willy Tarreau0b9c02c2009-02-04 22:05:05 +01001539
1540 See also : "nbproc" in global section.
1541
1542
Willy Tarreau0ba27502007-12-24 16:55:16 +01001543block { if | unless } <condition>
1544 Block a layer 7 request if/unless a condition is matched
1545 May be used in sections : defaults | frontend | listen | backend
1546 no | yes | yes | yes
1547
1548 The HTTP request will be blocked very early in the layer 7 processing
1549 if/unless <condition> is matched. A 403 error will be returned if the request
Willy Tarreauc57f0e22009-05-10 13:12:33 +02001550 is blocked. The condition has to reference ACLs (see section 7). This is
Willy Tarreau0ba27502007-12-24 16:55:16 +01001551 typically used to deny access to certain sensible resources if some
1552 conditions are met or not met. There is no fixed limit to the number of
1553 "block" statements per instance.
1554
1555 Example:
1556 acl invalid_src src 0.0.0.0/7 224.0.0.0/3
1557 acl invalid_src src_port 0:1023
1558 acl local_dst hdr(host) -i localhost
1559 block if invalid_src || local_dst
1560
Willy Tarreauc57f0e22009-05-10 13:12:33 +02001561 See section 7 about ACL usage.
Willy Tarreau0ba27502007-12-24 16:55:16 +01001562
1563
1564capture cookie <name> len <length>
1565 Capture and log a cookie in the request and in the response.
1566 May be used in sections : defaults | frontend | listen | backend
1567 no | yes | yes | no
1568 Arguments :
1569 <name> is the beginning of the name of the cookie to capture. In order
1570 to match the exact name, simply suffix the name with an equal
1571 sign ('='). The full name will appear in the logs, which is
1572 useful with application servers which adjust both the cookie name
1573 and value (eg: ASPSESSIONXXXXX).
1574
1575 <length> is the maximum number of characters to report in the logs, which
1576 include the cookie name, the equal sign and the value, all in the
1577 standard "name=value" form. The string will be truncated on the
1578 right if it exceeds <length>.
1579
1580 Only the first cookie is captured. Both the "cookie" request headers and the
1581 "set-cookie" response headers are monitored. This is particularly useful to
1582 check for application bugs causing session crossing or stealing between
1583 users, because generally the user's cookies can only change on a login page.
1584
1585 When the cookie was not presented by the client, the associated log column
1586 will report "-". When a request does not cause a cookie to be assigned by the
1587 server, a "-" is reported in the response column.
1588
1589 The capture is performed in the frontend only because it is necessary that
1590 the log format does not change for a given frontend depending on the
1591 backends. This may change in the future. Note that there can be only one
1592 "capture cookie" statement in a frontend. The maximum capture length is
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01001593 configured in the sources by default to 64 characters. It is not possible to
Willy Tarreau0ba27502007-12-24 16:55:16 +01001594 specify a capture in a "defaults" section.
1595
1596 Example:
1597 capture cookie ASPSESSION len 32
1598
1599 See also : "capture request header", "capture response header" as well as
Willy Tarreauc57f0e22009-05-10 13:12:33 +02001600 section 8 about logging.
Willy Tarreau0ba27502007-12-24 16:55:16 +01001601
1602
1603capture request header <name> len <length>
1604 Capture and log the first occurrence of the specified request header.
1605 May be used in sections : defaults | frontend | listen | backend
1606 no | yes | yes | no
1607 Arguments :
1608 <name> is the name of the header to capture. The header names are not
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01001609 case-sensitive, but it is a common practice to write them as they
Willy Tarreau0ba27502007-12-24 16:55:16 +01001610 appear in the requests, with the first letter of each word in
1611 upper case. The header name will not appear in the logs, only the
1612 value is reported, but the position in the logs is respected.
1613
1614 <length> is the maximum number of characters to extract from the value and
1615 report in the logs. The string will be truncated on the right if
1616 it exceeds <length>.
1617
Willy Tarreaucc6c8912009-02-22 10:53:55 +01001618 Only the first value of the last occurrence of the header is captured. The
Willy Tarreau0ba27502007-12-24 16:55:16 +01001619 value will be added to the logs between braces ('{}'). If multiple headers
1620 are captured, they will be delimited by a vertical bar ('|') and will appear
Willy Tarreaucc6c8912009-02-22 10:53:55 +01001621 in the same order they were declared in the configuration. Non-existent
1622 headers will be logged just as an empty string. Common uses for request
1623 header captures include the "Host" field in virtual hosting environments, the
1624 "Content-length" when uploads are supported, "User-agent" to quickly
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01001625 differentiate between real users and robots, and "X-Forwarded-For" in proxied
Willy Tarreaucc6c8912009-02-22 10:53:55 +01001626 environments to find where the request came from.
1627
1628 Note that when capturing headers such as "User-agent", some spaces may be
1629 logged, making the log analysis more difficult. Thus be careful about what
1630 you log if you know your log parser is not smart enough to rely on the
1631 braces.
Willy Tarreau0ba27502007-12-24 16:55:16 +01001632
1633 There is no limit to the number of captured request headers, but each capture
1634 is limited to 64 characters. In order to keep log format consistent for a
1635 same frontend, header captures can only be declared in a frontend. It is not
1636 possible to specify a capture in a "defaults" section.
1637
1638 Example:
1639 capture request header Host len 15
1640 capture request header X-Forwarded-For len 15
1641 capture request header Referrer len 15
1642
Willy Tarreauc57f0e22009-05-10 13:12:33 +02001643 See also : "capture cookie", "capture response header" as well as section 8
Willy Tarreau0ba27502007-12-24 16:55:16 +01001644 about logging.
1645
1646
1647capture response header <name> len <length>
1648 Capture and log the first occurrence of the specified response header.
1649 May be used in sections : defaults | frontend | listen | backend
1650 no | yes | yes | no
1651 Arguments :
1652 <name> is the name of the header to capture. The header names are not
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01001653 case-sensitive, but it is a common practice to write them as they
Willy Tarreau0ba27502007-12-24 16:55:16 +01001654 appear in the response, with the first letter of each word in
1655 upper case. The header name will not appear in the logs, only the
1656 value is reported, but the position in the logs is respected.
1657
1658 <length> is the maximum number of characters to extract from the value and
1659 report in the logs. The string will be truncated on the right if
1660 it exceeds <length>.
1661
Willy Tarreaucc6c8912009-02-22 10:53:55 +01001662 Only the first value of the last occurrence of the header is captured. The
Willy Tarreau0ba27502007-12-24 16:55:16 +01001663 result will be added to the logs between braces ('{}') after the captured
1664 request headers. If multiple headers are captured, they will be delimited by
1665 a vertical bar ('|') and will appear in the same order they were declared in
Willy Tarreaucc6c8912009-02-22 10:53:55 +01001666 the configuration. Non-existent headers will be logged just as an empty
1667 string. Common uses for response header captures include the "Content-length"
1668 header which indicates how many bytes are expected to be returned, the
1669 "Location" header to track redirections.
Willy Tarreau0ba27502007-12-24 16:55:16 +01001670
1671 There is no limit to the number of captured response headers, but each
1672 capture is limited to 64 characters. In order to keep log format consistent
1673 for a same frontend, header captures can only be declared in a frontend. It
1674 is not possible to specify a capture in a "defaults" section.
1675
1676 Example:
1677 capture response header Content-length len 9
1678 capture response header Location len 15
1679
Willy Tarreauc57f0e22009-05-10 13:12:33 +02001680 See also : "capture cookie", "capture request header" as well as section 8
Willy Tarreau0ba27502007-12-24 16:55:16 +01001681 about logging.
1682
1683
Cyril Bontéf0c60612010-02-06 14:44:47 +01001684clitimeout <timeout> (deprecated)
Willy Tarreau0ba27502007-12-24 16:55:16 +01001685 Set the maximum inactivity time on the client side.
1686 May be used in sections : defaults | frontend | listen | backend
1687 yes | yes | yes | no
1688 Arguments :
1689 <timeout> is the timeout value is specified in milliseconds by default, but
1690 can be in any other unit if the number is suffixed by the unit,
1691 as explained at the top of this document.
1692
1693 The inactivity timeout applies when the client is expected to acknowledge or
1694 send data. In HTTP mode, this timeout is particularly important to consider
1695 during the first phase, when the client sends the request, and during the
1696 response while it is reading data sent by the server. The value is specified
1697 in milliseconds by default, but can be in any other unit if the number is
1698 suffixed by the unit, as specified at the top of this document. In TCP mode
1699 (and to a lesser extent, in HTTP mode), it is highly recommended that the
1700 client timeout remains equal to the server timeout in order to avoid complex
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01001701 situations to debug. It is a good practice to cover one or several TCP packet
Willy Tarreau0ba27502007-12-24 16:55:16 +01001702 losses by specifying timeouts that are slightly above multiples of 3 seconds
1703 (eg: 4 or 5 seconds).
1704
1705 This parameter is specific to frontends, but can be specified once for all in
1706 "defaults" sections. This is in fact one of the easiest solutions not to
1707 forget about it. An unspecified timeout results in an infinite timeout, which
1708 is not recommended. Such a usage is accepted and works but reports a warning
1709 during startup because it may results in accumulation of expired sessions in
1710 the system if the system's timeouts are not configured either.
1711
1712 This parameter is provided for compatibility but is currently deprecated.
1713 Please use "timeout client" instead.
1714
Willy Tarreau036fae02008-01-06 13:24:40 +01001715 See also : "timeout client", "timeout http-request", "timeout server", and
1716 "srvtimeout".
Willy Tarreau0ba27502007-12-24 16:55:16 +01001717
1718
Cyril Bontéf0c60612010-02-06 14:44:47 +01001719contimeout <timeout> (deprecated)
Willy Tarreau0ba27502007-12-24 16:55:16 +01001720 Set the maximum time to wait for a connection attempt to a server to succeed.
1721 May be used in sections : defaults | frontend | listen | backend
1722 yes | no | yes | yes
1723 Arguments :
1724 <timeout> is the timeout value is specified in milliseconds by default, but
1725 can be in any other unit if the number is suffixed by the unit,
1726 as explained at the top of this document.
1727
1728 If the server is located on the same LAN as haproxy, the connection should be
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01001729 immediate (less than a few milliseconds). Anyway, it is a good practice to
Willy Tarreaud72758d2010-01-12 10:42:19 +01001730 cover one or several TCP packet losses by specifying timeouts that are
Willy Tarreau0ba27502007-12-24 16:55:16 +01001731 slightly above multiples of 3 seconds (eg: 4 or 5 seconds). By default, the
1732 connect timeout also presets the queue timeout to the same value if this one
1733 has not been specified. Historically, the contimeout was also used to set the
1734 tarpit timeout in a listen section, which is not possible in a pure frontend.
1735
1736 This parameter is specific to backends, but can be specified once for all in
1737 "defaults" sections. This is in fact one of the easiest solutions not to
1738 forget about it. An unspecified timeout results in an infinite timeout, which
1739 is not recommended. Such a usage is accepted and works but reports a warning
1740 during startup because it may results in accumulation of failed sessions in
1741 the system if the system's timeouts are not configured either.
1742
1743 This parameter is provided for backwards compatibility but is currently
1744 deprecated. Please use "timeout connect", "timeout queue" or "timeout tarpit"
1745 instead.
1746
1747 See also : "timeout connect", "timeout queue", "timeout tarpit",
1748 "timeout server", "contimeout".
1749
1750
Willy Tarreau55165fe2009-05-10 12:02:55 +02001751cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ]
Willy Tarreauba4c5be2010-10-23 12:46:42 +02001752 [ postonly ] [ preserve ] [ domain <domain> ]*
Willy Tarreau996a92c2010-10-13 19:30:47 +02001753 [ maxidle <idle> ] [ maxlife <life> ]
Willy Tarreau0ba27502007-12-24 16:55:16 +01001754 Enable cookie-based persistence in a backend.
1755 May be used in sections : defaults | frontend | listen | backend
1756 yes | no | yes | yes
1757 Arguments :
1758 <name> is the name of the cookie which will be monitored, modified or
1759 inserted in order to bring persistence. This cookie is sent to
1760 the client via a "Set-Cookie" header in the response, and is
1761 brought back by the client in a "Cookie" header in all requests.
1762 Special care should be taken to choose a name which does not
1763 conflict with any likely application cookie. Also, if the same
1764 backends are subject to be used by the same clients (eg:
1765 HTTP/HTTPS), care should be taken to use different cookie names
1766 between all backends if persistence between them is not desired.
1767
1768 rewrite This keyword indicates that the cookie will be provided by the
1769 server and that haproxy will have to modify its value to set the
1770 server's identifier in it. This mode is handy when the management
1771 of complex combinations of "Set-cookie" and "Cache-control"
1772 headers is left to the application. The application can then
1773 decide whether or not it is appropriate to emit a persistence
1774 cookie. Since all responses should be monitored, this mode only
1775 works in HTTP close mode. Unless the application behaviour is
1776 very complex and/or broken, it is advised not to start with this
1777 mode for new deployments. This keyword is incompatible with
1778 "insert" and "prefix".
1779
1780 insert This keyword indicates that the persistence cookie will have to
Willy Tarreaua79094d2010-08-31 22:54:15 +02001781 be inserted by haproxy in server responses if the client did not
Willy Tarreauba4c5be2010-10-23 12:46:42 +02001782
Willy Tarreaua79094d2010-08-31 22:54:15 +02001783 already have a cookie that would have permitted it to access this
Willy Tarreauba4c5be2010-10-23 12:46:42 +02001784 server. When used without the "preserve" option, if the server
1785 emits a cookie with the same name, it will be remove before
1786 processing. For this reason, this mode can be used to upgrade
1787 existing configurations running in the "rewrite" mode. The cookie
1788 will only be a session cookie and will not be stored on the
1789 client's disk. By default, unless the "indirect" option is added,
1790 the server will see the cookies emitted by the client. Due to
1791 caching effects, it is generally wise to add the "nocache" or
1792 "postonly" keywords (see below). The "insert" keyword is not
1793 compatible with "rewrite" and "prefix".
Willy Tarreau0ba27502007-12-24 16:55:16 +01001794
1795 prefix This keyword indicates that instead of relying on a dedicated
1796 cookie for the persistence, an existing one will be completed.
1797 This may be needed in some specific environments where the client
1798 does not support more than one single cookie and the application
1799 already needs it. In this case, whenever the server sets a cookie
1800 named <name>, it will be prefixed with the server's identifier
1801 and a delimiter. The prefix will be removed from all client
1802 requests so that the server still finds the cookie it emitted.
1803 Since all requests and responses are subject to being modified,
1804 this mode requires the HTTP close mode. The "prefix" keyword is
1805 not compatible with "rewrite" and "insert".
1806
Willy Tarreaua79094d2010-08-31 22:54:15 +02001807 indirect When this option is specified, no cookie will be emitted to a
1808 client which already has a valid one for the server which has
1809 processed the request. If the server sets such a cookie itself,
Willy Tarreauba4c5be2010-10-23 12:46:42 +02001810 it will be removed, unless the "preserve" option is also set. In
1811 "insert" mode, this will additionally remove cookies from the
1812 requests transmitted to the server, making the persistence
1813 mechanism totally transparent from an application point of view.
Willy Tarreau0ba27502007-12-24 16:55:16 +01001814
1815 nocache This option is recommended in conjunction with the insert mode
1816 when there is a cache between the client and HAProxy, as it
1817 ensures that a cacheable response will be tagged non-cacheable if
1818 a cookie needs to be inserted. This is important because if all
1819 persistence cookies are added on a cacheable home page for
1820 instance, then all customers will then fetch the page from an
1821 outer cache and will all share the same persistence cookie,
1822 leading to one server receiving much more traffic than others.
1823 See also the "insert" and "postonly" options.
1824
1825 postonly This option ensures that cookie insertion will only be performed
1826 on responses to POST requests. It is an alternative to the
1827 "nocache" option, because POST responses are not cacheable, so
1828 this ensures that the persistence cookie will never get cached.
1829 Since most sites do not need any sort of persistence before the
1830 first POST which generally is a login request, this is a very
1831 efficient method to optimize caching without risking to find a
1832 persistence cookie in the cache.
1833 See also the "insert" and "nocache" options.
1834
Willy Tarreauba4c5be2010-10-23 12:46:42 +02001835 preserve This option may only be used with "insert" and/or "indirect". It
1836 allows the server to emit the persistence cookie itself. In this
1837 case, if a cookie is found in the response, haproxy will leave it
1838 untouched. This is useful in order to end persistence after a
1839 logout request for instance. For this, the server just has to
1840 emit a cookie with an invalid value (eg: empty) or with a date in
1841 the past. By combining this mechanism with the "disable-on-404"
1842 check option, it is possible to perform a completely graceful
1843 shutdown because users will definitely leave the server after
1844 they logout.
1845
Krzysztof Piotr Oledzkiefe3b6f2008-05-23 23:49:32 +02001846 domain This option allows to specify the domain at which a cookie is
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01001847 inserted. It requires exactly one parameter: a valid domain
Willy Tarreau68a897b2009-12-03 23:28:34 +01001848 name. If the domain begins with a dot, the browser is allowed to
1849 use it for any host ending with that name. It is also possible to
1850 specify several domain names by invoking this option multiple
1851 times. Some browsers might have small limits on the number of
1852 domains, so be careful when doing that. For the record, sending
1853 10 domains to MSIE 6 or Firefox 2 works as expected.
Krzysztof Piotr Oledzkiefe3b6f2008-05-23 23:49:32 +02001854
Willy Tarreau996a92c2010-10-13 19:30:47 +02001855 maxidle This option allows inserted cookies to be ignored after some idle
1856 time. It only works with insert-mode cookies. When a cookie is
1857 sent to the client, the date this cookie was emitted is sent too.
1858 Upon further presentations of this cookie, if the date is older
1859 than the delay indicated by the parameter (in seconds), it will
1860 be ignored. Otherwise, it will be refreshed if needed when the
1861 response is sent to the client. This is particularly useful to
1862 prevent users who never close their browsers from remaining for
1863 too long on the same server (eg: after a farm size change). When
1864 this option is set and a cookie has no date, it is always
1865 accepted, but gets refreshed in the response. This maintains the
1866 ability for admins to access their sites. Cookies that have a
1867 date in the future further than 24 hours are ignored. Doing so
1868 lets admins fix timezone issues without risking kicking users off
1869 the site.
1870
1871 maxlife This option allows inserted cookies to be ignored after some life
1872 time, whether they're in use or not. It only works with insert
1873 mode cookies. When a cookie is first sent to the client, the date
1874 this cookie was emitted is sent too. Upon further presentations
1875 of this cookie, if the date is older than the delay indicated by
1876 the parameter (in seconds), it will be ignored. If the cookie in
1877 the request has no date, it is accepted and a date will be set.
1878 Cookies that have a date in the future further than 24 hours are
1879 ignored. Doing so lets admins fix timezone issues without risking
1880 kicking users off the site. Contrary to maxidle, this value is
1881 not refreshed, only the first visit date counts. Both maxidle and
1882 maxlife may be used at the time. This is particularly useful to
1883 prevent users who never close their browsers from remaining for
1884 too long on the same server (eg: after a farm size change). This
1885 is stronger than the maxidle method in that it forces a
1886 redispatch after some absolute delay.
1887
Willy Tarreau0ba27502007-12-24 16:55:16 +01001888 There can be only one persistence cookie per HTTP backend, and it can be
1889 declared in a defaults section. The value of the cookie will be the value
1890 indicated after the "cookie" keyword in a "server" statement. If no cookie
1891 is declared for a given server, the cookie is not set.
Willy Tarreau6a06a402007-07-15 20:15:28 +02001892
Willy Tarreau0ba27502007-12-24 16:55:16 +01001893 Examples :
1894 cookie JSESSIONID prefix
1895 cookie SRV insert indirect nocache
1896 cookie SRV insert postonly indirect
Willy Tarreau996a92c2010-10-13 19:30:47 +02001897 cookie SRV insert indirect nocache maxidle 30m maxlife 8h
Willy Tarreau0ba27502007-12-24 16:55:16 +01001898
Cyril Bontéa8e7bbc2010-04-25 22:29:29 +02001899 See also : "appsession", "balance source", "capture cookie", "server"
Cyril Bonté0d4bf012010-04-25 23:21:46 +02001900 and "ignore-persist".
Willy Tarreau0ba27502007-12-24 16:55:16 +01001901
Willy Tarreau983e01e2010-01-11 18:42:06 +01001902
Krzysztof Piotr Oledzkic6df0662010-01-05 16:38:49 +01001903default-server [param*]
1904 Change default options for a server in a backend
1905 May be used in sections : defaults | frontend | listen | backend
1906 yes | no | yes | yes
1907 Arguments:
Willy Tarreau983e01e2010-01-11 18:42:06 +01001908 <param*> is a list of parameters for this server. The "default-server"
1909 keyword accepts an important number of options and has a complete
1910 section dedicated to it. Please refer to section 5 for more
1911 details.
Krzysztof Piotr Oledzkic6df0662010-01-05 16:38:49 +01001912
Willy Tarreau983e01e2010-01-11 18:42:06 +01001913 Example :
Krzysztof Piotr Oledzkic6df0662010-01-05 16:38:49 +01001914 default-server inter 1000 weight 13
1915
1916 See also: "server" and section 5 about server options
Willy Tarreau0ba27502007-12-24 16:55:16 +01001917
Willy Tarreau983e01e2010-01-11 18:42:06 +01001918
Willy Tarreau0ba27502007-12-24 16:55:16 +01001919default_backend <backend>
1920 Specify the backend to use when no "use_backend" rule has been matched.
1921 May be used in sections : defaults | frontend | listen | backend
1922 yes | yes | yes | no
1923 Arguments :
1924 <backend> is the name of the backend to use.
1925
1926 When doing content-switching between frontend and backends using the
1927 "use_backend" keyword, it is often useful to indicate which backend will be
1928 used when no rule has matched. It generally is the dynamic backend which
1929 will catch all undetermined requests.
1930
Willy Tarreau0ba27502007-12-24 16:55:16 +01001931 Example :
1932
1933 use_backend dynamic if url_dyn
1934 use_backend static if url_css url_img extension_img
1935 default_backend dynamic
1936
Willy Tarreau2769aa02007-12-27 18:26:09 +01001937 See also : "use_backend", "reqsetbe", "reqisetbe"
1938
Willy Tarreau0ba27502007-12-24 16:55:16 +01001939
1940disabled
1941 Disable a proxy, frontend or backend.
1942 May be used in sections : defaults | frontend | listen | backend
1943 yes | yes | yes | yes
1944 Arguments : none
1945
1946 The "disabled" keyword is used to disable an instance, mainly in order to
1947 liberate a listening port or to temporarily disable a service. The instance
1948 will still be created and its configuration will be checked, but it will be
1949 created in the "stopped" state and will appear as such in the statistics. It
1950 will not receive any traffic nor will it send any health-checks or logs. It
1951 is possible to disable many instances at once by adding the "disabled"
1952 keyword in a "defaults" section.
1953
1954 See also : "enabled"
1955
1956
Willy Tarreau5ce94572010-06-07 14:35:41 +02001957dispatch <address>:<port>
1958 Set a default server address
1959 May be used in sections : defaults | frontend | listen | backend
1960 no | no | yes | yes
1961 Arguments : none
1962
1963 <address> is the IPv4 address of the default server. Alternatively, a
1964 resolvable hostname is supported, but this name will be resolved
1965 during start-up.
1966
1967 <ports> is a mandatory port specification. All connections will be sent
1968 to this port, and it is not permitted to use port offsets as is
1969 possible with normal servers.
1970
1971 The "disabled" keyword designates a default server for use when no other
1972 server can take the connection. In the past it was used to forward non
1973 persistent connections to an auxiliary load balancer. Due to its simple
1974 syntax, it has also been used for simple TCP relays. It is recommended not to
1975 use it for more clarity, and to use the "server" directive instead.
1976
1977 See also : "server"
1978
1979
Willy Tarreau0ba27502007-12-24 16:55:16 +01001980enabled
1981 Enable a proxy, frontend or backend.
1982 May be used in sections : defaults | frontend | listen | backend
1983 yes | yes | yes | yes
1984 Arguments : none
1985
1986 The "enabled" keyword is used to explicitly enable an instance, when the
1987 defaults has been set to "disabled". This is very rarely used.
1988
1989 See also : "disabled"
1990
1991
1992errorfile <code> <file>
1993 Return a file contents instead of errors generated by HAProxy
1994 May be used in sections : defaults | frontend | listen | backend
1995 yes | yes | yes | yes
1996 Arguments :
1997 <code> is the HTTP status code. Currently, HAProxy is capable of
1998 generating codes 400, 403, 408, 500, 502, 503, and 504.
1999
2000 <file> designates a file containing the full HTTP response. It is
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01002001 recommended to follow the common practice of appending ".http" to
Willy Tarreau0ba27502007-12-24 16:55:16 +01002002 the filename so that people do not confuse the response with HTML
Willy Tarreau59140a22009-02-22 12:02:30 +01002003 error pages, and to use absolute paths, since files are read
2004 before any chroot is performed.
Willy Tarreau0ba27502007-12-24 16:55:16 +01002005
2006 It is important to understand that this keyword is not meant to rewrite
2007 errors returned by the server, but errors detected and returned by HAProxy.
2008 This is why the list of supported errors is limited to a small set.
2009
2010 The files are returned verbatim on the TCP socket. This allows any trick such
2011 as redirections to another URL or site, as well as tricks to clean cookies,
2012 force enable or disable caching, etc... The package provides default error
2013 files returning the same contents as default errors.
2014
Willy Tarreau59140a22009-02-22 12:02:30 +01002015 The files should not exceed the configured buffer size (BUFSIZE), which
2016 generally is 8 or 16 kB, otherwise they will be truncated. It is also wise
2017 not to put any reference to local contents (eg: images) in order to avoid
2018 loops between the client and HAProxy when all servers are down, causing an
2019 error to be returned instead of an image. For better HTTP compliance, it is
2020 recommended that all header lines end with CR-LF and not LF alone.
2021
Willy Tarreau0ba27502007-12-24 16:55:16 +01002022 The files are read at the same time as the configuration and kept in memory.
2023 For this reason, the errors continue to be returned even when the process is
2024 chrooted, and no file change is considered while the process is running. A
Willy Tarreauc27debf2008-01-06 08:57:02 +01002025 simple method for developing those files consists in associating them to the
Willy Tarreau0ba27502007-12-24 16:55:16 +01002026 403 status code and interrogating a blocked URL.
2027
2028 See also : "errorloc", "errorloc302", "errorloc303"
2029
Willy Tarreau59140a22009-02-22 12:02:30 +01002030 Example :
2031 errorfile 400 /etc/haproxy/errorfiles/400badreq.http
2032 errorfile 403 /etc/haproxy/errorfiles/403forbid.http
2033 errorfile 503 /etc/haproxy/errorfiles/503sorry.http
2034
Willy Tarreau2769aa02007-12-27 18:26:09 +01002035
2036errorloc <code> <url>
2037errorloc302 <code> <url>
2038 Return an HTTP redirection to a URL instead of errors generated by HAProxy
2039 May be used in sections : defaults | frontend | listen | backend
2040 yes | yes | yes | yes
2041 Arguments :
2042 <code> is the HTTP status code. Currently, HAProxy is capable of
2043 generating codes 400, 403, 408, 500, 502, 503, and 504.
2044
2045 <url> it is the exact contents of the "Location" header. It may contain
2046 either a relative URI to an error page hosted on the same site,
2047 or an absolute URI designating an error page on another site.
2048 Special care should be given to relative URIs to avoid redirect
2049 loops if the URI itself may generate the same error (eg: 500).
2050
2051 It is important to understand that this keyword is not meant to rewrite
2052 errors returned by the server, but errors detected and returned by HAProxy.
2053 This is why the list of supported errors is limited to a small set.
2054
2055 Note that both keyword return the HTTP 302 status code, which tells the
2056 client to fetch the designated URL using the same HTTP method. This can be
2057 quite problematic in case of non-GET methods such as POST, because the URL
2058 sent to the client might not be allowed for something other than GET. To
2059 workaround this problem, please use "errorloc303" which send the HTTP 303
2060 status code, indicating to the client that the URL must be fetched with a GET
2061 request.
2062
2063 See also : "errorfile", "errorloc303"
2064
2065
2066errorloc303 <code> <url>
2067 Return an HTTP redirection to a URL instead of errors generated by HAProxy
2068 May be used in sections : defaults | frontend | listen | backend
2069 yes | yes | yes | yes
2070 Arguments :
2071 <code> is the HTTP status code. Currently, HAProxy is capable of
2072 generating codes 400, 403, 408, 500, 502, 503, and 504.
2073
2074 <url> it is the exact contents of the "Location" header. It may contain
2075 either a relative URI to an error page hosted on the same site,
2076 or an absolute URI designating an error page on another site.
2077 Special care should be given to relative URIs to avoid redirect
2078 loops if the URI itself may generate the same error (eg: 500).
2079
2080 It is important to understand that this keyword is not meant to rewrite
2081 errors returned by the server, but errors detected and returned by HAProxy.
2082 This is why the list of supported errors is limited to a small set.
2083
2084 Note that both keyword return the HTTP 303 status code, which tells the
2085 client to fetch the designated URL using the same HTTP GET method. This
2086 solves the usual problems associated with "errorloc" and the 302 code. It is
2087 possible that some very old browsers designed before HTTP/1.1 do not support
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01002088 it, but no such problem has been reported till now.
Willy Tarreau2769aa02007-12-27 18:26:09 +01002089
2090 See also : "errorfile", "errorloc", "errorloc302"
2091
2092
Willy Tarreau4de91492010-01-22 19:10:05 +01002093force-persist { if | unless } <condition>
2094 Declare a condition to force persistence on down servers
2095 May be used in sections: defaults | frontend | listen | backend
2096 no | yes | yes | yes
2097
2098 By default, requests are not dispatched to down servers. It is possible to
2099 force this using "option persist", but it is unconditional and redispatches
2100 to a valid server if "option redispatch" is set. That leaves with very little
2101 possibilities to force some requests to reach a server which is artificially
2102 marked down for maintenance operations.
2103
2104 The "force-persist" statement allows one to declare various ACL-based
2105 conditions which, when met, will cause a request to ignore the down status of
2106 a server and still try to connect to it. That makes it possible to start a
2107 server, still replying an error to the health checks, and run a specially
2108 configured browser to test the service. Among the handy methods, one could
2109 use a specific source IP address, or a specific cookie. The cookie also has
2110 the advantage that it can easily be added/removed on the browser from a test
2111 page. Once the service is validated, it is then possible to open the service
2112 to the world by returning a valid response to health checks.
2113
2114 The forced persistence is enabled when an "if" condition is met, or unless an
2115 "unless" condition is met. The final redispatch is always disabled when this
2116 is used.
2117
Cyril Bonté0d4bf012010-04-25 23:21:46 +02002118 See also : "option redispatch", "ignore-persist", "persist",
Cyril Bontéa8e7bbc2010-04-25 22:29:29 +02002119 and section 7 about ACL usage.
Willy Tarreau4de91492010-01-22 19:10:05 +01002120
2121
Willy Tarreau2769aa02007-12-27 18:26:09 +01002122fullconn <conns>
2123 Specify at what backend load the servers will reach their maxconn
2124 May be used in sections : defaults | frontend | listen | backend
2125 yes | no | yes | yes
2126 Arguments :
2127 <conns> is the number of connections on the backend which will make the
2128 servers use the maximal number of connections.
2129
Willy Tarreau198a7442008-01-17 12:05:32 +01002130 When a server has a "maxconn" parameter specified, it means that its number
Willy Tarreau2769aa02007-12-27 18:26:09 +01002131 of concurrent connections will never go higher. Additionally, if it has a
Willy Tarreau198a7442008-01-17 12:05:32 +01002132 "minconn" parameter, it indicates a dynamic limit following the backend's
Willy Tarreau2769aa02007-12-27 18:26:09 +01002133 load. The server will then always accept at least <minconn> connections,
2134 never more than <maxconn>, and the limit will be on the ramp between both
2135 values when the backend has less than <conns> concurrent connections. This
2136 makes it possible to limit the load on the servers during normal loads, but
2137 push it further for important loads without overloading the servers during
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01002138 exceptional loads.
Willy Tarreau2769aa02007-12-27 18:26:09 +01002139
2140 Example :
2141 # The servers will accept between 100 and 1000 concurrent connections each
2142 # and the maximum of 1000 will be reached when the backend reaches 10000
2143 # connections.
2144 backend dynamic
2145 fullconn 10000
2146 server srv1 dyn1:80 minconn 100 maxconn 1000
2147 server srv2 dyn2:80 minconn 100 maxconn 1000
2148
2149 See also : "maxconn", "server"
2150
2151
2152grace <time>
2153 Maintain a proxy operational for some time after a soft stop
2154 May be used in sections : defaults | frontend | listen | backend
Cyril Bonté99ed3272010-01-24 23:29:44 +01002155 yes | yes | yes | yes
Willy Tarreau2769aa02007-12-27 18:26:09 +01002156 Arguments :
2157 <time> is the time (by default in milliseconds) for which the instance
2158 will remain operational with the frontend sockets still listening
2159 when a soft-stop is received via the SIGUSR1 signal.
2160
2161 This may be used to ensure that the services disappear in a certain order.
2162 This was designed so that frontends which are dedicated to monitoring by an
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01002163 external equipment fail immediately while other ones remain up for the time
Willy Tarreau2769aa02007-12-27 18:26:09 +01002164 needed by the equipment to detect the failure.
2165
2166 Note that currently, there is very little benefit in using this parameter,
2167 and it may in fact complicate the soft-reconfiguration process more than
2168 simplify it.
2169
Willy Tarreau0ba27502007-12-24 16:55:16 +01002170
Willy Tarreau6b2e11b2009-10-01 07:52:15 +02002171hash-type <method>
2172 Specify a method to use for mapping hashes to servers
2173 May be used in sections : defaults | frontend | listen | backend
2174 yes | no | yes | yes
2175 Arguments :
2176 map-based the hash table is a static array containing all alive servers.
2177 The hashes will be very smooth, will consider weights, but will
2178 be static in that weight changes while a server is up will be
2179 ignored. This means that there will be no slow start. Also,
2180 since a server is selected by its position in the array, most
2181 mappings are changed when the server count changes. This means
2182 that when a server goes up or down, or when a server is added
2183 to a farm, most connections will be redistributed to different
2184 servers. This can be inconvenient with caches for instance.
2185
2186 consistent the hash table is a tree filled with many occurrences of each
2187 server. The hash key is looked up in the tree and the closest
2188 server is chosen. This hash is dynamic, it supports changing
2189 weights while the servers are up, so it is compatible with the
2190 slow start feature. It has the advantage that when a server
2191 goes up or down, only its associations are moved. When a server
2192 is added to the farm, only a few part of the mappings are
2193 redistributed, making it an ideal algorithm for caches.
2194 However, due to its principle, the algorithm will never be very
2195 smooth and it may sometimes be necessary to adjust a server's
2196 weight or its ID to get a more balanced distribution. In order
2197 to get the same distribution on multiple load balancers, it is
2198 important that all servers have the same IDs.
2199
2200 The default hash type is "map-based" and is recommended for most usages.
2201
2202 See also : "balance", "server"
2203
2204
Willy Tarreau0ba27502007-12-24 16:55:16 +01002205http-check disable-on-404
2206 Enable a maintenance mode upon HTTP/404 response to health-checks
2207 May be used in sections : defaults | frontend | listen | backend
Willy Tarreau2769aa02007-12-27 18:26:09 +01002208 yes | no | yes | yes
Willy Tarreau0ba27502007-12-24 16:55:16 +01002209 Arguments : none
2210
2211 When this option is set, a server which returns an HTTP code 404 will be
2212 excluded from further load-balancing, but will still receive persistent
2213 connections. This provides a very convenient method for Web administrators
2214 to perform a graceful shutdown of their servers. It is also important to note
2215 that a server which is detected as failed while it was in this mode will not
2216 generate an alert, just a notice. If the server responds 2xx or 3xx again, it
2217 will immediately be reinserted into the farm. The status on the stats page
2218 reports "NOLB" for a server in this mode. It is important to note that this
Willy Tarreaubd741542010-03-16 18:46:54 +01002219 option only works in conjunction with the "httpchk" option. If this option
2220 is used with "http-check expect", then it has precedence over it so that 404
2221 responses will still be considered as soft-stop.
2222
2223 See also : "option httpchk", "http-check expect"
2224
2225
2226http-check expect [!] <match> <pattern>
2227 Make HTTP health checks consider reponse contents or specific status codes
2228 May be used in sections : defaults | frontend | listen | backend
2229 no | no | yes | yes
2230 Arguments :
2231 <match> is a keyword indicating how to look for a specific pattern in the
2232 response. The keyword may be one of "status", "rstatus",
2233 "string", or "rstring". The keyword may be preceeded by an
2234 exclamation mark ("!") to negate the match. Spaces are allowed
2235 between the exclamation mark and the keyword. See below for more
2236 details on the supported keywords.
2237
2238 <pattern> is the pattern to look for. It may be a string or a regular
2239 expression. If the pattern contains spaces, they must be escaped
2240 with the usual backslash ('\').
2241
2242 By default, "option httpchk" considers that response statuses 2xx and 3xx
2243 are valid, and that others are invalid. When "http-check expect" is used,
2244 it defines what is considered valid or invalid. Only one "http-check"
2245 statement is supported in a backend. If a server fails to respond or times
2246 out, the check obviously fails. The available matches are :
2247
2248 status <string> : test the exact string match for the HTTP status code.
2249 A health check respose will be considered valid if the
2250 response's status code is exactly this string. If the
2251 "status" keyword is prefixed with "!", then the response
2252 will be considered invalid if the status code matches.
2253
2254 rstatus <regex> : test a regular expression for the HTTP status code.
2255 A health check respose will be considered valid if the
2256 response's status code matches the expression. If the
2257 "rstatus" keyword is prefixed with "!", then the response
2258 will be considered invalid if the status code matches.
2259 This is mostly used to check for multiple codes.
2260
2261 string <string> : test the exact string match in the HTTP response body.
2262 A health check respose will be considered valid if the
2263 response's body contains this exact string. If the
2264 "string" keyword is prefixed with "!", then the response
2265 will be considered invalid if the body contains this
2266 string. This can be used to look for a mandatory word at
2267 the end of a dynamic page, or to detect a failure when a
2268 specific error appears on the check page (eg: a stack
2269 trace).
2270
2271 rstring <regex> : test a regular expression on the HTTP response body.
2272 A health check respose will be considered valid if the
2273 response's body matches this expression. If the "rstring"
2274 keyword is prefixed with "!", then the response will be
2275 considered invalid if the body matches the expression.
2276 This can be used to look for a mandatory word at the end
2277 of a dynamic page, or to detect a failure when a specific
2278 error appears on the check page (eg: a stack trace).
2279
2280 It is important to note that the responses will be limited to a certain size
2281 defined by the global "tune.chksize" option, which defaults to 16384 bytes.
2282 Thus, too large responses may not contain the mandatory pattern when using
2283 "string" or "rstring". If a large response is absolutely required, it is
2284 possible to change the default max size by setting the global variable.
2285 However, it is worth keeping in mind that parsing very large responses can
2286 waste some CPU cycles, especially when regular expressions are used, and that
2287 it is always better to focus the checks on smaller resources.
2288
2289 Last, if "http-check expect" is combined with "http-check disable-on-404",
2290 then this last one has precedence when the server responds with 404.
2291
2292 Examples :
2293 # only accept status 200 as valid
2294 http-request expect status 200
2295
2296 # consider SQL errors as errors
2297 http-request expect ! string SQL\ Error
2298
2299 # consider status 5xx only as errors
2300 http-request expect ! rstatus ^5
2301
2302 # check that we have a correct hexadecimal tag before /html
2303 http-request expect rstring <!--tag:[0-9a-f]*</html>
Willy Tarreau0ba27502007-12-24 16:55:16 +01002304
Willy Tarreaubd741542010-03-16 18:46:54 +01002305 See also : "option httpchk", "http-check disable-on-404"
Willy Tarreau2769aa02007-12-27 18:26:09 +01002306
2307
Willy Tarreauef781042010-01-27 11:53:01 +01002308http-check send-state
2309 Enable emission of a state header with HTTP health checks
2310 May be used in sections : defaults | frontend | listen | backend
2311 yes | no | yes | yes
2312 Arguments : none
2313
2314 When this option is set, haproxy will systematically send a special header
2315 "X-Haproxy-Server-State" with a list of parameters indicating to each server
2316 how they are seen by haproxy. This can be used for instance when a server is
2317 manipulated without access to haproxy and the operator needs to know whether
2318 haproxy still sees it up or not, or if the server is the last one in a farm.
2319
2320 The header is composed of fields delimited by semi-colons, the first of which
2321 is a word ("UP", "DOWN", "NOLB"), possibly followed by a number of valid
2322 checks on the total number before transition, just as appears in the stats
2323 interface. Next headers are in the form "<variable>=<value>", indicating in
2324 no specific order some values available in the stats interface :
2325 - a variable "name", containing the name of the backend followed by a slash
2326 ("/") then the name of the server. This can be used when a server is
2327 checked in multiple backends.
2328
2329 - a variable "node" containing the name of the haproxy node, as set in the
2330 global "node" variable, otherwise the system's hostname if unspecified.
2331
2332 - a variable "weight" indicating the weight of the server, a slash ("/")
2333 and the total weight of the farm (just counting usable servers). This
2334 helps to know if other servers are available to handle the load when this
2335 one fails.
2336
2337 - a variable "scur" indicating the current number of concurrent connections
2338 on the server, followed by a slash ("/") then the total number of
2339 connections on all servers of the same backend.
2340
2341 - a variable "qcur" indicating the current number of requests in the
2342 server's queue.
2343
2344 Example of a header received by the application server :
2345 >>> X-Haproxy-Server-State: UP 2/3; name=bck/srv2; node=lb1; weight=1/2; \
2346 scur=13/22; qcur=0
2347
2348 See also : "option httpchk", "http-check disable-on-404"
2349
Cyril Bonté2be1b3f2010-09-30 23:46:30 +02002350http-request { allow | deny | auth [realm <realm>] }
Cyril Bontéf0c60612010-02-06 14:44:47 +01002351 [ { if | unless } <condition> ]
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +01002352 Access control for Layer 7 requests
2353
2354 May be used in sections: defaults | frontend | listen | backend
2355 no | yes | yes | yes
2356
2357 These set of options allow to fine control access to a
2358 frontend/listen/backend. Each option may be followed by if/unless and acl.
2359 First option with matched condition (or option without condition) is final.
Cyril Bonté2be1b3f2010-09-30 23:46:30 +02002360 For "deny" a 403 error will be returned, for "allow" normal processing is
2361 performed, for "auth" a 401/407 error code is returned so the client
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +01002362 should be asked to enter a username and password.
2363
2364 There is no fixed limit to the number of http-request statements per
2365 instance.
2366
2367 Example:
Cyril Bonté78caf842010-03-10 22:41:43 +01002368 acl nagios src 192.168.129.3
2369 acl local_net src 192.168.0.0/16
2370 acl auth_ok http_auth(L1)
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +01002371
Cyril Bonté78caf842010-03-10 22:41:43 +01002372 http-request allow if nagios
2373 http-request allow if local_net auth_ok
2374 http-request auth realm Gimme if local_net auth_ok
2375 http-request deny
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +01002376
Cyril Bonté78caf842010-03-10 22:41:43 +01002377 Example:
2378 acl auth_ok http_auth_group(L1) G1
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +01002379
Cyril Bonté78caf842010-03-10 22:41:43 +01002380 http-request auth unless auth_ok
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +01002381
Cyril Bonté2be1b3f2010-09-30 23:46:30 +02002382 See also : "stats http-request", section 3.4 about userlists and section 7
2383 about ACL usage.
Willy Tarreauef781042010-01-27 11:53:01 +01002384
Krzysztof Piotr Oledzkif58a9622008-02-23 01:19:10 +01002385id <value>
Willy Tarreau53fb4ae2009-10-04 23:04:08 +02002386 Set a persistent ID to a proxy.
2387 May be used in sections : defaults | frontend | listen | backend
2388 no | yes | yes | yes
2389 Arguments : none
2390
2391 Set a persistent ID for the proxy. This ID must be unique and positive.
2392 An unused ID will automatically be assigned if unset. The first assigned
2393 value will be 1. This ID is currently only returned in statistics.
Krzysztof Piotr Oledzkif58a9622008-02-23 01:19:10 +01002394
2395
Cyril Bonté0d4bf012010-04-25 23:21:46 +02002396ignore-persist { if | unless } <condition>
2397 Declare a condition to ignore persistence
2398 May be used in sections: defaults | frontend | listen | backend
2399 no | yes | yes | yes
2400
2401 By default, when cookie persistence is enabled, every requests containing
2402 the cookie are unconditionally persistent (assuming the target server is up
2403 and running).
2404
2405 The "ignore-persist" statement allows one to declare various ACL-based
2406 conditions which, when met, will cause a request to ignore persistence.
2407 This is sometimes useful to load balance requests for static files, which
2408 oftenly don't require persistence. This can also be used to fully disable
2409 persistence for a specific User-Agent (for example, some web crawler bots).
2410
2411 Combined with "appsession", it can also help reduce HAProxy memory usage, as
2412 the appsession table won't grow if persistence is ignored.
2413
2414 The persistence is ignored when an "if" condition is met, or unless an
2415 "unless" condition is met.
2416
2417 See also : "force-persist", "cookie", and section 7 about ACL usage.
2418
2419
Willy Tarreau2769aa02007-12-27 18:26:09 +01002420log global
Willy Tarreauf7edefa2009-05-10 17:20:05 +02002421log <address> <facility> [<level> [<minlevel>]]
Willy Tarreau2769aa02007-12-27 18:26:09 +01002422 Enable per-instance logging of events and traffic.
2423 May be used in sections : defaults | frontend | listen | backend
2424 yes | yes | yes | yes
2425 Arguments :
2426 global should be used when the instance's logging parameters are the
2427 same as the global ones. This is the most common usage. "global"
2428 replaces <address>, <facility> and <level> with those of the log
2429 entries found in the "global" section. Only one "log global"
2430 statement may be used per instance, and this form takes no other
2431 parameter.
2432
2433 <address> indicates where to send the logs. It takes the same format as
2434 for the "global" section's logs, and can be one of :
2435
2436 - An IPv4 address optionally followed by a colon (':') and a UDP
2437 port. If no port is specified, 514 is used by default (the
2438 standard syslog port).
2439
2440 - A filesystem path to a UNIX domain socket, keeping in mind
2441 considerations for chroot (be sure the path is accessible
2442 inside the chroot) and uid/gid (be sure the path is
2443 appropriately writeable).
2444
2445 <facility> must be one of the 24 standard syslog facilities :
2446
2447 kern user mail daemon auth syslog lpr news
2448 uucp cron auth2 ftp ntp audit alert cron2
2449 local0 local1 local2 local3 local4 local5 local6 local7
2450
2451 <level> is optional and can be specified to filter outgoing messages. By
2452 default, all messages are sent. If a level is specified, only
2453 messages with a severity at least as important as this level
Willy Tarreauf7edefa2009-05-10 17:20:05 +02002454 will be sent. An optional minimum level can be specified. If it
2455 is set, logs emitted with a more severe level than this one will
2456 be capped to this level. This is used to avoid sending "emerg"
2457 messages on all terminals on some default syslog configurations.
2458 Eight levels are known :
Willy Tarreau2769aa02007-12-27 18:26:09 +01002459
2460 emerg alert crit err warning notice info debug
2461
2462 Note that up to two "log" entries may be specified per instance. However, if
2463 "log global" is used and if the "global" section already contains 2 log
2464 entries, then additional log entries will be ignored.
2465
2466 Also, it is important to keep in mind that it is the frontend which decides
Willy Tarreaucc6c8912009-02-22 10:53:55 +01002467 what to log from a connection, and that in case of content switching, the log
2468 entries from the backend will be ignored. Connections are logged at level
2469 "info".
2470
2471 However, backend log declaration define how and where servers status changes
2472 will be logged. Level "notice" will be used to indicate a server going up,
2473 "warning" will be used for termination signals and definitive service
2474 termination, and "alert" will be used for when a server goes down.
2475
2476 Note : According to RFC3164, messages are truncated to 1024 bytes before
2477 being emitted.
Willy Tarreau2769aa02007-12-27 18:26:09 +01002478
2479 Example :
2480 log global
Willy Tarreauf7edefa2009-05-10 17:20:05 +02002481 log 127.0.0.1:514 local0 notice # only send important events
2482 log 127.0.0.1:514 local0 notice notice # same but limit output level
Willy Tarreau2769aa02007-12-27 18:26:09 +01002483
2484
2485maxconn <conns>
2486 Fix the maximum number of concurrent connections on a frontend
2487 May be used in sections : defaults | frontend | listen | backend
2488 yes | yes | yes | no
2489 Arguments :
2490 <conns> is the maximum number of concurrent connections the frontend will
2491 accept to serve. Excess connections will be queued by the system
2492 in the socket's listen queue and will be served once a connection
2493 closes.
2494
2495 If the system supports it, it can be useful on big sites to raise this limit
2496 very high so that haproxy manages connection queues, instead of leaving the
2497 clients with unanswered connection attempts. This value should not exceed the
2498 global maxconn. Also, keep in mind that a connection contains two buffers
2499 of 8kB each, as well as some other data resulting in about 17 kB of RAM being
2500 consumed per established connection. That means that a medium system equipped
2501 with 1GB of RAM can withstand around 40000-50000 concurrent connections if
2502 properly tuned.
2503
2504 Also, when <conns> is set to large values, it is possible that the servers
2505 are not sized to accept such loads, and for this reason it is generally wise
2506 to assign them some reasonable connection limits.
2507
2508 See also : "server", global section's "maxconn", "fullconn"
2509
2510
2511mode { tcp|http|health }
2512 Set the running mode or protocol of the instance
2513 May be used in sections : defaults | frontend | listen | backend
2514 yes | yes | yes | yes
2515 Arguments :
2516 tcp The instance will work in pure TCP mode. A full-duplex connection
2517 will be established between clients and servers, and no layer 7
2518 examination will be performed. This is the default mode. It
2519 should be used for SSL, SSH, SMTP, ...
2520
2521 http The instance will work in HTTP mode. The client request will be
2522 analyzed in depth before connecting to any server. Any request
2523 which is not RFC-compliant will be rejected. Layer 7 filtering,
2524 processing and switching will be possible. This is the mode which
2525 brings HAProxy most of its value.
2526
2527 health The instance will work in "health" mode. It will just reply "OK"
2528 to incoming connections and close the connection. Nothing will be
2529 logged. This mode is used to reply to external components health
2530 checks. This mode is deprecated and should not be used anymore as
2531 it is possible to do the same and even better by combining TCP or
2532 HTTP modes with the "monitor" keyword.
2533
2534 When doing content switching, it is mandatory that the frontend and the
2535 backend are in the same mode (generally HTTP), otherwise the configuration
2536 will be refused.
2537
2538 Example :
2539 defaults http_instances
2540 mode http
2541
2542 See also : "monitor", "monitor-net"
2543
Willy Tarreau0ba27502007-12-24 16:55:16 +01002544
Cyril Bontéf0c60612010-02-06 14:44:47 +01002545monitor fail { if | unless } <condition>
Willy Tarreau2769aa02007-12-27 18:26:09 +01002546 Add a condition to report a failure to a monitor HTTP request.
Willy Tarreau0ba27502007-12-24 16:55:16 +01002547 May be used in sections : defaults | frontend | listen | backend
2548 no | yes | yes | no
Willy Tarreau0ba27502007-12-24 16:55:16 +01002549 Arguments :
2550 if <cond> the monitor request will fail if the condition is satisfied,
2551 and will succeed otherwise. The condition should describe a
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01002552 combined test which must induce a failure if all conditions
Willy Tarreau0ba27502007-12-24 16:55:16 +01002553 are met, for instance a low number of servers both in a
2554 backend and its backup.
2555
2556 unless <cond> the monitor request will succeed only if the condition is
2557 satisfied, and will fail otherwise. Such a condition may be
2558 based on a test on the presence of a minimum number of active
2559 servers in a list of backends.
2560
2561 This statement adds a condition which can force the response to a monitor
2562 request to report a failure. By default, when an external component queries
2563 the URI dedicated to monitoring, a 200 response is returned. When one of the
2564 conditions above is met, haproxy will return 503 instead of 200. This is
2565 very useful to report a site failure to an external component which may base
2566 routing advertisements between multiple sites on the availability reported by
2567 haproxy. In this case, one would rely on an ACL involving the "nbsrv"
Willy Tarreau2769aa02007-12-27 18:26:09 +01002568 criterion. Note that "monitor fail" only works in HTTP mode.
Willy Tarreau0ba27502007-12-24 16:55:16 +01002569
2570 Example:
2571 frontend www
Willy Tarreau2769aa02007-12-27 18:26:09 +01002572 mode http
Willy Tarreau0ba27502007-12-24 16:55:16 +01002573 acl site_dead nbsrv(dynamic) lt 2
2574 acl site_dead nbsrv(static) lt 2
2575 monitor-uri /site_alive
2576 monitor fail if site_dead
2577
Willy Tarreau2769aa02007-12-27 18:26:09 +01002578 See also : "monitor-net", "monitor-uri"
2579
2580
2581monitor-net <source>
2582 Declare a source network which is limited to monitor requests
2583 May be used in sections : defaults | frontend | listen | backend
2584 yes | yes | yes | no
2585 Arguments :
2586 <source> is the source IPv4 address or network which will only be able to
2587 get monitor responses to any request. It can be either an IPv4
2588 address, a host name, or an address followed by a slash ('/')
2589 followed by a mask.
2590
2591 In TCP mode, any connection coming from a source matching <source> will cause
2592 the connection to be immediately closed without any log. This allows another
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01002593 equipment to probe the port and verify that it is still listening, without
Willy Tarreau2769aa02007-12-27 18:26:09 +01002594 forwarding the connection to a remote server.
2595
2596 In HTTP mode, a connection coming from a source matching <source> will be
2597 accepted, the following response will be sent without waiting for a request,
2598 then the connection will be closed : "HTTP/1.0 200 OK". This is normally
2599 enough for any front-end HTTP probe to detect that the service is UP and
2600 running without forwarding the request to a backend server.
2601
2602 Monitor requests are processed very early. It is not possible to block nor
2603 divert them using ACLs. They cannot be logged either, and it is the intended
2604 purpose. They are only used to report HAProxy's health to an upper component,
2605 nothing more. Right now, it is not possible to set failure conditions on
2606 requests caught by "monitor-net".
2607
Willy Tarreau95cd2832010-03-04 23:36:33 +01002608 Last, please note that only one "monitor-net" statement can be specified in
2609 a frontend. If more than one is found, only the last one will be considered.
2610
Willy Tarreau2769aa02007-12-27 18:26:09 +01002611 Example :
2612 # addresses .252 and .253 are just probing us.
2613 frontend www
2614 monitor-net 192.168.0.252/31
2615
2616 See also : "monitor fail", "monitor-uri"
2617
2618
2619monitor-uri <uri>
2620 Intercept a URI used by external components' monitor requests
2621 May be used in sections : defaults | frontend | listen | backend
2622 yes | yes | yes | no
2623 Arguments :
2624 <uri> is the exact URI which we want to intercept to return HAProxy's
2625 health status instead of forwarding the request.
2626
2627 When an HTTP request referencing <uri> will be received on a frontend,
2628 HAProxy will not forward it nor log it, but instead will return either
2629 "HTTP/1.0 200 OK" or "HTTP/1.0 503 Service unavailable", depending on failure
2630 conditions defined with "monitor fail". This is normally enough for any
2631 front-end HTTP probe to detect that the service is UP and running without
2632 forwarding the request to a backend server. Note that the HTTP method, the
2633 version and all headers are ignored, but the request must at least be valid
2634 at the HTTP level. This keyword may only be used with an HTTP-mode frontend.
2635
2636 Monitor requests are processed very early. It is not possible to block nor
2637 divert them using ACLs. They cannot be logged either, and it is the intended
2638 purpose. They are only used to report HAProxy's health to an upper component,
2639 nothing more. However, it is possible to add any number of conditions using
2640 "monitor fail" and ACLs so that the result can be adjusted to whatever check
2641 can be imagined (most often the number of available servers in a backend).
2642
2643 Example :
2644 # Use /haproxy_test to report haproxy's status
2645 frontend www
2646 mode http
2647 monitor-uri /haproxy_test
2648
2649 See also : "monitor fail", "monitor-net"
2650
Willy Tarreau0ba27502007-12-24 16:55:16 +01002651
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002652option abortonclose
2653no option abortonclose
2654 Enable or disable early dropping of aborted requests pending in queues.
2655 May be used in sections : defaults | frontend | listen | backend
2656 yes | no | yes | yes
2657 Arguments : none
2658
2659 In presence of very high loads, the servers will take some time to respond.
2660 The per-instance connection queue will inflate, and the response time will
2661 increase respective to the size of the queue times the average per-session
2662 response time. When clients will wait for more than a few seconds, they will
Willy Tarreau198a7442008-01-17 12:05:32 +01002663 often hit the "STOP" button on their browser, leaving a useless request in
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002664 the queue, and slowing down other users, and the servers as well, because the
2665 request will eventually be served, then aborted at the first error
2666 encountered while delivering the response.
2667
2668 As there is no way to distinguish between a full STOP and a simple output
2669 close on the client side, HTTP agents should be conservative and consider
2670 that the client might only have closed its output channel while waiting for
2671 the response. However, this introduces risks of congestion when lots of users
2672 do the same, and is completely useless nowadays because probably no client at
2673 all will close the session while waiting for the response. Some HTTP agents
Willy Tarreaud72758d2010-01-12 10:42:19 +01002674 support this behaviour (Squid, Apache, HAProxy), and others do not (TUX, most
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002675 hardware-based load balancers). So the probability for a closed input channel
Willy Tarreau198a7442008-01-17 12:05:32 +01002676 to represent a user hitting the "STOP" button is close to 100%, and the risk
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002677 of being the single component to break rare but valid traffic is extremely
2678 low, which adds to the temptation to be able to abort a session early while
2679 still not served and not pollute the servers.
2680
2681 In HAProxy, the user can choose the desired behaviour using the option
2682 "abortonclose". By default (without the option) the behaviour is HTTP
2683 compliant and aborted requests will be served. But when the option is
2684 specified, a session with an incoming channel closed will be aborted while
2685 it is still possible, either pending in the queue for a connection slot, or
2686 during the connection establishment if the server has not yet acknowledged
2687 the connection request. This considerably reduces the queue size and the load
2688 on saturated servers when users are tempted to click on STOP, which in turn
Willy Tarreaud72758d2010-01-12 10:42:19 +01002689 reduces the response time for other users.
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002690
2691 If this option has been enabled in a "defaults" section, it can be disabled
2692 in a specific instance by prepending the "no" keyword before it.
2693
2694 See also : "timeout queue" and server's "maxconn" and "maxqueue" parameters
2695
2696
Willy Tarreau4076a152009-04-02 15:18:36 +02002697option accept-invalid-http-request
2698no option accept-invalid-http-request
2699 Enable or disable relaxing of HTTP request parsing
2700 May be used in sections : defaults | frontend | listen | backend
2701 yes | yes | yes | no
2702 Arguments : none
2703
2704 By default, HAProxy complies with RFC2616 in terms of message parsing. This
2705 means that invalid characters in header names are not permitted and cause an
2706 error to be returned to the client. This is the desired behaviour as such
2707 forbidden characters are essentially used to build attacks exploiting server
2708 weaknesses, and bypass security filtering. Sometimes, a buggy browser or
2709 server will emit invalid header names for whatever reason (configuration,
2710 implementation) and the issue will not be immediately fixed. In such a case,
2711 it is possible to relax HAProxy's header name parser to accept any character
2712 even if that does not make sense, by specifying this option.
2713
2714 This option should never be enabled by default as it hides application bugs
2715 and open security breaches. It should only be deployed after a problem has
2716 been confirmed.
2717
2718 When this option is enabled, erroneous header names will still be accepted in
2719 requests, but the complete request will be captured in order to permit later
2720 analysis using the "show errors" request on the UNIX stats socket. Doing this
2721 also helps confirming that the issue has been solved.
2722
2723 If this option has been enabled in a "defaults" section, it can be disabled
2724 in a specific instance by prepending the "no" keyword before it.
2725
2726 See also : "option accept-invalid-http-response" and "show errors" on the
2727 stats socket.
2728
2729
2730option accept-invalid-http-response
2731no option accept-invalid-http-response
2732 Enable or disable relaxing of HTTP response parsing
2733 May be used in sections : defaults | frontend | listen | backend
2734 yes | no | yes | yes
2735 Arguments : none
2736
2737 By default, HAProxy complies with RFC2616 in terms of message parsing. This
2738 means that invalid characters in header names are not permitted and cause an
2739 error to be returned to the client. This is the desired behaviour as such
2740 forbidden characters are essentially used to build attacks exploiting server
2741 weaknesses, and bypass security filtering. Sometimes, a buggy browser or
2742 server will emit invalid header names for whatever reason (configuration,
2743 implementation) and the issue will not be immediately fixed. In such a case,
2744 it is possible to relax HAProxy's header name parser to accept any character
2745 even if that does not make sense, by specifying this option.
2746
2747 This option should never be enabled by default as it hides application bugs
2748 and open security breaches. It should only be deployed after a problem has
2749 been confirmed.
2750
2751 When this option is enabled, erroneous header names will still be accepted in
2752 responses, but the complete response will be captured in order to permit
2753 later analysis using the "show errors" request on the UNIX stats socket.
2754 Doing this also helps confirming that the issue has been solved.
2755
2756 If this option has been enabled in a "defaults" section, it can be disabled
2757 in a specific instance by prepending the "no" keyword before it.
2758
2759 See also : "option accept-invalid-http-request" and "show errors" on the
2760 stats socket.
2761
2762
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002763option allbackups
2764no option allbackups
2765 Use either all backup servers at a time or only the first one
2766 May be used in sections : defaults | frontend | listen | backend
2767 yes | no | yes | yes
2768 Arguments : none
2769
2770 By default, the first operational backup server gets all traffic when normal
2771 servers are all down. Sometimes, it may be preferred to use multiple backups
2772 at once, because one will not be enough. When "option allbackups" is enabled,
2773 the load balancing will be performed among all backup servers when all normal
2774 ones are unavailable. The same load balancing algorithm will be used and the
2775 servers' weights will be respected. Thus, there will not be any priority
2776 order between the backup servers anymore.
2777
2778 This option is mostly used with static server farms dedicated to return a
2779 "sorry" page when an application is completely offline.
2780
2781 If this option has been enabled in a "defaults" section, it can be disabled
2782 in a specific instance by prepending the "no" keyword before it.
2783
2784
2785option checkcache
2786no option checkcache
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01002787 Analyze all server responses and block requests with cacheable cookies
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002788 May be used in sections : defaults | frontend | listen | backend
2789 yes | no | yes | yes
2790 Arguments : none
2791
2792 Some high-level frameworks set application cookies everywhere and do not
2793 always let enough control to the developer to manage how the responses should
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01002794 be cached. When a session cookie is returned on a cacheable object, there is a
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002795 high risk of session crossing or stealing between users traversing the same
2796 caches. In some situations, it is better to block the response than to let
2797 some sensible session information go in the wild.
2798
2799 The option "checkcache" enables deep inspection of all server responses for
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01002800 strict compliance with HTTP specification in terms of cacheability. It
Willy Tarreau198a7442008-01-17 12:05:32 +01002801 carefully checks "Cache-control", "Pragma" and "Set-cookie" headers in server
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002802 response to check if there's a risk of caching a cookie on a client-side
2803 proxy. When this option is enabled, the only responses which can be delivered
Willy Tarreau198a7442008-01-17 12:05:32 +01002804 to the client are :
2805 - all those without "Set-Cookie" header ;
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002806 - all those with a return code other than 200, 203, 206, 300, 301, 410,
Willy Tarreau198a7442008-01-17 12:05:32 +01002807 provided that the server has not set a "Cache-control: public" header ;
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002808 - all those that come from a POST request, provided that the server has not
2809 set a 'Cache-Control: public' header ;
2810 - those with a 'Pragma: no-cache' header
2811 - those with a 'Cache-control: private' header
2812 - those with a 'Cache-control: no-store' header
2813 - those with a 'Cache-control: max-age=0' header
2814 - those with a 'Cache-control: s-maxage=0' header
2815 - those with a 'Cache-control: no-cache' header
2816 - those with a 'Cache-control: no-cache="set-cookie"' header
2817 - those with a 'Cache-control: no-cache="set-cookie,' header
2818 (allowing other fields after set-cookie)
2819
2820 If a response doesn't respect these requirements, then it will be blocked
Willy Tarreau198a7442008-01-17 12:05:32 +01002821 just as if it was from an "rspdeny" filter, with an "HTTP 502 bad gateway".
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002822 The session state shows "PH--" meaning that the proxy blocked the response
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01002823 during headers processing. Additionally, an alert will be sent in the logs so
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002824 that admins are informed that there's something to be fixed.
2825
2826 Due to the high impact on the application, the application should be tested
2827 in depth with the option enabled before going to production. It is also a
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01002828 good practice to always activate it during tests, even if it is not used in
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002829 production, as it will report potentially dangerous application behaviours.
2830
2831 If this option has been enabled in a "defaults" section, it can be disabled
2832 in a specific instance by prepending the "no" keyword before it.
2833
2834
2835option clitcpka
2836no option clitcpka
2837 Enable or disable the sending of TCP keepalive packets on the client side
2838 May be used in sections : defaults | frontend | listen | backend
2839 yes | yes | yes | no
2840 Arguments : none
2841
2842 When there is a firewall or any session-aware component between a client and
2843 a server, and when the protocol involves very long sessions with long idle
2844 periods (eg: remote desktops), there is a risk that one of the intermediate
2845 components decides to expire a session which has remained idle for too long.
2846
2847 Enabling socket-level TCP keep-alives makes the system regularly send packets
2848 to the other end of the connection, leaving it active. The delay between
2849 keep-alive probes is controlled by the system only and depends both on the
2850 operating system and its tuning parameters.
2851
2852 It is important to understand that keep-alive packets are neither emitted nor
2853 received at the application level. It is only the network stacks which sees
2854 them. For this reason, even if one side of the proxy already uses keep-alives
2855 to maintain its connection alive, those keep-alive packets will not be
2856 forwarded to the other side of the proxy.
2857
2858 Please note that this has nothing to do with HTTP keep-alive.
2859
2860 Using option "clitcpka" enables the emission of TCP keep-alive probes on the
2861 client side of a connection, which should help when session expirations are
2862 noticed between HAProxy and a client.
2863
2864 If this option has been enabled in a "defaults" section, it can be disabled
2865 in a specific instance by prepending the "no" keyword before it.
2866
2867 See also : "option srvtcpka", "option tcpka"
2868
2869
Willy Tarreau0ba27502007-12-24 16:55:16 +01002870option contstats
2871 Enable continuous traffic statistics updates
2872 May be used in sections : defaults | frontend | listen | backend
2873 yes | yes | yes | no
2874 Arguments : none
2875
2876 By default, counters used for statistics calculation are incremented
2877 only when a session finishes. It works quite well when serving small
2878 objects, but with big ones (for example large images or archives) or
2879 with A/V streaming, a graph generated from haproxy counters looks like
2880 a hedgehog. With this option enabled counters get incremented continuously,
2881 during a whole session. Recounting touches a hotpath directly so
2882 it is not enabled by default, as it has small performance impact (~0.5%).
2883
2884
Willy Tarreauc9bd0cc2009-05-10 11:57:02 +02002885option dontlog-normal
2886no option dontlog-normal
2887 Enable or disable logging of normal, successful connections
2888 May be used in sections : defaults | frontend | listen | backend
2889 yes | yes | yes | no
2890 Arguments : none
2891
2892 There are large sites dealing with several thousand connections per second
2893 and for which logging is a major pain. Some of them are even forced to turn
2894 logs off and cannot debug production issues. Setting this option ensures that
2895 normal connections, those which experience no error, no timeout, no retry nor
2896 redispatch, will not be logged. This leaves disk space for anomalies. In HTTP
2897 mode, the response status code is checked and return codes 5xx will still be
2898 logged.
2899
2900 It is strongly discouraged to use this option as most of the time, the key to
2901 complex issues is in the normal logs which will not be logged here. If you
2902 need to separate logs, see the "log-separate-errors" option instead.
2903
Willy Tarreauc57f0e22009-05-10 13:12:33 +02002904 See also : "log", "dontlognull", "log-separate-errors" and section 8 about
Willy Tarreauc9bd0cc2009-05-10 11:57:02 +02002905 logging.
2906
2907
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002908option dontlognull
2909no option dontlognull
2910 Enable or disable logging of null connections
2911 May be used in sections : defaults | frontend | listen | backend
2912 yes | yes | yes | no
2913 Arguments : none
2914
2915 In certain environments, there are components which will regularly connect to
2916 various systems to ensure that they are still alive. It can be the case from
2917 another load balancer as well as from monitoring systems. By default, even a
2918 simple port probe or scan will produce a log. If those connections pollute
2919 the logs too much, it is possible to enable option "dontlognull" to indicate
2920 that a connection on which no data has been transferred will not be logged,
2921 which typically corresponds to those probes.
2922
2923 It is generally recommended not to use this option in uncontrolled
2924 environments (eg: internet), otherwise scans and other malicious activities
2925 would not be logged.
2926
2927 If this option has been enabled in a "defaults" section, it can be disabled
2928 in a specific instance by prepending the "no" keyword before it.
2929
Willy Tarreauc57f0e22009-05-10 13:12:33 +02002930 See also : "log", "monitor-net", "monitor-uri" and section 8 about logging.
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002931
2932
2933option forceclose
2934no option forceclose
2935 Enable or disable active connection closing after response is transferred.
2936 May be used in sections : defaults | frontend | listen | backend
Willy Tarreaua31e5df2009-12-30 01:10:35 +01002937 yes | yes | yes | yes
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002938 Arguments : none
2939
2940 Some HTTP servers do not necessarily close the connections when they receive
2941 the "Connection: close" set by "option httpclose", and if the client does not
2942 close either, then the connection remains open till the timeout expires. This
2943 causes high number of simultaneous connections on the servers and shows high
2944 global session times in the logs.
2945
2946 When this happens, it is possible to use "option forceclose". It will
Willy Tarreau82eeaf22009-12-29 12:09:05 +01002947 actively close the outgoing server channel as soon as the server has finished
Willy Tarreau0dfdf192010-01-05 11:33:11 +01002948 to respond. This option implicitly enables the "httpclose" option. Note that
2949 this option also enables the parsing of the full request and response, which
2950 means we can close the connection to the server very quickly, releasing some
2951 resources earlier than with httpclose.
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002952
Willy Tarreau8a8e1d92010-04-05 16:15:16 +02002953 This option may also be combined with "option http-pretend-keepalive", which
2954 will disable sending of the "Connection: close" header, but will still cause
2955 the connection to be closed once the whole response is received.
2956
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002957 If this option has been enabled in a "defaults" section, it can be disabled
2958 in a specific instance by prepending the "no" keyword before it.
2959
Willy Tarreau8a8e1d92010-04-05 16:15:16 +02002960 See also : "option httpclose" and "option http-pretend-keepalive"
Willy Tarreaubf1f8162007-12-28 17:42:56 +01002961
2962
Ross Westaf72a1d2008-08-03 10:51:45 +02002963option forwardfor [ except <network> ] [ header <name> ]
Willy Tarreauc27debf2008-01-06 08:57:02 +01002964 Enable insertion of the X-Forwarded-For header to requests sent to servers
2965 May be used in sections : defaults | frontend | listen | backend
2966 yes | yes | yes | yes
2967 Arguments :
2968 <network> is an optional argument used to disable this option for sources
2969 matching <network>
Ross Westaf72a1d2008-08-03 10:51:45 +02002970 <name> an optional argument to specify a different "X-Forwarded-For"
Willy Tarreaud72758d2010-01-12 10:42:19 +01002971 header name.
Willy Tarreauc27debf2008-01-06 08:57:02 +01002972
2973 Since HAProxy works in reverse-proxy mode, the servers see its IP address as
2974 their client address. This is sometimes annoying when the client's IP address
2975 is expected in server logs. To solve this problem, the well-known HTTP header
2976 "X-Forwarded-For" may be added by HAProxy to all requests sent to the server.
2977 This header contains a value representing the client's IP address. Since this
2978 header is always appended at the end of the existing header list, the server
2979 must be configured to always use the last occurrence of this header only. See
Ross Westaf72a1d2008-08-03 10:51:45 +02002980 the server's manual to find how to enable use of this standard header. Note
2981 that only the last occurrence of the header must be used, since it is really
2982 possible that the client has already brought one.
2983
Willy Tarreaud72758d2010-01-12 10:42:19 +01002984 The keyword "header" may be used to supply a different header name to replace
Ross Westaf72a1d2008-08-03 10:51:45 +02002985 the default "X-Forwarded-For". This can be useful where you might already
Willy Tarreaud72758d2010-01-12 10:42:19 +01002986 have a "X-Forwarded-For" header from a different application (eg: stunnel),
2987 and you need preserve it. Also if your backend server doesn't use the
Ross Westaf72a1d2008-08-03 10:51:45 +02002988 "X-Forwarded-For" header and requires different one (eg: Zeus Web Servers
2989 require "X-Cluster-Client-IP").
Willy Tarreauc27debf2008-01-06 08:57:02 +01002990
2991 Sometimes, a same HAProxy instance may be shared between a direct client
2992 access and a reverse-proxy access (for instance when an SSL reverse-proxy is
2993 used to decrypt HTTPS traffic). It is possible to disable the addition of the
2994 header for a known source address or network by adding the "except" keyword
2995 followed by the network address. In this case, any source IP matching the
2996 network will not cause an addition of this header. Most common uses are with
2997 private networks or 127.0.0.1.
2998
2999 This option may be specified either in the frontend or in the backend. If at
Ross Westaf72a1d2008-08-03 10:51:45 +02003000 least one of them uses it, the header will be added. Note that the backend's
3001 setting of the header subargument takes precedence over the frontend's if
3002 both are defined.
Willy Tarreauc27debf2008-01-06 08:57:02 +01003003
3004 It is important to note that as long as HAProxy does not support keep-alive
3005 connections, only the first request of a connection will receive the header.
3006 For this reason, it is important to ensure that "option httpclose" is set
3007 when using this option.
3008
Ross Westaf72a1d2008-08-03 10:51:45 +02003009 Examples :
Willy Tarreauc27debf2008-01-06 08:57:02 +01003010 # Public HTTP address also used by stunnel on the same machine
3011 frontend www
3012 mode http
3013 option forwardfor except 127.0.0.1 # stunnel already adds the header
3014
Ross Westaf72a1d2008-08-03 10:51:45 +02003015 # Those servers want the IP Address in X-Client
3016 backend www
3017 mode http
3018 option forwardfor header X-Client
3019
Willy Tarreauc27debf2008-01-06 08:57:02 +01003020 See also : "option httpclose"
3021
Willy Tarreau8a8e1d92010-04-05 16:15:16 +02003022
3023option http-pretend-keepalive
3024no option http-pretend-keepalive
3025 Define whether haproxy will announce keepalive to the server or not
3026 May be used in sections : defaults | frontend | listen | backend
3027 yes | yes | yes | yes
3028 Arguments : none
3029
3030 When running with "option http-server-close" or "option forceclose", haproxy
3031 adds a "Connection: close" header to the request forwarded to the server.
3032 Unfortunately, when some servers see this header, they automatically refrain
3033 from using the chunked encoding for responses of unknown length, while this
3034 is totally unrelated. The immediate effect is that this prevents haproxy from
3035 maintaining the client connection alive. A second effect is that a client or
3036 a cache could receive an incomplete response without being aware of it, and
3037 consider the response complete.
3038
3039 By setting "option http-pretend-keepalive", haproxy will make the server
3040 believe it will keep the connection alive. The server will then not fall back
3041 to the abnormal undesired above. When haproxy gets the whole response, it
3042 will close the connection with the server just as it would do with the
3043 "forceclose" option. That way the client gets a normal response and the
3044 connection is correctly closed on the server side.
3045
3046 It is recommended not to enable this option by default, because most servers
3047 will more efficiently close the connection themselves after the last packet,
3048 and release its buffers slightly earlier. Also, the added packet on the
3049 network could slightly reduce the overall peak performance. However it is
3050 worth noting that when this option is enabled, haproxy will have slightly
3051 less work to do. So if haproxy is the bottleneck on the whole architecture,
3052 enabling this option might save a few CPU cycles.
3053
3054 This option may be set both in a frontend and in a backend. It is enabled if
3055 at least one of the frontend or backend holding a connection has it enabled.
Willy Tarreau22a95342010-09-29 14:31:41 +02003056 This option may be compbined with "option httpclose", which will cause
3057 keepalive to be announced to the server and close to be announced to the
3058 client. This practice is discouraged though.
Willy Tarreau8a8e1d92010-04-05 16:15:16 +02003059
3060 If this option has been enabled in a "defaults" section, it can be disabled
3061 in a specific instance by prepending the "no" keyword before it.
3062
3063 See also : "option forceclose" and "option http-server-close"
3064
Willy Tarreauc27debf2008-01-06 08:57:02 +01003065
Willy Tarreaub608feb2010-01-02 22:47:18 +01003066option http-server-close
3067no option http-server-close
3068 Enable or disable HTTP connection closing on the server side
3069 May be used in sections : defaults | frontend | listen | backend
3070 yes | yes | yes | yes
3071 Arguments : none
3072
Patrick Mezard9ec2ec42010-06-12 17:02:45 +02003073 By default, when a client communicates with a server, HAProxy will only
3074 analyze, log, and process the first request of each connection. Setting
3075 "option http-server-close" enables HTTP connection-close mode on the server
3076 side while keeping the ability to support HTTP keep-alive and pipelining on
3077 the client side. This provides the lowest latency on the client side (slow
3078 network) and the fastest session reuse on the server side to save server
3079 resources, similarly to "option forceclose". It also permits non-keepalive
3080 capable servers to be served in keep-alive mode to the clients if they
3081 conform to the requirements of RFC2616. Please note that some servers do not
3082 always conform to those requirements when they see "Connection: close" in the
3083 request. The effect will be that keep-alive will never be used. A workaround
3084 consists in enabling "option http-pretend-keepalive".
Willy Tarreaub608feb2010-01-02 22:47:18 +01003085
3086 At the moment, logs will not indicate whether requests came from the same
3087 session or not. The accept date reported in the logs corresponds to the end
3088 of the previous request, and the request time corresponds to the time spent
3089 waiting for a new request. The keep-alive request time is still bound to the
Willy Tarreaub16a5742010-01-10 14:46:16 +01003090 timeout defined by "timeout http-keep-alive" or "timeout http-request" if
3091 not set.
Willy Tarreaub608feb2010-01-02 22:47:18 +01003092
3093 This option may be set both in a frontend and in a backend. It is enabled if
3094 at least one of the frontend or backend holding a connection has it enabled.
Willy Tarreau0dfdf192010-01-05 11:33:11 +01003095 It is worth noting that "option forceclose" has precedence over "option
3096 http-server-close" and that combining "http-server-close" with "httpclose"
3097 basically achieve the same result as "forceclose".
Willy Tarreaub608feb2010-01-02 22:47:18 +01003098
3099 If this option has been enabled in a "defaults" section, it can be disabled
3100 in a specific instance by prepending the "no" keyword before it.
3101
Patrick Mezard9ec2ec42010-06-12 17:02:45 +02003102 See also : "option forceclose", "option http-pretend-keepalive",
3103 "option httpclose" and "1.1. The HTTP transaction model".
Willy Tarreaub608feb2010-01-02 22:47:18 +01003104
3105
Willy Tarreau88d349d2010-01-25 12:15:43 +01003106option http-use-proxy-header
Cyril Bontéf0c60612010-02-06 14:44:47 +01003107no option http-use-proxy-header
Willy Tarreau88d349d2010-01-25 12:15:43 +01003108 Make use of non-standard Proxy-Connection header instead of Connection
3109 May be used in sections : defaults | frontend | listen | backend
3110 yes | yes | yes | no
3111 Arguments : none
3112
3113 While RFC2616 explicitly states that HTTP/1.1 agents must use the
3114 Connection header to indicate their wish of persistent or non-persistent
3115 connections, both browsers and proxies ignore this header for proxied
3116 connections and make use of the undocumented, non-standard Proxy-Connection
3117 header instead. The issue begins when trying to put a load balancer between
3118 browsers and such proxies, because there will be a difference between what
3119 haproxy understands and what the client and the proxy agree on.
3120
3121 By setting this option in a frontend, haproxy can automatically switch to use
3122 that non-standard header if it sees proxied requests. A proxied request is
3123 defined here as one where the URI begins with neither a '/' nor a '*'. The
3124 choice of header only affects requests passing through proxies making use of
3125 one of the "httpclose", "forceclose" and "http-server-close" options. Note
3126 that this option can only be specified in a frontend and will affect the
3127 request along its whole life.
3128
Willy Tarreau844a7e72010-01-31 21:46:18 +01003129 Also, when this option is set, a request which requires authentication will
3130 automatically switch to use proxy authentication headers if it is itself a
3131 proxied request. That makes it possible to check or enforce authentication in
3132 front of an existing proxy.
3133
Willy Tarreau88d349d2010-01-25 12:15:43 +01003134 This option should normally never be used, except in front of a proxy.
3135
3136 See also : "option httpclose", "option forceclose" and "option
3137 http-server-close".
3138
3139
Willy Tarreaud63335a2010-02-26 12:56:52 +01003140option httpchk
3141option httpchk <uri>
3142option httpchk <method> <uri>
3143option httpchk <method> <uri> <version>
3144 Enable HTTP protocol to check on the servers health
3145 May be used in sections : defaults | frontend | listen | backend
3146 yes | no | yes | yes
3147 Arguments :
3148 <method> is the optional HTTP method used with the requests. When not set,
3149 the "OPTIONS" method is used, as it generally requires low server
3150 processing and is easy to filter out from the logs. Any method
3151 may be used, though it is not recommended to invent non-standard
3152 ones.
3153
3154 <uri> is the URI referenced in the HTTP requests. It defaults to " / "
3155 which is accessible by default on almost any server, but may be
3156 changed to any other URI. Query strings are permitted.
3157
3158 <version> is the optional HTTP version string. It defaults to "HTTP/1.0"
3159 but some servers might behave incorrectly in HTTP 1.0, so turning
3160 it to HTTP/1.1 may sometimes help. Note that the Host field is
3161 mandatory in HTTP/1.1, and as a trick, it is possible to pass it
3162 after "\r\n" following the version string.
3163
3164 By default, server health checks only consist in trying to establish a TCP
3165 connection. When "option httpchk" is specified, a complete HTTP request is
3166 sent once the TCP connection is established, and responses 2xx and 3xx are
3167 considered valid, while all other ones indicate a server failure, including
3168 the lack of any response.
3169
3170 The port and interval are specified in the server configuration.
3171
3172 This option does not necessarily require an HTTP backend, it also works with
3173 plain TCP backends. This is particularly useful to check simple scripts bound
3174 to some dedicated ports using the inetd daemon.
3175
3176 Examples :
3177 # Relay HTTPS traffic to Apache instance and check service availability
3178 # using HTTP request "OPTIONS * HTTP/1.1" on port 80.
3179 backend https_relay
3180 mode tcp
3181 option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
3182 server apache1 192.168.1.1:443 check port 80
3183
3184 See also : "option ssl-hello-chk", "option smtpchk", "option mysql-check",
3185 "http-check" and the "check", "port" and "inter" server options.
3186
3187
Willy Tarreauc27debf2008-01-06 08:57:02 +01003188option httpclose
3189no option httpclose
3190 Enable or disable passive HTTP connection closing
3191 May be used in sections : defaults | frontend | listen | backend
3192 yes | yes | yes | yes
3193 Arguments : none
3194
Patrick Mezard9ec2ec42010-06-12 17:02:45 +02003195 By default, when a client communicates with a server, HAProxy will only
3196 analyze, log, and process the first request of each connection. If "option
3197 httpclose" is set, it will check if a "Connection: close" header is already
3198 set in each direction, and will add one if missing. Each end should react to
3199 this by actively closing the TCP connection after each transfer, thus
3200 resulting in a switch to the HTTP close mode. Any "Connection" header
3201 different from "close" will also be removed.
Willy Tarreauc27debf2008-01-06 08:57:02 +01003202
3203 It seldom happens that some servers incorrectly ignore this header and do not
Willy Tarreau0dfdf192010-01-05 11:33:11 +01003204 close the connection eventhough they reply "Connection: close". For this
3205 reason, they are not compatible with older HTTP 1.0 browsers. If this happens
3206 it is possible to use the "option forceclose" which actively closes the
3207 request connection once the server responds. Option "forceclose" also
3208 releases the server connection earlier because it does not have to wait for
3209 the client to acknowledge it.
Willy Tarreauc27debf2008-01-06 08:57:02 +01003210
3211 This option may be set both in a frontend and in a backend. It is enabled if
3212 at least one of the frontend or backend holding a connection has it enabled.
3213 If "option forceclose" is specified too, it has precedence over "httpclose".
Willy Tarreau0dfdf192010-01-05 11:33:11 +01003214 If "option http-server-close" is enabled at the same time as "httpclose", it
3215 basically achieves the same result as "option forceclose".
Willy Tarreauc27debf2008-01-06 08:57:02 +01003216
3217 If this option has been enabled in a "defaults" section, it can be disabled
3218 in a specific instance by prepending the "no" keyword before it.
3219
Patrick Mezard9ec2ec42010-06-12 17:02:45 +02003220 See also : "option forceclose", "option http-server-close" and
3221 "1.1. The HTTP transaction model".
Willy Tarreauc27debf2008-01-06 08:57:02 +01003222
3223
Emeric Brun3a058f32009-06-30 18:26:00 +02003224option httplog [ clf ]
Willy Tarreauc27debf2008-01-06 08:57:02 +01003225 Enable logging of HTTP request, session state and timers
3226 May be used in sections : defaults | frontend | listen | backend
3227 yes | yes | yes | yes
Emeric Brun3a058f32009-06-30 18:26:00 +02003228 Arguments :
3229 clf if the "clf" argument is added, then the output format will be
3230 the CLF format instead of HAProxy's default HTTP format. You can
3231 use this when you need to feed HAProxy's logs through a specific
3232 log analyser which only support the CLF format and which is not
3233 extensible.
Willy Tarreauc27debf2008-01-06 08:57:02 +01003234
3235 By default, the log output format is very poor, as it only contains the
3236 source and destination addresses, and the instance name. By specifying
3237 "option httplog", each log line turns into a much richer format including,
3238 but not limited to, the HTTP request, the connection timers, the session
3239 status, the connections numbers, the captured headers and cookies, the
3240 frontend, backend and server name, and of course the source address and
3241 ports.
3242
3243 This option may be set either in the frontend or the backend.
3244
Emeric Brun3a058f32009-06-30 18:26:00 +02003245 If this option has been enabled in a "defaults" section, it can be disabled
3246 in a specific instance by prepending the "no" keyword before it. Specifying
3247 only "option httplog" will automatically clear the 'clf' mode if it was set
3248 by default.
3249
Willy Tarreauc57f0e22009-05-10 13:12:33 +02003250 See also : section 8 about logging.
Willy Tarreauc27debf2008-01-06 08:57:02 +01003251
Willy Tarreau55165fe2009-05-10 12:02:55 +02003252
3253option http_proxy
3254no option http_proxy
3255 Enable or disable plain HTTP proxy mode
3256 May be used in sections : defaults | frontend | listen | backend
3257 yes | yes | yes | yes
3258 Arguments : none
3259
3260 It sometimes happens that people need a pure HTTP proxy which understands
3261 basic proxy requests without caching nor any fancy feature. In this case,
3262 it may be worth setting up an HAProxy instance with the "option http_proxy"
3263 set. In this mode, no server is declared, and the connection is forwarded to
3264 the IP address and port found in the URL after the "http://" scheme.
3265
3266 No host address resolution is performed, so this only works when pure IP
3267 addresses are passed. Since this option's usage perimeter is rather limited,
3268 it will probably be used only by experts who know they need exactly it. Last,
3269 if the clients are susceptible of sending keep-alive requests, it will be
3270 needed to add "option http_close" to ensure that all requests will correctly
3271 be analyzed.
3272
3273 If this option has been enabled in a "defaults" section, it can be disabled
3274 in a specific instance by prepending the "no" keyword before it.
3275
3276 Example :
3277 # this backend understands HTTP proxy requests and forwards them directly.
3278 backend direct_forward
3279 option httpclose
3280 option http_proxy
3281
3282 See also : "option httpclose"
3283
Willy Tarreau211ad242009-10-03 21:45:07 +02003284
Cyril Bontéa8e7bbc2010-04-25 22:29:29 +02003285option ignore-persist { if | unless } <condition>
3286 Declare a condition to ignore persistence
3287 May be used in sections: defaults | frontend | listen | backend
3288 no | yes | yes | yes
3289
3290 By default, when cookie persistence is enabled, every requests containing
3291 the cookie are unconditionally persistent (assuming the target server is up
3292 and running).
3293
3294 The "ignore-persist" statement allows one to declare various ACL-based
3295 conditions which, when met, will cause a request to ignore persistence.
3296 This is sometimes useful to load balance requests for static files, which
3297 oftenly don't require persistence. This can also be used to fully disable
3298 persistence for a specific User-Agent (for example, some web crawler bots).
3299
3300 Combined with "appsession", it can also help reduce HAProxy memory usage, as
3301 the appsession table won't grow if persistence is ignored.
3302
3303 The persistence is ignored when an "if" condition is met, or unless an
3304 "unless" condition is met.
3305
3306 See also : "option force-persist", "cookie", and section 7 about ACL usage.
3307
3308
Willy Tarreauf27b5ea2009-10-03 22:01:18 +02003309option independant-streams
3310no option independant-streams
3311 Enable or disable independant timeout processing for both directions
3312 May be used in sections : defaults | frontend | listen | backend
3313 yes | yes | yes | yes
3314 Arguments : none
3315
3316 By default, when data is sent over a socket, both the write timeout and the
3317 read timeout for that socket are refreshed, because we consider that there is
3318 activity on that socket, and we have no other means of guessing if we should
3319 receive data or not.
3320
3321 While this default behaviour is desirable for almost all applications, there
3322 exists a situation where it is desirable to disable it, and only refresh the
3323 read timeout if there are incoming data. This happens on sessions with large
3324 timeouts and low amounts of exchanged data such as telnet session. If the
3325 server suddenly disappears, the output data accumulates in the system's
3326 socket buffers, both timeouts are correctly refreshed, and there is no way
3327 to know the server does not receive them, so we don't timeout. However, when
3328 the underlying protocol always echoes sent data, it would be enough by itself
3329 to detect the issue using the read timeout. Note that this problem does not
3330 happen with more verbose protocols because data won't accumulate long in the
3331 socket buffers.
3332
3333 When this option is set on the frontend, it will disable read timeout updates
3334 on data sent to the client. There probably is little use of this case. When
3335 the option is set on the backend, it will disable read timeout updates on
3336 data sent to the server. Doing so will typically break large HTTP posts from
3337 slow lines, so use it with caution.
3338
3339 See also : "timeout client" and "timeout server"
3340
3341
Gabor Lekenyb4c81e42010-09-29 18:17:05 +02003342option ldap-check
3343 Use LDAPv3 health checks for server testing
3344 May be used in sections : defaults | frontend | listen | backend
3345 yes | no | yes | yes
3346 Arguments : none
3347
3348 It is possible to test that the server correctly talks LDAPv3 instead of just
3349 testing that it accepts the TCP connection. When this option is set, an
3350 LDAPv3 anonymous simple bind message is sent to the server, and the response
3351 is analyzed to find an LDAPv3 bind response message.
3352
3353 The server is considered valid only when the LDAP response contains success
3354 resultCode (http://tools.ietf.org/html/rfc4511#section-4.1.9).
3355
3356 Logging of bind requests is server dependent see your documentation how to
3357 configure it.
3358
3359 Example :
3360 option ldap-check
3361
3362 See also : "option httpchk"
3363
3364
Willy Tarreau211ad242009-10-03 21:45:07 +02003365option log-health-checks
3366no option log-health-checks
3367 Enable or disable logging of health checks
3368 May be used in sections : defaults | frontend | listen | backend
3369 yes | no | yes | yes
3370 Arguments : none
3371
3372 Enable health checks logging so it possible to check for example what
3373 was happening before a server crash. Failed health check are logged if
3374 server is UP and succeeded health checks if server is DOWN, so the amount
3375 of additional information is limited.
3376
3377 If health check logging is enabled no health check status is printed
3378 when servers is set up UP/DOWN/ENABLED/DISABLED.
3379
3380 See also: "log" and section 8 about logging.
3381
Willy Tarreauc9bd0cc2009-05-10 11:57:02 +02003382
3383option log-separate-errors
3384no option log-separate-errors
3385 Change log level for non-completely successful connections
3386 May be used in sections : defaults | frontend | listen | backend
3387 yes | yes | yes | no
3388 Arguments : none
3389
3390 Sometimes looking for errors in logs is not easy. This option makes haproxy
3391 raise the level of logs containing potentially interesting information such
3392 as errors, timeouts, retries, redispatches, or HTTP status codes 5xx. The
3393 level changes from "info" to "err". This makes it possible to log them
3394 separately to a different file with most syslog daemons. Be careful not to
3395 remove them from the original file, otherwise you would lose ordering which
3396 provides very important information.
3397
3398 Using this option, large sites dealing with several thousand connections per
3399 second may log normal traffic to a rotating buffer and only archive smaller
3400 error logs.
3401
Willy Tarreauc57f0e22009-05-10 13:12:33 +02003402 See also : "log", "dontlognull", "dontlog-normal" and section 8 about
Willy Tarreauc9bd0cc2009-05-10 11:57:02 +02003403 logging.
3404
Willy Tarreauc27debf2008-01-06 08:57:02 +01003405
3406option logasap
3407no option logasap
3408 Enable or disable early logging of HTTP requests
3409 May be used in sections : defaults | frontend | listen | backend
3410 yes | yes | yes | no
3411 Arguments : none
3412
3413 By default, HTTP requests are logged upon termination so that the total
3414 transfer time and the number of bytes appear in the logs. When large objects
3415 are being transferred, it may take a while before the request appears in the
3416 logs. Using "option logasap", the request gets logged as soon as the server
3417 sends the complete headers. The only missing information in the logs will be
3418 the total number of bytes which will indicate everything except the amount
3419 of data transferred, and the total time which will not take the transfer
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01003420 time into account. In such a situation, it's a good practice to capture the
Willy Tarreauc27debf2008-01-06 08:57:02 +01003421 "Content-Length" response header so that the logs at least indicate how many
3422 bytes are expected to be transferred.
3423
Willy Tarreaucc6c8912009-02-22 10:53:55 +01003424 Examples :
3425 listen http_proxy 0.0.0.0:80
3426 mode http
3427 option httplog
3428 option logasap
3429 log 192.168.2.200 local3
3430
3431 >>> Feb 6 12:14:14 localhost \
3432 haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in \
3433 static/srv1 9/10/7/14/+30 200 +243 - - ---- 3/1/1/1/0 1/0 \
3434 "GET /image.iso HTTP/1.0"
3435
Willy Tarreauc57f0e22009-05-10 13:12:33 +02003436 See also : "option httplog", "capture response header", and section 8 about
Willy Tarreauc27debf2008-01-06 08:57:02 +01003437 logging.
3438
3439
Hervé COMMOWICK8776f1b2010-10-18 15:58:36 +02003440option mysql-check [ user <username> ]
3441 Use MySQL health checks for server testing
Hervé COMMOWICK698ae002010-01-12 09:25:13 +01003442 May be used in sections : defaults | frontend | listen | backend
3443 yes | no | yes | yes
Hervé COMMOWICK8776f1b2010-10-18 15:58:36 +02003444 Arguments :
3445 user <username> This is the username which will be used when connecting
3446 to MySQL server.
3447
3448 If you specify a username, the check consists of sending two MySQL packet,
3449 one Client Authentication packet, and one QUIT packet, to correctly close
3450 MySQL session. We then parse the MySQL Handshake Initialisation packet and/or
3451 Error packet. It is a basic but useful test which does not produce error nor
3452 aborted connect on the server. However, it requires adding an authorization
3453 in the MySQL table, like this :
3454
3455 USE mysql;
3456 INSERT INTO user (Host,User) values ('<ip_of_haproxy>','<username>');
3457 FLUSH PRIVILEGES;
3458
3459 If you don't specify a username (it is deprecated and not recommended), the
3460 check only consists in parsing the Mysql Handshake Initialisation packet or
3461 Error packet, we don't send anything in this mode. It was reported that it
3462 can generate lockout if check is too frequent and/or if there is not enough
3463 traffic. In fact, you need in this case to check MySQL "max_connect_errors"
3464 value as if a connection is established successfully within fewer than MySQL
3465 "max_connect_errors" attempts after a previous connection was interrupted,
3466 the error count for the host is cleared to zero. If HAProxy's server get
3467 blocked, the "FLUSH HOSTS" statement is the only way to unblock it.
3468
3469 Remember that this does not check database presence nor database consistency.
3470 To do this, you can use an external check with xinetd for example.
Hervé COMMOWICK698ae002010-01-12 09:25:13 +01003471
Hervé COMMOWICK8776f1b2010-10-18 15:58:36 +02003472 The check requires MySQL >=4.0, for older version, please use TCP check.
Hervé COMMOWICK698ae002010-01-12 09:25:13 +01003473
3474 Most often, an incoming MySQL server needs to see the client's IP address for
3475 various purposes, including IP privilege matching and connection logging.
3476 When possible, it is often wise to masquerade the client's IP address when
3477 connecting to the server using the "usesrc" argument of the "source" keyword,
3478 which requires the cttproxy feature to be compiled in, and the MySQL server
3479 to route the client via the machine hosting haproxy.
3480
3481 See also: "option httpchk"
3482
3483
Willy Tarreaua453bdd2008-01-08 19:50:52 +01003484option nolinger
3485no option nolinger
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01003486 Enable or disable immediate session resource cleaning after close
Willy Tarreaua453bdd2008-01-08 19:50:52 +01003487 May be used in sections: defaults | frontend | listen | backend
3488 yes | yes | yes | yes
Willy Tarreaueabeafa2008-01-16 16:17:06 +01003489 Arguments : none
Willy Tarreaua453bdd2008-01-08 19:50:52 +01003490
3491 When clients or servers abort connections in a dirty way (eg: they are
3492 physically disconnected), the session timeouts triggers and the session is
3493 closed. But it will remain in FIN_WAIT1 state for some time in the system,
3494 using some resources and possibly limiting the ability to establish newer
3495 connections.
3496
3497 When this happens, it is possible to activate "option nolinger" which forces
3498 the system to immediately remove any socket's pending data on close. Thus,
3499 the session is instantly purged from the system's tables. This usually has
3500 side effects such as increased number of TCP resets due to old retransmits
3501 getting immediately rejected. Some firewalls may sometimes complain about
3502 this too.
3503
3504 For this reason, it is not recommended to use this option when not absolutely
3505 needed. You know that you need it when you have thousands of FIN_WAIT1
3506 sessions on your system (TIME_WAIT ones do not count).
3507
3508 This option may be used both on frontends and backends, depending on the side
3509 where it is required. Use it on the frontend for clients, and on the backend
3510 for servers.
3511
3512 If this option has been enabled in a "defaults" section, it can be disabled
3513 in a specific instance by prepending the "no" keyword before it.
3514
3515
Willy Tarreau55165fe2009-05-10 12:02:55 +02003516option originalto [ except <network> ] [ header <name> ]
3517 Enable insertion of the X-Original-To header to requests sent to servers
3518 May be used in sections : defaults | frontend | listen | backend
3519 yes | yes | yes | yes
3520 Arguments :
3521 <network> is an optional argument used to disable this option for sources
3522 matching <network>
3523 <name> an optional argument to specify a different "X-Original-To"
3524 header name.
3525
3526 Since HAProxy can work in transparent mode, every request from a client can
3527 be redirected to the proxy and HAProxy itself can proxy every request to a
3528 complex SQUID environment and the destination host from SO_ORIGINAL_DST will
3529 be lost. This is annoying when you want access rules based on destination ip
3530 addresses. To solve this problem, a new HTTP header "X-Original-To" may be
3531 added by HAProxy to all requests sent to the server. This header contains a
3532 value representing the original destination IP address. Since this must be
3533 configured to always use the last occurrence of this header only. Note that
3534 only the last occurrence of the header must be used, since it is really
3535 possible that the client has already brought one.
3536
3537 The keyword "header" may be used to supply a different header name to replace
3538 the default "X-Original-To". This can be useful where you might already
3539 have a "X-Original-To" header from a different application, and you need
3540 preserve it. Also if your backend server doesn't use the "X-Original-To"
3541 header and requires different one.
3542
3543 Sometimes, a same HAProxy instance may be shared between a direct client
3544 access and a reverse-proxy access (for instance when an SSL reverse-proxy is
3545 used to decrypt HTTPS traffic). It is possible to disable the addition of the
3546 header for a known source address or network by adding the "except" keyword
3547 followed by the network address. In this case, any source IP matching the
3548 network will not cause an addition of this header. Most common uses are with
3549 private networks or 127.0.0.1.
3550
3551 This option may be specified either in the frontend or in the backend. If at
3552 least one of them uses it, the header will be added. Note that the backend's
3553 setting of the header subargument takes precedence over the frontend's if
3554 both are defined.
3555
3556 It is important to note that as long as HAProxy does not support keep-alive
3557 connections, only the first request of a connection will receive the header.
3558 For this reason, it is important to ensure that "option httpclose" is set
3559 when using this option.
3560
3561 Examples :
3562 # Original Destination address
3563 frontend www
3564 mode http
3565 option originalto except 127.0.0.1
3566
3567 # Those servers want the IP Address in X-Client-Dst
3568 backend www
3569 mode http
3570 option originalto header X-Client-Dst
3571
3572 See also : "option httpclose"
3573
3574
Willy Tarreaua453bdd2008-01-08 19:50:52 +01003575option persist
3576no option persist
3577 Enable or disable forced persistence on down servers
3578 May be used in sections: defaults | frontend | listen | backend
3579 yes | no | yes | yes
Willy Tarreaueabeafa2008-01-16 16:17:06 +01003580 Arguments : none
Willy Tarreaua453bdd2008-01-08 19:50:52 +01003581
3582 When an HTTP request reaches a backend with a cookie which references a dead
3583 server, by default it is redispatched to another server. It is possible to
3584 force the request to be sent to the dead server first using "option persist"
3585 if absolutely needed. A common use case is when servers are under extreme
3586 load and spend their time flapping. In this case, the users would still be
3587 directed to the server they opened the session on, in the hope they would be
3588 correctly served. It is recommended to use "option redispatch" in conjunction
3589 with this option so that in the event it would not be possible to connect to
3590 the server at all (server definitely dead), the client would finally be
3591 redirected to another valid server.
3592
3593 If this option has been enabled in a "defaults" section, it can be disabled
3594 in a specific instance by prepending the "no" keyword before it.
3595
Willy Tarreau4de91492010-01-22 19:10:05 +01003596 See also : "option redispatch", "retries", "force-persist"
Willy Tarreaua453bdd2008-01-08 19:50:52 +01003597
3598
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +01003599option redispatch
3600no option redispatch
3601 Enable or disable session redistribution in case of connection failure
3602 May be used in sections: defaults | frontend | listen | backend
3603 yes | no | yes | yes
Willy Tarreaueabeafa2008-01-16 16:17:06 +01003604 Arguments : none
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +01003605
3606 In HTTP mode, if a server designated by a cookie is down, clients may
3607 definitely stick to it because they cannot flush the cookie, so they will not
3608 be able to access the service anymore.
3609
3610 Specifying "option redispatch" will allow the proxy to break their
3611 persistence and redistribute them to a working server.
3612
3613 It also allows to retry last connection to another server in case of multiple
3614 connection failures. Of course, it requires having "retries" set to a nonzero
3615 value.
Willy Tarreaud72758d2010-01-12 10:42:19 +01003616
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +01003617 This form is the preferred form, which replaces both the "redispatch" and
3618 "redisp" keywords.
3619
3620 If this option has been enabled in a "defaults" section, it can be disabled
3621 in a specific instance by prepending the "no" keyword before it.
3622
Willy Tarreau4de91492010-01-22 19:10:05 +01003623 See also : "redispatch", "retries", "force-persist"
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +01003624
Willy Tarreaua453bdd2008-01-08 19:50:52 +01003625
3626option smtpchk
3627option smtpchk <hello> <domain>
3628 Use SMTP health checks for server testing
3629 May be used in sections : defaults | frontend | listen | backend
3630 yes | no | yes | yes
Willy Tarreaud72758d2010-01-12 10:42:19 +01003631 Arguments :
Willy Tarreaua453bdd2008-01-08 19:50:52 +01003632 <hello> is an optional argument. It is the "hello" command to use. It can
3633 be either "HELO" (for SMTP) or "EHLO" (for ESTMP). All other
3634 values will be turned into the default command ("HELO").
3635
3636 <domain> is the domain name to present to the server. It may only be
3637 specified (and is mandatory) if the hello command has been
3638 specified. By default, "localhost" is used.
3639
3640 When "option smtpchk" is set, the health checks will consist in TCP
3641 connections followed by an SMTP command. By default, this command is
3642 "HELO localhost". The server's return code is analyzed and only return codes
3643 starting with a "2" will be considered as valid. All other responses,
3644 including a lack of response will constitute an error and will indicate a
3645 dead server.
3646
3647 This test is meant to be used with SMTP servers or relays. Depending on the
3648 request, it is possible that some servers do not log each connection attempt,
3649 so you may want to experiment to improve the behaviour. Using telnet on port
3650 25 is often easier than adjusting the configuration.
3651
3652 Most often, an incoming SMTP server needs to see the client's IP address for
3653 various purposes, including spam filtering, anti-spoofing and logging. When
3654 possible, it is often wise to masquerade the client's IP address when
3655 connecting to the server using the "usesrc" argument of the "source" keyword,
3656 which requires the cttproxy feature to be compiled in.
3657
3658 Example :
3659 option smtpchk HELO mydomain.org
3660
3661 See also : "option httpchk", "source"
3662
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +01003663
Krzysztof Piotr Oledzkiaeebf9b2009-10-04 15:43:17 +02003664option socket-stats
3665no option socket-stats
3666
3667 Enable or disable collecting & providing separate statistics for each socket.
3668 May be used in sections : defaults | frontend | listen | backend
3669 yes | yes | yes | no
3670
3671 Arguments : none
3672
3673
Willy Tarreauff4f82d2009-02-06 11:28:13 +01003674option splice-auto
3675no option splice-auto
3676 Enable or disable automatic kernel acceleration on sockets in both directions
3677 May be used in sections : defaults | frontend | listen | backend
3678 yes | yes | yes | yes
3679 Arguments : none
3680
3681 When this option is enabled either on a frontend or on a backend, haproxy
3682 will automatically evaluate the opportunity to use kernel tcp splicing to
3683 forward data between the client and the server, in either direction. Haproxy
3684 uses heuristics to estimate if kernel splicing might improve performance or
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01003685 not. Both directions are handled independently. Note that the heuristics used
Willy Tarreauff4f82d2009-02-06 11:28:13 +01003686 are not much aggressive in order to limit excessive use of splicing. This
3687 option requires splicing to be enabled at compile time, and may be globally
3688 disabled with the global option "nosplice". Since splice uses pipes, using it
3689 requires that there are enough spare pipes.
3690
3691 Important note: kernel-based TCP splicing is a Linux-specific feature which
3692 first appeared in kernel 2.6.25. It offers kernel-based acceleration to
3693 transfer data between sockets without copying these data to user-space, thus
3694 providing noticeable performance gains and CPU cycles savings. Since many
3695 early implementations are buggy, corrupt data and/or are inefficient, this
3696 feature is not enabled by default, and it should be used with extreme care.
3697 While it is not possible to detect the correctness of an implementation,
3698 2.6.29 is the first version offering a properly working implementation. In
3699 case of doubt, splicing may be globally disabled using the global "nosplice"
3700 keyword.
3701
3702 Example :
3703 option splice-auto
3704
3705 If this option has been enabled in a "defaults" section, it can be disabled
3706 in a specific instance by prepending the "no" keyword before it.
3707
3708 See also : "option splice-request", "option splice-response", and global
3709 options "nosplice" and "maxpipes"
3710
3711
3712option splice-request
3713no option splice-request
3714 Enable or disable automatic kernel acceleration on sockets for requests
3715 May be used in sections : defaults | frontend | listen | backend
3716 yes | yes | yes | yes
3717 Arguments : none
3718
3719 When this option is enabled either on a frontend or on a backend, haproxy
3720 will user kernel tcp splicing whenever possible to forward data going from
3721 the client to the server. It might still use the recv/send scheme if there
3722 are no spare pipes left. This option requires splicing to be enabled at
3723 compile time, and may be globally disabled with the global option "nosplice".
3724 Since splice uses pipes, using it requires that there are enough spare pipes.
3725
3726 Important note: see "option splice-auto" for usage limitations.
3727
3728 Example :
3729 option splice-request
3730
3731 If this option has been enabled in a "defaults" section, it can be disabled
3732 in a specific instance by prepending the "no" keyword before it.
3733
3734 See also : "option splice-auto", "option splice-response", and global options
3735 "nosplice" and "maxpipes"
3736
3737
3738option splice-response
3739no option splice-response
3740 Enable or disable automatic kernel acceleration on sockets for responses
3741 May be used in sections : defaults | frontend | listen | backend
3742 yes | yes | yes | yes
3743 Arguments : none
3744
3745 When this option is enabled either on a frontend or on a backend, haproxy
3746 will user kernel tcp splicing whenever possible to forward data going from
3747 the server to the client. It might still use the recv/send scheme if there
3748 are no spare pipes left. This option requires splicing to be enabled at
3749 compile time, and may be globally disabled with the global option "nosplice".
3750 Since splice uses pipes, using it requires that there are enough spare pipes.
3751
3752 Important note: see "option splice-auto" for usage limitations.
3753
3754 Example :
3755 option splice-response
3756
3757 If this option has been enabled in a "defaults" section, it can be disabled
3758 in a specific instance by prepending the "no" keyword before it.
3759
3760 See also : "option splice-auto", "option splice-request", and global options
3761 "nosplice" and "maxpipes"
3762
3763
Willy Tarreaubf1f8162007-12-28 17:42:56 +01003764option srvtcpka
3765no option srvtcpka
3766 Enable or disable the sending of TCP keepalive packets on the server side
3767 May be used in sections : defaults | frontend | listen | backend
3768 yes | no | yes | yes
3769 Arguments : none
3770
3771 When there is a firewall or any session-aware component between a client and
3772 a server, and when the protocol involves very long sessions with long idle
3773 periods (eg: remote desktops), there is a risk that one of the intermediate
3774 components decides to expire a session which has remained idle for too long.
3775
3776 Enabling socket-level TCP keep-alives makes the system regularly send packets
3777 to the other end of the connection, leaving it active. The delay between
3778 keep-alive probes is controlled by the system only and depends both on the
3779 operating system and its tuning parameters.
3780
3781 It is important to understand that keep-alive packets are neither emitted nor
3782 received at the application level. It is only the network stacks which sees
3783 them. For this reason, even if one side of the proxy already uses keep-alives
3784 to maintain its connection alive, those keep-alive packets will not be
3785 forwarded to the other side of the proxy.
3786
3787 Please note that this has nothing to do with HTTP keep-alive.
3788
3789 Using option "srvtcpka" enables the emission of TCP keep-alive probes on the
3790 server side of a connection, which should help when session expirations are
3791 noticed between HAProxy and a server.
3792
3793 If this option has been enabled in a "defaults" section, it can be disabled
3794 in a specific instance by prepending the "no" keyword before it.
3795
3796 See also : "option clitcpka", "option tcpka"
3797
3798
Willy Tarreaua453bdd2008-01-08 19:50:52 +01003799option ssl-hello-chk
3800 Use SSLv3 client hello health checks for server testing
3801 May be used in sections : defaults | frontend | listen | backend
3802 yes | no | yes | yes
3803 Arguments : none
3804
3805 When some SSL-based protocols are relayed in TCP mode through HAProxy, it is
3806 possible to test that the server correctly talks SSL instead of just testing
3807 that it accepts the TCP connection. When "option ssl-hello-chk" is set, pure
3808 SSLv3 client hello messages are sent once the connection is established to
3809 the server, and the response is analyzed to find an SSL server hello message.
3810 The server is considered valid only when the response contains this server
3811 hello message.
3812
3813 All servers tested till there correctly reply to SSLv3 client hello messages,
3814 and most servers tested do not even log the requests containing only hello
3815 messages, which is appreciable.
3816
3817 See also: "option httpchk"
3818
3819
Willy Tarreau9ea05a72009-06-14 12:07:01 +02003820option tcp-smart-accept
3821no option tcp-smart-accept
3822 Enable or disable the saving of one ACK packet during the accept sequence
3823 May be used in sections : defaults | frontend | listen | backend
3824 yes | yes | yes | no
3825 Arguments : none
3826
3827 When an HTTP connection request comes in, the system acknowledges it on
3828 behalf of HAProxy, then the client immediately sends its request, and the
3829 system acknowledges it too while it is notifying HAProxy about the new
3830 connection. HAProxy then reads the request and responds. This means that we
3831 have one TCP ACK sent by the system for nothing, because the request could
3832 very well be acknowledged by HAProxy when it sends its response.
3833
3834 For this reason, in HTTP mode, HAProxy automatically asks the system to avoid
3835 sending this useless ACK on platforms which support it (currently at least
3836 Linux). It must not cause any problem, because the system will send it anyway
3837 after 40 ms if the response takes more time than expected to come.
3838
3839 During complex network debugging sessions, it may be desirable to disable
3840 this optimization because delayed ACKs can make troubleshooting more complex
3841 when trying to identify where packets are delayed. It is then possible to
3842 fall back to normal behaviour by specifying "no option tcp-smart-accept".
3843
3844 It is also possible to force it for non-HTTP proxies by simply specifying
3845 "option tcp-smart-accept". For instance, it can make sense with some services
3846 such as SMTP where the server speaks first.
3847
3848 It is recommended to avoid forcing this option in a defaults section. In case
3849 of doubt, consider setting it back to automatic values by prepending the
3850 "default" keyword before it, or disabling it using the "no" keyword.
3851
Willy Tarreaud88edf22009-06-14 15:48:17 +02003852 See also : "option tcp-smart-connect"
3853
3854
3855option tcp-smart-connect
3856no option tcp-smart-connect
3857 Enable or disable the saving of one ACK packet during the connect sequence
3858 May be used in sections : defaults | frontend | listen | backend
3859 yes | no | yes | yes
3860 Arguments : none
3861
3862 On certain systems (at least Linux), HAProxy can ask the kernel not to
3863 immediately send an empty ACK upon a connection request, but to directly
3864 send the buffer request instead. This saves one packet on the network and
3865 thus boosts performance. It can also be useful for some servers, because they
3866 immediately get the request along with the incoming connection.
3867
3868 This feature is enabled when "option tcp-smart-connect" is set in a backend.
3869 It is not enabled by default because it makes network troubleshooting more
3870 complex.
3871
3872 It only makes sense to enable it with protocols where the client speaks first
3873 such as HTTP. In other situations, if there is no data to send in place of
3874 the ACK, a normal ACK is sent.
3875
3876 If this option has been enabled in a "defaults" section, it can be disabled
3877 in a specific instance by prepending the "no" keyword before it.
3878
3879 See also : "option tcp-smart-accept"
3880
Willy Tarreau9ea05a72009-06-14 12:07:01 +02003881
Willy Tarreaubf1f8162007-12-28 17:42:56 +01003882option tcpka
3883 Enable or disable the sending of TCP keepalive packets on both sides
3884 May be used in sections : defaults | frontend | listen | backend
3885 yes | yes | yes | yes
3886 Arguments : none
3887
3888 When there is a firewall or any session-aware component between a client and
3889 a server, and when the protocol involves very long sessions with long idle
3890 periods (eg: remote desktops), there is a risk that one of the intermediate
3891 components decides to expire a session which has remained idle for too long.
3892
3893 Enabling socket-level TCP keep-alives makes the system regularly send packets
3894 to the other end of the connection, leaving it active. The delay between
3895 keep-alive probes is controlled by the system only and depends both on the
3896 operating system and its tuning parameters.
3897
3898 It is important to understand that keep-alive packets are neither emitted nor
3899 received at the application level. It is only the network stacks which sees
3900 them. For this reason, even if one side of the proxy already uses keep-alives
3901 to maintain its connection alive, those keep-alive packets will not be
3902 forwarded to the other side of the proxy.
3903
3904 Please note that this has nothing to do with HTTP keep-alive.
3905
3906 Using option "tcpka" enables the emission of TCP keep-alive probes on both
3907 the client and server sides of a connection. Note that this is meaningful
3908 only in "defaults" or "listen" sections. If this option is used in a
3909 frontend, only the client side will get keep-alives, and if this option is
3910 used in a backend, only the server side will get keep-alives. For this
3911 reason, it is strongly recommended to explicitly use "option clitcpka" and
3912 "option srvtcpka" when the configuration is split between frontends and
3913 backends.
3914
3915 See also : "option clitcpka", "option srvtcpka"
3916
Willy Tarreau844e3c52008-01-11 16:28:18 +01003917
3918option tcplog
3919 Enable advanced logging of TCP connections with session state and timers
3920 May be used in sections : defaults | frontend | listen | backend
3921 yes | yes | yes | yes
3922 Arguments : none
3923
3924 By default, the log output format is very poor, as it only contains the
3925 source and destination addresses, and the instance name. By specifying
3926 "option tcplog", each log line turns into a much richer format including, but
3927 not limited to, the connection timers, the session status, the connections
3928 numbers, the frontend, backend and server name, and of course the source
3929 address and ports. This option is useful for pure TCP proxies in order to
3930 find which of the client or server disconnects or times out. For normal HTTP
3931 proxies, it's better to use "option httplog" which is even more complete.
3932
3933 This option may be set either in the frontend or the backend.
3934
Willy Tarreauc57f0e22009-05-10 13:12:33 +02003935 See also : "option httplog", and section 8 about logging.
Willy Tarreau844e3c52008-01-11 16:28:18 +01003936
3937
Willy Tarreau844e3c52008-01-11 16:28:18 +01003938option transparent
3939no option transparent
3940 Enable client-side transparent proxying
3941 May be used in sections : defaults | frontend | listen | backend
Willy Tarreau4b1f8592008-12-23 23:13:55 +01003942 yes | no | yes | yes
Willy Tarreau844e3c52008-01-11 16:28:18 +01003943 Arguments : none
3944
3945 This option was introduced in order to provide layer 7 persistence to layer 3
3946 load balancers. The idea is to use the OS's ability to redirect an incoming
3947 connection for a remote address to a local process (here HAProxy), and let
3948 this process know what address was initially requested. When this option is
3949 used, sessions without cookies will be forwarded to the original destination
3950 IP address of the incoming request (which should match that of another
3951 equipment), while requests with cookies will still be forwarded to the
3952 appropriate server.
3953
3954 Note that contrary to a common belief, this option does NOT make HAProxy
3955 present the client's IP to the server when establishing the connection.
3956
Willy Tarreaueabeafa2008-01-16 16:17:06 +01003957 See also: the "usersrc" argument of the "source" keyword, and the
3958 "transparent" option of the "bind" keyword.
Willy Tarreau844e3c52008-01-11 16:28:18 +01003959
Willy Tarreaubf1f8162007-12-28 17:42:56 +01003960
Emeric Brun647caf12009-06-30 17:57:00 +02003961persist rdp-cookie
3962persist rdp-cookie(name)
3963 Enable RDP cookie-based persistence
3964 May be used in sections : defaults | frontend | listen | backend
3965 yes | no | yes | yes
3966 Arguments :
3967 <name> is the optional name of the RDP cookie to check. If omitted, the
Willy Tarreau61e28f22010-05-16 22:31:05 +02003968 default cookie name "msts" will be used. There currently is no
3969 valid reason to change this name.
Emeric Brun647caf12009-06-30 17:57:00 +02003970
3971 This statement enables persistence based on an RDP cookie. The RDP cookie
3972 contains all information required to find the server in the list of known
3973 servers. So when this option is set in the backend, the request is analysed
3974 and if an RDP cookie is found, it is decoded. If it matches a known server
3975 which is still UP (or if "option persist" is set), then the connection is
3976 forwarded to this server.
3977
3978 Note that this only makes sense in a TCP backend, but for this to work, the
3979 frontend must have waited long enough to ensure that an RDP cookie is present
3980 in the request buffer. This is the same requirement as with the "rdp-cookie"
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01003981 load-balancing method. Thus it is highly recommended to put all statements in
Emeric Brun647caf12009-06-30 17:57:00 +02003982 a single "listen" section.
3983
Willy Tarreau61e28f22010-05-16 22:31:05 +02003984 Also, it is important to understand that the terminal server will emit this
3985 RDP cookie only if it is configured for "token redirection mode", which means
3986 that the "IP address redirection" option is disabled.
3987
Emeric Brun647caf12009-06-30 17:57:00 +02003988 Example :
3989 listen tse-farm
3990 bind :3389
3991 # wait up to 5s for an RDP cookie in the request
3992 tcp-request inspect-delay 5s
3993 tcp-request content accept if RDP_COOKIE
3994 # apply RDP cookie persistence
3995 persist rdp-cookie
3996 # if server is unknown, let's balance on the same cookie.
3997 # alternatively, "balance leastconn" may be useful too.
3998 balance rdp-cookie
3999 server srv1 1.1.1.1:3389
4000 server srv2 1.1.1.2:3389
4001
4002 See also : "balance rdp-cookie", "tcp-request" and the "req_rdp_cookie" ACL.
4003
4004
Willy Tarreau3a7d2072009-03-05 23:48:25 +01004005rate-limit sessions <rate>
4006 Set a limit on the number of new sessions accepted per second on a frontend
4007 May be used in sections : defaults | frontend | listen | backend
4008 yes | yes | yes | no
4009 Arguments :
4010 <rate> The <rate> parameter is an integer designating the maximum number
4011 of new sessions per second to accept on the frontend.
4012
4013 When the frontend reaches the specified number of new sessions per second, it
4014 stops accepting new connections until the rate drops below the limit again.
4015 During this time, the pending sessions will be kept in the socket's backlog
4016 (in system buffers) and haproxy will not even be aware that sessions are
4017 pending. When applying very low limit on a highly loaded service, it may make
4018 sense to increase the socket's backlog using the "backlog" keyword.
4019
4020 This feature is particularly efficient at blocking connection-based attacks
4021 or service abuse on fragile servers. Since the session rate is measured every
4022 millisecond, it is extremely accurate. Also, the limit applies immediately,
4023 no delay is needed at all to detect the threshold.
4024
4025 Example : limit the connection rate on SMTP to 10 per second max
4026 listen smtp
4027 mode tcp
4028 bind :25
4029 rate-limit sessions 10
4030 server 127.0.0.1:1025
4031
4032 Note : when the maximum rate is reached, the frontend's status appears as
4033 "FULL" in the statistics, exactly as when it is saturated.
4034
4035 See also : the "backlog" keyword and the "fe_sess_rate" ACL criterion.
4036
4037
Willy Tarreauf285f542010-01-03 20:03:03 +01004038redirect location <to> [code <code>] <option> [{if | unless} <condition>]
4039redirect prefix <to> [code <code>] <option> [{if | unless} <condition>]
Willy Tarreaub463dfb2008-06-07 23:08:56 +02004040 Return an HTTP redirection if/unless a condition is matched
4041 May be used in sections : defaults | frontend | listen | backend
4042 no | yes | yes | yes
4043
4044 If/unless the condition is matched, the HTTP request will lead to a redirect
Willy Tarreauf285f542010-01-03 20:03:03 +01004045 response. If no condition is specified, the redirect applies unconditionally.
Willy Tarreaub463dfb2008-06-07 23:08:56 +02004046
Willy Tarreau0140f252008-11-19 21:07:09 +01004047 Arguments :
4048 <to> With "redirect location", the exact value in <to> is placed into
4049 the HTTP "Location" header. In case of "redirect prefix", the
4050 "Location" header is built from the concatenation of <to> and the
4051 complete URI, including the query string, unless the "drop-query"
Willy Tarreaufe651a52008-11-19 21:15:17 +01004052 option is specified (see below). As a special case, if <to>
4053 equals exactly "/" in prefix mode, then nothing is inserted
4054 before the original URI. It allows one to redirect to the same
4055 URL.
Willy Tarreau0140f252008-11-19 21:07:09 +01004056
4057 <code> The code is optional. It indicates which type of HTTP redirection
4058 is desired. Only codes 301, 302 and 303 are supported, and 302 is
4059 used if no code is specified. 301 means "Moved permanently", and
4060 a browser may cache the Location. 302 means "Moved permanently"
4061 and means that the browser should not cache the redirection. 303
4062 is equivalent to 302 except that the browser will fetch the
4063 location with a GET method.
4064
4065 <option> There are several options which can be specified to adjust the
4066 expected behaviour of a redirection :
4067
4068 - "drop-query"
4069 When this keyword is used in a prefix-based redirection, then the
4070 location will be set without any possible query-string, which is useful
4071 for directing users to a non-secure page for instance. It has no effect
4072 with a location-type redirect.
4073
Willy Tarreau81e3b4f2010-01-10 00:42:19 +01004074 - "append-slash"
4075 This keyword may be used in conjunction with "drop-query" to redirect
4076 users who use a URL not ending with a '/' to the same one with the '/'.
4077 It can be useful to ensure that search engines will only see one URL.
4078 For this, a return code 301 is preferred.
4079
Willy Tarreau0140f252008-11-19 21:07:09 +01004080 - "set-cookie NAME[=value]"
4081 A "Set-Cookie" header will be added with NAME (and optionally "=value")
4082 to the response. This is sometimes used to indicate that a user has
4083 been seen, for instance to protect against some types of DoS. No other
4084 cookie option is added, so the cookie will be a session cookie. Note
4085 that for a browser, a sole cookie name without an equal sign is
4086 different from a cookie with an equal sign.
4087
4088 - "clear-cookie NAME[=]"
4089 A "Set-Cookie" header will be added with NAME (and optionally "="), but
4090 with the "Max-Age" attribute set to zero. This will tell the browser to
4091 delete this cookie. It is useful for instance on logout pages. It is
4092 important to note that clearing the cookie "NAME" will not remove a
4093 cookie set with "NAME=value". You have to clear the cookie "NAME=" for
4094 that, because the browser makes the difference.
Willy Tarreaub463dfb2008-06-07 23:08:56 +02004095
4096 Example: move the login URL only to HTTPS.
4097 acl clear dst_port 80
4098 acl secure dst_port 8080
4099 acl login_page url_beg /login
Willy Tarreau0140f252008-11-19 21:07:09 +01004100 acl logout url_beg /logout
Willy Tarreau79da4692008-11-19 20:03:04 +01004101 acl uid_given url_reg /login?userid=[^&]+
Willy Tarreau0140f252008-11-19 21:07:09 +01004102 acl cookie_set hdr_sub(cookie) SEEN=1
4103
4104 redirect prefix https://mysite.com set-cookie SEEN=1 if !cookie_set
Willy Tarreau79da4692008-11-19 20:03:04 +01004105 redirect prefix https://mysite.com if login_page !secure
4106 redirect prefix http://mysite.com drop-query if login_page !uid_given
4107 redirect location http://mysite.com/ if !login_page secure
Willy Tarreau0140f252008-11-19 21:07:09 +01004108 redirect location / clear-cookie USERID= if logout
Willy Tarreaub463dfb2008-06-07 23:08:56 +02004109
Willy Tarreau81e3b4f2010-01-10 00:42:19 +01004110 Example: send redirects for request for articles without a '/'.
4111 acl missing_slash path_reg ^/article/[^/]*$
4112 redirect code 301 prefix / drop-query append-slash if missing_slash
4113
Willy Tarreauc57f0e22009-05-10 13:12:33 +02004114 See section 7 about ACL usage.
Willy Tarreaub463dfb2008-06-07 23:08:56 +02004115
4116
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +01004117redisp (deprecated)
4118redispatch (deprecated)
4119 Enable or disable session redistribution in case of connection failure
4120 May be used in sections: defaults | frontend | listen | backend
4121 yes | no | yes | yes
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004122 Arguments : none
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +01004123
4124 In HTTP mode, if a server designated by a cookie is down, clients may
4125 definitely stick to it because they cannot flush the cookie, so they will not
4126 be able to access the service anymore.
4127
4128 Specifying "redispatch" will allow the proxy to break their persistence and
4129 redistribute them to a working server.
4130
4131 It also allows to retry last connection to another server in case of multiple
4132 connection failures. Of course, it requires having "retries" set to a nonzero
4133 value.
Willy Tarreaud72758d2010-01-12 10:42:19 +01004134
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +01004135 This form is deprecated, do not use it in any new configuration, use the new
4136 "option redispatch" instead.
4137
4138 See also : "option redispatch"
4139
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004140
Willy Tarreau8abd4cd2010-01-31 14:30:44 +01004141reqadd <string> [{if | unless} <cond>]
Willy Tarreau303c0352008-01-17 19:01:39 +01004142 Add a header at the end of the HTTP request
4143 May be used in sections : defaults | frontend | listen | backend
4144 no | yes | yes | yes
4145 Arguments :
4146 <string> is the complete line to be added. Any space or known delimiter
4147 must be escaped using a backslash ('\'). Please refer to section
Willy Tarreauc57f0e22009-05-10 13:12:33 +02004148 6 about HTTP header manipulation for more information.
Willy Tarreau303c0352008-01-17 19:01:39 +01004149
Willy Tarreau8abd4cd2010-01-31 14:30:44 +01004150 <cond> is an optional matching condition built from ACLs. It makes it
4151 possible to ignore this rule when other conditions are not met.
4152
Willy Tarreau303c0352008-01-17 19:01:39 +01004153 A new line consisting in <string> followed by a line feed will be added after
4154 the last header of an HTTP request.
4155
4156 Header transformations only apply to traffic which passes through HAProxy,
4157 and not to traffic generated by HAProxy, such as health-checks or error
4158 responses.
4159
Willy Tarreau8abd4cd2010-01-31 14:30:44 +01004160 Example : add "X-Proto: SSL" to requests coming via port 81
4161 acl is-ssl dst_port 81
4162 reqadd X-Proto:\ SSL if is-ssl
4163
4164 See also: "rspadd", section 6 about HTTP header manipulation, and section 7
4165 about ACLs.
Willy Tarreau303c0352008-01-17 19:01:39 +01004166
4167
Willy Tarreau5321c422010-01-28 20:35:13 +01004168reqallow <search> [{if | unless} <cond>]
4169reqiallow <search> [{if | unless} <cond>] (ignore case)
Willy Tarreau303c0352008-01-17 19:01:39 +01004170 Definitely allow an HTTP request if a line matches a regular expression
4171 May be used in sections : defaults | frontend | listen | backend
4172 no | yes | yes | yes
4173 Arguments :
4174 <search> is the regular expression applied to HTTP headers and to the
4175 request line. This is an extended regular expression. Parenthesis
4176 grouping is supported and no preliminary backslash is required.
4177 Any space or known delimiter must be escaped using a backslash
4178 ('\'). The pattern applies to a full line at a time. The
4179 "reqallow" keyword strictly matches case while "reqiallow"
4180 ignores case.
4181
Willy Tarreau5321c422010-01-28 20:35:13 +01004182 <cond> is an optional matching condition built from ACLs. It makes it
4183 possible to ignore this rule when other conditions are not met.
4184
Willy Tarreau303c0352008-01-17 19:01:39 +01004185 A request containing any line which matches extended regular expression
4186 <search> will mark the request as allowed, even if any later test would
4187 result in a deny. The test applies both to the request line and to request
4188 headers. Keep in mind that URLs in request line are case-sensitive while
Willy Tarreaud72758d2010-01-12 10:42:19 +01004189 header names are not.
Willy Tarreau303c0352008-01-17 19:01:39 +01004190
4191 It is easier, faster and more powerful to use ACLs to write access policies.
4192 Reqdeny, reqallow and reqpass should be avoided in new designs.
4193
4194 Example :
4195 # allow www.* but refuse *.local
4196 reqiallow ^Host:\ www\.
4197 reqideny ^Host:\ .*\.local
4198
Willy Tarreau5321c422010-01-28 20:35:13 +01004199 See also: "reqdeny", "block", section 6 about HTTP header manipulation, and
4200 section 7 about ACLs.
Willy Tarreau303c0352008-01-17 19:01:39 +01004201
4202
Willy Tarreau5321c422010-01-28 20:35:13 +01004203reqdel <search> [{if | unless} <cond>]
4204reqidel <search> [{if | unless} <cond>] (ignore case)
Willy Tarreau303c0352008-01-17 19:01:39 +01004205 Delete all headers matching a regular expression in an HTTP request
4206 May be used in sections : defaults | frontend | listen | backend
4207 no | yes | yes | yes
4208 Arguments :
4209 <search> is the regular expression applied to HTTP headers and to the
4210 request line. This is an extended regular expression. Parenthesis
4211 grouping is supported and no preliminary backslash is required.
4212 Any space or known delimiter must be escaped using a backslash
4213 ('\'). The pattern applies to a full line at a time. The "reqdel"
4214 keyword strictly matches case while "reqidel" ignores case.
4215
Willy Tarreau5321c422010-01-28 20:35:13 +01004216 <cond> is an optional matching condition built from ACLs. It makes it
4217 possible to ignore this rule when other conditions are not met.
4218
Willy Tarreau303c0352008-01-17 19:01:39 +01004219 Any header line matching extended regular expression <search> in the request
4220 will be completely deleted. Most common use of this is to remove unwanted
4221 and/or dangerous headers or cookies from a request before passing it to the
4222 next servers.
4223
4224 Header transformations only apply to traffic which passes through HAProxy,
4225 and not to traffic generated by HAProxy, such as health-checks or error
4226 responses. Keep in mind that header names are not case-sensitive.
4227
4228 Example :
4229 # remove X-Forwarded-For header and SERVER cookie
4230 reqidel ^X-Forwarded-For:.*
4231 reqidel ^Cookie:.*SERVER=
4232
Willy Tarreau5321c422010-01-28 20:35:13 +01004233 See also: "reqadd", "reqrep", "rspdel", section 6 about HTTP header
4234 manipulation, and section 7 about ACLs.
Willy Tarreau303c0352008-01-17 19:01:39 +01004235
4236
Willy Tarreau5321c422010-01-28 20:35:13 +01004237reqdeny <search> [{if | unless} <cond>]
4238reqideny <search> [{if | unless} <cond>] (ignore case)
Willy Tarreau303c0352008-01-17 19:01:39 +01004239 Deny an HTTP request if a line matches a regular expression
4240 May be used in sections : defaults | frontend | listen | backend
4241 no | yes | yes | yes
4242 Arguments :
4243 <search> is the regular expression applied to HTTP headers and to the
4244 request line. This is an extended regular expression. Parenthesis
4245 grouping is supported and no preliminary backslash is required.
4246 Any space or known delimiter must be escaped using a backslash
4247 ('\'). The pattern applies to a full line at a time. The
4248 "reqdeny" keyword strictly matches case while "reqideny" ignores
4249 case.
4250
Willy Tarreau5321c422010-01-28 20:35:13 +01004251 <cond> is an optional matching condition built from ACLs. It makes it
4252 possible to ignore this rule when other conditions are not met.
4253
Willy Tarreau303c0352008-01-17 19:01:39 +01004254 A request containing any line which matches extended regular expression
4255 <search> will mark the request as denied, even if any later test would
4256 result in an allow. The test applies both to the request line and to request
4257 headers. Keep in mind that URLs in request line are case-sensitive while
Willy Tarreaud72758d2010-01-12 10:42:19 +01004258 header names are not.
Willy Tarreau303c0352008-01-17 19:01:39 +01004259
Willy Tarreauced27012008-01-17 20:35:34 +01004260 A denied request will generate an "HTTP 403 forbidden" response once the
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01004261 complete request has been parsed. This is consistent with what is practiced
Willy Tarreaud72758d2010-01-12 10:42:19 +01004262 using ACLs.
Willy Tarreauced27012008-01-17 20:35:34 +01004263
Willy Tarreau303c0352008-01-17 19:01:39 +01004264 It is easier, faster and more powerful to use ACLs to write access policies.
4265 Reqdeny, reqallow and reqpass should be avoided in new designs.
4266
4267 Example :
4268 # refuse *.local, then allow www.*
4269 reqideny ^Host:\ .*\.local
4270 reqiallow ^Host:\ www\.
4271
Willy Tarreau5321c422010-01-28 20:35:13 +01004272 See also: "reqallow", "rspdeny", "block", section 6 about HTTP header
4273 manipulation, and section 7 about ACLs.
Willy Tarreau303c0352008-01-17 19:01:39 +01004274
4275
Willy Tarreau5321c422010-01-28 20:35:13 +01004276reqpass <search> [{if | unless} <cond>]
4277reqipass <search> [{if | unless} <cond>] (ignore case)
Willy Tarreau303c0352008-01-17 19:01:39 +01004278 Ignore any HTTP request line matching a regular expression in next rules
4279 May be used in sections : defaults | frontend | listen | backend
4280 no | yes | yes | yes
4281 Arguments :
4282 <search> is the regular expression applied to HTTP headers and to the
4283 request line. This is an extended regular expression. Parenthesis
4284 grouping is supported and no preliminary backslash is required.
4285 Any space or known delimiter must be escaped using a backslash
4286 ('\'). The pattern applies to a full line at a time. The
4287 "reqpass" keyword strictly matches case while "reqipass" ignores
4288 case.
4289
Willy Tarreau5321c422010-01-28 20:35:13 +01004290 <cond> is an optional matching condition built from ACLs. It makes it
4291 possible to ignore this rule when other conditions are not met.
4292
Willy Tarreau303c0352008-01-17 19:01:39 +01004293 A request containing any line which matches extended regular expression
4294 <search> will skip next rules, without assigning any deny or allow verdict.
4295 The test applies both to the request line and to request headers. Keep in
4296 mind that URLs in request line are case-sensitive while header names are not.
4297
4298 It is easier, faster and more powerful to use ACLs to write access policies.
4299 Reqdeny, reqallow and reqpass should be avoided in new designs.
4300
4301 Example :
4302 # refuse *.local, then allow www.*, but ignore "www.private.local"
4303 reqipass ^Host:\ www.private\.local
4304 reqideny ^Host:\ .*\.local
4305 reqiallow ^Host:\ www\.
4306
Willy Tarreau5321c422010-01-28 20:35:13 +01004307 See also: "reqallow", "reqdeny", "block", section 6 about HTTP header
4308 manipulation, and section 7 about ACLs.
Willy Tarreau303c0352008-01-17 19:01:39 +01004309
4310
Willy Tarreau5321c422010-01-28 20:35:13 +01004311reqrep <search> <string> [{if | unless} <cond>]
4312reqirep <search> <string> [{if | unless} <cond>] (ignore case)
Willy Tarreau303c0352008-01-17 19:01:39 +01004313 Replace a regular expression with a string in an HTTP request line
4314 May be used in sections : defaults | frontend | listen | backend
4315 no | yes | yes | yes
4316 Arguments :
4317 <search> is the regular expression applied to HTTP headers and to the
4318 request line. This is an extended regular expression. Parenthesis
4319 grouping is supported and no preliminary backslash is required.
4320 Any space or known delimiter must be escaped using a backslash
4321 ('\'). The pattern applies to a full line at a time. The "reqrep"
4322 keyword strictly matches case while "reqirep" ignores case.
4323
4324 <string> is the complete line to be added. Any space or known delimiter
4325 must be escaped using a backslash ('\'). References to matched
4326 pattern groups are possible using the common \N form, with N
4327 being a single digit between 0 and 9. Please refer to section
Willy Tarreauc57f0e22009-05-10 13:12:33 +02004328 6 about HTTP header manipulation for more information.
Willy Tarreau303c0352008-01-17 19:01:39 +01004329
Willy Tarreau5321c422010-01-28 20:35:13 +01004330 <cond> is an optional matching condition built from ACLs. It makes it
4331 possible to ignore this rule when other conditions are not met.
4332
Willy Tarreau303c0352008-01-17 19:01:39 +01004333 Any line matching extended regular expression <search> in the request (both
4334 the request line and header lines) will be completely replaced with <string>.
4335 Most common use of this is to rewrite URLs or domain names in "Host" headers.
4336
4337 Header transformations only apply to traffic which passes through HAProxy,
4338 and not to traffic generated by HAProxy, such as health-checks or error
4339 responses. Note that for increased readability, it is suggested to add enough
4340 spaces between the request and the response. Keep in mind that URLs in
4341 request line are case-sensitive while header names are not.
4342
4343 Example :
4344 # replace "/static/" with "/" at the beginning of any request path.
4345 reqrep ^([^\ ]*)\ /static/(.*) \1\ /\2
4346 # replace "www.mydomain.com" with "www" in the host name.
4347 reqirep ^Host:\ www.mydomain.com Host:\ www
4348
Willy Tarreau5321c422010-01-28 20:35:13 +01004349 See also: "reqadd", "reqdel", "rsprep", section 6 about HTTP header
4350 manipulation, and section 7 about ACLs.
Willy Tarreau303c0352008-01-17 19:01:39 +01004351
4352
Willy Tarreau5321c422010-01-28 20:35:13 +01004353reqtarpit <search> [{if | unless} <cond>]
4354reqitarpit <search> [{if | unless} <cond>] (ignore case)
Willy Tarreau303c0352008-01-17 19:01:39 +01004355 Tarpit an HTTP request containing a line matching a regular expression
4356 May be used in sections : defaults | frontend | listen | backend
4357 no | yes | yes | yes
4358 Arguments :
4359 <search> is the regular expression applied to HTTP headers and to the
4360 request line. This is an extended regular expression. Parenthesis
4361 grouping is supported and no preliminary backslash is required.
4362 Any space or known delimiter must be escaped using a backslash
4363 ('\'). The pattern applies to a full line at a time. The
4364 "reqtarpit" keyword strictly matches case while "reqitarpit"
4365 ignores case.
4366
Willy Tarreau5321c422010-01-28 20:35:13 +01004367 <cond> is an optional matching condition built from ACLs. It makes it
4368 possible to ignore this rule when other conditions are not met.
4369
Willy Tarreau303c0352008-01-17 19:01:39 +01004370 A request containing any line which matches extended regular expression
4371 <search> will be tarpitted, which means that it will connect to nowhere, will
Willy Tarreauced27012008-01-17 20:35:34 +01004372 be kept open for a pre-defined time, then will return an HTTP error 500 so
4373 that the attacker does not suspect it has been tarpitted. The status 500 will
4374 be reported in the logs, but the completion flags will indicate "PT". The
Willy Tarreau303c0352008-01-17 19:01:39 +01004375 delay is defined by "timeout tarpit", or "timeout connect" if the former is
4376 not set.
4377
4378 The goal of the tarpit is to slow down robots attacking servers with
4379 identifiable requests. Many robots limit their outgoing number of connections
4380 and stay connected waiting for a reply which can take several minutes to
4381 come. Depending on the environment and attack, it may be particularly
4382 efficient at reducing the load on the network and firewalls.
4383
Willy Tarreau5321c422010-01-28 20:35:13 +01004384 Examples :
Willy Tarreau303c0352008-01-17 19:01:39 +01004385 # ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
4386 # block all others.
4387 reqipass ^User-Agent:\.*(Mozilla|MSIE)
4388 reqitarpit ^User-Agent:
4389
Willy Tarreau5321c422010-01-28 20:35:13 +01004390 # block bad guys
4391 acl badguys src 10.1.0.3 172.16.13.20/28
4392 reqitarpit . if badguys
4393
4394 See also: "reqallow", "reqdeny", "reqpass", section 6 about HTTP header
4395 manipulation, and section 7 about ACLs.
Willy Tarreau303c0352008-01-17 19:01:39 +01004396
4397
Willy Tarreaue5c5ce92008-06-20 17:27:19 +02004398retries <value>
4399 Set the number of retries to perform on a server after a connection failure
4400 May be used in sections: defaults | frontend | listen | backend
4401 yes | no | yes | yes
4402 Arguments :
4403 <value> is the number of times a connection attempt should be retried on
4404 a server when a connection either is refused or times out. The
4405 default value is 3.
4406
4407 It is important to understand that this value applies to the number of
4408 connection attempts, not full requests. When a connection has effectively
4409 been established to a server, there will be no more retry.
4410
4411 In order to avoid immediate reconnections to a server which is restarting,
4412 a turn-around timer of 1 second is applied before a retry occurs.
4413
4414 When "option redispatch" is set, the last retry may be performed on another
4415 server even if a cookie references a different server.
4416
4417 See also : "option redispatch"
4418
4419
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004420rspadd <string> [{if | unless} <cond>]
Willy Tarreau303c0352008-01-17 19:01:39 +01004421 Add a header at the end of the HTTP response
4422 May be used in sections : defaults | frontend | listen | backend
4423 no | yes | yes | yes
4424 Arguments :
4425 <string> is the complete line to be added. Any space or known delimiter
4426 must be escaped using a backslash ('\'). Please refer to section
Willy Tarreauc57f0e22009-05-10 13:12:33 +02004427 6 about HTTP header manipulation for more information.
Willy Tarreau303c0352008-01-17 19:01:39 +01004428
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004429 <cond> is an optional matching condition built from ACLs. It makes it
4430 possible to ignore this rule when other conditions are not met.
4431
Willy Tarreau303c0352008-01-17 19:01:39 +01004432 A new line consisting in <string> followed by a line feed will be added after
4433 the last header of an HTTP response.
4434
4435 Header transformations only apply to traffic which passes through HAProxy,
4436 and not to traffic generated by HAProxy, such as health-checks or error
4437 responses.
4438
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004439 See also: "reqadd", section 6 about HTTP header manipulation, and section 7
4440 about ACLs.
Willy Tarreau303c0352008-01-17 19:01:39 +01004441
4442
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004443rspdel <search> [{if | unless} <cond>]
4444rspidel <search> [{if | unless} <cond>] (ignore case)
Willy Tarreau303c0352008-01-17 19:01:39 +01004445 Delete all headers matching a regular expression in an HTTP response
4446 May be used in sections : defaults | frontend | listen | backend
4447 no | yes | yes | yes
4448 Arguments :
4449 <search> is the regular expression applied to HTTP headers and to the
4450 response line. This is an extended regular expression, so
4451 parenthesis grouping is supported and no preliminary backslash
4452 is required. Any space or known delimiter must be escaped using
4453 a backslash ('\'). The pattern applies to a full line at a time.
4454 The "rspdel" keyword strictly matches case while "rspidel"
4455 ignores case.
4456
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004457 <cond> is an optional matching condition built from ACLs. It makes it
4458 possible to ignore this rule when other conditions are not met.
4459
Willy Tarreau303c0352008-01-17 19:01:39 +01004460 Any header line matching extended regular expression <search> in the response
4461 will be completely deleted. Most common use of this is to remove unwanted
4462 and/or sensible headers or cookies from a response before passing it to the
4463 client.
4464
4465 Header transformations only apply to traffic which passes through HAProxy,
4466 and not to traffic generated by HAProxy, such as health-checks or error
4467 responses. Keep in mind that header names are not case-sensitive.
4468
4469 Example :
4470 # remove the Server header from responses
4471 reqidel ^Server:.*
4472
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004473 See also: "rspadd", "rsprep", "reqdel", section 6 about HTTP header
4474 manipulation, and section 7 about ACLs.
Willy Tarreau303c0352008-01-17 19:01:39 +01004475
4476
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004477rspdeny <search> [{if | unless} <cond>]
4478rspideny <search> [{if | unless} <cond>] (ignore case)
Willy Tarreau303c0352008-01-17 19:01:39 +01004479 Block an HTTP response if a line matches a regular expression
4480 May be used in sections : defaults | frontend | listen | backend
4481 no | yes | yes | yes
4482 Arguments :
4483 <search> is the regular expression applied to HTTP headers and to the
4484 response line. This is an extended regular expression, so
4485 parenthesis grouping is supported and no preliminary backslash
4486 is required. Any space or known delimiter must be escaped using
4487 a backslash ('\'). The pattern applies to a full line at a time.
4488 The "rspdeny" keyword strictly matches case while "rspideny"
4489 ignores case.
4490
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004491 <cond> is an optional matching condition built from ACLs. It makes it
4492 possible to ignore this rule when other conditions are not met.
4493
Willy Tarreau303c0352008-01-17 19:01:39 +01004494 A response containing any line which matches extended regular expression
4495 <search> will mark the request as denied. The test applies both to the
4496 response line and to response headers. Keep in mind that header names are not
4497 case-sensitive.
4498
4499 Main use of this keyword is to prevent sensitive information leak and to
Willy Tarreauced27012008-01-17 20:35:34 +01004500 block the response before it reaches the client. If a response is denied, it
4501 will be replaced with an HTTP 502 error so that the client never retrieves
4502 any sensitive data.
Willy Tarreau303c0352008-01-17 19:01:39 +01004503
4504 It is easier, faster and more powerful to use ACLs to write access policies.
4505 Rspdeny should be avoided in new designs.
4506
4507 Example :
4508 # Ensure that no content type matching ms-word will leak
4509 rspideny ^Content-type:\.*/ms-word
4510
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004511 See also: "reqdeny", "acl", "block", section 6 about HTTP header manipulation
4512 and section 7 about ACLs.
Willy Tarreau303c0352008-01-17 19:01:39 +01004513
4514
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004515rsprep <search> <string> [{if | unless} <cond>]
4516rspirep <search> <string> [{if | unless} <cond>] (ignore case)
Willy Tarreau303c0352008-01-17 19:01:39 +01004517 Replace a regular expression with a string in an HTTP response line
4518 May be used in sections : defaults | frontend | listen | backend
4519 no | yes | yes | yes
4520 Arguments :
4521 <search> is the regular expression applied to HTTP headers and to the
4522 response line. This is an extended regular expression, so
4523 parenthesis grouping is supported and no preliminary backslash
4524 is required. Any space or known delimiter must be escaped using
4525 a backslash ('\'). The pattern applies to a full line at a time.
4526 The "rsprep" keyword strictly matches case while "rspirep"
4527 ignores case.
4528
4529 <string> is the complete line to be added. Any space or known delimiter
4530 must be escaped using a backslash ('\'). References to matched
4531 pattern groups are possible using the common \N form, with N
4532 being a single digit between 0 and 9. Please refer to section
Willy Tarreauc57f0e22009-05-10 13:12:33 +02004533 6 about HTTP header manipulation for more information.
Willy Tarreau303c0352008-01-17 19:01:39 +01004534
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004535 <cond> is an optional matching condition built from ACLs. It makes it
4536 possible to ignore this rule when other conditions are not met.
4537
Willy Tarreau303c0352008-01-17 19:01:39 +01004538 Any line matching extended regular expression <search> in the response (both
4539 the response line and header lines) will be completely replaced with
4540 <string>. Most common use of this is to rewrite Location headers.
4541
4542 Header transformations only apply to traffic which passes through HAProxy,
4543 and not to traffic generated by HAProxy, such as health-checks or error
4544 responses. Note that for increased readability, it is suggested to add enough
4545 spaces between the request and the response. Keep in mind that header names
4546 are not case-sensitive.
4547
4548 Example :
4549 # replace "Location: 127.0.0.1:8080" with "Location: www.mydomain.com"
4550 rspirep ^Location:\ 127.0.0.1:8080 Location:\ www.mydomain.com
4551
Willy Tarreaufdb563c2010-01-31 15:43:27 +01004552 See also: "rspadd", "rspdel", "reqrep", section 6 about HTTP header
4553 manipulation, and section 7 about ACLs.
Willy Tarreau303c0352008-01-17 19:01:39 +01004554
4555
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004556server <name> <address>[:port] [param*]
4557 Declare a server in a backend
4558 May be used in sections : defaults | frontend | listen | backend
4559 no | no | yes | yes
4560 Arguments :
4561 <name> is the internal name assigned to this server. This name will
4562 appear in logs and alerts.
4563
4564 <address> is the IPv4 address of the server. Alternatively, a resolvable
4565 hostname is supported, but this name will be resolved during
Willy Tarreaud669a4f2010-07-13 14:49:50 +02004566 start-up. Address "0.0.0.0" or "*" has a special meaning. It
4567 indicates that the connection will be forwarded to the same IP
4568 address as the one from the client connection. This is useful in
4569 transparent proxy architectures where the client's connection is
4570 intercepted and haproxy must forward to the original destination
4571 address. This is more or less what the "transparent" keyword does
4572 except that with a server it's possible to limit concurrency and
4573 to report statistics.
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004574
4575 <ports> is an optional port specification. If set, all connections will
4576 be sent to this port. If unset, the same port the client
4577 connected to will be used. The port may also be prefixed by a "+"
4578 or a "-". In this case, the server's port will be determined by
4579 adding this value to the client's port.
4580
4581 <param*> is a list of parameters for this server. The "server" keywords
4582 accepts an important number of options and has a complete section
Willy Tarreauc57f0e22009-05-10 13:12:33 +02004583 dedicated to it. Please refer to section 5 for more details.
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004584
4585 Examples :
4586 server first 10.1.1.1:1080 cookie first check inter 1000
4587 server second 10.1.1.2:1080 cookie second check inter 1000
4588
Krzysztof Piotr Oledzkic6df0662010-01-05 16:38:49 +01004589 See also: "default-server" and section 5 about server options
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004590
4591
4592source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ]
Willy Tarreaubce70882009-09-07 11:51:47 +02004593source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | hdr_ip(<hdr>[,<occ>]) } ]
Willy Tarreaud53f96b2009-02-04 18:46:54 +01004594source <addr>[:<port>] [interface <name>]
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004595 Set the source address for outgoing connections
4596 May be used in sections : defaults | frontend | listen | backend
4597 yes | no | yes | yes
4598 Arguments :
4599 <addr> is the IPv4 address HAProxy will bind to before connecting to a
4600 server. This address is also used as a source for health checks.
4601 The default value of 0.0.0.0 means that the system will select
4602 the most appropriate address to reach its destination.
4603
4604 <port> is an optional port. It is normally not needed but may be useful
4605 in some very specific contexts. The default value of zero means
Willy Tarreauc6f4ce82009-06-10 11:09:37 +02004606 the system will select a free port. Note that port ranges are not
4607 supported in the backend. If you want to force port ranges, you
4608 have to specify them on each "server" line.
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004609
4610 <addr2> is the IP address to present to the server when connections are
4611 forwarded in full transparent proxy mode. This is currently only
4612 supported on some patched Linux kernels. When this address is
4613 specified, clients connecting to the server will be presented
4614 with this address, while health checks will still use the address
4615 <addr>.
4616
4617 <port2> is the optional port to present to the server when connections
4618 are forwarded in full transparent proxy mode (see <addr2> above).
4619 The default value of zero means the system will select a free
4620 port.
4621
Willy Tarreaubce70882009-09-07 11:51:47 +02004622 <hdr> is the name of a HTTP header in which to fetch the IP to bind to.
4623 This is the name of a comma-separated header list which can
4624 contain multiple IP addresses. By default, the last occurrence is
4625 used. This is designed to work with the X-Forwarded-For header
4626 and to automatically bind to the the client's IP address as seen
4627 by previous proxy, typically Stunnel. In order to use another
4628 occurrence from the last one, please see the <occ> parameter
4629 below. When the header (or occurrence) is not found, no binding
4630 is performed so that the proxy's default IP address is used. Also
4631 keep in mind that the header name is case insensitive, as for any
4632 HTTP header.
4633
4634 <occ> is the occurrence number of a value to be used in a multi-value
4635 header. This is to be used in conjunction with "hdr_ip(<hdr>)",
4636 in order to specificy which occurrence to use for the source IP
4637 address. Positive values indicate a position from the first
4638 occurrence, 1 being the first one. Negative values indicate
4639 positions relative to the last one, -1 being the last one. This
4640 is helpful for situations where an X-Forwarded-For header is set
4641 at the entry point of an infrastructure and must be used several
4642 proxy layers away. When this value is not specified, -1 is
4643 assumed. Passing a zero here disables the feature.
4644
Willy Tarreaud53f96b2009-02-04 18:46:54 +01004645 <name> is an optional interface name to which to bind to for outgoing
4646 traffic. On systems supporting this features (currently, only
4647 Linux), this allows one to bind all traffic to the server to
4648 this interface even if it is not the one the system would select
4649 based on routing tables. This should be used with extreme care.
4650 Note that using this option requires root privileges.
4651
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004652 The "source" keyword is useful in complex environments where a specific
4653 address only is allowed to connect to the servers. It may be needed when a
4654 private address must be used through a public gateway for instance, and it is
4655 known that the system cannot determine the adequate source address by itself.
4656
4657 An extension which is available on certain patched Linux kernels may be used
4658 through the "usesrc" optional keyword. It makes it possible to connect to the
4659 servers with an IP address which does not belong to the system itself. This
4660 is called "full transparent proxy mode". For this to work, the destination
4661 servers have to route their traffic back to this address through the machine
4662 running HAProxy, and IP forwarding must generally be enabled on this machine.
4663
4664 In this "full transparent proxy" mode, it is possible to force a specific IP
4665 address to be presented to the servers. This is not much used in fact. A more
4666 common use is to tell HAProxy to present the client's IP address. For this,
4667 there are two methods :
4668
4669 - present the client's IP and port addresses. This is the most transparent
4670 mode, but it can cause problems when IP connection tracking is enabled on
4671 the machine, because a same connection may be seen twice with different
4672 states. However, this solution presents the huge advantage of not
4673 limiting the system to the 64k outgoing address+port couples, because all
4674 of the client ranges may be used.
4675
4676 - present only the client's IP address and select a spare port. This
4677 solution is still quite elegant but slightly less transparent (downstream
4678 firewalls logs will not match upstream's). It also presents the downside
4679 of limiting the number of concurrent connections to the usual 64k ports.
4680 However, since the upstream and downstream ports are different, local IP
4681 connection tracking on the machine will not be upset by the reuse of the
4682 same session.
4683
4684 Note that depending on the transparent proxy technology used, it may be
4685 required to force the source address. In fact, cttproxy version 2 requires an
4686 IP address in <addr> above, and does not support setting of "0.0.0.0" as the
4687 IP address because it creates NAT entries which much match the exact outgoing
4688 address. Tproxy version 4 and some other kernel patches which work in pure
4689 forwarding mode generally will not have this limitation.
4690
4691 This option sets the default source for all servers in the backend. It may
4692 also be specified in a "defaults" section. Finer source address specification
4693 is possible at the server level using the "source" server option. Refer to
Willy Tarreauc57f0e22009-05-10 13:12:33 +02004694 section 5 for more information.
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004695
4696 Examples :
4697 backend private
4698 # Connect to the servers using our 192.168.1.200 source address
4699 source 192.168.1.200
4700
4701 backend transparent_ssl1
4702 # Connect to the SSL farm from the client's source address
4703 source 192.168.1.200 usesrc clientip
4704
4705 backend transparent_ssl2
4706 # Connect to the SSL farm from the client's source address and port
4707 # not recommended if IP conntrack is present on the local machine.
4708 source 192.168.1.200 usesrc client
4709
4710 backend transparent_ssl3
4711 # Connect to the SSL farm from the client's source address. It
4712 # is more conntrack-friendly.
4713 source 192.168.1.200 usesrc clientip
4714
4715 backend transparent_smtp
4716 # Connect to the SMTP farm from the client's source address/port
4717 # with Tproxy version 4.
4718 source 0.0.0.0 usesrc clientip
4719
Willy Tarreaubce70882009-09-07 11:51:47 +02004720 backend transparent_http
4721 # Connect to the servers using the client's IP as seen by previous
4722 # proxy.
4723 source 0.0.0.0 usesrc hdr_ip(x-forwarded-for,-1)
4724
Willy Tarreauc57f0e22009-05-10 13:12:33 +02004725 See also : the "source" server option in section 5, the Tproxy patches for
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004726 the Linux kernel on www.balabit.com, the "bind" keyword.
4727
Krzysztof Piotr Oledzki25b501a2008-01-06 16:36:16 +01004728
Willy Tarreau844e3c52008-01-11 16:28:18 +01004729srvtimeout <timeout> (deprecated)
4730 Set the maximum inactivity time on the server side.
4731 May be used in sections : defaults | frontend | listen | backend
4732 yes | no | yes | yes
4733 Arguments :
4734 <timeout> is the timeout value specified in milliseconds by default, but
4735 can be in any other unit if the number is suffixed by the unit,
4736 as explained at the top of this document.
4737
4738 The inactivity timeout applies when the server is expected to acknowledge or
4739 send data. In HTTP mode, this timeout is particularly important to consider
4740 during the first phase of the server's response, when it has to send the
4741 headers, as it directly represents the server's processing time for the
4742 request. To find out what value to put there, it's often good to start with
4743 what would be considered as unacceptable response times, then check the logs
4744 to observe the response time distribution, and adjust the value accordingly.
4745
4746 The value is specified in milliseconds by default, but can be in any other
4747 unit if the number is suffixed by the unit, as specified at the top of this
4748 document. In TCP mode (and to a lesser extent, in HTTP mode), it is highly
4749 recommended that the client timeout remains equal to the server timeout in
4750 order to avoid complex situations to debug. Whatever the expected server
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01004751 response times, it is a good practice to cover at least one or several TCP
Willy Tarreau844e3c52008-01-11 16:28:18 +01004752 packet losses by specifying timeouts that are slightly above multiples of 3
Willy Tarreaud72758d2010-01-12 10:42:19 +01004753 seconds (eg: 4 or 5 seconds minimum).
Willy Tarreau844e3c52008-01-11 16:28:18 +01004754
4755 This parameter is specific to backends, but can be specified once for all in
4756 "defaults" sections. This is in fact one of the easiest solutions not to
4757 forget about it. An unspecified timeout results in an infinite timeout, which
4758 is not recommended. Such a usage is accepted and works but reports a warning
4759 during startup because it may results in accumulation of expired sessions in
4760 the system if the system's timeouts are not configured either.
4761
4762 This parameter is provided for compatibility but is currently deprecated.
4763 Please use "timeout server" instead.
4764
4765 See also : "timeout server", "timeout client" and "clitimeout".
4766
4767
Cyril Bonté66c327d2010-10-12 00:14:37 +02004768stats admin { if | unless } <cond>
4769 Enable statistics admin level if/unless a condition is matched
4770 May be used in sections : defaults | frontend | listen | backend
4771 no | no | yes | yes
4772
4773 This statement enables the statistics admin level if/unless a condition is
4774 matched.
4775
4776 The admin level allows to enable/disable servers from the web interface. By
4777 default, statistics page is read-only for security reasons.
4778
4779 Currently, there are 2 known limitations :
4780
4781 - The POST data are limited to one packet, which means that if the list of
4782 servers is too long, the request won't be processed. It is recommended
4783 to alter few servers at a time.
4784
4785 - Expect: 100-continue is not supported.
4786
4787 Example :
4788 # statistics admin level only for localhost
4789 backend stats_localhost
4790 stats enable
4791 stats admin if LOCALHOST
4792
4793 Example :
4794 # statistics admin level always enabled because of the authentication
4795 backend stats_auth
4796 stats enable
4797 stats auth admin:AdMiN123
4798 stats admin if TRUE
4799
4800 Example :
4801 # statistics admin level depends on the authenticated user
4802 userlist stats-auth
4803 group admin users admin
4804 user admin insecure-password AdMiN123
4805 group readonly users haproxy
4806 user haproxy insecure-password haproxy
4807
4808 backend stats_auth
4809 stats enable
4810 acl AUTH http_auth(stats-auth)
4811 acl AUTH_ADMIN http_auth_group(stats-auth) admin
4812 stats http-request auth unless AUTH
4813 stats admin if AUTH_ADMIN
4814
4815 See also : "stats enable", "stats auth", "stats http-request", section 3.4
4816 about userlists and section 7 about ACL usage.
4817
4818
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004819stats auth <user>:<passwd>
4820 Enable statistics with authentication and grant access to an account
4821 May be used in sections : defaults | frontend | listen | backend
4822 yes | no | yes | yes
4823 Arguments :
4824 <user> is a user name to grant access to
4825
4826 <passwd> is the cleartext password associated to this user
4827
4828 This statement enables statistics with default settings, and restricts access
4829 to declared users only. It may be repeated as many times as necessary to
4830 allow as many users as desired. When a user tries to access the statistics
4831 without a valid account, a "401 Forbidden" response will be returned so that
4832 the browser asks the user to provide a valid user and password. The real
4833 which will be returned to the browser is configurable using "stats realm".
4834
4835 Since the authentication method is HTTP Basic Authentication, the passwords
4836 circulate in cleartext on the network. Thus, it was decided that the
4837 configuration file would also use cleartext passwords to remind the users
4838 that those ones should not be sensible and not shared with any other account.
4839
4840 It is also possible to reduce the scope of the proxies which appear in the
4841 report using "stats scope".
4842
4843 Though this statement alone is enough to enable statistics reporting, it is
4844 recommended to set all other settings in order to avoid relying on default
4845 unobvious parameters.
4846
4847 Example :
4848 # public access (limited to this backend only)
4849 backend public_www
4850 server srv1 192.168.0.1:80
4851 stats enable
4852 stats hide-version
4853 stats scope .
4854 stats uri /admin?stats
4855 stats realm Haproxy\ Statistics
4856 stats auth admin1:AdMiN123
4857 stats auth admin2:AdMiN321
4858
4859 # internal monitoring access (unlimited)
4860 backend private_monitoring
4861 stats enable
4862 stats uri /admin?stats
4863 stats refresh 5s
4864
4865 See also : "stats enable", "stats realm", "stats scope", "stats uri"
4866
4867
4868stats enable
4869 Enable statistics reporting with default settings
4870 May be used in sections : defaults | frontend | listen | backend
4871 yes | no | yes | yes
4872 Arguments : none
4873
4874 This statement enables statistics reporting with default settings defined
4875 at build time. Unless stated otherwise, these settings are used :
4876 - stats uri : /haproxy?stats
4877 - stats realm : "HAProxy Statistics"
4878 - stats auth : no authentication
4879 - stats scope : no restriction
4880
4881 Though this statement alone is enough to enable statistics reporting, it is
4882 recommended to set all other settings in order to avoid relying on default
4883 unobvious parameters.
4884
4885 Example :
4886 # public access (limited to this backend only)
4887 backend public_www
4888 server srv1 192.168.0.1:80
4889 stats enable
4890 stats hide-version
4891 stats scope .
4892 stats uri /admin?stats
4893 stats realm Haproxy\ Statistics
4894 stats auth admin1:AdMiN123
4895 stats auth admin2:AdMiN321
4896
4897 # internal monitoring access (unlimited)
4898 backend private_monitoring
4899 stats enable
4900 stats uri /admin?stats
4901 stats refresh 5s
4902
4903 See also : "stats auth", "stats realm", "stats uri"
4904
4905
Willy Tarreaud63335a2010-02-26 12:56:52 +01004906stats hide-version
4907 Enable statistics and hide HAProxy version reporting
Willy Tarreau1d45b7c2009-08-16 10:29:18 +02004908 May be used in sections : defaults | frontend | listen | backend
4909 yes | no | yes | yes
Willy Tarreaud63335a2010-02-26 12:56:52 +01004910 Arguments : none
Willy Tarreau1d45b7c2009-08-16 10:29:18 +02004911
Willy Tarreaud63335a2010-02-26 12:56:52 +01004912 By default, the stats page reports some useful status information along with
4913 the statistics. Among them is HAProxy's version. However, it is generally
4914 considered dangerous to report precise version to anyone, as it can help them
4915 target known weaknesses with specific attacks. The "stats hide-version"
4916 statement removes the version from the statistics report. This is recommended
4917 for public sites or any site with a weak login/password.
Willy Tarreau1d45b7c2009-08-16 10:29:18 +02004918
Krzysztof Piotr Oledzki48cb2ae2009-10-02 22:51:14 +02004919 Though this statement alone is enough to enable statistics reporting, it is
4920 recommended to set all other settings in order to avoid relying on default
4921 unobvious parameters.
4922
Willy Tarreaud63335a2010-02-26 12:56:52 +01004923 Example :
4924 # public access (limited to this backend only)
4925 backend public_www
4926 server srv1 192.168.0.1:80
Krzysztof Piotr Oledzki48cb2ae2009-10-02 22:51:14 +02004927 stats enable
Willy Tarreaud63335a2010-02-26 12:56:52 +01004928 stats hide-version
4929 stats scope .
4930 stats uri /admin?stats
4931 stats realm Haproxy\ Statistics
4932 stats auth admin1:AdMiN123
4933 stats auth admin2:AdMiN321
Willy Tarreau1d45b7c2009-08-16 10:29:18 +02004934
Willy Tarreau1d45b7c2009-08-16 10:29:18 +02004935 # internal monitoring access (unlimited)
4936 backend private_monitoring
4937 stats enable
Willy Tarreaud63335a2010-02-26 12:56:52 +01004938 stats uri /admin?stats
4939 stats refresh 5s
Krzysztof Piotr Oledzki15514c22010-01-04 16:03:09 +01004940
Willy Tarreaud63335a2010-02-26 12:56:52 +01004941 See also : "stats auth", "stats enable", "stats realm", "stats uri"
Willy Tarreau1d45b7c2009-08-16 10:29:18 +02004942
Willy Tarreau983e01e2010-01-11 18:42:06 +01004943
Cyril Bonté2be1b3f2010-09-30 23:46:30 +02004944stats http-request { allow | deny | auth [realm <realm>] }
4945 [ { if | unless } <condition> ]
4946 Access control for statistics
4947
4948 May be used in sections: defaults | frontend | listen | backend
4949 no | no | yes | yes
4950
4951 As "http-request", these set of options allow to fine control access to
4952 statistics. Each option may be followed by if/unless and acl.
4953 First option with matched condition (or option without condition) is final.
4954 For "deny" a 403 error will be returned, for "allow" normal processing is
4955 performed, for "auth" a 401/407 error code is returned so the client
4956 should be asked to enter a username and password.
4957
4958 There is no fixed limit to the number of http-request statements per
4959 instance.
4960
4961 See also : "http-request", section 3.4 about userlists and section 7
4962 about ACL usage.
4963
4964
Willy Tarreaueabeafa2008-01-16 16:17:06 +01004965stats realm <realm>
4966 Enable statistics and set authentication realm
4967 May be used in sections : defaults | frontend | listen | backend
4968 yes | no | yes | yes
4969 Arguments :
4970 <realm> is the name of the HTTP Basic Authentication realm reported to
4971 the browser. The browser uses it to display it in the pop-up
4972 inviting the user to enter a valid username and password.
4973
4974 The realm is read as a single word, so any spaces in it should be escaped
4975 using a backslash ('\').
4976
4977 This statement is useful only in conjunction with "stats auth" since it is
4978 only related to authentication.
4979
4980 Though this statement alone is enough to enable statistics reporting, it is
4981 recommended to set all other settings in order to avoid relying on default
4982 unobvious parameters.
4983
4984 Example :
4985 # public access (limited to this backend only)
4986 backend public_www
4987 server srv1 192.168.0.1:80
4988 stats enable
4989 stats hide-version
4990 stats scope .
4991 stats uri /admin?stats
4992 stats realm Haproxy\ Statistics
4993 stats auth admin1:AdMiN123
4994 stats auth admin2:AdMiN321
4995
4996 # internal monitoring access (unlimited)
4997 backend private_monitoring
4998 stats enable
4999 stats uri /admin?stats
5000 stats refresh 5s
5001
5002 See also : "stats auth", "stats enable", "stats uri"
5003
5004
5005stats refresh <delay>
5006 Enable statistics with automatic refresh
5007 May be used in sections : defaults | frontend | listen | backend
5008 yes | no | yes | yes
5009 Arguments :
5010 <delay> is the suggested refresh delay, specified in seconds, which will
5011 be returned to the browser consulting the report page. While the
5012 browser is free to apply any delay, it will generally respect it
5013 and refresh the page this every seconds. The refresh interval may
5014 be specified in any other non-default time unit, by suffixing the
5015 unit after the value, as explained at the top of this document.
5016
5017 This statement is useful on monitoring displays with a permanent page
5018 reporting the load balancer's activity. When set, the HTML report page will
5019 include a link "refresh"/"stop refresh" so that the user can select whether
5020 he wants automatic refresh of the page or not.
5021
5022 Though this statement alone is enough to enable statistics reporting, it is
5023 recommended to set all other settings in order to avoid relying on default
5024 unobvious parameters.
5025
5026 Example :
5027 # public access (limited to this backend only)
5028 backend public_www
5029 server srv1 192.168.0.1:80
5030 stats enable
5031 stats hide-version
5032 stats scope .
5033 stats uri /admin?stats
5034 stats realm Haproxy\ Statistics
5035 stats auth admin1:AdMiN123
5036 stats auth admin2:AdMiN321
5037
5038 # internal monitoring access (unlimited)
5039 backend private_monitoring
5040 stats enable
5041 stats uri /admin?stats
5042 stats refresh 5s
5043
5044 See also : "stats auth", "stats enable", "stats realm", "stats uri"
5045
5046
5047stats scope { <name> | "." }
5048 Enable statistics and limit access scope
5049 May be used in sections : defaults | frontend | listen | backend
5050 yes | no | yes | yes
5051 Arguments :
5052 <name> is the name of a listen, frontend or backend section to be
5053 reported. The special name "." (a single dot) designates the
5054 section in which the statement appears.
5055
5056 When this statement is specified, only the sections enumerated with this
5057 statement will appear in the report. All other ones will be hidden. This
5058 statement may appear as many times as needed if multiple sections need to be
5059 reported. Please note that the name checking is performed as simple string
5060 comparisons, and that it is never checked that a give section name really
5061 exists.
5062
5063 Though this statement alone is enough to enable statistics reporting, it is
5064 recommended to set all other settings in order to avoid relying on default
5065 unobvious parameters.
5066
5067 Example :
5068 # public access (limited to this backend only)
5069 backend public_www
5070 server srv1 192.168.0.1:80
5071 stats enable
5072 stats hide-version
5073 stats scope .
5074 stats uri /admin?stats
5075 stats realm Haproxy\ Statistics
5076 stats auth admin1:AdMiN123
5077 stats auth admin2:AdMiN321
5078
5079 # internal monitoring access (unlimited)
5080 backend private_monitoring
5081 stats enable
5082 stats uri /admin?stats
5083 stats refresh 5s
5084
5085 See also : "stats auth", "stats enable", "stats realm", "stats uri"
5086
Willy Tarreaud63335a2010-02-26 12:56:52 +01005087
Willy Tarreauc9705a12010-07-27 20:05:50 +02005088stats show-desc [ <desc> ]
Willy Tarreaud63335a2010-02-26 12:56:52 +01005089 Enable reporting of a description on the statistics page.
5090 May be used in sections : defaults | frontend | listen | backend
5091 yes | no | yes | yes
5092
Willy Tarreauc9705a12010-07-27 20:05:50 +02005093 <desc> is an optional description to be reported. If unspecified, the
Willy Tarreaud63335a2010-02-26 12:56:52 +01005094 description from global section is automatically used instead.
5095
5096 This statement is useful for users that offer shared services to their
5097 customers, where node or description should be different for each customer.
5098
5099 Though this statement alone is enough to enable statistics reporting, it is
5100 recommended to set all other settings in order to avoid relying on default
5101 unobvious parameters.
5102
5103 Example :
5104 # internal monitoring access (unlimited)
5105 backend private_monitoring
5106 stats enable
5107 stats show-desc Master node for Europe, Asia, Africa
5108 stats uri /admin?stats
5109 stats refresh 5s
5110
5111 See also: "show-node", "stats enable", "stats uri" and "description" in
5112 global section.
5113
5114
5115stats show-legends
5116 Enable reporting additional informations on the statistics page :
5117 - cap: capabilities (proxy)
5118 - mode: one of tcp, http or health (proxy)
5119 - id: SNMP ID (proxy, socket, server)
5120 - IP (socket, server)
5121 - cookie (backend, server)
5122
5123 Though this statement alone is enough to enable statistics reporting, it is
5124 recommended to set all other settings in order to avoid relying on default
5125 unobvious parameters.
5126
5127 See also: "stats enable", "stats uri".
5128
5129
5130stats show-node [ <name> ]
5131 Enable reporting of a host name on the statistics page.
5132 May be used in sections : defaults | frontend | listen | backend
5133 yes | no | yes | yes
5134 Arguments:
5135 <name> is an optional name to be reported. If unspecified, the
5136 node name from global section is automatically used instead.
5137
5138 This statement is useful for users that offer shared services to their
5139 customers, where node or description might be different on a stats page
5140 provided for each customer.
5141
5142 Though this statement alone is enough to enable statistics reporting, it is
5143 recommended to set all other settings in order to avoid relying on default
5144 unobvious parameters.
5145
5146 Example:
5147 # internal monitoring access (unlimited)
5148 backend private_monitoring
5149 stats enable
5150 stats show-node Europe-1
5151 stats uri /admin?stats
5152 stats refresh 5s
5153
5154 See also: "show-desc", "stats enable", "stats uri", and "node" in global
5155 section.
5156
Willy Tarreaueabeafa2008-01-16 16:17:06 +01005157
5158stats uri <prefix>
5159 Enable statistics and define the URI prefix to access them
5160 May be used in sections : defaults | frontend | listen | backend
5161 yes | no | yes | yes
5162 Arguments :
5163 <prefix> is the prefix of any URI which will be redirected to stats. This
5164 prefix may contain a question mark ('?') to indicate part of a
5165 query string.
5166
5167 The statistics URI is intercepted on the relayed traffic, so it appears as a
5168 page within the normal application. It is strongly advised to ensure that the
5169 selected URI will never appear in the application, otherwise it will never be
5170 possible to reach it in the application.
5171
5172 The default URI compiled in haproxy is "/haproxy?stats", but this may be
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01005173 changed at build time, so it's better to always explicitly specify it here.
Willy Tarreaueabeafa2008-01-16 16:17:06 +01005174 It is generally a good idea to include a question mark in the URI so that
5175 intermediate proxies refrain from caching the results. Also, since any string
5176 beginning with the prefix will be accepted as a stats request, the question
5177 mark helps ensuring that no valid URI will begin with the same words.
5178
5179 It is sometimes very convenient to use "/" as the URI prefix, and put that
5180 statement in a "listen" instance of its own. That makes it easy to dedicate
5181 an address or a port to statistics only.
5182
5183 Though this statement alone is enough to enable statistics reporting, it is
5184 recommended to set all other settings in order to avoid relying on default
5185 unobvious parameters.
5186
5187 Example :
5188 # public access (limited to this backend only)
5189 backend public_www
5190 server srv1 192.168.0.1:80
5191 stats enable
5192 stats hide-version
5193 stats scope .
5194 stats uri /admin?stats
5195 stats realm Haproxy\ Statistics
5196 stats auth admin1:AdMiN123
5197 stats auth admin2:AdMiN321
5198
5199 # internal monitoring access (unlimited)
5200 backend private_monitoring
5201 stats enable
5202 stats uri /admin?stats
5203 stats refresh 5s
5204
5205 See also : "stats auth", "stats enable", "stats realm"
5206
5207
Willy Tarreaud63335a2010-02-26 12:56:52 +01005208stick match <pattern> [table <table>] [{if | unless} <cond>]
5209 Define a request pattern matching condition to stick a user to a server
Willy Tarreaueabeafa2008-01-16 16:17:06 +01005210 May be used in sections : defaults | frontend | listen | backend
Willy Tarreaud63335a2010-02-26 12:56:52 +01005211 no | no | yes | yes
Willy Tarreaub937b7e2010-01-12 15:27:54 +01005212
5213 Arguments :
5214 <pattern> is a pattern extraction rule as described in section 7.8. It
5215 describes what elements of the incoming request or connection
5216 will be analysed in the hope to find a matching entry in a
5217 stickiness table. This rule is mandatory.
5218
5219 <table> is an optional stickiness table name. If unspecified, the same
5220 backend's table is used. A stickiness table is declared using
5221 the "stick-table" statement.
5222
5223 <cond> is an optional matching condition. It makes it possible to match
5224 on a certain criterion only when other conditions are met (or
5225 not met). For instance, it could be used to match on a source IP
5226 address except when a request passes through a known proxy, in
5227 which case we'd match on a header containing that IP address.
5228
5229 Some protocols or applications require complex stickiness rules and cannot
5230 always simply rely on cookies nor hashing. The "stick match" statement
5231 describes a rule to extract the stickiness criterion from an incoming request
5232 or connection. See section 7 for a complete list of possible patterns and
5233 transformation rules.
5234
5235 The table has to be declared using the "stick-table" statement. It must be of
5236 a type compatible with the pattern. By default it is the one which is present
5237 in the same backend. It is possible to share a table with other backends by
5238 referencing it using the "table" keyword. If another table is referenced,
5239 the server's ID inside the backends are used. By default, all server IDs
5240 start at 1 in each backend, so the server ordering is enough. But in case of
5241 doubt, it is highly recommended to force server IDs using their "id" setting.
5242
5243 It is possible to restrict the conditions where a "stick match" statement
5244 will apply, using "if" or "unless" followed by a condition. See section 7 for
5245 ACL based conditions.
5246
5247 There is no limit on the number of "stick match" statements. The first that
5248 applies and matches will cause the request to be directed to the same server
5249 as was used for the request which created the entry. That way, multiple
5250 matches can be used as fallbacks.
5251
5252 The stick rules are checked after the persistence cookies, so they will not
5253 affect stickiness if a cookie has already been used to select a server. That
5254 way, it becomes very easy to insert cookies and match on IP addresses in
5255 order to maintain stickiness between HTTP and HTTPS.
5256
5257 Example :
5258 # forward SMTP users to the same server they just used for POP in the
5259 # last 30 minutes
5260 backend pop
5261 mode tcp
5262 balance roundrobin
5263 stick store-request src
5264 stick-table type ip size 200k expire 30m
5265 server s1 192.168.1.1:110
5266 server s2 192.168.1.1:110
5267
5268 backend smtp
5269 mode tcp
5270 balance roundrobin
5271 stick match src table pop
5272 server s1 192.168.1.1:25
5273 server s2 192.168.1.1:25
5274
5275 See also : "stick-table", "stick on", and section 7 about ACLs and pattern
5276 extraction.
5277
5278
5279stick on <pattern> [table <table>] [{if | unless} <condition>]
5280 Define a request pattern to associate a user to a server
5281 May be used in sections : defaults | frontend | listen | backend
5282 no | no | yes | yes
5283
5284 Note : This form is exactly equivalent to "stick match" followed by
5285 "stick store-request", all with the same arguments. Please refer
5286 to both keywords for details. It is only provided as a convenience
5287 for writing more maintainable configurations.
5288
5289 Examples :
5290 # The following form ...
Willy Tarreauec579d82010-02-26 19:15:04 +01005291 stick on src table pop if !localhost
Willy Tarreaub937b7e2010-01-12 15:27:54 +01005292
5293 # ...is strictly equivalent to this one :
5294 stick match src table pop if !localhost
5295 stick store-request src table pop if !localhost
5296
5297
5298 # Use cookie persistence for HTTP, and stick on source address for HTTPS as
5299 # well as HTTP without cookie. Share the same table between both accesses.
5300 backend http
5301 mode http
5302 balance roundrobin
5303 stick on src table https
5304 cookie SRV insert indirect nocache
5305 server s1 192.168.1.1:80 cookie s1
5306 server s2 192.168.1.1:80 cookie s2
5307
5308 backend https
5309 mode tcp
5310 balance roundrobin
5311 stick-table type ip size 200k expire 30m
5312 stick on src
5313 server s1 192.168.1.1:443
5314 server s2 192.168.1.1:443
5315
5316 See also : "stick match" and "stick store-request"
5317
5318
5319stick store-request <pattern> [table <table>] [{if | unless} <condition>]
5320 Define a request pattern used to create an entry in a stickiness table
5321 May be used in sections : defaults | frontend | listen | backend
5322 no | no | yes | yes
5323
5324 Arguments :
5325 <pattern> is a pattern extraction rule as described in section 7.8. It
5326 describes what elements of the incoming request or connection
5327 will be analysed, extracted and stored in the table once a
5328 server is selected.
5329
5330 <table> is an optional stickiness table name. If unspecified, the same
5331 backend's table is used. A stickiness table is declared using
5332 the "stick-table" statement.
5333
5334 <cond> is an optional storage condition. It makes it possible to store
5335 certain criteria only when some conditions are met (or not met).
5336 For instance, it could be used to store the source IP address
5337 except when the request passes through a known proxy, in which
5338 case we'd store a converted form of a header containing that IP
5339 address.
5340
5341 Some protocols or applications require complex stickiness rules and cannot
5342 always simply rely on cookies nor hashing. The "stick store-request" statement
5343 describes a rule to decide what to extract from the request and when to do
5344 it, in order to store it into a stickiness table for further requests to
5345 match it using the "stick match" statement. Obviously the extracted part must
5346 make sense and have a chance to be matched in a further request. Storing a
5347 client's IP address for instance often makes sense. Storing an ID found in a
5348 URL parameter also makes sense. Storing a source port will almost never make
5349 any sense because it will be randomly matched. See section 7 for a complete
5350 list of possible patterns and transformation rules.
5351
5352 The table has to be declared using the "stick-table" statement. It must be of
5353 a type compatible with the pattern. By default it is the one which is present
5354 in the same backend. It is possible to share a table with other backends by
5355 referencing it using the "table" keyword. If another table is referenced,
5356 the server's ID inside the backends are used. By default, all server IDs
5357 start at 1 in each backend, so the server ordering is enough. But in case of
5358 doubt, it is highly recommended to force server IDs using their "id" setting.
5359
5360 It is possible to restrict the conditions where a "stick store-request"
5361 statement will apply, using "if" or "unless" followed by a condition. This
5362 condition will be evaluated while parsing the request, so any criteria can be
5363 used. See section 7 for ACL based conditions.
5364
5365 There is no limit on the number of "stick store-request" statements, but
5366 there is a limit of 8 simultaneous stores per request or response. This
5367 makes it possible to store up to 8 criteria, all extracted from either the
5368 request or the response, regardless of the number of rules. Only the 8 first
5369 ones which match will be kept. Using this, it is possible to feed multiple
5370 tables at once in the hope to increase the chance to recognize a user on
5371 another protocol or access method.
5372
5373 The "store-request" rules are evaluated once the server connection has been
5374 established, so that the table will contain the real server that processed
5375 the request.
5376
5377 Example :
5378 # forward SMTP users to the same server they just used for POP in the
5379 # last 30 minutes
5380 backend pop
5381 mode tcp
5382 balance roundrobin
5383 stick store-request src
5384 stick-table type ip size 200k expire 30m
5385 server s1 192.168.1.1:110
5386 server s2 192.168.1.1:110
5387
5388 backend smtp
5389 mode tcp
5390 balance roundrobin
5391 stick match src table pop
5392 server s1 192.168.1.1:25
5393 server s2 192.168.1.1:25
5394
5395 See also : "stick-table", "stick on", and section 7 about ACLs and pattern
5396 extraction.
5397
5398
Emeric Brun7c6b82e2010-09-24 16:34:28 +02005399stick-table type {ip | integer | string [len <length>] | binary [len <length>]}
5400 size <size> [expire <expire>] [nopurge] [store <data_type>]*
Willy Tarreaub937b7e2010-01-12 15:27:54 +01005401 Configure the stickiness table for the current backend
5402 May be used in sections : defaults | frontend | listen | backend
Willy Tarreauc00cdc22010-06-06 16:48:26 +02005403 no | yes | yes | yes
Willy Tarreaub937b7e2010-01-12 15:27:54 +01005404
5405 Arguments :
5406 ip a table declared with "type ip" will only store IPv4 addresses.
5407 This form is very compact (about 50 bytes per entry) and allows
5408 very fast entry lookup and stores with almost no overhead. This
5409 is mainly used to store client source IP addresses.
5410
5411 integer a table declared with "type integer" will store 32bit integers
5412 which can represent a client identifier found in a request for
5413 instance.
5414
5415 string a table declared with "type string" will store substrings of up
5416 to <len> characters. If the string provided by the pattern
5417 extractor is larger than <len>, it will be truncated before
5418 being stored. During matching, at most <len> characters will be
5419 compared between the string in the table and the extracted
5420 pattern. When not specified, the string is automatically limited
Emeric Brun7c6b82e2010-09-24 16:34:28 +02005421 to 32 characters.
5422
5423 binary a table declared with "type binary" will store binary blocks
5424 of <len> bytes. If the block provided by the pattern
5425 extractor is larger than <len>, it will be truncated before
5426 being stored. If the block provided by the pattern extractor
5427 is shorter than <len>, it will be padded by 0. When not
5428 specified, the block is automatically limited to 32 bytes.
Willy Tarreaub937b7e2010-01-12 15:27:54 +01005429
5430 <length> is the maximum number of characters that will be stored in a
Emeric Brun7c6b82e2010-09-24 16:34:28 +02005431 "string" type table (See type "string" above). Or the number
5432 of bytes of the block in "binary" type table. Be careful when
Willy Tarreaub937b7e2010-01-12 15:27:54 +01005433 changing this parameter as memory usage will proportionally
5434 increase.
5435
5436 <size> is the maximum number of entries that can fit in the table. This
Cyril Bonté78caf842010-03-10 22:41:43 +01005437 value directly impacts memory usage. Count approximately
5438 50 bytes per entry, plus the size of a string if any. The size
5439 supports suffixes "k", "m", "g" for 2^10, 2^20 and 2^30 factors.
Willy Tarreaub937b7e2010-01-12 15:27:54 +01005440
5441 [nopurge] indicates that we refuse to purge older entries when the table
5442 is full. When not specified and the table is full when haproxy
5443 wants to store an entry in it, it will flush a few of the oldest
5444 entries in order to release some space for the new ones. This is
5445 most often the desired behaviour. In some specific cases, it
5446 be desirable to refuse new entries instead of purging the older
5447 ones. That may be the case when the amount of data to store is
5448 far above the hardware limits and we prefer not to offer access
5449 to new clients than to reject the ones already connected. When
5450 using this parameter, be sure to properly set the "expire"
5451 parameter (see below).
5452
5453 <expire> defines the maximum duration of an entry in the table since it
5454 was last created, refreshed or matched. The expiration delay is
5455 defined using the standard time format, similarly as the various
5456 timeouts. The maximum duration is slightly above 24 days. See
5457 section 2.2 for more information. If this delay is not specified,
5458 the session won't automatically expire, but older entries will
5459 be removed once full. Be sure not to use the "nopurge" parameter
5460 if not expiration delay is specified.
5461
Willy Tarreau08d5f982010-06-06 13:34:54 +02005462 <data_type> is used to store additional information in the stick-table. This
5463 may be used by ACLs in order to control various criteria related
5464 to the activity of the client matching the stick-table. For each
5465 item specified here, the size of each entry will be inflated so
Willy Tarreauc9705a12010-07-27 20:05:50 +02005466 that the additional data can fit. Several data types may be
5467 stored with an entry. Multiple data types may be specified after
5468 the "store" keyword, as a comma-separated list. Alternatively,
5469 it is possible to repeat the "store" keyword followed by one or
5470 several data types. Except for the "server_id" type which is
5471 automatically detected and enabled, all data types must be
5472 explicitly declared to be stored. If an ACL references a data
5473 type which is not stored, the ACL will simply not match. Some
5474 data types require an argument which must be passed just after
5475 the type between parenthesis. See below for the supported data
5476 types and their arguments.
5477
5478 The data types that can be stored with an entry are the following :
5479 - server_id : this is an integer which holds the numeric ID of the server a
5480 request was assigned to. It is used by the "stick match", "stick store",
5481 and "stick on" rules. It is automatically enabled when referenced.
5482
5483 - gpc0 : first General Purpose Counter. It is a positive 32-bit integer
5484 integer which may be used for anything. Most of the time it will be used
5485 to put a special tag on some entries, for instance to note that a
5486 specific behaviour was detected and must be known for future matches.
5487
5488 - conn_cnt : Connection Count. It is a positive 32-bit integer which counts
5489 the absolute number of connections received from clients which matched
5490 this entry. It does not mean the connections were accepted, just that
5491 they were received.
5492
5493 - conn_cur : Current Connections. It is a positive 32-bit integer which
5494 stores the concurrent connection counts for the entry. It is incremented
5495 once an incoming connection matches the entry, and decremented once the
5496 connection leaves. That way it is possible to know at any time the exact
5497 number of concurrent connections for an entry.
5498
5499 - conn_rate(<period>) : frequency counter (takes 12 bytes). It takes an
5500 integer parameter <period> which indicates in milliseconds the length
5501 of the period over which the average is measured. It reports the average
5502 incoming connection rate over that period, in connections per period. The
5503 result is an integer which can be matched using ACLs.
5504
5505 - sess_cnt : Session Count. It is a positive 32-bit integer which counts
5506 the absolute number of sessions received from clients which matched this
5507 entry. A session is a connection that was accepted by the layer 4 rules.
5508
5509 - sess_rate(<period>) : frequency counter (takes 12 bytes). It takes an
5510 integer parameter <period> which indicates in milliseconds the length
5511 of the period over which the average is measured. It reports the average
5512 incoming session rate over that period, in sessions per period. The
5513 result is an integer which can be matched using ACLs.
5514
5515 - http_req_cnt : HTTP request Count. It is a positive 32-bit integer which
5516 counts the absolute number of HTTP requests received from clients which
5517 matched this entry. It does not matter whether they are valid requests or
5518 not. Note that this is different from sessions when keep-alive is used on
5519 the client side.
5520
5521 - http_req_rate(<period>) : frequency counter (takes 12 bytes). It takes an
5522 integer parameter <period> which indicates in milliseconds the length
5523 of the period over which the average is measured. It reports the average
5524 HTTP request rate over that period, in requests per period. The result is
5525 an integer which can be matched using ACLs. It does not matter whether
5526 they are valid requests or not. Note that this is different from sessions
5527 when keep-alive is used on the client side.
5528
5529 - http_err_cnt : HTTP Error Count. It is a positive 32-bit integer which
5530 counts the absolute number of HTTP requests errors induced by clients
5531 which matched this entry. Errors are counted on invalid and truncated
5532 requests, as well as on denied or tarpitted requests, and on failed
5533 authentications. If the server responds with 4xx, then the request is
5534 also counted as an error since it's an error triggered by the client
5535 (eg: vulnerability scan).
5536
5537 - http_err_rate(<period>) : frequency counter (takes 12 bytes). It takes an
5538 integer parameter <period> which indicates in milliseconds the length
5539 of the period over which the average is measured. It reports the average
5540 HTTP request error rate over that period, in requests per period (see
5541 http_err_cnt above for what is accounted as an error). The result is an
5542 integer which can be matched using ACLs.
5543
5544 - bytes_in_cnt : client to server byte count. It is a positive 64-bit
5545 integer which counts the cumulated amount of bytes received from clients
5546 which matched this entry. Headers are included in the count. This may be
5547 used to limit abuse of upload features on photo or video servers.
5548
5549 - bytes_in_rate(<period>) : frequency counter (takes 12 bytes). It takes an
5550 integer parameter <period> which indicates in milliseconds the length
5551 of the period over which the average is measured. It reports the average
5552 incoming bytes rate over that period, in bytes per period. It may be used
5553 to detect users which upload too much and too fast. Warning: with large
5554 uploads, it is possible that the amount of uploaded data will be counted
5555 once upon termination, thus causing spikes in the average transfer speed
5556 instead of having a smooth one. This may partially be smoothed with
5557 "option contstats" though this is not perfect yet. Use of byte_in_cnt is
5558 recommended for better fairness.
5559
5560 - bytes_out_cnt : server to client byte count. It is a positive 64-bit
5561 integer which counts the cumulated amount of bytes sent to clients which
5562 matched this entry. Headers are included in the count. This may be used
5563 to limit abuse of bots sucking the whole site.
5564
5565 - bytes_out_rate(<period>) : frequency counter (takes 12 bytes). It takes
5566 an integer parameter <period> which indicates in milliseconds the length
5567 of the period over which the average is measured. It reports the average
5568 outgoing bytes rate over that period, in bytes per period. It may be used
5569 to detect users which download too much and too fast. Warning: with large
5570 transfers, it is possible that the amount of transferred data will be
5571 counted once upon termination, thus causing spikes in the average
5572 transfer speed instead of having a smooth one. This may partially be
5573 smoothed with "option contstats" though this is not perfect yet. Use of
5574 byte_out_cnt is recommended for better fairness.
Willy Tarreau08d5f982010-06-06 13:34:54 +02005575
Willy Tarreauc00cdc22010-06-06 16:48:26 +02005576 There is only one stick-table per proxy. At the moment of writing this doc,
5577 it does not seem useful to have multiple tables per proxy. If this happens
Willy Tarreaub937b7e2010-01-12 15:27:54 +01005578 to be required, simply create a dummy backend with a stick-table in it and
5579 reference it.
5580
5581 It is important to understand that stickiness based on learning information
5582 has some limitations, including the fact that all learned associations are
5583 lost upon restart. In general it can be good as a complement but not always
5584 as an exclusive stickiness.
5585
Willy Tarreauc9705a12010-07-27 20:05:50 +02005586 Last, memory requirements may be important when storing many data types.
5587 Indeed, storing all indicators above at once in each entry requires 116 bytes
5588 per entry, or 116 MB for a 1-million entries table. This is definitely not
5589 something that can be ignored.
5590
5591 Example:
5592 # Keep track of counters of up to 1 million IP addresses over 5 minutes
5593 # and store a general purpose counter and the average connection rate
5594 # computed over a sliding window of 30 seconds.
5595 stick-table type ip size 1m expire 5m store gpc0,conn_rate(30s)
5596
5597 See also : "stick match", "stick on", "stick store-request", section 2.2
5598 about time format and section 7 avoud ACLs.
Willy Tarreaub937b7e2010-01-12 15:27:54 +01005599
5600
Willy Tarreaue9656522010-08-17 15:40:09 +02005601tcp-request connection <action> [{if | unless} <condition>]
5602 Perform an action on an incoming connection depending on a layer 4 condition
Willy Tarreau1a687942010-05-23 22:40:30 +02005603 May be used in sections : defaults | frontend | listen | backend
5604 no | yes | yes | no
Willy Tarreaue9656522010-08-17 15:40:09 +02005605 Arguments :
5606 <action> defines the action to perform if the condition applies. Valid
5607 actions include : "accept", "reject", "track-sc1", "track-sc2".
5608 See below for more details.
Willy Tarreau1a687942010-05-23 22:40:30 +02005609
Willy Tarreaue9656522010-08-17 15:40:09 +02005610 <condition> is a standard layer4-only ACL-based condition (see section 7).
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005611
5612 Immediately after acceptance of a new incoming connection, it is possible to
5613 evaluate some conditions to decide whether this connection must be accepted
Willy Tarreaue9656522010-08-17 15:40:09 +02005614 or dropped or have its counters tracked. Those conditions cannot make use of
5615 any data contents because the connection has not been read from yet, and the
5616 buffers are not yet allocated. This is used to selectively and very quickly
5617 accept or drop connections from various sources with a very low overhead. If
5618 some contents need to be inspected in order to take the decision, the
5619 "tcp-request content" statements must be used instead.
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005620
Willy Tarreaue9656522010-08-17 15:40:09 +02005621 The "tcp-request connection" rules are evaluated in their exact declaration
5622 order. If no rule matches or if there is no rule, the default action is to
5623 accept the incoming connection. There is no specific limit to the number of
5624 rules which may be inserted.
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005625
Willy Tarreaue9656522010-08-17 15:40:09 +02005626 Three types of actions are supported :
5627 - accept :
5628 accepts the connection if the condition is true (when used with "if")
5629 or false (when used with "unless"). The first such rule executed ends
5630 the rules evaluation.
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005631
Willy Tarreaue9656522010-08-17 15:40:09 +02005632 - reject :
5633 rejects the connection if the condition is true (when used with "if")
5634 or false (when used with "unless"). The first such rule executed ends
5635 the rules evaluation. Rejected connections do not even become a
5636 session, which is why they are accounted separately for in the stats,
5637 as "denied connections". They are not considered for the session
5638 rate-limit and are not logged either. The reason is that these rules
5639 should only be used to filter extremely high connection rates such as
5640 the ones encountered during a massive DDoS attack. Under these extreme
5641 conditions, the simple action of logging each event would make the
5642 system collapse and would considerably lower the filtering capacity. If
5643 logging is absolutely desired, then "tcp-request content" rules should
5644 be used instead.
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005645
Willy Tarreaue9656522010-08-17 15:40:09 +02005646 - { track-sc1 | track-sc2 } <key> [table <table>] :
5647 enables tracking of sticky counters from current connection. These
5648 rules do not stop evaluation and do not change default action. Two sets
5649 of counters may be simultaneously tracked by the same connection. The
5650 first "track-sc1" rule executed enables tracking of the counters of the
5651 specified table as the first set. The first "track-sc2" rule executed
5652 enables tracking of the counters of the specified table as the second
5653 set. It is a recommended practice to use the first set of counters for
5654 the per-frontend counters and the second set for the per-backend ones.
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005655
Willy Tarreaue9656522010-08-17 15:40:09 +02005656 These actions take one or two arguments :
5657 <key> is mandatory, and defines the criterion the tracking key will
5658 be derived from. At the moment, only "src" is supported. With
5659 it, the key will be the connection's source IPv4 address.
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005660
Willy Tarreaue9656522010-08-17 15:40:09 +02005661 <table> is an optional table to be used instead of the default one,
5662 which is the stick-table declared in the current proxy. All
5663 the counters for the matches and updates for the key will
5664 then be performed in that table until the session ends.
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005665
Willy Tarreaue9656522010-08-17 15:40:09 +02005666 Once a "track-sc*" rule is executed, the key is looked up in the table
5667 and if it is not found, an entry is allocated for it. Then a pointer to
5668 that entry is kept during all the session's life, and this entry's
5669 counters are updated as often as possible, every time the session's
5670 counters are updated, and also systematically when the session ends.
5671 If the entry tracks concurrent connection counters, one connection is
5672 counted for as long as the entry is tracked, and the entry will not
5673 expire during that time. Tracking counters also provides a performance
5674 advantage over just checking the keys, because only one table lookup is
5675 performed for all ACL checks that make use of it.
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005676
Willy Tarreaue9656522010-08-17 15:40:09 +02005677 Note that the "if/unless" condition is optional. If no condition is set on
5678 the action, it is simply performed unconditionally. That can be useful for
5679 "track-sc*" actions as well as for changing the default action to a reject.
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005680
Willy Tarreaue9656522010-08-17 15:40:09 +02005681 Example: accept all connections from white-listed hosts, reject too fast
5682 connection without counting them, and track accepted connections.
5683 This results in connection rate being capped from abusive sources.
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005684
Willy Tarreaue9656522010-08-17 15:40:09 +02005685 tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005686 tcp-request connection reject if { src_conn_rate gt 10 }
Willy Tarreaue9656522010-08-17 15:40:09 +02005687 tcp-request connection track-sc1 src
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005688
Willy Tarreaue9656522010-08-17 15:40:09 +02005689 Example: accept all connections from white-listed hosts, count all other
5690 connections and reject too fast ones. This results in abusive ones
5691 being blocked as long as they don't slow down.
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005692
Willy Tarreaue9656522010-08-17 15:40:09 +02005693 tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
5694 tcp-request connection track-sc1 src
5695 tcp-request connection reject if { sc1_conn_rate gt 10 }
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005696
5697 See section 7 about ACL usage.
5698
Willy Tarreaue9656522010-08-17 15:40:09 +02005699 See also : "tcp-request content", "stick-table"
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005700
5701
Willy Tarreaue9656522010-08-17 15:40:09 +02005702tcp-request content <action> [{if | unless} <condition>]
5703 Perform an action on a new session depending on a layer 4-7 condition
Willy Tarreau62644772008-07-16 18:36:06 +02005704 May be used in sections : defaults | frontend | listen | backend
Willy Tarreaufb356202010-08-03 14:02:05 +02005705 no | yes | yes | yes
Willy Tarreaue9656522010-08-17 15:40:09 +02005706 Arguments :
5707 <action> defines the action to perform if the condition applies. Valid
5708 actions include : "accept", "reject", "track-sc1", "track-sc2".
5709 See "tcp-request connection" above for their signification.
Willy Tarreau62644772008-07-16 18:36:06 +02005710
Willy Tarreaue9656522010-08-17 15:40:09 +02005711 <condition> is a standard layer 4-7 ACL-based condition (see section 7).
Willy Tarreau62644772008-07-16 18:36:06 +02005712
Willy Tarreaue9656522010-08-17 15:40:09 +02005713 A request's contents can be analysed at an early stage of request processing
5714 called "TCP content inspection". During this stage, ACL-based rules are
5715 evaluated every time the request contents are updated, until either an
5716 "accept" or a "reject" rule matches, or the TCP request inspection delay
5717 expires with no matching rule.
Willy Tarreau62644772008-07-16 18:36:06 +02005718
Willy Tarreaue9656522010-08-17 15:40:09 +02005719 The first difference between these rules and "tcp-request connection" rules
5720 is that "tcp-request content" rules can make use of contents to take a
5721 decision. Most often, these decisions will consider a protocol recognition or
5722 validity. The second difference is that content-based rules can be used in
5723 both frontends and backends. In frontends, they will be evaluated upon new
5724 connections. In backends, they will be evaluated once a session is assigned
5725 a backend. This means that a single frontend connection may be evaluated
5726 several times by one or multiple backends when a session gets reassigned
5727 (for instance after a client-side HTTP keep-alive request).
Willy Tarreau62644772008-07-16 18:36:06 +02005728
Willy Tarreaue9656522010-08-17 15:40:09 +02005729 Content-based rules are evaluated in their exact declaration order. If no
5730 rule matches or if there is no rule, the default action is to accept the
5731 contents. There is no specific limit to the number of rules which may be
5732 inserted.
Willy Tarreau62644772008-07-16 18:36:06 +02005733
Willy Tarreaue9656522010-08-17 15:40:09 +02005734 Three types of actions are supported :
5735 - accept :
5736 - reject :
5737 - { track-sc1 | track-sc2 } <key> [table <table>]
Willy Tarreau62644772008-07-16 18:36:06 +02005738
Willy Tarreaue9656522010-08-17 15:40:09 +02005739 They have the same meaning as their counter-parts in "tcp-request connection"
5740 so please refer to that section for a complete description.
Willy Tarreau62644772008-07-16 18:36:06 +02005741
Willy Tarreaue9656522010-08-17 15:40:09 +02005742 Also, it is worth noting that if sticky counters are tracked from a rule
5743 defined in a backend, this tracking will automatically end when the session
5744 releases the backend. That allows per-backend counter tracking even in case
5745 of HTTP keep-alive requests when the backend changes. While there is nothing
5746 mandatory about it, it is recommended to use the track-sc1 pointer to track
5747 per-frontend counters and track-sc2 to track per-backend counters.
Willy Tarreau62644772008-07-16 18:36:06 +02005748
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01005749 Note that the "if/unless" condition is optional. If no condition is set on
Willy Tarreaue9656522010-08-17 15:40:09 +02005750 the action, it is simply performed unconditionally. That can be useful for
5751 "track-sc*" actions as well as for changing the default action to a reject.
Willy Tarreau62644772008-07-16 18:36:06 +02005752
Willy Tarreaue9656522010-08-17 15:40:09 +02005753 It is perfectly possible to match layer 7 contents with "tcp-request content"
5754 rules, but then it is important to ensure that a full request has been
5755 buffered, otherwise no contents will match. In order to achieve this, the
5756 best solution involves detecting the HTTP protocol during the inspection
5757 period.
Willy Tarreau62644772008-07-16 18:36:06 +02005758
5759 Example:
Willy Tarreaue9656522010-08-17 15:40:09 +02005760 # Accept HTTP requests containing a Host header saying "example.com"
5761 # and reject everything else.
5762 acl is_host_com hdr(Host) -i example.com
5763 tcp-request inspect-delay 30s
5764 tcp-request content accept if HTTP is_host_com
5765 tcp-request content reject
5766
5767 Example:
Willy Tarreau62644772008-07-16 18:36:06 +02005768 # reject SMTP connection if client speaks first
5769 tcp-request inspect-delay 30s
5770 acl content_present req_len gt 0
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005771 tcp-request content reject if content_present
Willy Tarreau62644772008-07-16 18:36:06 +02005772
5773 # Forward HTTPS connection only if client speaks
5774 tcp-request inspect-delay 30s
5775 acl content_present req_len gt 0
Willy Tarreau68c03ab2010-08-06 15:08:45 +02005776 tcp-request content accept if content_present
Willy Tarreaue9656522010-08-17 15:40:09 +02005777 tcp-request content reject
5778
5779 Example: track per-frontend and per-backend counters, block abusers at the
5780 frontend when the backend detects abuse.
5781
5782 frontend http
5783 # Use General Purpose Couter 0 in SC1 as a global abuse counter
5784 # protecting all our sites
5785 stick-table type ip size 1m expire 5m store gpc0
5786 tcp-request connection track-sc1 src
5787 tcp-request connection reject if { sc1_get_gpc0 gt 0 }
5788 ...
5789 use_backend http_dynamic if { path_end .php }
5790
5791 backend http_dynamic
5792 # if a source makes too fast requests to this dynamic site (tracked
5793 # by SC2), block it globally in the frontend.
5794 stick-table type ip size 1m expire 5m store http_req_rate(10s)
5795 acl click_too_fast sc2_http_req_rate gt 10
5796 acl mark_as_abuser sc1_inc_gpc0
5797 tcp-request content track-sc2 src
5798 tcp-request content reject if click_too_fast mark_as_abuser
Willy Tarreau62644772008-07-16 18:36:06 +02005799
Willy Tarreauc57f0e22009-05-10 13:12:33 +02005800 See section 7 about ACL usage.
Willy Tarreau62644772008-07-16 18:36:06 +02005801
Willy Tarreaue9656522010-08-17 15:40:09 +02005802 See also : "tcp-request connection", "tcp-request inspect-delay"
Willy Tarreau62644772008-07-16 18:36:06 +02005803
5804
5805tcp-request inspect-delay <timeout>
5806 Set the maximum allowed time to wait for data during content inspection
5807 May be used in sections : defaults | frontend | listen | backend
Willy Tarreaufb356202010-08-03 14:02:05 +02005808 no | yes | yes | yes
Willy Tarreau62644772008-07-16 18:36:06 +02005809 Arguments :
5810 <timeout> is the timeout value specified in milliseconds by default, but
5811 can be in any other unit if the number is suffixed by the unit,
5812 as explained at the top of this document.
5813
5814 People using haproxy primarily as a TCP relay are often worried about the
5815 risk of passing any type of protocol to a server without any analysis. In
5816 order to be able to analyze the request contents, we must first withhold
5817 the data then analyze them. This statement simply enables withholding of
5818 data for at most the specified amount of time.
5819
Willy Tarreaufb356202010-08-03 14:02:05 +02005820 TCP content inspection applies very early when a connection reaches a
5821 frontend, then very early when the connection is forwarded to a backend. This
5822 means that a connection may experience a first delay in the frontend and a
5823 second delay in the backend if both have tcp-request rules.
5824
Willy Tarreau62644772008-07-16 18:36:06 +02005825 Note that when performing content inspection, haproxy will evaluate the whole
5826 rules for every new chunk which gets in, taking into account the fact that
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01005827 those data are partial. If no rule matches before the aforementioned delay,
Willy Tarreau62644772008-07-16 18:36:06 +02005828 a last check is performed upon expiration, this time considering that the
Willy Tarreaud869b242009-03-15 14:43:58 +01005829 contents are definitive. If no delay is set, haproxy will not wait at all
5830 and will immediately apply a verdict based on the available information.
5831 Obviously this is unlikely to be very useful and might even be racy, so such
5832 setups are not recommended.
Willy Tarreau62644772008-07-16 18:36:06 +02005833
5834 As soon as a rule matches, the request is released and continues as usual. If
5835 the timeout is reached and no rule matches, the default policy will be to let
5836 it pass through unaffected.
5837
5838 For most protocols, it is enough to set it to a few seconds, as most clients
5839 send the full request immediately upon connection. Add 3 or more seconds to
5840 cover TCP retransmits but that's all. For some protocols, it may make sense
Willy Tarreaud72758d2010-01-12 10:42:19 +01005841 to use large values, for instance to ensure that the client never talks
Willy Tarreau62644772008-07-16 18:36:06 +02005842 before the server (eg: SMTP), or to wait for a client to talk before passing
5843 data to the server (eg: SSL). Note that the client timeout must cover at
Willy Tarreaub824b002010-09-29 16:36:16 +02005844 least the inspection delay, otherwise it will expire first. If the client
5845 closes the connection or if the buffer is full, the delay immediately expires
5846 since the contents will not be able to change anymore.
Willy Tarreau62644772008-07-16 18:36:06 +02005847
Willy Tarreau55165fe2009-05-10 12:02:55 +02005848 See also : "tcp-request content accept", "tcp-request content reject",
Willy Tarreau62644772008-07-16 18:36:06 +02005849 "timeout client".
5850
5851
Emeric Brun0a3b67f2010-09-24 15:34:53 +02005852tcp-response content <action> [{if | unless} <condition>]
5853 Perform an action on a session response depending on a layer 4-7 condition
5854 May be used in sections : defaults | frontend | listen | backend
5855 no | no | yes | yes
5856 Arguments :
5857 <action> defines the action to perform if the condition applies. Valid
5858 actions include : "accept", "reject".
5859 See "tcp-request connection" above for their signification.
5860
5861 <condition> is a standard layer 4-7 ACL-based condition (see section 7).
5862
5863 Response contents can be analysed at an early stage of response processing
5864 called "TCP content inspection". During this stage, ACL-based rules are
5865 evaluated every time the response contents are updated, until either an
5866 "accept" or a "reject" rule matches, or a TCP response inspection delay is
5867 set and expires with no matching rule.
5868
5869 Most often, these decisions will consider a protocol recognition or validity.
5870
5871 Content-based rules are evaluated in their exact declaration order. If no
5872 rule matches or if there is no rule, the default action is to accept the
5873 contents. There is no specific limit to the number of rules which may be
5874 inserted.
5875
5876 Two types of actions are supported :
5877 - accept :
5878 accepts the response if the condition is true (when used with "if")
5879 or false (when used with "unless"). The first such rule executed ends
5880 the rules evaluation.
5881
5882 - reject :
5883 rejects the response if the condition is true (when used with "if")
5884 or false (when used with "unless"). The first such rule executed ends
5885 the rules evaluation. Rejected session are immediatly closed.
5886
5887 Note that the "if/unless" condition is optional. If no condition is set on
5888 the action, it is simply performed unconditionally. That can be useful for
5889 for changing the default action to a reject.
5890
5891 It is perfectly possible to match layer 7 contents with "tcp-reponse content"
5892 rules, but then it is important to ensure that a full response has been
5893 buffered, otherwise no contents will match. In order to achieve this, the
5894 best solution involves detecting the HTTP protocol during the inspection
5895 period.
5896
5897 See section 7 about ACL usage.
5898
5899 See also : "tcp-request content", "tcp-response inspect-delay"
5900
5901
5902tcp-response inspect-delay <timeout>
5903 Set the maximum allowed time to wait for a response during content inspection
5904 May be used in sections : defaults | frontend | listen | backend
5905 no | no | yes | yes
5906 Arguments :
5907 <timeout> is the timeout value specified in milliseconds by default, but
5908 can be in any other unit if the number is suffixed by the unit,
5909 as explained at the top of this document.
5910
5911 See also : "tcp-response content", "tcp-request inspect-delay".
5912
5913
Krzysztof Piotr Oledzki5259dfe2008-01-21 01:54:06 +01005914timeout check <timeout>
5915 Set additional check timeout, but only after a connection has been already
5916 established.
5917
5918 May be used in sections: defaults | frontend | listen | backend
5919 yes | no | yes | yes
5920 Arguments:
5921 <timeout> is the timeout value specified in milliseconds by default, but
5922 can be in any other unit if the number is suffixed by the unit,
5923 as explained at the top of this document.
5924
5925 If set, haproxy uses min("timeout connect", "inter") as a connect timeout
5926 for check and "timeout check" as an additional read timeout. The "min" is
5927 used so that people running with *very* long "timeout connect" (eg. those
5928 who needed this due to the queue or tarpit) do not slow down their checks.
Willy Tarreaud7550a22010-02-10 05:10:19 +01005929 (Please also note that there is no valid reason to have such long connect
5930 timeouts, because "timeout queue" and "timeout tarpit" can always be used to
5931 avoid that).
Krzysztof Piotr Oledzki5259dfe2008-01-21 01:54:06 +01005932
5933 If "timeout check" is not set haproxy uses "inter" for complete check
5934 timeout (connect + read) exactly like all <1.3.15 version.
5935
5936 In most cases check request is much simpler and faster to handle than normal
5937 requests and people may want to kick out laggy servers so this timeout should
Willy Tarreau41a340d2008-01-22 12:25:31 +01005938 be smaller than "timeout server".
Krzysztof Piotr Oledzki5259dfe2008-01-21 01:54:06 +01005939
5940 This parameter is specific to backends, but can be specified once for all in
5941 "defaults" sections. This is in fact one of the easiest solutions not to
5942 forget about it.
5943
Willy Tarreau41a340d2008-01-22 12:25:31 +01005944 See also: "timeout connect", "timeout queue", "timeout server",
5945 "timeout tarpit".
Krzysztof Piotr Oledzki5259dfe2008-01-21 01:54:06 +01005946
5947
Willy Tarreau0ba27502007-12-24 16:55:16 +01005948timeout client <timeout>
5949timeout clitimeout <timeout> (deprecated)
5950 Set the maximum inactivity time on the client side.
5951 May be used in sections : defaults | frontend | listen | backend
5952 yes | yes | yes | no
5953 Arguments :
Willy Tarreau844e3c52008-01-11 16:28:18 +01005954 <timeout> is the timeout value specified in milliseconds by default, but
Willy Tarreau0ba27502007-12-24 16:55:16 +01005955 can be in any other unit if the number is suffixed by the unit,
5956 as explained at the top of this document.
5957
5958 The inactivity timeout applies when the client is expected to acknowledge or
5959 send data. In HTTP mode, this timeout is particularly important to consider
5960 during the first phase, when the client sends the request, and during the
5961 response while it is reading data sent by the server. The value is specified
5962 in milliseconds by default, but can be in any other unit if the number is
5963 suffixed by the unit, as specified at the top of this document. In TCP mode
5964 (and to a lesser extent, in HTTP mode), it is highly recommended that the
5965 client timeout remains equal to the server timeout in order to avoid complex
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01005966 situations to debug. It is a good practice to cover one or several TCP packet
Willy Tarreau0ba27502007-12-24 16:55:16 +01005967 losses by specifying timeouts that are slightly above multiples of 3 seconds
5968 (eg: 4 or 5 seconds).
5969
5970 This parameter is specific to frontends, but can be specified once for all in
5971 "defaults" sections. This is in fact one of the easiest solutions not to
5972 forget about it. An unspecified timeout results in an infinite timeout, which
5973 is not recommended. Such a usage is accepted and works but reports a warning
5974 during startup because it may results in accumulation of expired sessions in
5975 the system if the system's timeouts are not configured either.
5976
5977 This parameter replaces the old, deprecated "clitimeout". It is recommended
5978 to use it to write new configurations. The form "timeout clitimeout" is
5979 provided only by backwards compatibility but its use is strongly discouraged.
5980
5981 See also : "clitimeout", "timeout server".
5982
5983
5984timeout connect <timeout>
5985timeout contimeout <timeout> (deprecated)
5986 Set the maximum time to wait for a connection attempt to a server to succeed.
5987 May be used in sections : defaults | frontend | listen | backend
5988 yes | no | yes | yes
5989 Arguments :
Willy Tarreau844e3c52008-01-11 16:28:18 +01005990 <timeout> is the timeout value specified in milliseconds by default, but
Willy Tarreau0ba27502007-12-24 16:55:16 +01005991 can be in any other unit if the number is suffixed by the unit,
5992 as explained at the top of this document.
5993
5994 If the server is located on the same LAN as haproxy, the connection should be
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01005995 immediate (less than a few milliseconds). Anyway, it is a good practice to
Willy Tarreaud72758d2010-01-12 10:42:19 +01005996 cover one or several TCP packet losses by specifying timeouts that are
Willy Tarreau0ba27502007-12-24 16:55:16 +01005997 slightly above multiples of 3 seconds (eg: 4 or 5 seconds). By default, the
Krzysztof Piotr Oledzki5259dfe2008-01-21 01:54:06 +01005998 connect timeout also presets both queue and tarpit timeouts to the same value
5999 if these have not been specified.
Willy Tarreau0ba27502007-12-24 16:55:16 +01006000
6001 This parameter is specific to backends, but can be specified once for all in
6002 "defaults" sections. This is in fact one of the easiest solutions not to
6003 forget about it. An unspecified timeout results in an infinite timeout, which
6004 is not recommended. Such a usage is accepted and works but reports a warning
6005 during startup because it may results in accumulation of failed sessions in
6006 the system if the system's timeouts are not configured either.
6007
6008 This parameter replaces the old, deprecated "contimeout". It is recommended
6009 to use it to write new configurations. The form "timeout contimeout" is
6010 provided only by backwards compatibility but its use is strongly discouraged.
6011
Willy Tarreau41a340d2008-01-22 12:25:31 +01006012 See also: "timeout check", "timeout queue", "timeout server", "contimeout",
6013 "timeout tarpit".
Willy Tarreau0ba27502007-12-24 16:55:16 +01006014
6015
Willy Tarreaub16a5742010-01-10 14:46:16 +01006016timeout http-keep-alive <timeout>
6017 Set the maximum allowed time to wait for a new HTTP request to appear
6018 May be used in sections : defaults | frontend | listen | backend
6019 yes | yes | yes | yes
6020 Arguments :
6021 <timeout> is the timeout value specified in milliseconds by default, but
6022 can be in any other unit if the number is suffixed by the unit,
6023 as explained at the top of this document.
6024
6025 By default, the time to wait for a new request in case of keep-alive is set
6026 by "timeout http-request". However this is not always convenient because some
6027 people want very short keep-alive timeouts in order to release connections
6028 faster, and others prefer to have larger ones but still have short timeouts
6029 once the request has started to present itself.
6030
6031 The "http-keep-alive" timeout covers these needs. It will define how long to
6032 wait for a new HTTP request to start coming after a response was sent. Once
6033 the first byte of request has been seen, the "http-request" timeout is used
6034 to wait for the complete request to come. Note that empty lines prior to a
6035 new request do not refresh the timeout and are not counted as a new request.
6036
6037 There is also another difference between the two timeouts : when a connection
6038 expires during timeout http-keep-alive, no error is returned, the connection
6039 just closes. If the connection expires in "http-request" while waiting for a
6040 connection to complete, a HTTP 408 error is returned.
6041
6042 In general it is optimal to set this value to a few tens to hundreds of
6043 milliseconds, to allow users to fetch all objects of a page at once but
6044 without waiting for further clicks. Also, if set to a very small value (eg:
6045 1 millisecond) it will probably only accept pipelined requests but not the
6046 non-pipelined ones. It may be a nice trade-off for very large sites running
Patrick Mézard2382ad62010-05-09 10:43:32 +02006047 with tens to hundreds of thousands of clients.
Willy Tarreaub16a5742010-01-10 14:46:16 +01006048
6049 If this parameter is not set, the "http-request" timeout applies, and if both
6050 are not set, "timeout client" still applies at the lower level. It should be
6051 set in the frontend to take effect, unless the frontend is in TCP mode, in
6052 which case the HTTP backend's timeout will be used.
6053
6054 See also : "timeout http-request", "timeout client".
6055
6056
Willy Tarreau036fae02008-01-06 13:24:40 +01006057timeout http-request <timeout>
6058 Set the maximum allowed time to wait for a complete HTTP request
6059 May be used in sections : defaults | frontend | listen | backend
Willy Tarreaucd7afc02009-07-12 10:03:17 +02006060 yes | yes | yes | yes
Willy Tarreau036fae02008-01-06 13:24:40 +01006061 Arguments :
Willy Tarreau844e3c52008-01-11 16:28:18 +01006062 <timeout> is the timeout value specified in milliseconds by default, but
Willy Tarreau036fae02008-01-06 13:24:40 +01006063 can be in any other unit if the number is suffixed by the unit,
6064 as explained at the top of this document.
6065
6066 In order to offer DoS protection, it may be required to lower the maximum
6067 accepted time to receive a complete HTTP request without affecting the client
6068 timeout. This helps protecting against established connections on which
6069 nothing is sent. The client timeout cannot offer a good protection against
6070 this abuse because it is an inactivity timeout, which means that if the
6071 attacker sends one character every now and then, the timeout will not
6072 trigger. With the HTTP request timeout, no matter what speed the client
6073 types, the request will be aborted if it does not complete in time.
6074
6075 Note that this timeout only applies to the header part of the request, and
6076 not to any data. As soon as the empty line is received, this timeout is not
Willy Tarreaub16a5742010-01-10 14:46:16 +01006077 used anymore. It is used again on keep-alive connections to wait for a second
6078 request if "timeout http-keep-alive" is not set.
Willy Tarreau036fae02008-01-06 13:24:40 +01006079
6080 Generally it is enough to set it to a few seconds, as most clients send the
6081 full request immediately upon connection. Add 3 or more seconds to cover TCP
6082 retransmits but that's all. Setting it to very low values (eg: 50 ms) will
6083 generally work on local networks as long as there are no packet losses. This
6084 will prevent people from sending bare HTTP requests using telnet.
6085
6086 If this parameter is not set, the client timeout still applies between each
Willy Tarreaucd7afc02009-07-12 10:03:17 +02006087 chunk of the incoming request. It should be set in the frontend to take
6088 effect, unless the frontend is in TCP mode, in which case the HTTP backend's
6089 timeout will be used.
Willy Tarreau036fae02008-01-06 13:24:40 +01006090
Willy Tarreaub16a5742010-01-10 14:46:16 +01006091 See also : "timeout http-keep-alive", "timeout client".
Willy Tarreau036fae02008-01-06 13:24:40 +01006092
Willy Tarreau844e3c52008-01-11 16:28:18 +01006093
6094timeout queue <timeout>
6095 Set the maximum time to wait in the queue for a connection slot to be free
6096 May be used in sections : defaults | frontend | listen | backend
6097 yes | no | yes | yes
6098 Arguments :
6099 <timeout> is the timeout value specified in milliseconds by default, but
6100 can be in any other unit if the number is suffixed by the unit,
6101 as explained at the top of this document.
6102
6103 When a server's maxconn is reached, connections are left pending in a queue
6104 which may be server-specific or global to the backend. In order not to wait
6105 indefinitely, a timeout is applied to requests pending in the queue. If the
6106 timeout is reached, it is considered that the request will almost never be
6107 served, so it is dropped and a 503 error is returned to the client.
6108
6109 The "timeout queue" statement allows to fix the maximum time for a request to
6110 be left pending in a queue. If unspecified, the same value as the backend's
6111 connection timeout ("timeout connect") is used, for backwards compatibility
6112 with older versions with no "timeout queue" parameter.
6113
6114 See also : "timeout connect", "contimeout".
6115
6116
6117timeout server <timeout>
6118timeout srvtimeout <timeout> (deprecated)
6119 Set the maximum inactivity time on the server side.
6120 May be used in sections : defaults | frontend | listen | backend
6121 yes | no | yes | yes
6122 Arguments :
6123 <timeout> is the timeout value specified in milliseconds by default, but
6124 can be in any other unit if the number is suffixed by the unit,
6125 as explained at the top of this document.
6126
6127 The inactivity timeout applies when the server is expected to acknowledge or
6128 send data. In HTTP mode, this timeout is particularly important to consider
6129 during the first phase of the server's response, when it has to send the
6130 headers, as it directly represents the server's processing time for the
6131 request. To find out what value to put there, it's often good to start with
6132 what would be considered as unacceptable response times, then check the logs
6133 to observe the response time distribution, and adjust the value accordingly.
6134
6135 The value is specified in milliseconds by default, but can be in any other
6136 unit if the number is suffixed by the unit, as specified at the top of this
6137 document. In TCP mode (and to a lesser extent, in HTTP mode), it is highly
6138 recommended that the client timeout remains equal to the server timeout in
6139 order to avoid complex situations to debug. Whatever the expected server
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01006140 response times, it is a good practice to cover at least one or several TCP
Willy Tarreau844e3c52008-01-11 16:28:18 +01006141 packet losses by specifying timeouts that are slightly above multiples of 3
Willy Tarreaud72758d2010-01-12 10:42:19 +01006142 seconds (eg: 4 or 5 seconds minimum).
Willy Tarreau844e3c52008-01-11 16:28:18 +01006143
6144 This parameter is specific to backends, but can be specified once for all in
6145 "defaults" sections. This is in fact one of the easiest solutions not to
6146 forget about it. An unspecified timeout results in an infinite timeout, which
6147 is not recommended. Such a usage is accepted and works but reports a warning
6148 during startup because it may results in accumulation of expired sessions in
6149 the system if the system's timeouts are not configured either.
6150
6151 This parameter replaces the old, deprecated "srvtimeout". It is recommended
6152 to use it to write new configurations. The form "timeout srvtimeout" is
6153 provided only by backwards compatibility but its use is strongly discouraged.
6154
6155 See also : "srvtimeout", "timeout client".
6156
6157
6158timeout tarpit <timeout>
Cyril Bonté78caf842010-03-10 22:41:43 +01006159 Set the duration for which tarpitted connections will be maintained
Willy Tarreau844e3c52008-01-11 16:28:18 +01006160 May be used in sections : defaults | frontend | listen | backend
6161 yes | yes | yes | yes
6162 Arguments :
6163 <timeout> is the tarpit duration specified in milliseconds by default, but
6164 can be in any other unit if the number is suffixed by the unit,
6165 as explained at the top of this document.
6166
6167 When a connection is tarpitted using "reqtarpit", it is maintained open with
6168 no activity for a certain amount of time, then closed. "timeout tarpit"
6169 defines how long it will be maintained open.
6170
6171 The value is specified in milliseconds by default, but can be in any other
6172 unit if the number is suffixed by the unit, as specified at the top of this
6173 document. If unspecified, the same value as the backend's connection timeout
6174 ("timeout connect") is used, for backwards compatibility with older versions
Cyril Bonté78caf842010-03-10 22:41:43 +01006175 with no "timeout tarpit" parameter.
Willy Tarreau844e3c52008-01-11 16:28:18 +01006176
6177 See also : "timeout connect", "contimeout".
6178
6179
6180transparent (deprecated)
6181 Enable client-side transparent proxying
6182 May be used in sections : defaults | frontend | listen | backend
Willy Tarreau4b1f8592008-12-23 23:13:55 +01006183 yes | no | yes | yes
Willy Tarreau844e3c52008-01-11 16:28:18 +01006184 Arguments : none
6185
6186 This keyword was introduced in order to provide layer 7 persistence to layer
6187 3 load balancers. The idea is to use the OS's ability to redirect an incoming
6188 connection for a remote address to a local process (here HAProxy), and let
6189 this process know what address was initially requested. When this option is
6190 used, sessions without cookies will be forwarded to the original destination
6191 IP address of the incoming request (which should match that of another
6192 equipment), while requests with cookies will still be forwarded to the
6193 appropriate server.
6194
6195 The "transparent" keyword is deprecated, use "option transparent" instead.
6196
6197 Note that contrary to a common belief, this option does NOT make HAProxy
6198 present the client's IP to the server when establishing the connection.
6199
Willy Tarreau844e3c52008-01-11 16:28:18 +01006200 See also: "option transparent"
6201
6202
6203use_backend <backend> if <condition>
6204use_backend <backend> unless <condition>
Willy Tarreau1d0dfb12009-07-07 15:10:31 +02006205 Switch to a specific backend if/unless an ACL-based condition is matched.
Willy Tarreau844e3c52008-01-11 16:28:18 +01006206 May be used in sections : defaults | frontend | listen | backend
6207 no | yes | yes | no
6208 Arguments :
6209 <backend> is the name of a valid backend or "listen" section.
6210
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006211 <condition> is a condition composed of ACLs, as described in section 7.
Willy Tarreau844e3c52008-01-11 16:28:18 +01006212
6213 When doing content-switching, connections arrive on a frontend and are then
6214 dispatched to various backends depending on a number of conditions. The
6215 relation between the conditions and the backends is described with the
Willy Tarreau1d0dfb12009-07-07 15:10:31 +02006216 "use_backend" keyword. While it is normally used with HTTP processing, it can
6217 also be used in pure TCP, either without content using stateless ACLs (eg:
6218 source address validation) or combined with a "tcp-request" rule to wait for
6219 some payload.
Willy Tarreau844e3c52008-01-11 16:28:18 +01006220
6221 There may be as many "use_backend" rules as desired. All of these rules are
6222 evaluated in their declaration order, and the first one which matches will
6223 assign the backend.
6224
6225 In the first form, the backend will be used if the condition is met. In the
6226 second form, the backend will be used if the condition is not met. If no
6227 condition is valid, the backend defined with "default_backend" will be used.
6228 If no default backend is defined, either the servers in the same section are
6229 used (in case of a "listen" section) or, in case of a frontend, no server is
6230 used and a 503 service unavailable response is returned.
6231
Willy Tarreau51aecc72009-07-12 09:47:04 +02006232 Note that it is possible to switch from a TCP frontend to an HTTP backend. In
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01006233 this case, either the frontend has already checked that the protocol is HTTP,
Willy Tarreau51aecc72009-07-12 09:47:04 +02006234 and backend processing will immediately follow, or the backend will wait for
6235 a complete HTTP request to get in. This feature is useful when a frontend
6236 must decode several protocols on a unique port, one of them being HTTP.
6237
Willy Tarreau1d0dfb12009-07-07 15:10:31 +02006238 See also: "default_backend", "tcp-request", and section 7 about ACLs.
Willy Tarreaud72758d2010-01-12 10:42:19 +01006239
Willy Tarreau036fae02008-01-06 13:24:40 +01006240
Krzysztof Piotr Oledzkic6df0662010-01-05 16:38:49 +010062415. Server and default-server options
Cyril Bontéf0c60612010-02-06 14:44:47 +01006242------------------------------------
Willy Tarreau6a06a402007-07-15 20:15:28 +02006243
Krzysztof Piotr Oledzkic6df0662010-01-05 16:38:49 +01006244The "server" and "default-server" keywords support a certain number of settings
6245which are all passed as arguments on the server line. The order in which those
6246arguments appear does not count, and they are all optional. Some of those
6247settings are single words (booleans) while others expect one or several values
6248after them. In this case, the values must immediately follow the setting name.
6249Except default-server, all those settings must be specified after the server's
6250address if they are used:
Willy Tarreau6a06a402007-07-15 20:15:28 +02006251
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006252 server <name> <address>[:port] [settings ...]
Krzysztof Piotr Oledzkic6df0662010-01-05 16:38:49 +01006253 default-server [settings ...]
Willy Tarreau6a06a402007-07-15 20:15:28 +02006254
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006255The currently supported settings are the following ones.
Willy Tarreau0ba27502007-12-24 16:55:16 +01006256
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006257addr <ipv4>
6258 Using the "addr" parameter, it becomes possible to use a different IP address
6259 to send health-checks. On some servers, it may be desirable to dedicate an IP
6260 address to specific component able to perform complex tests which are more
6261 suitable to health-checks than the application. This parameter is ignored if
6262 the "check" parameter is not set. See also the "port" parameter.
Willy Tarreau6a06a402007-07-15 20:15:28 +02006263
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006264 Supported in default-server: No
6265
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006266backup
6267 When "backup" is present on a server line, the server is only used in load
6268 balancing when all other non-backup servers are unavailable. Requests coming
6269 with a persistence cookie referencing the server will always be served
6270 though. By default, only the first operational backup server is used, unless
6271 the "allbackups" option is set in the backend. See also the "allbackups"
6272 option.
Willy Tarreau6a06a402007-07-15 20:15:28 +02006273
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006274 Supported in default-server: No
6275
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006276check
6277 This option enables health checks on the server. By default, a server is
6278 always considered available. If "check" is set, the server will receive
6279 periodic health checks to ensure that it is really able to serve requests.
6280 The default address and port to send the tests to are those of the server,
6281 and the default source is the same as the one defined in the backend. It is
6282 possible to change the address using the "addr" parameter, the port using the
6283 "port" parameter, the source address using the "source" address, and the
6284 interval and timers using the "inter", "rise" and "fall" parameters. The
6285 request method is define in the backend using the "httpchk", "smtpchk",
Hervé COMMOWICK698ae002010-01-12 09:25:13 +01006286 "mysql-check" and "ssl-hello-chk" options. Please refer to those options and
6287 parameters for more information.
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006288
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006289 Supported in default-server: No
6290
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006291cookie <value>
6292 The "cookie" parameter sets the cookie value assigned to the server to
6293 <value>. This value will be checked in incoming requests, and the first
6294 operational server possessing the same value will be selected. In return, in
6295 cookie insertion or rewrite modes, this value will be assigned to the cookie
6296 sent to the client. There is nothing wrong in having several servers sharing
6297 the same cookie value, and it is in fact somewhat common between normal and
6298 backup servers. See also the "cookie" keyword in backend section.
6299
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006300 Supported in default-server: No
6301
Willy Tarreau96839092010-03-29 10:02:24 +02006302disabled
6303 The "disabled" keyword starts the server in the "disabled" state. That means
6304 that it is marked down in maintenance mode, and no connection other than the
6305 ones allowed by persist mode will reach it. It is very well suited to setup
6306 new servers, because normal traffic will never reach them, while it is still
6307 possible to test the service by making use of the force-persist mechanism.
6308
6309 Supported in default-server: No
6310
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006311error-limit <count>
Willy Tarreau983e01e2010-01-11 18:42:06 +01006312 If health observing is enabled, the "error-limit" parameter specifies the
6313 number of consecutive errors that triggers event selected by the "on-error"
6314 option. By default it is set to 10 consecutive errors.
Krzysztof Piotr Oledzki97f07b82009-12-15 22:31:24 +01006315
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006316 Supported in default-server: Yes
6317
6318 See also the "check", "error-limit" and "on-error".
Krzysztof Piotr Oledzki97f07b82009-12-15 22:31:24 +01006319
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006320fall <count>
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006321 The "fall" parameter states that a server will be considered as dead after
6322 <count> consecutive unsuccessful health checks. This value defaults to 3 if
6323 unspecified. See also the "check", "inter" and "rise" parameters.
6324
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006325 Supported in default-server: Yes
6326
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006327id <value>
Willy Tarreau53fb4ae2009-10-04 23:04:08 +02006328 Set a persistent ID for the server. This ID must be positive and unique for
6329 the proxy. An unused ID will automatically be assigned if unset. The first
6330 assigned value will be 1. This ID is currently only returned in statistics.
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006331
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006332 Supported in default-server: No
6333
6334inter <delay>
6335fastinter <delay>
6336downinter <delay>
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006337 The "inter" parameter sets the interval between two consecutive health checks
6338 to <delay> milliseconds. If left unspecified, the delay defaults to 2000 ms.
6339 It is also possible to use "fastinter" and "downinter" to optimize delays
6340 between checks depending on the server state :
6341
6342 Server state | Interval used
6343 ---------------------------------+-----------------------------------------
6344 UP 100% (non-transitional) | "inter"
6345 ---------------------------------+-----------------------------------------
6346 Transitionally UP (going down), |
6347 Transitionally DOWN (going up), | "fastinter" if set, "inter" otherwise.
6348 or yet unchecked. |
6349 ---------------------------------+-----------------------------------------
6350 DOWN 100% (non-transitional) | "downinter" if set, "inter" otherwise.
6351 ---------------------------------+-----------------------------------------
Willy Tarreaud72758d2010-01-12 10:42:19 +01006352
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006353 Just as with every other time-based parameter, they can be entered in any
6354 other explicit unit among { us, ms, s, m, h, d }. The "inter" parameter also
6355 serves as a timeout for health checks sent to servers if "timeout check" is
6356 not set. In order to reduce "resonance" effects when multiple servers are
6357 hosted on the same hardware, the health-checks of all servers are started
6358 with a small time offset between them. It is also possible to add some random
6359 noise in the health checks interval using the global "spread-checks"
6360 keyword. This makes sense for instance when a lot of backends use the same
6361 servers.
6362
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006363 Supported in default-server: Yes
6364
6365maxconn <maxconn>
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006366 The "maxconn" parameter specifies the maximal number of concurrent
6367 connections that will be sent to this server. If the number of incoming
6368 concurrent requests goes higher than this value, they will be queued, waiting
6369 for a connection to be released. This parameter is very important as it can
6370 save fragile servers from going down under extreme loads. If a "minconn"
6371 parameter is specified, the limit becomes dynamic. The default value is "0"
6372 which means unlimited. See also the "minconn" and "maxqueue" parameters, and
6373 the backend's "fullconn" keyword.
6374
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006375 Supported in default-server: Yes
6376
6377maxqueue <maxqueue>
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006378 The "maxqueue" parameter specifies the maximal number of connections which
6379 will wait in the queue for this server. If this limit is reached, next
6380 requests will be redispatched to other servers instead of indefinitely
6381 waiting to be served. This will break persistence but may allow people to
6382 quickly re-log in when the server they try to connect to is dying. The
6383 default value is "0" which means the queue is unlimited. See also the
6384 "maxconn" and "minconn" parameters.
6385
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006386 Supported in default-server: Yes
6387
6388minconn <minconn>
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006389 When the "minconn" parameter is set, the maxconn limit becomes a dynamic
6390 limit following the backend's load. The server will always accept at least
6391 <minconn> connections, never more than <maxconn>, and the limit will be on
6392 the ramp between both values when the backend has less than <fullconn>
6393 concurrent connections. This makes it possible to limit the load on the
6394 server during normal loads, but push it further for important loads without
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01006395 overloading the server during exceptional loads. See also the "maxconn"
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006396 and "maxqueue" parameters, as well as the "fullconn" backend keyword.
Krzysztof Piotr Oledzki97f07b82009-12-15 22:31:24 +01006397
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006398 Supported in default-server: Yes
6399
Krzysztof Piotr Oledzki97f07b82009-12-15 22:31:24 +01006400observe <mode>
6401 This option enables health adjusting based on observing communication with
6402 the server. By default this functionality is disabled and enabling it also
6403 requires to enable health checks. There are two supported modes: "layer4" and
6404 "layer7". In layer4 mode, only successful/unsuccessful tcp connections are
6405 significant. In layer7, which is only allowed for http proxies, responses
6406 received from server are verified, like valid/wrong http code, unparsable
6407 headers, a timeout, etc.
6408
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006409 Supported in default-server: No
6410
Krzysztof Piotr Oledzki97f07b82009-12-15 22:31:24 +01006411 See also the "check", "on-error" and "error-limit".
6412
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006413on-error <mode>
Krzysztof Piotr Oledzki97f07b82009-12-15 22:31:24 +01006414 Select what should happen when enough consecutive errors are detected.
6415 Currently, four modes are available:
6416 - fastinter: force fastinter
6417 - fail-check: simulate a failed check, also forces fastinter (default)
6418 - sudden-death: simulate a pre-fatal failed health check, one more failed
6419 check will mark a server down, forces fastinter
6420 - mark-down: mark the server immediately down and force fastinter
6421
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006422 Supported in default-server: Yes
6423
Krzysztof Piotr Oledzki97f07b82009-12-15 22:31:24 +01006424 See also the "check", "observe" and "error-limit".
6425
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006426port <port>
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006427 Using the "port" parameter, it becomes possible to use a different port to
6428 send health-checks. On some servers, it may be desirable to dedicate a port
6429 to a specific component able to perform complex tests which are more suitable
6430 to health-checks than the application. It is common to run a simple script in
6431 inetd for instance. This parameter is ignored if the "check" parameter is not
6432 set. See also the "addr" parameter.
6433
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006434 Supported in default-server: Yes
6435
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006436redir <prefix>
6437 The "redir" parameter enables the redirection mode for all GET and HEAD
6438 requests addressing this server. This means that instead of having HAProxy
6439 forward the request to the server, it will send an "HTTP 302" response with
6440 the "Location" header composed of this prefix immediately followed by the
6441 requested URI beginning at the leading '/' of the path component. That means
6442 that no trailing slash should be used after <prefix>. All invalid requests
6443 will be rejected, and all non-GET or HEAD requests will be normally served by
6444 the server. Note that since the response is completely forged, no header
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01006445 mangling nor cookie insertion is possible in the response. However, cookies in
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006446 requests are still analysed, making this solution completely usable to direct
6447 users to a remote location in case of local disaster. Main use consists in
6448 increasing bandwidth for static servers by having the clients directly
6449 connect to them. Note: never use a relative location here, it would cause a
6450 loop between the client and HAProxy!
6451
6452 Example : server srv1 192.168.1.1:80 redir http://image1.mydomain.com check
6453
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006454 Supported in default-server: No
6455
6456rise <count>
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006457 The "rise" parameter states that a server will be considered as operational
6458 after <count> consecutive successful health checks. This value defaults to 2
6459 if unspecified. See also the "check", "inter" and "fall" parameters.
6460
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006461 Supported in default-server: Yes
6462
6463slowstart <start_time_in_ms>
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006464 The "slowstart" parameter for a server accepts a value in milliseconds which
6465 indicates after how long a server which has just come back up will run at
6466 full speed. Just as with every other time-based parameter, it can be entered
6467 in any other explicit unit among { us, ms, s, m, h, d }. The speed grows
6468 linearly from 0 to 100% during this time. The limitation applies to two
6469 parameters :
6470
6471 - maxconn: the number of connections accepted by the server will grow from 1
6472 to 100% of the usual dynamic limit defined by (minconn,maxconn,fullconn).
6473
6474 - weight: when the backend uses a dynamic weighted algorithm, the weight
6475 grows linearly from 1 to 100%. In this case, the weight is updated at every
6476 health-check. For this reason, it is important that the "inter" parameter
6477 is smaller than the "slowstart", in order to maximize the number of steps.
6478
6479 The slowstart never applies when haproxy starts, otherwise it would cause
6480 trouble to running servers. It only applies when a server has been previously
6481 seen as failed.
6482
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006483 Supported in default-server: Yes
6484
Willy Tarreauc6f4ce82009-06-10 11:09:37 +02006485source <addr>[:<pl>[-<ph>]] [usesrc { <addr2>[:<port2>] | client | clientip } ]
Willy Tarreaubce70882009-09-07 11:51:47 +02006486source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | hdr_ip(<hdr>[,<occ>]) } ]
Willy Tarreauc6f4ce82009-06-10 11:09:37 +02006487source <addr>[:<pl>[-<ph>]] [interface <name>] ...
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006488 The "source" parameter sets the source address which will be used when
6489 connecting to the server. It follows the exact same parameters and principle
6490 as the backend "source" keyword, except that it only applies to the server
6491 referencing it. Please consult the "source" keyword for details.
6492
Willy Tarreauc6f4ce82009-06-10 11:09:37 +02006493 Additionally, the "source" statement on a server line allows one to specify a
6494 source port range by indicating the lower and higher bounds delimited by a
6495 dash ('-'). Some operating systems might require a valid IP address when a
6496 source port range is specified. It is permitted to have the same IP/range for
6497 several servers. Doing so makes it possible to bypass the maximum of 64k
6498 total concurrent connections. The limit will then reach 64k connections per
6499 server.
6500
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006501 Supported in default-server: No
6502
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006503track [<proxy>/]<server>
6504 This option enables ability to set the current state of the server by
6505 tracking another one. Only a server with checks enabled can be tracked
6506 so it is not possible for example to track a server that tracks another
6507 one. If <proxy> is omitted the current one is used. If disable-on-404 is
6508 used, it has to be enabled on both proxies.
6509
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006510 Supported in default-server: No
6511
6512weight <weight>
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006513 The "weight" parameter is used to adjust the server's weight relative to
6514 other servers. All servers will receive a load proportional to their weight
6515 relative to the sum of all weights, so the higher the weight, the higher the
Willy Tarreau6704d672009-06-15 10:56:05 +02006516 load. The default weight is 1, and the maximal value is 256. A value of 0
6517 means the server will not participate in load-balancing but will still accept
6518 persistent connections. If this parameter is used to distribute the load
6519 according to server's capacity, it is recommended to start with values which
6520 can both grow and shrink, for instance between 10 and 100 to leave enough
6521 room above and below for later adjustments.
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006522
Krzysztof Piotr Oledzkic53601c2010-01-06 10:50:42 +01006523 Supported in default-server: Yes
6524
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006525
65266. HTTP header manipulation
6527---------------------------
6528
6529In HTTP mode, it is possible to rewrite, add or delete some of the request and
6530response headers based on regular expressions. It is also possible to block a
6531request or a response if a particular header matches a regular expression,
6532which is enough to stop most elementary protocol attacks, and to protect
6533against information leak from the internal network. But there is a limitation
6534to this : since HAProxy's HTTP engine does not support keep-alive, only headers
6535passed during the first request of a TCP session will be seen. All subsequent
6536headers will be considered data only and not analyzed. Furthermore, HAProxy
6537never touches data contents, it stops analysis at the end of headers.
6538
Willy Tarreau816b9792009-09-15 21:25:21 +02006539There is an exception though. If HAProxy encounters an "Informational Response"
6540(status code 1xx), it is able to process all rsp* rules which can allow, deny,
6541rewrite or delete a header, but it will refuse to add a header to any such
6542messages as this is not HTTP-compliant. The reason for still processing headers
6543in such responses is to stop and/or fix any possible information leak which may
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01006544happen, for instance because another downstream equipment would unconditionally
Willy Tarreau816b9792009-09-15 21:25:21 +02006545add a header, or if a server name appears there. When such messages are seen,
6546normal processing still occurs on the next non-informational messages.
6547
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006548This section covers common usage of the following keywords, described in detail
6549in section 4.2 :
6550
6551 - reqadd <string>
6552 - reqallow <search>
6553 - reqiallow <search>
6554 - reqdel <search>
6555 - reqidel <search>
6556 - reqdeny <search>
6557 - reqideny <search>
6558 - reqpass <search>
6559 - reqipass <search>
6560 - reqrep <search> <replace>
6561 - reqirep <search> <replace>
6562 - reqtarpit <search>
6563 - reqitarpit <search>
6564 - rspadd <string>
6565 - rspdel <search>
6566 - rspidel <search>
6567 - rspdeny <search>
6568 - rspideny <search>
6569 - rsprep <search> <replace>
6570 - rspirep <search> <replace>
6571
6572With all these keywords, the same conventions are used. The <search> parameter
6573is a POSIX extended regular expression (regex) which supports grouping through
6574parenthesis (without the backslash). Spaces and other delimiters must be
6575prefixed with a backslash ('\') to avoid confusion with a field delimiter.
6576Other characters may be prefixed with a backslash to change their meaning :
6577
6578 \t for a tab
6579 \r for a carriage return (CR)
6580 \n for a new line (LF)
6581 \ to mark a space and differentiate it from a delimiter
6582 \# to mark a sharp and differentiate it from a comment
6583 \\ to use a backslash in a regex
6584 \\\\ to use a backslash in the text (*2 for regex, *2 for haproxy)
6585 \xXX to write the ASCII hex code XX as in the C language
6586
6587The <replace> parameter contains the string to be used to replace the largest
6588portion of text matching the regex. It can make use of the special characters
6589above, and can reference a substring which is delimited by parenthesis in the
6590regex, by writing a backslash ('\') immediately followed by one digit from 0 to
65919 indicating the group position (0 designating the entire line). This practice
6592is very common to users of the "sed" program.
6593
6594The <string> parameter represents the string which will systematically be added
6595after the last header line. It can also use special character sequences above.
6596
6597Notes related to these keywords :
6598---------------------------------
6599 - these keywords are not always convenient to allow/deny based on header
6600 contents. It is strongly recommended to use ACLs with the "block" keyword
6601 instead, resulting in far more flexible and manageable rules.
6602
6603 - lines are always considered as a whole. It is not possible to reference
6604 a header name only or a value only. This is important because of the way
6605 headers are written (notably the number of spaces after the colon).
6606
6607 - the first line is always considered as a header, which makes it possible to
6608 rewrite or filter HTTP requests URIs or response codes, but in turn makes
6609 it harder to distinguish between headers and request line. The regex prefix
6610 ^[^\ \t]*[\ \t] matches any HTTP method followed by a space, and the prefix
6611 ^[^ \t:]*: matches any header name followed by a colon.
6612
6613 - for performances reasons, the number of characters added to a request or to
6614 a response is limited at build time to values between 1 and 4 kB. This
6615 should normally be far more than enough for most usages. If it is too short
6616 on occasional usages, it is possible to gain some space by removing some
6617 useless headers before adding new ones.
6618
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01006619 - keywords beginning with "reqi" and "rspi" are the same as their counterpart
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006620 without the 'i' letter except that they ignore case when matching patterns.
6621
6622 - when a request passes through a frontend then a backend, all req* rules
6623 from the frontend will be evaluated, then all req* rules from the backend
6624 will be evaluated. The reverse path is applied to responses.
6625
6626 - req* statements are applied after "block" statements, so that "block" is
6627 always the first one, but before "use_backend" in order to permit rewriting
Willy Tarreaud72758d2010-01-12 10:42:19 +01006628 before switching.
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006629
6630
Willy Tarreaub937b7e2010-01-12 15:27:54 +010066317. Using ACLs and pattern extraction
6632------------------------------------
Willy Tarreauc57f0e22009-05-10 13:12:33 +02006633
6634The use of Access Control Lists (ACL) provides a flexible solution to perform
6635content switching and generally to take decisions based on content extracted
6636from the request, the response or any environmental status. The principle is
6637simple :
6638
6639 - define test criteria with sets of values
6640 - perform actions only if a set of tests is valid
6641
6642The actions generally consist in blocking the request, or selecting a backend.
6643
6644In order to define a test, the "acl" keyword is used. The syntax is :
6645
6646 acl <aclname> <criterion> [flags] [operator] <value> ...
6647
6648This creates a new ACL <aclname> or completes an existing one with new tests.
6649Those tests apply to the portion of request/response specified in <criterion>
6650and may be adjusted with optional flags [flags]. Some criteria also support
6651an operator which may be specified before the set of values. The values are
6652of the type supported by the criterion, and are separated by spaces.
6653
6654ACL names must be formed from upper and lower case letters, digits, '-' (dash),
6655'_' (underscore) , '.' (dot) and ':' (colon). ACL names are case-sensitive,
6656which means that "my_acl" and "My_Acl" are two different ACLs.
6657
6658There is no enforced limit to the number of ACLs. The unused ones do not affect
6659performance, they just consume a small amount of memory.
6660
6661The following ACL flags are currently supported :
6662
Willy Tarreau2b5285d2010-05-09 23:45:24 +02006663 -i : ignore case during matching of all subsequent patterns.
6664 -f : load patterns from a file.
Willy Tarreau6a06a402007-07-15 20:15:28 +02006665 -- : force end of flags. Useful when a string looks like one of the flags.
6666
Willy Tarreau2b5285d2010-05-09 23:45:24 +02006667The "-f" flag is special as it loads all of the lines it finds in the file
6668specified in argument and loads all of them before continuing. It is even
6669possible to pass multiple "-f" arguments if the patterns are to be loaded from
Willy Tarreau58215a02010-05-13 22:07:43 +02006670multiple files. Empty lines as well as lines beginning with a sharp ('#') will
6671be ignored. All leading spaces and tabs will be stripped. If it is absolutely
6672needed to insert a valid pattern beginning with a sharp, just prefix it with a
6673space so that it is not taken for a comment. Depending on the data type and
6674match method, haproxy may load the lines into a binary tree, allowing very fast
6675lookups. This is true for IPv4 and exact string matching. In this case,
6676duplicates will automatically be removed. Also, note that the "-i" flag applies
6677to subsequent entries and not to entries loaded from files preceeding it. For
6678instance :
Willy Tarreau2b5285d2010-05-09 23:45:24 +02006679
6680 acl valid-ua hdr(user-agent) -f exact-ua.lst -i -f generic-ua.lst test
6681
6682In this example, each line of "exact-ua.lst" will be exactly matched against
6683the "user-agent" header of the request. Then each line of "generic-ua" will be
6684case-insensitively matched. Then the word "test" will be insensitively matched
6685too.
6686
6687Note that right now it is difficult for the ACL parsers to report errors, so if
6688a file is unreadable or unparsable, the most you'll get is a parse error in the
6689ACL. Thus, file-based ACLs should only be produced by reliable processes.
6690
Willy Tarreau6a06a402007-07-15 20:15:28 +02006691Supported types of values are :
Willy Tarreau0ba27502007-12-24 16:55:16 +01006692
Willy Tarreau6a06a402007-07-15 20:15:28 +02006693 - integers or integer ranges
6694 - strings
6695 - regular expressions
6696 - IP addresses and networks
6697
6698
Willy Tarreauc57f0e22009-05-10 13:12:33 +020066997.1. Matching integers
6700----------------------
Willy Tarreau6a06a402007-07-15 20:15:28 +02006701
6702Matching integers is special in that ranges and operators are permitted. Note
6703that integer matching only applies to positive values. A range is a value
6704expressed with a lower and an upper bound separated with a colon, both of which
6705may be omitted.
6706
6707For instance, "1024:65535" is a valid range to represent a range of
6708unprivileged ports, and "1024:" would also work. "0:1023" is a valid
6709representation of privileged ports, and ":1023" would also work.
6710
Willy Tarreau62644772008-07-16 18:36:06 +02006711As a special case, some ACL functions support decimal numbers which are in fact
6712two integers separated by a dot. This is used with some version checks for
6713instance. All integer properties apply to those decimal numbers, including
6714ranges and operators.
6715
Willy Tarreau6a06a402007-07-15 20:15:28 +02006716For an easier usage, comparison operators are also supported. Note that using
Willy Tarreau0ba27502007-12-24 16:55:16 +01006717operators with ranges does not make much sense and is strongly discouraged.
6718Similarly, it does not make much sense to perform order comparisons with a set
6719of values.
Willy Tarreau6a06a402007-07-15 20:15:28 +02006720
Willy Tarreau0ba27502007-12-24 16:55:16 +01006721Available operators for integer matching are :
Willy Tarreau6a06a402007-07-15 20:15:28 +02006722
6723 eq : true if the tested value equals at least one value
6724 ge : true if the tested value is greater than or equal to at least one value
6725 gt : true if the tested value is greater than at least one value
6726 le : true if the tested value is less than or equal to at least one value
6727 lt : true if the tested value is less than at least one value
6728
Willy Tarreau0ba27502007-12-24 16:55:16 +01006729For instance, the following ACL matches any negative Content-Length header :
Willy Tarreau6a06a402007-07-15 20:15:28 +02006730
6731 acl negative-length hdr_val(content-length) lt 0
6732
Willy Tarreau62644772008-07-16 18:36:06 +02006733This one matches SSL versions between 3.0 and 3.1 (inclusive) :
6734
6735 acl sslv3 req_ssl_ver 3:3.1
6736
Willy Tarreau6a06a402007-07-15 20:15:28 +02006737
Willy Tarreauc57f0e22009-05-10 13:12:33 +020067387.2. Matching strings
6739---------------------
Willy Tarreau6a06a402007-07-15 20:15:28 +02006740
6741String matching applies to verbatim strings as they are passed, with the
6742exception of the backslash ("\") which makes it possible to escape some
6743characters such as the space. If the "-i" flag is passed before the first
6744string, then the matching will be performed ignoring the case. In order
6745to match the string "-i", either set it second, or pass the "--" flag
Willy Tarreau0ba27502007-12-24 16:55:16 +01006746before the first string. Same applies of course to match the string "--".
Willy Tarreau6a06a402007-07-15 20:15:28 +02006747
6748
Willy Tarreauc57f0e22009-05-10 13:12:33 +020067497.3. Matching regular expressions (regexes)
6750-------------------------------------------
Willy Tarreau6a06a402007-07-15 20:15:28 +02006751
6752Just like with string matching, regex matching applies to verbatim strings as
6753they are passed, with the exception of the backslash ("\") which makes it
6754possible to escape some characters such as the space. If the "-i" flag is
6755passed before the first regex, then the matching will be performed ignoring
6756the case. In order to match the string "-i", either set it second, or pass
Willy Tarreau0ba27502007-12-24 16:55:16 +01006757the "--" flag before the first string. Same principle applies of course to
6758match the string "--".
Willy Tarreau6a06a402007-07-15 20:15:28 +02006759
6760
Willy Tarreauc57f0e22009-05-10 13:12:33 +020067617.4. Matching IPv4 addresses
6762----------------------------
Willy Tarreau6a06a402007-07-15 20:15:28 +02006763
6764IPv4 addresses values can be specified either as plain addresses or with a
6765netmask appended, in which case the IPv4 address matches whenever it is
6766within the network. Plain addresses may also be replaced with a resolvable
Willy Tarreaud2a4aa22008-01-31 15:28:22 +01006767host name, but this practice is generally discouraged as it makes it more
Willy Tarreau0ba27502007-12-24 16:55:16 +01006768difficult to read and debug configurations. If hostnames are used, you should
6769at least ensure that they are present in /etc/hosts so that the configuration
6770does not depend on any random DNS match at the moment the configuration is
6771parsed.
Willy Tarreau6a06a402007-07-15 20:15:28 +02006772
6773
Willy Tarreauc57f0e22009-05-10 13:12:33 +020067747.5. Available matching criteria
6775--------------------------------
Willy Tarreau6a06a402007-07-15 20:15:28 +02006776
Willy Tarreauc57f0e22009-05-10 13:12:33 +020067777.5.1. Matching at Layer 4 and below
6778------------------------------------
Willy Tarreau0ba27502007-12-24 16:55:16 +01006779
6780A first set of criteria applies to information which does not require any
6781analysis of the request or response contents. Those generally include TCP/IP
6782addresses and ports, as well as internal values independant on the stream.
6783
Willy Tarreau6a06a402007-07-15 20:15:28 +02006784always_false
6785 This one never matches. All values and flags are ignored. It may be used as
6786 a temporary replacement for another one when adjusting configurations.
6787
6788always_true
6789 This one always matches. All values and flags are ignored. It may be used as
6790 a temporary replacement for another one when adjusting configurations.
6791
Willy Tarreaud63335a2010-02-26 12:56:52 +01006792avg_queue <integer>
Willy Tarreau6cbd6472010-09-08 19:06:18 +02006793avg_queue(backend) <integer>
Willy Tarreaud63335a2010-02-26 12:56:52 +01006794 Returns the total number of queued connections of the designated backend
6795 divided by the number of active servers. This is very similar to "queue"
6796 except that the size of the farm is considered, in order to give a more
6797 accurate measurement of the time it may take for a new connection to be
6798 processed. The main usage is to return a sorry page to new users when it
6799 becomes certain they will get a degraded service. Note that in the event
6800 there would not be any active server anymore, we would consider twice the
6801 number of queued connections as the measured value. This is a fair estimate,
6802 as we expect one server to get back soon anyway, but we still prefer to send
6803 new traffic to another backend if in better shape. See also the "queue",
6804 "be_conn", and "be_sess_rate" criteria.
Krzysztof Piotr Oledzki346f76d2010-01-12 21:59:30 +01006805
Willy Tarreaua36af912009-10-10 12:02:45 +02006806be_conn <integer>
Willy Tarreau6cbd6472010-09-08 19:06:18 +02006807be_conn(backend) <integer>
Willy Tarreaua36af912009-10-10 12:02:45 +02006808 Applies to the number of currently established connections on the backend,
6809 possibly including the connection being evaluated. If no backend name is
6810 specified, the current one is used. But it is also possible to check another
6811 backend. It can be used to use a specific farm when the nominal one is full.
6812 See also the "fe_conn", "queue" and "be_sess_rate" criteria.
Willy Tarreau6a06a402007-07-15 20:15:28 +02006813
Willy Tarreaud63335a2010-02-26 12:56:52 +01006814be_sess_rate <integer>
6815be_sess_rate(backend) <integer>
6816 Returns true when the sessions creation rate on the backend matches the
6817 specified values or ranges, in number of new sessions per second. This is
6818 used to switch to an alternate backend when an expensive or fragile one
6819 reaches too high a session rate, or to limit abuse of service (eg. prevent
6820 sucking of an online dictionary).
6821
6822 Example :
6823 # Redirect to an error page if the dictionary is requested too often
6824 backend dynamic
6825 mode http
6826 acl being_scanned be_sess_rate gt 100
6827 redirect location /denied.html if being_scanned
Willy Tarreau0ba27502007-12-24 16:55:16 +01006828
Jeffrey 'jf' Lim5051d7b2008-09-04 01:03:03 +08006829connslots <integer>
6830connslots(backend) <integer>
6831 The basic idea here is to be able to measure the number of connection "slots"
Willy Tarreau55165fe2009-05-10 12:02:55 +02006832 still available (connection + queue), so that anything beyond that (intended
Jeffrey 'jf' Lim5051d7b2008-09-04 01:03:03 +08006833 usage; see "use_backend" keyword) can be redirected to a different backend.
6834
Willy Tarreau55165fe2009-05-10 12:02:55 +02006835 'connslots' = number of available server connection slots, + number of
6836 available server queue slots.
Jeffrey 'jf' Lim5051d7b2008-09-04 01:03:03 +08006837
Willy Tarreaua36af912009-10-10 12:02:45 +02006838 Note that while "fe_conn" may be used, "connslots" comes in especially
Willy Tarreau55165fe2009-05-10 12:02:55 +02006839 useful when you have a case of traffic going to one single ip, splitting into
6840 multiple backends (perhaps using acls to do name-based load balancing) and
6841 you want to be able to differentiate between different backends, and their
6842 available "connslots". Also, whereas "nbsrv" only measures servers that are
6843 actually *down*, this acl is more fine-grained and looks into the number of
Willy Tarreaua36af912009-10-10 12:02:45 +02006844 available connection slots as well. See also "queue" and "avg_queue".
Jeffrey 'jf' Lim5051d7b2008-09-04 01:03:03 +08006845
Willy Tarreau55165fe2009-05-10 12:02:55 +02006846 OTHER CAVEATS AND NOTES: at this point in time, the code does not take care
6847 of dynamic connections. Also, if any of the server maxconn, or maxqueue is 0,
6848 then this acl clearly does not make sense, in which case the value returned
6849 will be -1.
Jeffrey 'jf' Lim5051d7b2008-09-04 01:03:03 +08006850
Willy Tarreaud63335a2010-02-26 12:56:52 +01006851dst <ip_address>
6852 Applies to the local IPv4 address the client connected to. It can be used to
6853 switch to a different backend for some alternative addresses.
Willy Tarreaua36af912009-10-10 12:02:45 +02006854
Willy Tarreaud63335a2010-02-26 12:56:52 +01006855dst_conn <integer>
6856 Applies to the number of currently established connections on the same socket
6857 including the one being evaluated. It can be used to either return a sorry
6858 page before hard-blocking, or to use a specific backend to drain new requests
6859 when the socket is considered saturated. This offers the ability to assign
6860 different limits to different listening ports or addresses. See also the
6861 "fe_conn" and "be_conn" criteria.
6862
6863dst_port <integer>
6864 Applies to the local port the client connected to. It can be used to switch
6865 to a different backend for some alternative ports.
6866
6867fe_conn <integer>
6868fe_conn(frontend) <integer>
6869 Applies to the number of currently established connections on the frontend,
6870 possibly including the connection being evaluated. If no frontend name is
6871 specified, the current one is used. But it is also possible to check another
6872 frontend. It can be used to either return a sorry page before hard-blocking,
6873 or to use a specific backend to drain new requests when the farm is
6874 considered saturated. See also the "dst_conn", "be_conn" and "fe_sess_rate"
6875 criteria.
6876
6877fe_id <integer>
Cyril Bonté78caf842010-03-10 22:41:43 +01006878 Applies to the frontend's id. Can be used in backends to check from which
Willy Tarreaud63335a2010-02-26 12:56:52 +01006879 frontend it was called.
Willy Tarreaua36af912009-10-10 12:02:45 +02006880
Willy Tarreau079ff0a2009-03-05 21:34:28 +01006881fe_sess_rate <integer>
6882fe_sess_rate(frontend) <integer>
6883 Returns true when the session creation rate on the current or the named
6884 frontend matches the specified values or ranges, expressed in new sessions
6885 per second. This is used to limit the connection rate to acceptable ranges in
6886 order to prevent abuse of service at the earliest moment. This can be
6887 combined with layer 4 ACLs in order to force the clients to wait a bit for
6888 the rate to go down below the limit.
6889
6890 Example :
6891 # This frontend limits incoming mails to 10/s with a max of 100
6892 # concurrent connections. We accept any connection below 10/s, and
6893 # force excess clients to wait for 100 ms. Since clients are limited to
6894 # 100 max, there cannot be more than 10 incoming mails per second.
6895 frontend mail
6896 bind :25
6897 mode tcp
6898 maxconn 100
6899 acl too_fast fe_sess_rate ge 10
6900 tcp-request inspect-delay 100ms
6901 tcp-request content accept if ! too_fast
6902 tcp-request content accept if WAIT_END
Willy Tarreaud72758d2010-01-12 10:42:19 +01006903
Willy Tarreaud63335a2010-02-26 12:56:52 +01006904nbsrv <integer>
6905nbsrv(backend) <integer>
6906 Returns true when the number of usable servers of either the current backend
6907 or the named backend matches the values or ranges specified. This is used to
6908 switch to an alternate backend when the number of servers is too low to
6909 to handle some load. It is useful to report a failure when combined with
6910 "monitor fail".
Willy Tarreau079ff0a2009-03-05 21:34:28 +01006911
Willy Tarreaud63335a2010-02-26 12:56:52 +01006912queue <integer>
Willy Tarreauf5a526f2010-09-01 08:06:18 +02006913queue(backend) <integer>
Willy Tarreaud63335a2010-02-26 12:56:52 +01006914 Returns the total number of queued connections of the designated backend,
6915 including all the connections in server queues. If no backend name is
6916 specified, the current one is used, but it is also possible to check another
6917 one. This can be used to take actions when queuing goes above a known level,
6918 generally indicating a surge of traffic or a massive slowdown on the servers.
6919 One possible action could be to reject new users but still accept old ones.
6920 See also the "avg_queue", "be_conn", and "be_sess_rate" criteria.
6921
Willy Tarreaue9656522010-08-17 15:40:09 +02006922sc1_bytes_in_rate
6923sc2_bytes_in_rate
6924 Returns the average client-to-server bytes rate from the currently tracked
6925 counters, measured in amount of bytes over the period configured in the
6926 table. See also src_bytes_in_rate.
6927
6928sc1_bytes_out_rate
6929sc2_bytes_out_rate
6930 Returns the average server-to-client bytes rate from the currently tracked
6931 counters, measured in amount of bytes over the period configured in the
6932 table. See also src_bytes_out_rate.
6933
6934sc1_conn_cnt
6935sc2_conn_cnt
6936 Returns the cumulated number of incoming connections from currently tracked
6937 counters. See also src_conn_cnt.
6938
6939sc1_conn_cur
6940sc2_conn_cur
6941 Returns the current amount of concurrent connections tracking the same
6942 tracked counters. This number is automatically incremented when tracking
6943 begins and decremented when tracking stops. See also src_conn_cur.
6944
6945sc1_conn_rate
6946sc2_conn_rate
6947 Returns the average connection rate from the currently tracked counters,
6948 measured in amount of connections over the period configured in the table.
6949 See also src_conn_rate.
6950
6951sc1_get_gpc0
6952sc2_get_gpc0
6953 Returns the value of the first General Purpose Counter associated to the
6954 currently tracked counters. See also src_get_gpc0 and sc1/sc2_inc_gpc0.
6955
6956sc1_http_err_cnt
6957sc2_http_err_cnt
6958 Returns the cumulated number of HTTP errors from the currently tracked
6959 counters. This includes the both request errors and 4xx error responses.
6960 See also src_http_err_cnt.
6961
6962sc1_http_err_rate
6963sc2_http_err_rate
6964 Returns the average rate of HTTP errors from the currently tracked counters,
6965 measured in amount of errors over the period configured in the table. This
6966 includes the both request errors and 4xx error responses. See also
6967 src_http_err_rate.
6968
6969sc1_http_req_cnt
6970sc2_http_req_cnt
6971 Returns the cumulated number of HTTP requests from the currently tracked
6972 counters. This includes every started request, valid or not. See also
6973 src_http_req_cnt.
6974
6975sc1_http_req_rate
6976sc2_http_req_rate
6977 Returns the average rate of HTTP requests from the currently tracked
6978 counters, measured in amount of requests over the period configured in
6979 the table. This includes every started request, valid or not. See also
6980 src_http_req_rate.
6981
6982sc1_inc_gpc0
6983sc2_inc_gpc0
6984 Increments the first General Purpose Counter associated to the currently
6985 tracked counters, and returns its value. Before the first invocation, the
6986 stored value is zero, so first invocation will increase it to 1 and will
6987 return 1. The test can also be used alone and always returns true. This is
6988 typically used as a second ACL in an expression in order to mark a connection
6989 when a first ACL was verified :
6990
6991 acl abuse sc1_http_req_rate gt 10
6992 acl kill sc1_inc_gpc0
6993 tcp-request connection reject if abuse kill
6994
6995sc1_kbytes_in
6996sc2_kbytes_in
6997 Returns the amount of client-to-server data from the currently tracked
6998 counters, measured in kilobytes over the period configured in the table. The
6999 test is currently performed on 32-bit integers, which limits values to 4
7000 terabytes. See also src_kbytes_in.
7001
7002sc1_kbytes_out
7003sc2_kbytes_out
7004 Returns the amount of server-to-client data from the currently tracked
7005 counters, measured in kilobytes over the period configured in the table. The
7006 test is currently performed on 32-bit integers, which limits values to 4
7007 terabytes. See also src_kbytes_out.
7008
7009sc1_sess_cnt
7010sc2_sess_cnt
7011 Returns the cumulated number of incoming connections that were transformed
7012 into sessions, which means that they were accepted by a "tcp-request
7013 connection" rule, from the currently tracked counters. A backend may count
7014 more sessions than connections because each connection could result in many
7015 backend sessions if some HTTP keep-alive is performend over the connection
7016 with the client. See also src_sess_cnt.
7017
7018sc1_sess_rate
7019sc2_sess_rate
7020 Returns the average session rate from the currently tracked counters,
7021 measured in amount of sessions over the period configured in the table. A
7022 session is a connection that got past the early "tcp-request connection"
7023 rules. A backend may count more sessions than connections because each
7024 connection could result in many backend sessions if some HTTP keep-alive is
7025 performend over the connection with the client. See also src_sess_rate.
7026
Willy Tarreaud63335a2010-02-26 12:56:52 +01007027so_id <integer>
7028 Applies to the socket's id. Useful in frontends with many bind keywords.
7029
7030src <ip_address>
7031 Applies to the client's IPv4 address. It is usually used to limit access to
7032 certain resources such as statistics. Note that it is the TCP-level source
7033 address which is used, and not the address of a client behind a proxy.
7034
Willy Tarreauc9705a12010-07-27 20:05:50 +02007035src_bytes_in_rate <integer>
7036src_bytes_in_rate(table) <integer>
7037 Returns the average bytes rate from the connection's source IPv4 address in
7038 the current proxy's stick-table or in the designated stick-table, measured in
7039 amount of bytes over the period configured in the table. If the address is
Willy Tarreaue9656522010-08-17 15:40:09 +02007040 not found, zero is returned. See also sc1/sc2_bytes_in_rate.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007041
7042src_bytes_out_rate <integer>
7043src_bytes_out_rate(table) <integer>
7044 Returns the average bytes rate to the connection's source IPv4 address in the
7045 current proxy's stick-table or in the designated stick-table, measured in
7046 amount of bytes over the period configured in the table. If the address is
Willy Tarreaue9656522010-08-17 15:40:09 +02007047 not found, zero is returned. See also sc1/sc2_bytes_out_rate.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007048
7049src_conn_cnt <integer>
7050src_conn_cnt(table) <integer>
7051 Returns the cumulated number of connections initiated from the current
7052 connection's source IPv4 address in the current proxy's stick-table or in
7053 the designated stick-table. If the address is not found, zero is returned.
Willy Tarreaue9656522010-08-17 15:40:09 +02007054 See also sc1/sc2_conn_cnt.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007055
7056src_conn_cur <integer>
7057src_conn_cur(table) <integer>
7058 Returns the current amount of concurrent connections initiated from the
7059 current connection's source IPv4 address in the current proxy's stick-table
7060 or in the designated stick-table. If the address is not found, zero is
Willy Tarreaue9656522010-08-17 15:40:09 +02007061 returned. See also sc1/sc2_conn_cur.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007062
7063src_conn_rate <integer>
7064src_conn_rate(table) <integer>
7065 Returns the average connection rate from the connection's source IPv4 address
7066 in the current proxy's stick-table or in the designated stick-table, measured
7067 in amount of connections over the period configured in the table. If the
Willy Tarreaue9656522010-08-17 15:40:09 +02007068 address is not found, zero is returned. See also sc1/sc2_conn_rate.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007069
7070src_get_gpc0 <integer>
7071src_get_gpc0(table) <integer>
7072 Returns the value of the first General Purpose Counter associated to the
7073 connection's source IPv4 address in the current proxy's stick-table or in
7074 the designated stick-table. If the address is not found, zero is returned.
Willy Tarreaue9656522010-08-17 15:40:09 +02007075 See also sc1/sc2_get_gpc0 and src_inc_gpc0.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007076
7077src_http_err_cnt <integer>
7078src_http_err_cnt(table) <integer>
7079 Returns the cumulated number of HTTP errors from the current connection's
7080 source IPv4 address in the current proxy's stick-table or in the designated
7081 stick-table. This includes the both request errors and 4xx error responses.
Willy Tarreaue9656522010-08-17 15:40:09 +02007082 If the address is not found, zero is returned. See also sc1/sc2_http_err_cnt.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007083
7084src_http_err_rate <integer>
7085src_http_err_rate(table) <integer>
7086 Returns the average rate of HTTP errors from the current connection's source
7087 IPv4 address in the current proxy's stick-table or in the designated stick-
7088 table, measured in amount of errors over the period configured in the table.
7089 This includes the both request errors and 4xx error responses. If the address
Willy Tarreaue9656522010-08-17 15:40:09 +02007090 is not found, zero is returned. See also sc1/sc2_http_err_rate.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007091
7092src_http_req_cnt <integer>
7093src_http_req_cnt(table) <integer>
7094 Returns the cumulated number of HTTP requests from the current connection's
7095 source IPv4 address in the current proxy's stick-table or in the designated
7096 stick-table. This includes every started request, valid or not. If the
Willy Tarreaue9656522010-08-17 15:40:09 +02007097 address is not found, zero is returned. See also sc1/sc2_http_req_cnt.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007098
7099src_http_req_rate <integer>
7100src_http_req_rate(table) <integer>
7101 Returns the average rate of HTTP requests from the current connection's
7102 source IPv4 address in the current proxy's stick-table or in the designated
7103 stick-table, measured in amount of requests over the period configured in the
7104 table. This includes every started request, valid or not. If the address is
Willy Tarreaue9656522010-08-17 15:40:09 +02007105 not found, zero is returned. See also sc1/sc2_http_req_rate.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007106
7107src_inc_gpc0 <integer>
7108src_inc_gpc0(table) <integer>
7109 Increments the first General Purpose Counter associated to the connection's
7110 source IPv4 address in the current proxy's stick-table or in the designated
7111 stick-table, and returns its value. If the address is not found, an entry is
7112 created and 1 is returned. The test can also be used alone and always returns
7113 true. This is typically used as a second ACL in an expression in order to
7114 mark a connection when a first ACL was verified :
7115
7116 acl abuse src_http_req_rate gt 10
7117 acl kill src_inc_gpc0
Willy Tarreaue9656522010-08-17 15:40:09 +02007118 tcp-request connection reject if abuse kill
Willy Tarreauc9705a12010-07-27 20:05:50 +02007119
7120src_kbytes_in <integer>
7121src_kbytes_in(table) <integer>
7122 Returns the amount of data received from the connection's source IPv4 address
7123 in the current proxy's stick-table or in the designated stick-table, measured
7124 in kilobytes over the period configured in the table. If the address is not
7125 found, zero is returned. The test is currently performed on 32-bit integers,
Willy Tarreaue9656522010-08-17 15:40:09 +02007126 which limits values to 4 terabytes. See also sc1/sc2_kbytes_in.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007127
7128src_kbytes_out <integer>
7129src_kbytes_out(table) <integer>
7130 Returns the amount of data sent to the connection's source IPv4 address in
7131 the current proxy's stick-table or in the designated stick-table, measured
7132 in kilobytes over the period configured in the table. If the address is not
7133 found, zero is returned. The test is currently performed on 32-bit integers,
Willy Tarreaue9656522010-08-17 15:40:09 +02007134 which limits values to 4 terabytes. See also sc1/sc2_kbytes_out.
Willy Tarreaua975b8f2010-06-05 19:13:27 +02007135
Willy Tarreaud63335a2010-02-26 12:56:52 +01007136src_port <integer>
7137 Applies to the client's TCP source port. This has a very limited usage.
Willy Tarreau079ff0a2009-03-05 21:34:28 +01007138
Willy Tarreauc9705a12010-07-27 20:05:50 +02007139src_sess_cnt <integer>
7140src_sess_cnt(table) <integer>
7141 Returns the cumulated number of connections initiated from the current
7142 connection's source IPv4 address in the current proxy's stick-table or in the
7143 designated stick-table, that were transformed into sessions, which means that
7144 they were accepted by "tcp-request" rules. If the address is not found, zero
Willy Tarreaue9656522010-08-17 15:40:09 +02007145 is returned. See also sc1/sc2_sess_cnt.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007146
7147src_sess_rate <integer>
7148src_sess_rate(table) <integer>
7149 Returns the average session rate from the connection's source IPv4 address in
7150 the current proxy's stick-table or in the designated stick-table, measured in
7151 amount of sessions over the period configured in the table. A session is a
7152 connection that got past the early "tcp-request" rules. If the address is not
Willy Tarreaue9656522010-08-17 15:40:09 +02007153 found, zero is returned. See also sc1/sc2_sess_rate.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007154
7155src_updt_conn_cnt <integer>
7156src_updt_conn_cnt(table) <integer>
Willy Tarreaua975b8f2010-06-05 19:13:27 +02007157 Creates or updates the entry associated to the source IPv4 address in the
Willy Tarreauc9705a12010-07-27 20:05:50 +02007158 current proxy's stick-table or in the designated stick-table. This table
7159 must be configured to store the "conn_cnt" data type, otherwise the match
Willy Tarreaua975b8f2010-06-05 19:13:27 +02007160 will be ignored. The current count is incremented by one, and the expiration
7161 timer refreshed. The updated count is returned, so this match can't return
7162 zero. This is used to reject service abusers based on their source address.
Willy Tarreauc9705a12010-07-27 20:05:50 +02007163 Note: it is recommended to use the more complete "track-counters" instead.
Willy Tarreaua975b8f2010-06-05 19:13:27 +02007164
7165 Example :
7166 # This frontend limits incoming SSH connections to 3 per 10 second for
7167 # each source address, and rejects excess connections until a 10 second
7168 # silence is observed. At most 20 addresses are tracked.
7169 listen ssh
7170 bind :22
7171 mode tcp
7172 maxconn 100
Willy Tarreauc9705a12010-07-27 20:05:50 +02007173 stick-table type ip size 20 expire 10s store conn_cnt
Willy Tarreaua975b8f2010-06-05 19:13:27 +02007174 tcp-request content reject if { src_update_count gt 3 }
7175 server local 127.0.0.1:22
7176
Willy Tarreau0b1cd942010-05-16 22:18:27 +02007177srv_is_up(<server>)
7178srv_is_up(<backend>/<server>)
7179 Returns true when the designated server is UP, and false when it is either
7180 DOWN or in maintenance mode. If <backend> is omitted, then the server is
7181 looked up in the current backend. The function takes no arguments since it
7182 is used as a boolean. It is mainly used to take action based on an external
7183 status reported via a health check (eg: a geographical site's availability).
7184 Another possible use which is more of a hack consists in using dummy servers
7185 as boolean variables that can be enabled or disabled from the CLI, so that
7186 rules depending on those ACLs can be tweaked in realtime.
7187
Willy Tarreau0ba27502007-12-24 16:55:16 +01007188
Willy Tarreaue9656522010-08-17 15:40:09 +020071897.5.2. Matching contents at Layer 4 (also called Layer 6)
7190---------------------------------------------------------
Willy Tarreau62644772008-07-16 18:36:06 +02007191
7192A second set of criteria depends on data found in buffers, but which can change
7193during analysis. This requires that some data has been buffered, for instance
Willy Tarreaue9656522010-08-17 15:40:09 +02007194through TCP request content inspection. Please see the "tcp-request content"
7195keyword for more detailed information on the subject.
Willy Tarreau62644772008-07-16 18:36:06 +02007196
7197req_len <integer>
Emeric Brunbede3d02009-06-30 17:54:00 +02007198 Returns true when the length of the data in the request buffer matches the
Willy Tarreau62644772008-07-16 18:36:06 +02007199 specified range. It is important to understand that this test does not
7200 return false as long as the buffer is changing. This means that a check with
7201 equality to zero will almost always immediately match at the beginning of the
7202 session, while a test for more data will wait for that data to come in and
7203 return false only when haproxy is certain that no more data will come in.
7204 This test was designed to be used with TCP request content inspection.
7205
Willy Tarreau2492d5b2009-07-11 00:06:00 +02007206req_proto_http
7207 Returns true when data in the request buffer look like HTTP and correctly
7208 parses as such. It is the same parser as the common HTTP request parser which
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01007209 is used so there should be no surprises. This test can be used for instance
Willy Tarreau2492d5b2009-07-11 00:06:00 +02007210 to direct HTTP traffic to a given port and HTTPS traffic to another one
7211 using TCP request content inspection rules.
7212
Emeric Brunbede3d02009-06-30 17:54:00 +02007213req_rdp_cookie <string>
7214req_rdp_cookie(name) <string>
7215 Returns true when data in the request buffer look like the RDP protocol, and
7216 a cookie is present and equal to <string>. By default, any cookie name is
7217 checked, but a specific cookie name can be specified in parenthesis. The
7218 parser only checks for the first cookie, as illustrated in the RDP protocol
7219 specification. The cookie name is case insensitive. This ACL can be useful
7220 with the "MSTS" cookie, as it can contain the user name of the client
7221 connecting to the server if properly configured on the client. This can be
7222 used to restrict access to certain servers to certain users.
7223
7224req_rdp_cookie_cnt <integer>
7225req_rdp_cookie_cnt(name) <integer>
7226 Returns true when the data in the request buffer look like the RDP protocol
7227 and the number of RDP cookies matches the specified range (typically zero or
7228 one). Optionally a specific cookie name can be checked. This is a simple way
7229 of detecting the RDP protocol, as clients generally send the MSTS or MSTSHASH
7230 cookies.
7231
Willy Tarreau62644772008-07-16 18:36:06 +02007232req_ssl_ver <decimal>
7233 Returns true when data in the request buffer look like SSL, with a protocol
7234 version matching the specified range. Both SSLv2 hello messages and SSLv3
7235 messages are supported. The test tries to be strict enough to avoid being
7236 easily fooled. In particular, it waits for as many bytes as announced in the
7237 message header if this header looks valid (bound to the buffer size). Note
7238 that TLSv1 is announced as SSL version 3.1. This test was designed to be used
7239 with TCP request content inspection.
7240
Emeric Brun392d1d82010-09-24 15:45:16 +02007241req_ssl_hello_type <integer>
7242 Returns true when data in the request buffer looks like a complete SSL (v3
7243 or superior) hello message and handshake type is equal to <integer>.
7244 This test was designed to be used with TCP request content inspection: an
7245 SSL session ID may be fetched.
7246
7247rep_ssl_hello_type <integer>
7248 Returns true when data in the response buffer looks like a complete SSL (v3
7249 or superior) hello message and handshake type is equal to <integer>.
7250 This test was designed to be used with TCP response content inspection: a
7251 SSL session ID may be fetched.
7252
Willy Tarreaub6fb4202008-07-20 11:18:28 +02007253wait_end
7254 Waits for the end of the analysis period to return true. This may be used in
7255 conjunction with content analysis to avoid returning a wrong verdict early.
7256 It may also be used to delay some actions, such as a delayed reject for some
7257 special addresses. Since it either stops the rules evaluation or immediately
7258 returns true, it is recommended to use this acl as the last one in a rule.
7259 Please note that the default ACL "WAIT_END" is always usable without prior
7260 declaration. This test was designed to be used with TCP request content
7261 inspection.
7262
7263 Examples :
7264 # delay every incoming request by 2 seconds
7265 tcp-request inspect-delay 2s
7266 tcp-request content accept if WAIT_END
7267
7268 # don't immediately tell bad guys they are rejected
7269 tcp-request inspect-delay 10s
7270 acl goodguys src 10.0.0.0/24
7271 acl badguys src 10.0.1.0/24
7272 tcp-request content accept if goodguys
7273 tcp-request content reject if badguys WAIT_END
7274 tcp-request content reject
7275
Willy Tarreau62644772008-07-16 18:36:06 +02007276
Willy Tarreauc57f0e22009-05-10 13:12:33 +020072777.5.3. Matching at Layer 7
7278--------------------------
Willy Tarreau0ba27502007-12-24 16:55:16 +01007279
Willy Tarreau62644772008-07-16 18:36:06 +02007280A third set of criteria applies to information which can be found at the
Willy Tarreau0ba27502007-12-24 16:55:16 +01007281application layer (layer 7). Those require that a full HTTP request has been
7282read, and are only evaluated then. They may require slightly more CPU resources
7283than the layer 4 ones, but not much since the request and response are indexed.
7284
Willy Tarreaud63335a2010-02-26 12:56:52 +01007285hdr <string>
7286hdr(header) <string>
7287 Note: all the "hdr*" matching criteria either apply to all headers, or to a
7288 particular header whose name is passed between parenthesis and without any
7289 space. The header name is not case-sensitive. The header matching complies
7290 with RFC2616, and treats as separate headers all values delimited by commas.
7291 Use the shdr() variant for response headers sent by the server.
7292
7293 The "hdr" criteria returns true if any of the headers matching the criteria
7294 match any of the strings. This can be used to check exact for values. For
7295 instance, checking that "connection: close" is set :
7296
7297 hdr(Connection) -i close
7298
7299hdr_beg <string>
7300hdr_beg(header) <string>
7301 Returns true when one of the headers begins with one of the strings. See
7302 "hdr" for more information on header matching. Use the shdr_beg() variant for
7303 response headers sent by the server.
7304
7305hdr_cnt <integer>
7306hdr_cnt(header) <integer>
7307 Returns true when the number of occurrence of the specified header matches
7308 the values or ranges specified. It is important to remember that one header
7309 line may count as several headers if it has several values. This is used to
7310 detect presence, absence or abuse of a specific header, as well as to block
7311 request smuggling attacks by rejecting requests which contain more than one
7312 of certain headers. See "hdr" for more information on header matching. Use
7313 the shdr_cnt() variant for response headers sent by the server.
7314
7315hdr_dir <string>
7316hdr_dir(header) <string>
7317 Returns true when one of the headers contains one of the strings either
7318 isolated or delimited by slashes. This is used to perform filename or
7319 directory name matching, and may be used with Referer. See "hdr" for more
7320 information on header matching. Use the shdr_dir() variant for response
7321 headers sent by the server.
7322
7323hdr_dom <string>
7324hdr_dom(header) <string>
7325 Returns true when one of the headers contains one of the strings either
7326 isolated or delimited by dots. This is used to perform domain name matching,
7327 and may be used with the Host header. See "hdr" for more information on
7328 header matching. Use the shdr_dom() variant for response headers sent by the
7329 server.
7330
7331hdr_end <string>
7332hdr_end(header) <string>
7333 Returns true when one of the headers ends with one of the strings. See "hdr"
7334 for more information on header matching. Use the shdr_end() variant for
7335 response headers sent by the server.
7336
7337hdr_ip <ip_address>
7338hdr_ip(header) <ip_address>
7339 Returns true when one of the headers' values contains an IP address matching
7340 <ip_address>. This is mainly used with headers such as X-Forwarded-For or
7341 X-Client-IP. See "hdr" for more information on header matching. Use the
7342 shdr_ip() variant for response headers sent by the server.
7343
7344hdr_reg <regex>
7345hdr_reg(header) <regex>
7346 Returns true when one of the headers matches of the regular expressions. It
7347 can be used at any time, but it is important to remember that regex matching
7348 is slower than other methods. See also other "hdr_" criteria, as well as
7349 "hdr" for more information on header matching. Use the shdr_reg() variant for
7350 response headers sent by the server.
7351
7352hdr_sub <string>
7353hdr_sub(header) <string>
7354 Returns true when one of the headers contains one of the strings. See "hdr"
7355 for more information on header matching. Use the shdr_sub() variant for
7356 response headers sent by the server.
7357
7358hdr_val <integer>
7359hdr_val(header) <integer>
7360 Returns true when one of the headers starts with a number which matches the
7361 values or ranges specified. This may be used to limit content-length to
7362 acceptable values for example. See "hdr" for more information on header
7363 matching. Use the shdr_val() variant for response headers sent by the server.
7364
7365http_auth(userlist)
7366http_auth_group(userlist) <group> [<group>]*
7367 Returns true when authentication data received from the client matches
7368 username & password stored on the userlist. It is also possible to
7369 use http_auth_group to check if the user is assigned to at least one
7370 of specified groups.
7371
7372 Currently only http basic auth is supported.
7373
Willy Tarreau7f18e522010-10-22 20:04:13 +02007374http_req_first
7375 Returns true when the request being processed is the first one of the
7376 connection. This can be used to add or remove headers that may be missing
7377 from some requests when a request is not the first one, or even to perform
7378 some specific ACL checks only on the first request.
7379
Willy Tarreau6a06a402007-07-15 20:15:28 +02007380method <string>
7381 Applies to the method in the HTTP request, eg: "GET". Some predefined ACL
7382 already check for most common methods.
7383
Willy Tarreau6a06a402007-07-15 20:15:28 +02007384path <string>
7385 Returns true when the path part of the request, which starts at the first
7386 slash and ends before the question mark, equals one of the strings. It may be
7387 used to match known files, such as /favicon.ico.
7388
7389path_beg <string>
Willy Tarreau0ba27502007-12-24 16:55:16 +01007390 Returns true when the path begins with one of the strings. This can be used
7391 to send certain directory names to alternative backends.
Willy Tarreau6a06a402007-07-15 20:15:28 +02007392
Willy Tarreau6a06a402007-07-15 20:15:28 +02007393path_dir <string>
7394 Returns true when one of the strings is found isolated or delimited with
7395 slashes in the path. This is used to perform filename or directory name
7396 matching without the risk of wrong match due to colliding prefixes. See also
7397 "url_dir" and "path_sub".
7398
7399path_dom <string>
7400 Returns true when one of the strings is found isolated or delimited with dots
7401 in the path. This may be used to perform domain name matching in proxy
7402 requests. See also "path_sub" and "url_dom".
7403
Willy Tarreaud63335a2010-02-26 12:56:52 +01007404path_end <string>
7405 Returns true when the path ends with one of the strings. This may be used to
7406 control file name extension.
7407
Willy Tarreau6a06a402007-07-15 20:15:28 +02007408path_reg <regex>
7409 Returns true when the path matches one of the regular expressions. It can be
7410 used any time, but it is important to remember that regex matching is slower
7411 than other methods. See also "url_reg" and all "path_" criteria.
7412
Willy Tarreaud63335a2010-02-26 12:56:52 +01007413path_sub <string>
7414 Returns true when the path contains one of the strings. It can be used to
7415 detect particular patterns in paths, such as "../" for example. See also
7416 "path_dir".
7417
7418req_ver <string>
7419 Applies to the version string in the HTTP request, eg: "1.0". Some predefined
7420 ACL already check for versions 1.0 and 1.1.
7421
7422status <integer>
7423 Applies to the HTTP status code in the HTTP response, eg: "302". It can be
7424 used to act on responses depending on status ranges, for instance, remove
7425 any Location header if the response is not a 3xx.
7426
Willy Tarreau6a06a402007-07-15 20:15:28 +02007427url <string>
7428 Applies to the whole URL passed in the request. The only real use is to match
7429 "*", for which there already is a predefined ACL.
7430
7431url_beg <string>
7432 Returns true when the URL begins with one of the strings. This can be used to
7433 check whether a URL begins with a slash or with a protocol scheme.
7434
Willy Tarreau6a06a402007-07-15 20:15:28 +02007435url_dir <string>
7436 Returns true when one of the strings is found isolated or delimited with
7437 slashes in the URL. This is used to perform filename or directory name
7438 matching without the risk of wrong match due to colliding prefixes. See also
7439 "path_dir" and "url_sub".
7440
7441url_dom <string>
7442 Returns true when one of the strings is found isolated or delimited with dots
7443 in the URL. This is used to perform domain name matching without the risk of
7444 wrong match due to colliding prefixes. See also "url_sub".
7445
Willy Tarreaud63335a2010-02-26 12:56:52 +01007446url_end <string>
7447 Returns true when the URL ends with one of the strings. It has very limited
7448 use. "path_end" should be used instead for filename matching.
Willy Tarreau6a06a402007-07-15 20:15:28 +02007449
Alexandre Cassen5eb1a902007-11-29 15:43:32 +01007450url_ip <ip_address>
Willy Tarreau0ba27502007-12-24 16:55:16 +01007451 Applies to the IP address specified in the absolute URI in an HTTP request.
7452 It can be used to prevent access to certain resources such as local network.
Willy Tarreau198a7442008-01-17 12:05:32 +01007453 It is useful with option "http_proxy".
Alexandre Cassen5eb1a902007-11-29 15:43:32 +01007454
7455url_port <integer>
Willy Tarreau0ba27502007-12-24 16:55:16 +01007456 Applies to the port specified in the absolute URI in an HTTP request. It can
7457 be used to prevent access to certain resources. It is useful with option
Willy Tarreau198a7442008-01-17 12:05:32 +01007458 "http_proxy". Note that if the port is not specified in the request, port 80
Willy Tarreau0ba27502007-12-24 16:55:16 +01007459 is assumed.
Alexandre Cassen5eb1a902007-11-29 15:43:32 +01007460
Willy Tarreaud63335a2010-02-26 12:56:52 +01007461url_reg <regex>
7462 Returns true when the URL matches one of the regular expressions. It can be
7463 used any time, but it is important to remember that regex matching is slower
7464 than other methods. See also "path_reg" and all "url_" criteria.
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +01007465
Willy Tarreaud63335a2010-02-26 12:56:52 +01007466url_sub <string>
7467 Returns true when the URL contains one of the strings. It can be used to
7468 detect particular patterns in query strings for example. See also "path_sub".
Krzysztof Piotr Oledzki6b35ce12010-02-01 23:35:44 +01007469
Willy Tarreau198a7442008-01-17 12:05:32 +01007470
Willy Tarreauc57f0e22009-05-10 13:12:33 +020074717.6. Pre-defined ACLs
7472---------------------
Willy Tarreauced27012008-01-17 20:35:34 +01007473
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007474Some predefined ACLs are hard-coded so that they do not have to be declared in
7475every frontend which needs them. They all have their names in upper case in
Patrick Mézard2382ad62010-05-09 10:43:32 +02007476order to avoid confusion. Their equivalence is provided below.
Willy Tarreauced27012008-01-17 20:35:34 +01007477
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007478ACL name Equivalent to Usage
7479---------------+-----------------------------+---------------------------------
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007480FALSE always_false never match
Willy Tarreau2492d5b2009-07-11 00:06:00 +02007481HTTP req_proto_http match if protocol is valid HTTP
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007482HTTP_1.0 req_ver 1.0 match HTTP version 1.0
7483HTTP_1.1 req_ver 1.1 match HTTP version 1.1
Willy Tarreaud63335a2010-02-26 12:56:52 +01007484HTTP_CONTENT hdr_val(content-length) gt 0 match an existing content-length
7485HTTP_URL_ABS url_reg ^[^/:]*:// match absolute URL with scheme
7486HTTP_URL_SLASH url_beg / match URL beginning with "/"
7487HTTP_URL_STAR url * match URL equal to "*"
7488LOCALHOST src 127.0.0.1/8 match connection from local host
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007489METH_CONNECT method CONNECT match HTTP CONNECT method
7490METH_GET method GET HEAD match HTTP GET or HEAD method
7491METH_HEAD method HEAD match HTTP HEAD method
7492METH_OPTIONS method OPTIONS match HTTP OPTIONS method
7493METH_POST method POST match HTTP POST method
7494METH_TRACE method TRACE match HTTP TRACE method
Emeric Brunbede3d02009-06-30 17:54:00 +02007495RDP_COOKIE req_rdp_cookie_cnt gt 0 match presence of an RDP cookie
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007496REQ_CONTENT req_len gt 0 match data in the request buffer
Willy Tarreaud63335a2010-02-26 12:56:52 +01007497TRUE always_true always match
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007498WAIT_END wait_end wait for end of content analysis
7499---------------+-----------------------------+---------------------------------
Willy Tarreauced27012008-01-17 20:35:34 +01007500
Willy Tarreauced27012008-01-17 20:35:34 +01007501
Willy Tarreauc57f0e22009-05-10 13:12:33 +020075027.7. Using ACLs to form conditions
7503----------------------------------
Willy Tarreauced27012008-01-17 20:35:34 +01007504
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007505Some actions are only performed upon a valid condition. A condition is a
7506combination of ACLs with operators. 3 operators are supported :
Willy Tarreauced27012008-01-17 20:35:34 +01007507
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007508 - AND (implicit)
7509 - OR (explicit with the "or" keyword or the "||" operator)
7510 - Negation with the exclamation mark ("!")
Willy Tarreauced27012008-01-17 20:35:34 +01007511
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01007512A condition is formed as a disjunctive form:
Willy Tarreauced27012008-01-17 20:35:34 +01007513
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007514 [!]acl1 [!]acl2 ... [!]acln { or [!]acl1 [!]acl2 ... [!]acln } ...
Willy Tarreauced27012008-01-17 20:35:34 +01007515
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007516Such conditions are generally used after an "if" or "unless" statement,
7517indicating when the condition will trigger the action.
Willy Tarreauced27012008-01-17 20:35:34 +01007518
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007519For instance, to block HTTP requests to the "*" URL with methods other than
7520"OPTIONS", as well as POST requests without content-length, and GET or HEAD
7521requests with a content-length greater than 0, and finally every request which
7522is not either GET/HEAD/POST/OPTIONS !
Willy Tarreauced27012008-01-17 20:35:34 +01007523
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007524 acl missing_cl hdr_cnt(Content-length) eq 0
7525 block if HTTP_URL_STAR !METH_OPTIONS || METH_POST missing_cl
7526 block if METH_GET HTTP_CONTENT
7527 block unless METH_GET or METH_POST or METH_OPTIONS
Willy Tarreauced27012008-01-17 20:35:34 +01007528
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007529To select a different backend for requests to static contents on the "www" site
7530and to every request on the "img", "video", "download" and "ftp" hosts :
Willy Tarreauced27012008-01-17 20:35:34 +01007531
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007532 acl url_static path_beg /static /images /img /css
7533 acl url_static path_end .gif .png .jpg .css .js
7534 acl host_www hdr_beg(host) -i www
7535 acl host_static hdr_beg(host) -i img. video. download. ftp.
Willy Tarreauced27012008-01-17 20:35:34 +01007536
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007537 # now use backend "static" for all static-only hosts, and for static urls
7538 # of host "www". Use backend "www" for the rest.
7539 use_backend static if host_static or host_www url_static
7540 use_backend www if host_www
Willy Tarreauced27012008-01-17 20:35:34 +01007541
Willy Tarreau95fa4692010-02-01 13:05:50 +01007542It is also possible to form rules using "anonymous ACLs". Those are unnamed ACL
7543expressions that are built on the fly without needing to be declared. They must
7544be enclosed between braces, with a space before and after each brace (because
7545the braces must be seen as independant words). Example :
7546
7547 The following rule :
7548
7549 acl missing_cl hdr_cnt(Content-length) eq 0
7550 block if METH_POST missing_cl
7551
7552 Can also be written that way :
7553
7554 block if METH_POST { hdr_cnt(Content-length) eq 0 }
7555
7556It is generally not recommended to use this construct because it's a lot easier
7557to leave errors in the configuration when written that way. However, for very
7558simple rules matching only one source IP address for instance, it can make more
7559sense to use them than to declare ACLs with random names. Another example of
7560good use is the following :
7561
7562 With named ACLs :
7563
7564 acl site_dead nbsrv(dynamic) lt 2
7565 acl site_dead nbsrv(static) lt 2
7566 monitor fail if site_dead
7567
7568 With anonymous ACLs :
7569
7570 monitor fail if { nbsrv(dynamic) lt 2 } || { nbsrv(static) lt 2 }
7571
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007572See section 4.2 for detailed help on the "block" and "use_backend" keywords.
Willy Tarreauced27012008-01-17 20:35:34 +01007573
Willy Tarreau5764b382007-11-30 17:46:49 +01007574
Willy Tarreaub937b7e2010-01-12 15:27:54 +010075757.8. Pattern extraction
7576-----------------------
7577
7578The stickiness features relies on pattern extraction in the request and
7579response. Sometimes the data needs to be converted first before being stored,
7580for instance converted from ASCII to IP or upper case to lower case.
7581
7582All these operations of data extraction and conversion are defined as
7583"pattern extraction rules". A pattern rule always has the same format. It
7584begins with a single pattern fetch word, potentially followed by a list of
7585arguments within parenthesis then an optional list of transformations. As
7586much as possible, the pattern fetch functions use the same name as their
7587equivalent used in ACLs.
7588
7589The list of currently supported pattern fetch functions is the following :
7590
7591 src This is the source IPv4 address of the client of the session.
7592 It is of type IP and only works with such tables.
7593
7594 dst This is the destination IPv4 address of the session on the
7595 client side, which is the address the client connected to.
7596 It can be useful when running in transparent mode. It is of
7597 typie IP and only works with such tables.
7598
7599 dst_port This is the destination TCP port of the session on the client
7600 side, which is the port the client connected to. This might be
7601 used when running in transparent mode or when assigning dynamic
7602 ports to some clients for a whole application session. It is of
7603 type integer and only works with such tables.
7604
Willy Tarreau4a568972010-05-12 08:08:50 +02007605 hdr(name) This extracts the last occurrence of header <name> in an HTTP
7606 request and converts it to an IP address. This IP address is
7607 then used to match the table. A typical use is with the
7608 x-forwarded-for header.
7609
Willy Tarreaub937b7e2010-01-12 15:27:54 +01007610
7611The currently available list of transformations include :
7612
7613 lower Convert a string pattern to lower case. This can only be placed
7614 after a string pattern fetch function or after a conversion
7615 function returning a string type. The result is of type string.
7616
7617 upper Convert a string pattern to upper case. This can only be placed
7618 after a string pattern fetch function or after a conversion
7619 function returning a string type. The result is of type string.
7620
Willy Tarreaud31d6eb2010-01-26 18:01:41 +01007621 ipmask(mask) Apply a mask to an IPv4 address, and use the result for lookups
7622 and storage. This can be used to make all hosts within a
7623 certain mask to share the same table entries and as such use
7624 the same server. The mask can be passed in dotted form (eg:
7625 255.255.255.0) or in CIDR form (eg: 24).
7626
Willy Tarreaub937b7e2010-01-12 15:27:54 +01007627
Willy Tarreauc57f0e22009-05-10 13:12:33 +020076288. Logging
7629----------
Willy Tarreau844e3c52008-01-11 16:28:18 +01007630
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007631One of HAProxy's strong points certainly lies is its precise logs. It probably
7632provides the finest level of information available for such a product, which is
7633very important for troubleshooting complex environments. Standard information
7634provided in logs include client ports, TCP/HTTP state timers, precise session
7635state at termination and precise termination cause, information about decisions
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01007636to direct traffic to a server, and of course the ability to capture arbitrary
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007637headers.
7638
7639In order to improve administrators reactivity, it offers a great transparency
7640about encountered problems, both internal and external, and it is possible to
7641send logs to different sources at the same time with different level filters :
7642
7643 - global process-level logs (system errors, start/stop, etc..)
7644 - per-instance system and internal errors (lack of resource, bugs, ...)
7645 - per-instance external troubles (servers up/down, max connections)
7646 - per-instance activity (client connections), either at the establishment or
7647 at the termination.
7648
7649The ability to distribute different levels of logs to different log servers
7650allow several production teams to interact and to fix their problems as soon
7651as possible. For example, the system team might monitor system-wide errors,
7652while the application team might be monitoring the up/down for their servers in
7653real time, and the security team might analyze the activity logs with one hour
7654delay.
7655
7656
Willy Tarreauc57f0e22009-05-10 13:12:33 +020076578.1. Log levels
7658---------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007659
7660TCP and HTTP connections can be logged with informations such as date, time,
7661source IP address, destination address, connection duration, response times,
7662HTTP request, the HTTP return code, number of bytes transmitted, the conditions
7663in which the session ended, and even exchanged cookies values, to track a
7664particular user's problems for example. All messages are sent to up to two
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007665syslog servers. Check the "log" keyword in section 4.2 for more info about log
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007666facilities.
7667
7668
Willy Tarreauc57f0e22009-05-10 13:12:33 +020076698.2. Log formats
7670----------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007671
Emeric Brun3a058f32009-06-30 18:26:00 +02007672HAProxy supports 4 log formats. Several fields are common between these formats
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007673and will be detailed in the next sections. A few of them may slightly vary with
7674the configuration, due to indicators specific to certain options. The supported
7675formats are the following ones :
7676
7677 - the default format, which is very basic and very rarely used. It only
7678 provides very basic information about the incoming connection at the moment
7679 it is accepted : source IP:port, destination IP:port, and frontend-name.
7680 This mode will eventually disappear so it will not be described to great
7681 extents.
7682
7683 - the TCP format, which is more advanced. This format is enabled when "option
7684 tcplog" is set on the frontend. HAProxy will then usually wait for the
7685 connection to terminate before logging. This format provides much richer
7686 information, such as timers, connection counts, queue size, etc... This
7687 format is recommended for pure TCP proxies.
7688
7689 - the HTTP format, which is the most advanced for HTTP proxying. This format
7690 is enabled when "option httplog" is set on the frontend. It provides the
7691 same information as the TCP format with some HTTP-specific fields such as
7692 the request, the status code, and captures of headers and cookies. This
7693 format is recommended for HTTP proxies.
7694
Emeric Brun3a058f32009-06-30 18:26:00 +02007695 - the CLF HTTP format, which is equivalent to the HTTP format, but with the
7696 fields arranged in the same order as the CLF format. In this mode, all
7697 timers, captures, flags, etc... appear one per field after the end of the
7698 common fields, in the same order they appear in the standard HTTP format.
7699
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007700Next sections will go deeper into details for each of these formats. Format
7701specification will be performed on a "field" basis. Unless stated otherwise, a
7702field is a portion of text delimited by any number of spaces. Since syslog
7703servers are susceptible of inserting fields at the beginning of a line, it is
7704always assumed that the first field is the one containing the process name and
7705identifier.
7706
7707Note : Since log lines may be quite long, the log examples in sections below
7708 might be broken into multiple lines. The example log lines will be
7709 prefixed with 3 closing angle brackets ('>>>') and each time a log is
7710 broken into multiple lines, each non-final line will end with a
7711 backslash ('\') and the next line will start indented by two characters.
7712
7713
Willy Tarreauc57f0e22009-05-10 13:12:33 +020077148.2.1. Default log format
7715-------------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007716
7717This format is used when no specific option is set. The log is emitted as soon
7718as the connection is accepted. One should note that this currently is the only
7719format which logs the request's destination IP and ports.
7720
7721 Example :
7722 listen www
7723 mode http
7724 log global
7725 server srv1 127.0.0.1:8000
7726
7727 >>> Feb 6 12:12:09 localhost \
7728 haproxy[14385]: Connect from 10.0.1.2:33312 to 10.0.3.31:8012 \
7729 (www/HTTP)
7730
7731 Field Format Extract from the example above
7732 1 process_name '[' pid ']:' haproxy[14385]:
7733 2 'Connect from' Connect from
7734 3 source_ip ':' source_port 10.0.1.2:33312
7735 4 'to' to
7736 5 destination_ip ':' destination_port 10.0.3.31:8012
7737 6 '(' frontend_name '/' mode ')' (www/HTTP)
7738
7739Detailed fields description :
7740 - "source_ip" is the IP address of the client which initiated the connection.
7741 - "source_port" is the TCP port of the client which initiated the connection.
7742 - "destination_ip" is the IP address the client connected to.
7743 - "destination_port" is the TCP port the client connected to.
7744 - "frontend_name" is the name of the frontend (or listener) which received
7745 and processed the connection.
7746 - "mode is the mode the frontend is operating (TCP or HTTP).
7747
Willy Tarreauceb24bc2010-11-09 12:46:41 +01007748In case of a UNIX socket, the source and destination addresses are marked as
7749"unix:" and the ports reflect the internal ID of the socket which accepted the
7750connection (the same ID as reported in the stats).
7751
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007752It is advised not to use this deprecated format for newer installations as it
7753will eventually disappear.
7754
7755
Willy Tarreauc57f0e22009-05-10 13:12:33 +020077568.2.2. TCP log format
7757---------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007758
7759The TCP format is used when "option tcplog" is specified in the frontend, and
7760is the recommended format for pure TCP proxies. It provides a lot of precious
7761information for troubleshooting. Since this format includes timers and byte
7762counts, the log is normally emitted at the end of the session. It can be
7763emitted earlier if "option logasap" is specified, which makes sense in most
7764environments with long sessions such as remote terminals. Sessions which match
7765the "monitor" rules are never logged. It is also possible not to emit logs for
7766sessions for which no data were exchanged between the client and the server, by
Willy Tarreauc9bd0cc2009-05-10 11:57:02 +02007767specifying "option dontlognull" in the frontend. Successful connections will
7768not be logged if "option dontlog-normal" is specified in the frontend. A few
7769fields may slightly vary depending on some configuration options, those are
7770marked with a star ('*') after the field name below.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007771
7772 Example :
7773 frontend fnt
7774 mode tcp
7775 option tcplog
7776 log global
7777 default_backend bck
7778
7779 backend bck
7780 server srv1 127.0.0.1:8000
7781
7782 >>> Feb 6 12:12:56 localhost \
7783 haproxy[14387]: 10.0.1.2:33313 [06/Feb/2009:12:12:51.443] fnt \
7784 bck/srv1 0/0/5007 212 -- 0/0/0/0/3 0/0
7785
7786 Field Format Extract from the example above
7787 1 process_name '[' pid ']:' haproxy[14387]:
7788 2 client_ip ':' client_port 10.0.1.2:33313
7789 3 '[' accept_date ']' [06/Feb/2009:12:12:51.443]
7790 4 frontend_name fnt
7791 5 backend_name '/' server_name bck/srv1
7792 6 Tw '/' Tc '/' Tt* 0/0/5007
7793 7 bytes_read* 212
7794 8 termination_state --
7795 9 actconn '/' feconn '/' beconn '/' srv_conn '/' retries* 0/0/0/0/3
7796 10 srv_queue '/' backend_queue 0/0
7797
7798Detailed fields description :
7799 - "client_ip" is the IP address of the client which initiated the TCP
Willy Tarreauceb24bc2010-11-09 12:46:41 +01007800 connection to haproxy. If the connection was accepted on a UNIX socket
7801 instead, the IP address would be replaced with the word "unix". Note that
7802 when the connection is accepted on a socket configured with "accept-proxy"
7803 and the PROXY protocol is correctly used, then the logs will reflect the
7804 forwarded connection's information.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007805
7806 - "client_port" is the TCP port of the client which initiated the connection.
Willy Tarreauceb24bc2010-11-09 12:46:41 +01007807 If the connection was accepted on a UNIX socket instead, the port would be
7808 replaced with the ID of the accepting socket, which is also reported in the
7809 stats interface.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007810
7811 - "accept_date" is the exact date when the connection was received by haproxy
7812 (which might be very slightly different from the date observed on the
7813 network if there was some queuing in the system's backlog). This is usually
7814 the same date which may appear in any upstream firewall's log.
7815
7816 - "frontend_name" is the name of the frontend (or listener) which received
7817 and processed the connection.
7818
7819 - "backend_name" is the name of the backend (or listener) which was selected
7820 to manage the connection to the server. This will be the same as the
7821 frontend if no switching rule has been applied, which is common for TCP
7822 applications.
7823
7824 - "server_name" is the name of the last server to which the connection was
7825 sent, which might differ from the first one if there were connection errors
7826 and a redispatch occurred. Note that this server belongs to the backend
7827 which processed the request. If the connection was aborted before reaching
7828 a server, "<NOSRV>" is indicated instead of a server name.
7829
7830 - "Tw" is the total time in milliseconds spent waiting in the various queues.
7831 It can be "-1" if the connection was aborted before reaching the queue.
7832 See "Timers" below for more details.
7833
7834 - "Tc" is the total time in milliseconds spent waiting for the connection to
7835 establish to the final server, including retries. It can be "-1" if the
7836 connection was aborted before a connection could be established. See
7837 "Timers" below for more details.
7838
7839 - "Tt" is the total time in milliseconds elapsed between the accept and the
7840 last close. It covers all possible processings. There is one exception, if
7841 "option logasap" was specified, then the time counting stops at the moment
7842 the log is emitted. In this case, a '+' sign is prepended before the value,
7843 indicating that the final one will be larger. See "Timers" below for more
7844 details.
7845
7846 - "bytes_read" is the total number of bytes transmitted from the server to
7847 the client when the log is emitted. If "option logasap" is specified, the
7848 this value will be prefixed with a '+' sign indicating that the final one
7849 may be larger. Please note that this value is a 64-bit counter, so log
7850 analysis tools must be able to handle it without overflowing.
7851
7852 - "termination_state" is the condition the session was in when the session
7853 ended. This indicates the session state, which side caused the end of
7854 session to happen, and for what reason (timeout, error, ...). The normal
7855 flags should be "--", indicating the session was closed by either end with
7856 no data remaining in buffers. See below "Session state at disconnection"
7857 for more details.
7858
7859 - "actconn" is the total number of concurrent connections on the process when
7860 the session was logged. It it useful to detect when some per-process system
7861 limits have been reached. For instance, if actconn is close to 512 when
7862 multiple connection errors occur, chances are high that the system limits
7863 the process to use a maximum of 1024 file descriptors and that all of them
Willy Tarreauc57f0e22009-05-10 13:12:33 +02007864 are used. See section 3 "Global parameters" to find how to tune the system.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007865
7866 - "feconn" is the total number of concurrent connections on the frontend when
7867 the session was logged. It is useful to estimate the amount of resource
7868 required to sustain high loads, and to detect when the frontend's "maxconn"
7869 has been reached. Most often when this value increases by huge jumps, it is
7870 because there is congestion on the backend servers, but sometimes it can be
7871 caused by a denial of service attack.
7872
7873 - "beconn" is the total number of concurrent connections handled by the
7874 backend when the session was logged. It includes the total number of
7875 concurrent connections active on servers as well as the number of
7876 connections pending in queues. It is useful to estimate the amount of
7877 additional servers needed to support high loads for a given application.
7878 Most often when this value increases by huge jumps, it is because there is
7879 congestion on the backend servers, but sometimes it can be caused by a
7880 denial of service attack.
7881
7882 - "srv_conn" is the total number of concurrent connections still active on
7883 the server when the session was logged. It can never exceed the server's
7884 configured "maxconn" parameter. If this value is very often close or equal
7885 to the server's "maxconn", it means that traffic regulation is involved a
7886 lot, meaning that either the server's maxconn value is too low, or that
7887 there aren't enough servers to process the load with an optimal response
7888 time. When only one of the server's "srv_conn" is high, it usually means
7889 that this server has some trouble causing the connections to take longer to
7890 be processed than on other servers.
7891
7892 - "retries" is the number of connection retries experienced by this session
7893 when trying to connect to the server. It must normally be zero, unless a
7894 server is being stopped at the same moment the connection was attempted.
7895 Frequent retries generally indicate either a network problem between
7896 haproxy and the server, or a misconfigured system backlog on the server
7897 preventing new connections from being queued. This field may optionally be
7898 prefixed with a '+' sign, indicating that the session has experienced a
7899 redispatch after the maximal retry count has been reached on the initial
7900 server. In this case, the server name appearing in the log is the one the
7901 connection was redispatched to, and not the first one, though both may
7902 sometimes be the same in case of hashing for instance. So as a general rule
7903 of thumb, when a '+' is present in front of the retry count, this count
7904 should not be attributed to the logged server.
7905
7906 - "srv_queue" is the total number of requests which were processed before
7907 this one in the server queue. It is zero when the request has not gone
7908 through the server queue. It makes it possible to estimate the approximate
7909 server's response time by dividing the time spent in queue by the number of
7910 requests in the queue. It is worth noting that if a session experiences a
7911 redispatch and passes through two server queues, their positions will be
7912 cumulated. A request should not pass through both the server queue and the
7913 backend queue unless a redispatch occurs.
7914
7915 - "backend_queue" is the total number of requests which were processed before
7916 this one in the backend's global queue. It is zero when the request has not
7917 gone through the global queue. It makes it possible to estimate the average
7918 queue length, which easily translates into a number of missing servers when
7919 divided by a server's "maxconn" parameter. It is worth noting that if a
7920 session experiences a redispatch, it may pass twice in the backend's queue,
7921 and then both positions will be cumulated. A request should not pass
7922 through both the server queue and the backend queue unless a redispatch
7923 occurs.
7924
7925
Willy Tarreauc57f0e22009-05-10 13:12:33 +020079268.2.3. HTTP log format
7927----------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007928
7929The HTTP format is the most complete and the best suited for HTTP proxies. It
7930is enabled by when "option httplog" is specified in the frontend. It provides
7931the same level of information as the TCP format with additional features which
7932are specific to the HTTP protocol. Just like the TCP format, the log is usually
7933emitted at the end of the session, unless "option logasap" is specified, which
7934generally only makes sense for download sites. A session which matches the
7935"monitor" rules will never logged. It is also possible not to log sessions for
7936which no data were sent by the client by specifying "option dontlognull" in the
Willy Tarreauc9bd0cc2009-05-10 11:57:02 +02007937frontend. Successful connections will not be logged if "option dontlog-normal"
7938is specified in the frontend.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007939
7940Most fields are shared with the TCP log, some being different. A few fields may
7941slightly vary depending on some configuration options. Those ones are marked
7942with a star ('*') after the field name below.
7943
7944 Example :
7945 frontend http-in
7946 mode http
7947 option httplog
7948 log global
7949 default_backend bck
7950
7951 backend static
7952 server srv1 127.0.0.1:8000
7953
7954 >>> Feb 6 12:14:14 localhost \
7955 haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in \
7956 static/srv1 10/0/30/69/109 200 2750 - - ---- 1/1/1/1/0 0/0 {1wt.eu} \
Willy Tarreaud72758d2010-01-12 10:42:19 +01007957 {} "GET /index.html HTTP/1.1"
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007958
7959 Field Format Extract from the example above
7960 1 process_name '[' pid ']:' haproxy[14389]:
7961 2 client_ip ':' client_port 10.0.1.2:33317
7962 3 '[' accept_date ']' [06/Feb/2009:12:14:14.655]
7963 4 frontend_name http-in
7964 5 backend_name '/' server_name static/srv1
7965 6 Tq '/' Tw '/' Tc '/' Tr '/' Tt* 10/0/30/69/109
7966 7 status_code 200
7967 8 bytes_read* 2750
7968 9 captured_request_cookie -
7969 10 captured_response_cookie -
7970 11 termination_state ----
7971 12 actconn '/' feconn '/' beconn '/' srv_conn '/' retries* 1/1/1/1/0
7972 13 srv_queue '/' backend_queue 0/0
7973 14 '{' captured_request_headers* '}' {haproxy.1wt.eu}
7974 15 '{' captured_response_headers* '}' {}
7975 16 '"' http_request '"' "GET /index.html HTTP/1.1"
Willy Tarreaud72758d2010-01-12 10:42:19 +01007976
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007977
7978Detailed fields description :
7979 - "client_ip" is the IP address of the client which initiated the TCP
Willy Tarreauceb24bc2010-11-09 12:46:41 +01007980 connection to haproxy. If the connection was accepted on a UNIX socket
7981 instead, the IP address would be replaced with the word "unix". Note that
7982 when the connection is accepted on a socket configured with "accept-proxy"
7983 and the PROXY protocol is correctly used, then the logs will reflect the
7984 forwarded connection's information.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007985
7986 - "client_port" is the TCP port of the client which initiated the connection.
Willy Tarreauceb24bc2010-11-09 12:46:41 +01007987 If the connection was accepted on a UNIX socket instead, the port would be
7988 replaced with the ID of the accepting socket, which is also reported in the
7989 stats interface.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01007990
7991 - "accept_date" is the exact date when the TCP connection was received by
7992 haproxy (which might be very slightly different from the date observed on
7993 the network if there was some queuing in the system's backlog). This is
7994 usually the same date which may appear in any upstream firewall's log. This
7995 does not depend on the fact that the client has sent the request or not.
7996
7997 - "frontend_name" is the name of the frontend (or listener) which received
7998 and processed the connection.
7999
8000 - "backend_name" is the name of the backend (or listener) which was selected
8001 to manage the connection to the server. This will be the same as the
8002 frontend if no switching rule has been applied.
8003
8004 - "server_name" is the name of the last server to which the connection was
8005 sent, which might differ from the first one if there were connection errors
8006 and a redispatch occurred. Note that this server belongs to the backend
8007 which processed the request. If the request was aborted before reaching a
8008 server, "<NOSRV>" is indicated instead of a server name. If the request was
8009 intercepted by the stats subsystem, "<STATS>" is indicated instead.
8010
8011 - "Tq" is the total time in milliseconds spent waiting for the client to send
8012 a full HTTP request, not counting data. It can be "-1" if the connection
8013 was aborted before a complete request could be received. It should always
8014 be very small because a request generally fits in one single packet. Large
8015 times here generally indicate network trouble between the client and
8016 haproxy. See "Timers" below for more details.
8017
8018 - "Tw" is the total time in milliseconds spent waiting in the various queues.
8019 It can be "-1" if the connection was aborted before reaching the queue.
8020 See "Timers" below for more details.
8021
8022 - "Tc" is the total time in milliseconds spent waiting for the connection to
8023 establish to the final server, including retries. It can be "-1" if the
8024 request was aborted before a connection could be established. See "Timers"
8025 below for more details.
8026
8027 - "Tr" is the total time in milliseconds spent waiting for the server to send
8028 a full HTTP response, not counting data. It can be "-1" if the request was
8029 aborted before a complete response could be received. It generally matches
8030 the server's processing time for the request, though it may be altered by
8031 the amount of data sent by the client to the server. Large times here on
8032 "GET" requests generally indicate an overloaded server. See "Timers" below
8033 for more details.
8034
8035 - "Tt" is the total time in milliseconds elapsed between the accept and the
8036 last close. It covers all possible processings. There is one exception, if
8037 "option logasap" was specified, then the time counting stops at the moment
8038 the log is emitted. In this case, a '+' sign is prepended before the value,
8039 indicating that the final one will be larger. See "Timers" below for more
8040 details.
8041
8042 - "status_code" is the HTTP status code returned to the client. This status
8043 is generally set by the server, but it might also be set by haproxy when
8044 the server cannot be reached or when its response is blocked by haproxy.
8045
8046 - "bytes_read" is the total number of bytes transmitted to the client when
8047 the log is emitted. This does include HTTP headers. If "option logasap" is
8048 specified, the this value will be prefixed with a '+' sign indicating that
8049 the final one may be larger. Please note that this value is a 64-bit
8050 counter, so log analysis tools must be able to handle it without
8051 overflowing.
8052
8053 - "captured_request_cookie" is an optional "name=value" entry indicating that
8054 the client had this cookie in the request. The cookie name and its maximum
8055 length are defined by the "capture cookie" statement in the frontend
8056 configuration. The field is a single dash ('-') when the option is not
8057 set. Only one cookie may be captured, it is generally used to track session
8058 ID exchanges between a client and a server to detect session crossing
8059 between clients due to application bugs. For more details, please consult
8060 the section "Capturing HTTP headers and cookies" below.
8061
8062 - "captured_response_cookie" is an optional "name=value" entry indicating
8063 that the server has returned a cookie with its response. The cookie name
8064 and its maximum length are defined by the "capture cookie" statement in the
8065 frontend configuration. The field is a single dash ('-') when the option is
8066 not set. Only one cookie may be captured, it is generally used to track
8067 session ID exchanges between a client and a server to detect session
8068 crossing between clients due to application bugs. For more details, please
8069 consult the section "Capturing HTTP headers and cookies" below.
8070
8071 - "termination_state" is the condition the session was in when the session
8072 ended. This indicates the session state, which side caused the end of
8073 session to happen, for what reason (timeout, error, ...), just like in TCP
8074 logs, and information about persistence operations on cookies in the last
8075 two characters. The normal flags should begin with "--", indicating the
8076 session was closed by either end with no data remaining in buffers. See
8077 below "Session state at disconnection" for more details.
8078
8079 - "actconn" is the total number of concurrent connections on the process when
8080 the session was logged. It it useful to detect when some per-process system
8081 limits have been reached. For instance, if actconn is close to 512 or 1024
8082 when multiple connection errors occur, chances are high that the system
8083 limits the process to use a maximum of 1024 file descriptors and that all
Willy Tarreauc57f0e22009-05-10 13:12:33 +02008084 of them are used. See section 3 "Global parameters" to find how to tune the
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008085 system.
8086
8087 - "feconn" is the total number of concurrent connections on the frontend when
8088 the session was logged. It is useful to estimate the amount of resource
8089 required to sustain high loads, and to detect when the frontend's "maxconn"
8090 has been reached. Most often when this value increases by huge jumps, it is
8091 because there is congestion on the backend servers, but sometimes it can be
8092 caused by a denial of service attack.
8093
8094 - "beconn" is the total number of concurrent connections handled by the
8095 backend when the session was logged. It includes the total number of
8096 concurrent connections active on servers as well as the number of
8097 connections pending in queues. It is useful to estimate the amount of
8098 additional servers needed to support high loads for a given application.
8099 Most often when this value increases by huge jumps, it is because there is
8100 congestion on the backend servers, but sometimes it can be caused by a
8101 denial of service attack.
8102
8103 - "srv_conn" is the total number of concurrent connections still active on
8104 the server when the session was logged. It can never exceed the server's
8105 configured "maxconn" parameter. If this value is very often close or equal
8106 to the server's "maxconn", it means that traffic regulation is involved a
8107 lot, meaning that either the server's maxconn value is too low, or that
8108 there aren't enough servers to process the load with an optimal response
8109 time. When only one of the server's "srv_conn" is high, it usually means
8110 that this server has some trouble causing the requests to take longer to be
8111 processed than on other servers.
8112
8113 - "retries" is the number of connection retries experienced by this session
8114 when trying to connect to the server. It must normally be zero, unless a
8115 server is being stopped at the same moment the connection was attempted.
8116 Frequent retries generally indicate either a network problem between
8117 haproxy and the server, or a misconfigured system backlog on the server
8118 preventing new connections from being queued. This field may optionally be
8119 prefixed with a '+' sign, indicating that the session has experienced a
8120 redispatch after the maximal retry count has been reached on the initial
8121 server. In this case, the server name appearing in the log is the one the
8122 connection was redispatched to, and not the first one, though both may
8123 sometimes be the same in case of hashing for instance. So as a general rule
8124 of thumb, when a '+' is present in front of the retry count, this count
8125 should not be attributed to the logged server.
8126
8127 - "srv_queue" is the total number of requests which were processed before
8128 this one in the server queue. It is zero when the request has not gone
8129 through the server queue. It makes it possible to estimate the approximate
8130 server's response time by dividing the time spent in queue by the number of
8131 requests in the queue. It is worth noting that if a session experiences a
8132 redispatch and passes through two server queues, their positions will be
8133 cumulated. A request should not pass through both the server queue and the
8134 backend queue unless a redispatch occurs.
8135
8136 - "backend_queue" is the total number of requests which were processed before
8137 this one in the backend's global queue. It is zero when the request has not
8138 gone through the global queue. It makes it possible to estimate the average
8139 queue length, which easily translates into a number of missing servers when
8140 divided by a server's "maxconn" parameter. It is worth noting that if a
8141 session experiences a redispatch, it may pass twice in the backend's queue,
8142 and then both positions will be cumulated. A request should not pass
8143 through both the server queue and the backend queue unless a redispatch
8144 occurs.
8145
8146 - "captured_request_headers" is a list of headers captured in the request due
8147 to the presence of the "capture request header" statement in the frontend.
8148 Multiple headers can be captured, they will be delimited by a vertical bar
8149 ('|'). When no capture is enabled, the braces do not appear, causing a
8150 shift of remaining fields. It is important to note that this field may
8151 contain spaces, and that using it requires a smarter log parser than when
8152 it's not used. Please consult the section "Capturing HTTP headers and
8153 cookies" below for more details.
8154
8155 - "captured_response_headers" is a list of headers captured in the response
8156 due to the presence of the "capture response header" statement in the
8157 frontend. Multiple headers can be captured, they will be delimited by a
8158 vertical bar ('|'). When no capture is enabled, the braces do not appear,
8159 causing a shift of remaining fields. It is important to note that this
8160 field may contain spaces, and that using it requires a smarter log parser
8161 than when it's not used. Please consult the section "Capturing HTTP headers
8162 and cookies" below for more details.
8163
8164 - "http_request" is the complete HTTP request line, including the method,
8165 request and HTTP version string. Non-printable characters are encoded (see
8166 below the section "Non-printable characters"). This is always the last
8167 field, and it is always delimited by quotes and is the only one which can
8168 contain quotes. If new fields are added to the log format, they will be
8169 added before this field. This field might be truncated if the request is
8170 huge and does not fit in the standard syslog buffer (1024 characters). This
8171 is the reason why this field must always remain the last one.
8172
8173
Willy Tarreauc57f0e22009-05-10 13:12:33 +020081748.3. Advanced logging options
8175-----------------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008176
8177Some advanced logging options are often looked for but are not easy to find out
8178just by looking at the various options. Here is an entry point for the few
8179options which can enable better logging. Please refer to the keywords reference
8180for more information about their usage.
8181
8182
Willy Tarreauc57f0e22009-05-10 13:12:33 +020081838.3.1. Disabling logging of external tests
8184------------------------------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008185
8186It is quite common to have some monitoring tools perform health checks on
8187haproxy. Sometimes it will be a layer 3 load-balancer such as LVS or any
8188commercial load-balancer, and sometimes it will simply be a more complete
8189monitoring system such as Nagios. When the tests are very frequent, users often
8190ask how to disable logging for those checks. There are three possibilities :
8191
8192 - if connections come from everywhere and are just TCP probes, it is often
8193 desired to simply disable logging of connections without data exchange, by
8194 setting "option dontlognull" in the frontend. It also disables logging of
8195 port scans, which may or may not be desired.
8196
8197 - if the connection come from a known source network, use "monitor-net" to
8198 declare this network as monitoring only. Any host in this network will then
8199 only be able to perform health checks, and their requests will not be
8200 logged. This is generally appropriate to designate a list of equipments
8201 such as other load-balancers.
8202
8203 - if the tests are performed on a known URI, use "monitor-uri" to declare
8204 this URI as dedicated to monitoring. Any host sending this request will
8205 only get the result of a health-check, and the request will not be logged.
8206
8207
Willy Tarreauc57f0e22009-05-10 13:12:33 +020082088.3.2. Logging before waiting for the session to terminate
8209----------------------------------------------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008210
8211The problem with logging at end of connection is that you have no clue about
8212what is happening during very long sessions, such as remote terminal sessions
8213or large file downloads. This problem can be worked around by specifying
8214"option logasap" in the frontend. Haproxy will then log as soon as possible,
8215just before data transfer begins. This means that in case of TCP, it will still
8216log the connection status to the server, and in case of HTTP, it will log just
8217after processing the server headers. In this case, the number of bytes reported
8218is the number of header bytes sent to the client. In order to avoid confusion
8219with normal logs, the total time field and the number of bytes are prefixed
8220with a '+' sign which means that real numbers are certainly larger.
8221
8222
Willy Tarreauc57f0e22009-05-10 13:12:33 +020082238.3.3. Raising log level upon errors
8224------------------------------------
Willy Tarreauc9bd0cc2009-05-10 11:57:02 +02008225
8226Sometimes it is more convenient to separate normal traffic from errors logs,
8227for instance in order to ease error monitoring from log files. When the option
8228"log-separate-errors" is used, connections which experience errors, timeouts,
8229retries, redispatches or HTTP status codes 5xx will see their syslog level
8230raised from "info" to "err". This will help a syslog daemon store the log in
8231a separate file. It is very important to keep the errors in the normal traffic
8232file too, so that log ordering is not altered. You should also be careful if
8233you already have configured your syslog daemon to store all logs higher than
8234"notice" in an "admin" file, because the "err" level is higher than "notice".
8235
8236
Willy Tarreauc57f0e22009-05-10 13:12:33 +020082378.3.4. Disabling logging of successful connections
8238--------------------------------------------------
Willy Tarreauc9bd0cc2009-05-10 11:57:02 +02008239
8240Although this may sound strange at first, some large sites have to deal with
8241multiple thousands of logs per second and are experiencing difficulties keeping
8242them intact for a long time or detecting errors within them. If the option
8243"dontlog-normal" is set on the frontend, all normal connections will not be
8244logged. In this regard, a normal connection is defined as one without any
8245error, timeout, retry nor redispatch. In HTTP, the status code is checked too,
8246and a response with a status 5xx is not considered normal and will be logged
8247too. Of course, doing is is really discouraged as it will remove most of the
8248useful information from the logs. Do this only if you have no other
8249alternative.
8250
8251
Willy Tarreauc57f0e22009-05-10 13:12:33 +020082528.4. Timing events
8253------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008254
8255Timers provide a great help in troubleshooting network problems. All values are
8256reported in milliseconds (ms). These timers should be used in conjunction with
8257the session termination flags. In TCP mode with "option tcplog" set on the
8258frontend, 3 control points are reported under the form "Tw/Tc/Tt", and in HTTP
8259mode, 5 control points are reported under the form "Tq/Tw/Tc/Tr/Tt" :
8260
8261 - Tq: total time to get the client request (HTTP mode only). It's the time
8262 elapsed between the moment the client connection was accepted and the
8263 moment the proxy received the last HTTP header. The value "-1" indicates
8264 that the end of headers (empty line) has never been seen. This happens when
8265 the client closes prematurely or times out.
8266
8267 - Tw: total time spent in the queues waiting for a connection slot. It
8268 accounts for backend queue as well as the server queues, and depends on the
8269 queue size, and the time needed for the server to complete previous
8270 requests. The value "-1" means that the request was killed before reaching
8271 the queue, which is generally what happens with invalid or denied requests.
8272
8273 - Tc: total time to establish the TCP connection to the server. It's the time
8274 elapsed between the moment the proxy sent the connection request, and the
8275 moment it was acknowledged by the server, or between the TCP SYN packet and
8276 the matching SYN/ACK packet in return. The value "-1" means that the
8277 connection never established.
8278
8279 - Tr: server response time (HTTP mode only). It's the time elapsed between
8280 the moment the TCP connection was established to the server and the moment
8281 the server sent its complete response headers. It purely shows its request
8282 processing time, without the network overhead due to the data transmission.
8283 It is worth noting that when the client has data to send to the server, for
8284 instance during a POST request, the time already runs, and this can distort
8285 apparent response time. For this reason, it's generally wise not to trust
8286 too much this field for POST requests initiated from clients behind an
8287 untrusted network. A value of "-1" here means that the last the response
8288 header (empty line) was never seen, most likely because the server timeout
8289 stroke before the server managed to process the request.
8290
8291 - Tt: total session duration time, between the moment the proxy accepted it
8292 and the moment both ends were closed. The exception is when the "logasap"
8293 option is specified. In this case, it only equals (Tq+Tw+Tc+Tr), and is
8294 prefixed with a '+' sign. From this field, we can deduce "Td", the data
8295 transmission time, by substracting other timers when valid :
8296
8297 Td = Tt - (Tq + Tw + Tc + Tr)
8298
8299 Timers with "-1" values have to be excluded from this equation. In TCP
8300 mode, "Tq" and "Tr" have to be excluded too. Note that "Tt" can never be
8301 negative.
8302
8303These timers provide precious indications on trouble causes. Since the TCP
8304protocol defines retransmit delays of 3, 6, 12... seconds, we know for sure
8305that timers close to multiples of 3s are nearly always related to lost packets
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01008306due to network problems (wires, negotiation, congestion). Moreover, if "Tt" is
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008307close to a timeout value specified in the configuration, it often means that a
8308session has been aborted on timeout.
8309
8310Most common cases :
8311
8312 - If "Tq" is close to 3000, a packet has probably been lost between the
8313 client and the proxy. This is very rare on local networks but might happen
8314 when clients are on far remote networks and send large requests. It may
8315 happen that values larger than usual appear here without any network cause.
8316 Sometimes, during an attack or just after a resource starvation has ended,
8317 haproxy may accept thousands of connections in a few milliseconds. The time
8318 spent accepting these connections will inevitably slightly delay processing
8319 of other connections, and it can happen that request times in the order of
8320 a few tens of milliseconds are measured after a few thousands of new
Patrick Mezard105faca2010-06-12 17:02:46 +02008321 connections have been accepted at once. Setting "option http-server-close"
8322 may display larger request times since "Tq" also measures the time spent
8323 waiting for additional requests.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008324
8325 - If "Tc" is close to 3000, a packet has probably been lost between the
8326 server and the proxy during the server connection phase. This value should
8327 always be very low, such as 1 ms on local networks and less than a few tens
8328 of ms on remote networks.
8329
Willy Tarreau55165fe2009-05-10 12:02:55 +02008330 - If "Tr" is nearly always lower than 3000 except some rare values which seem
8331 to be the average majored by 3000, there are probably some packets lost
8332 between the proxy and the server.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008333
8334 - If "Tt" is large even for small byte counts, it generally is because
8335 neither the client nor the server decides to close the connection, for
8336 instance because both have agreed on a keep-alive connection mode. In order
8337 to solve this issue, it will be needed to specify "option httpclose" on
8338 either the frontend or the backend. If the problem persists, it means that
8339 the server ignores the "close" connection mode and expects the client to
8340 close. Then it will be required to use "option forceclose". Having the
8341 smallest possible 'Tt' is important when connection regulation is used with
8342 the "maxconn" option on the servers, since no new connection will be sent
8343 to the server until another one is released.
8344
8345Other noticeable HTTP log cases ('xx' means any value to be ignored) :
8346
8347 Tq/Tw/Tc/Tr/+Tt The "option logasap" is present on the frontend and the log
8348 was emitted before the data phase. All the timers are valid
8349 except "Tt" which is shorter than reality.
8350
8351 -1/xx/xx/xx/Tt The client was not able to send a complete request in time
8352 or it aborted too early. Check the session termination flags
8353 then "timeout http-request" and "timeout client" settings.
8354
8355 Tq/-1/xx/xx/Tt It was not possible to process the request, maybe because
8356 servers were out of order, because the request was invalid
8357 or forbidden by ACL rules. Check the session termination
8358 flags.
8359
8360 Tq/Tw/-1/xx/Tt The connection could not establish on the server. Either it
8361 actively refused it or it timed out after Tt-(Tq+Tw) ms.
8362 Check the session termination flags, then check the
8363 "timeout connect" setting. Note that the tarpit action might
8364 return similar-looking patterns, with "Tw" equal to the time
8365 the client connection was maintained open.
8366
8367 Tq/Tw/Tc/-1/Tt The server has accepted the connection but did not return
8368 a complete response in time, or it closed its connexion
8369 unexpectedly after Tt-(Tq+Tw+Tc) ms. Check the session
8370 termination flags, then check the "timeout server" setting.
8371
8372
Willy Tarreauc57f0e22009-05-10 13:12:33 +020083738.5. Session state at disconnection
8374-----------------------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008375
8376TCP and HTTP logs provide a session termination indicator in the
8377"termination_state" field, just before the number of active connections. It is
83782-characters long in TCP mode, and is extended to 4 characters in HTTP mode,
8379each of which has a special meaning :
8380
8381 - On the first character, a code reporting the first event which caused the
8382 session to terminate :
8383
8384 C : the TCP session was unexpectedly aborted by the client.
8385
8386 S : the TCP session was unexpectedly aborted by the server, or the
8387 server explicitly refused it.
8388
8389 P : the session was prematurely aborted by the proxy, because of a
8390 connection limit enforcement, because a DENY filter was matched,
8391 because of a security check which detected and blocked a dangerous
8392 error in server response which might have caused information leak
8393 (eg: cacheable cookie), or because the response was processed by
8394 the proxy (redirect, stats, etc...).
8395
8396 R : a resource on the proxy has been exhausted (memory, sockets, source
8397 ports, ...). Usually, this appears during the connection phase, and
8398 system logs should contain a copy of the precise error. If this
8399 happens, it must be considered as a very serious anomaly which
8400 should be fixed as soon as possible by any means.
8401
8402 I : an internal error was identified by the proxy during a self-check.
8403 This should NEVER happen, and you are encouraged to report any log
8404 containing this, because this would almost certainly be a bug. It
8405 would be wise to preventively restart the process after such an
8406 event too, in case it would be caused by memory corruption.
8407
8408 c : the client-side timeout expired while waiting for the client to
8409 send or receive data.
8410
8411 s : the server-side timeout expired while waiting for the server to
8412 send or receive data.
8413
8414 - : normal session completion, both the client and the server closed
8415 with nothing left in the buffers.
8416
8417 - on the second character, the TCP or HTTP session state when it was closed :
8418
8419 R : th proxy was waiting for a complete, valid REQUEST from the client
8420 (HTTP mode only). Nothing was sent to any server.
8421
8422 Q : the proxy was waiting in the QUEUE for a connection slot. This can
8423 only happen when servers have a 'maxconn' parameter set. It can
8424 also happen in the global queue after a redispatch consecutive to
8425 a failed attempt to connect to a dying server. If no redispatch is
8426 reported, then no connection attempt was made to any server.
8427
8428 C : the proxy was waiting for the CONNECTION to establish on the
8429 server. The server might at most have noticed a connection attempt.
8430
8431 H : the proxy was waiting for complete, valid response HEADERS from the
8432 server (HTTP only).
8433
8434 D : the session was in the DATA phase.
8435
8436 L : the proxy was still transmitting LAST data to the client while the
8437 server had already finished. This one is very rare as it can only
8438 happen when the client dies while receiving the last packets.
8439
8440 T : the request was tarpitted. It has been held open with the client
8441 during the whole "timeout tarpit" duration or until the client
8442 closed, both of which will be reported in the "Tw" timer.
8443
8444 - : normal session completion after end of data transfer.
8445
8446 - the third character tells whether the persistence cookie was provided by
8447 the client (only in HTTP mode) :
8448
8449 N : the client provided NO cookie. This is usually the case for new
8450 visitors, so counting the number of occurrences of this flag in the
8451 logs generally indicate a valid trend for the site frequentation.
8452
8453 I : the client provided an INVALID cookie matching no known server.
8454 This might be caused by a recent configuration change, mixed
Cyril Bontéa8e7bbc2010-04-25 22:29:29 +02008455 cookies between HTTP/HTTPS sites, persistence conditionally
8456 ignored, or an attack.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008457
8458 D : the client provided a cookie designating a server which was DOWN,
8459 so either "option persist" was used and the client was sent to
8460 this server, or it was not set and the client was redispatched to
8461 another server.
8462
Willy Tarreau996a92c2010-10-13 19:30:47 +02008463 V : the client provided a VALID cookie, and was sent to the associated
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008464 server.
8465
Willy Tarreau996a92c2010-10-13 19:30:47 +02008466 E : the client provided a valid cookie, but with a last date which was
8467 older than what is allowed by the "maxidle" cookie parameter, so
8468 the cookie is consider EXPIRED and is ignored. The request will be
8469 redispatched just as if there was no cookie.
8470
8471 O : the client provided a valid cookie, but with a first date which was
8472 older than what is allowed by the "maxlife" cookie parameter, so
8473 the cookie is consider too OLD and is ignored. The request will be
8474 redispatched just as if there was no cookie.
8475
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008476 - : does not apply (no cookie set in configuration).
8477
8478 - the last character reports what operations were performed on the persistence
8479 cookie returned by the server (only in HTTP mode) :
8480
8481 N : NO cookie was provided by the server, and none was inserted either.
8482
8483 I : no cookie was provided by the server, and the proxy INSERTED one.
8484 Note that in "cookie insert" mode, if the server provides a cookie,
8485 it will still be overwritten and reported as "I" here.
8486
Willy Tarreau996a92c2010-10-13 19:30:47 +02008487 U : the proxy UPDATED the last date in the cookie that was presented by
8488 the client. This can only happen in insert mode with "maxidle". It
8489 happens everytime there is activity at a different date than the
8490 date indicated in the cookie. If any other change happens, such as
8491 a redispatch, then the cookie will be marked as inserted instead.
8492
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008493 P : a cookie was PROVIDED by the server and transmitted as-is.
8494
8495 R : the cookie provided by the server was REWRITTEN by the proxy, which
8496 happens in "cookie rewrite" or "cookie prefix" modes.
8497
8498 D : the cookie provided by the server was DELETED by the proxy.
8499
8500 - : does not apply (no cookie set in configuration).
8501
Willy Tarreau996a92c2010-10-13 19:30:47 +02008502The combination of the two first flags gives a lot of information about what
8503was happening when the session terminated, and why it did terminate. It can be
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008504helpful to detect server saturation, network troubles, local system resource
8505starvation, attacks, etc...
8506
8507The most common termination flags combinations are indicated below. They are
8508alphabetically sorted, with the lowercase set just after the upper case for
8509easier finding and understanding.
8510
8511 Flags Reason
8512
8513 -- Normal termination.
8514
8515 CC The client aborted before the connection could be established to the
8516 server. This can happen when haproxy tries to connect to a recently
8517 dead (or unchecked) server, and the client aborts while haproxy is
8518 waiting for the server to respond or for "timeout connect" to expire.
8519
8520 CD The client unexpectedly aborted during data transfer. This can be
8521 caused by a browser crash, by an intermediate equipment between the
8522 client and haproxy which decided to actively break the connection,
8523 by network routing issues between the client and haproxy, or by a
8524 keep-alive session between the server and the client terminated first
8525 by the client.
Willy Tarreaud72758d2010-01-12 10:42:19 +01008526
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008527 cD The client did not send nor acknowledge any data for as long as the
8528 "timeout client" delay. This is often caused by network failures on
8529 the client side, or the client simply leaving the net uncleanly.
8530
8531 CH The client aborted while waiting for the server to start responding.
8532 It might be the server taking too long to respond or the client
8533 clicking the 'Stop' button too fast.
8534
8535 cH The "timeout client" stroke while waiting for client data during a
8536 POST request. This is sometimes caused by too large TCP MSS values
8537 for PPPoE networks which cannot transport full-sized packets. It can
8538 also happen when client timeout is smaller than server timeout and
8539 the server takes too long to respond.
8540
8541 CQ The client aborted while its session was queued, waiting for a server
8542 with enough empty slots to accept it. It might be that either all the
8543 servers were saturated or that the assigned server was taking too
8544 long a time to respond.
8545
8546 CR The client aborted before sending a full HTTP request. Most likely
8547 the request was typed by hand using a telnet client, and aborted
8548 too early. The HTTP status code is likely a 400 here. Sometimes this
8549 might also be caused by an IDS killing the connection between haproxy
8550 and the client.
8551
8552 cR The "timeout http-request" stroke before the client sent a full HTTP
8553 request. This is sometimes caused by too large TCP MSS values on the
8554 client side for PPPoE networks which cannot transport full-sized
8555 packets, or by clients sending requests by hand and not typing fast
8556 enough, or forgetting to enter the empty line at the end of the
8557 request. The HTTP status code is likely a 408 here.
8558
8559 CT The client aborted while its session was tarpitted. It is important to
8560 check if this happens on valid requests, in order to be sure that no
Willy Tarreau55165fe2009-05-10 12:02:55 +02008561 wrong tarpit rules have been written. If a lot of them happen, it
8562 might make sense to lower the "timeout tarpit" value to something
8563 closer to the average reported "Tw" timer, in order not to consume
8564 resources for just a few attackers.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008565
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01008566 SC The server or an equipment between it and haproxy explicitly refused
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008567 the TCP connection (the proxy received a TCP RST or an ICMP message
8568 in return). Under some circumstances, it can also be the network
8569 stack telling the proxy that the server is unreachable (eg: no route,
8570 or no ARP response on local network). When this happens in HTTP mode,
8571 the status code is likely a 502 or 503 here.
8572
8573 sC The "timeout connect" stroke before a connection to the server could
8574 complete. When this happens in HTTP mode, the status code is likely a
8575 503 or 504 here.
8576
8577 SD The connection to the server died with an error during the data
8578 transfer. This usually means that haproxy has received an RST from
8579 the server or an ICMP message from an intermediate equipment while
8580 exchanging data with the server. This can be caused by a server crash
8581 or by a network issue on an intermediate equipment.
8582
8583 sD The server did not send nor acknowledge any data for as long as the
8584 "timeout server" setting during the data phase. This is often caused
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01008585 by too short timeouts on L4 equipments before the server (firewalls,
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008586 load-balancers, ...), as well as keep-alive sessions maintained
8587 between the client and the server expiring first on haproxy.
8588
8589 SH The server aborted before sending its full HTTP response headers, or
8590 it crashed while processing the request. Since a server aborting at
8591 this moment is very rare, it would be wise to inspect its logs to
8592 control whether it crashed and why. The logged request may indicate a
8593 small set of faulty requests, demonstrating bugs in the application.
8594 Sometimes this might also be caused by an IDS killing the connection
8595 between haproxy and the server.
8596
8597 sH The "timeout server" stroke before the server could return its
8598 response headers. This is the most common anomaly, indicating too
8599 long transactions, probably caused by server or database saturation.
8600 The immediate workaround consists in increasing the "timeout server"
8601 setting, but it is important to keep in mind that the user experience
8602 will suffer from these long response times. The only long term
8603 solution is to fix the application.
8604
8605 sQ The session spent too much time in queue and has been expired. See
8606 the "timeout queue" and "timeout connect" settings to find out how to
8607 fix this if it happens too often. If it often happens massively in
8608 short periods, it may indicate general problems on the affected
8609 servers due to I/O or database congestion, or saturation caused by
8610 external attacks.
8611
8612 PC The proxy refused to establish a connection to the server because the
8613 process' socket limit has been reached while attempting to connect.
8614 The global "maxconn" parameter may be increased in the configuration
8615 so that it does not happen anymore. This status is very rare and
8616 might happen when the global "ulimit-n" parameter is forced by hand.
8617
8618 PH The proxy blocked the server's response, because it was invalid,
8619 incomplete, dangerous (cache control), or matched a security filter.
8620 In any case, an HTTP 502 error is sent to the client. One possible
8621 cause for this error is an invalid syntax in an HTTP header name
8622 containing unauthorized characters.
8623
8624 PR The proxy blocked the client's HTTP request, either because of an
8625 invalid HTTP syntax, in which case it returned an HTTP 400 error to
8626 the client, or because a deny filter matched, in which case it
8627 returned an HTTP 403 error.
8628
8629 PT The proxy blocked the client's request and has tarpitted its
8630 connection before returning it a 500 server error. Nothing was sent
8631 to the server. The connection was maintained open for as long as
8632 reported by the "Tw" timer field.
8633
8634 RC A local resource has been exhausted (memory, sockets, source ports)
8635 preventing the connection to the server from establishing. The error
8636 logs will tell precisely what was missing. This is very rare and can
8637 only be solved by proper system tuning.
8638
Willy Tarreau996a92c2010-10-13 19:30:47 +02008639The combination of the two last flags gives a lot of information about how
8640persistence was handled by the client, the server and by haproxy. This is very
8641important to troubleshoot disconnections, when users complain they have to
8642re-authenticate. The commonly encountered flags are :
8643
8644 -- Persistence cookie is not enabled.
8645
8646 NN No cookie was provided by the client, none was inserted in the
8647 response. For instance, this can be in insert mode with "postonly"
8648 set on a GET request.
8649
8650 II A cookie designating an invalid server was provided by the client,
8651 a valid one was inserted in the response. This typically happens when
8652 a "server" entry is removed from the configuraton, since its cookie
8653 value can be presented by a client when no other server knows it.
8654
8655 NI No cookie was provided by the client, one was inserted in the
8656 response. This typically happens for first requests from every user
8657 in "insert" mode, which makes it an easy way to count real users.
8658
8659 VN A cookie was provided by the client, none was inserted in the
8660 response. This happens for most responses for which the client has
8661 already got a cookie.
8662
8663 VU A cookie was provided by the client, with a last visit date which is
8664 not completely up-to-date, so an updated cookie was provided in
8665 response. This can also happen if there was no date at all, or if
8666 there was a date but the "maxidle" parameter was not set, so that the
8667 cookie can be switched to unlimited time.
8668
8669 EI A cookie was provided by the client, with a last visit date which is
8670 too old for the "maxidle" parameter, so the cookie was ignored and a
8671 new cookie was inserted in the response.
8672
8673 OI A cookie was provided by the client, with a first visit date which is
8674 too old for the "maxlife" parameter, so the cookie was ignored and a
8675 new cookie was inserted in the response.
8676
8677 DI The server designated by the cookie was down, a new server was
8678 selected and a new cookie was emitted in the response.
8679
8680 VI The server designated by the cookie was not marked dead but could not
8681 be reached. A redispatch happened and selected another one, which was
8682 then advertised in the response.
8683
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008684
Willy Tarreauc57f0e22009-05-10 13:12:33 +020086858.6. Non-printable characters
8686-----------------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008687
8688In order not to cause trouble to log analysis tools or terminals during log
8689consulting, non-printable characters are not sent as-is into log files, but are
8690converted to the two-digits hexadecimal representation of their ASCII code,
8691prefixed by the character '#'. The only characters that can be logged without
8692being escaped are comprised between 32 and 126 (inclusive). Obviously, the
8693escape character '#' itself is also encoded to avoid any ambiguity ("#23"). It
8694is the same for the character '"' which becomes "#22", as well as '{', '|' and
8695'}' when logging headers.
8696
8697Note that the space character (' ') is not encoded in headers, which can cause
8698issues for tools relying on space count to locate fields. A typical header
8699containing spaces is "User-Agent".
8700
8701Last, it has been observed that some syslog daemons such as syslog-ng escape
8702the quote ('"') with a backslash ('\'). The reverse operation can safely be
8703performed since no quote may appear anywhere else in the logs.
8704
8705
Willy Tarreauc57f0e22009-05-10 13:12:33 +020087068.7. Capturing HTTP cookies
8707---------------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008708
8709Cookie capture simplifies the tracking a complete user session. This can be
8710achieved using the "capture cookie" statement in the frontend. Please refer to
Willy Tarreauc57f0e22009-05-10 13:12:33 +02008711section 4.2 for more details. Only one cookie can be captured, and the same
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008712cookie will simultaneously be checked in the request ("Cookie:" header) and in
8713the response ("Set-Cookie:" header). The respective values will be reported in
8714the HTTP logs at the "captured_request_cookie" and "captured_response_cookie"
Willy Tarreauc57f0e22009-05-10 13:12:33 +02008715locations (see section 8.2.3 about HTTP log format). When either cookie is
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008716not seen, a dash ('-') replaces the value. This way, it's easy to detect when a
8717user switches to a new session for example, because the server will reassign it
8718a new cookie. It is also possible to detect if a server unexpectedly sets a
8719wrong cookie to a client, leading to session crossing.
8720
8721 Examples :
8722 # capture the first cookie whose name starts with "ASPSESSION"
8723 capture cookie ASPSESSION len 32
8724
8725 # capture the first cookie whose name is exactly "vgnvisitor"
8726 capture cookie vgnvisitor= len 32
8727
8728
Willy Tarreauc57f0e22009-05-10 13:12:33 +020087298.8. Capturing HTTP headers
8730---------------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008731
8732Header captures are useful to track unique request identifiers set by an upper
8733proxy, virtual host names, user-agents, POST content-length, referrers, etc. In
8734the response, one can search for information about the response length, how the
8735server asked the cache to behave, or an object location during a redirection.
8736
8737Header captures are performed using the "capture request header" and "capture
8738response header" statements in the frontend. Please consult their definition in
Willy Tarreauc57f0e22009-05-10 13:12:33 +02008739section 4.2 for more details.
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008740
8741It is possible to include both request headers and response headers at the same
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01008742time. Non-existent headers are logged as empty strings, and if one header
8743appears more than once, only its last occurrence will be logged. Request headers
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008744are grouped within braces '{' and '}' in the same order as they were declared,
8745and delimited with a vertical bar '|' without any space. Response headers
8746follow the same representation, but are displayed after a space following the
8747request headers block. These blocks are displayed just before the HTTP request
8748in the logs.
8749
8750 Example :
8751 # This instance chains to the outgoing proxy
8752 listen proxy-out
8753 mode http
8754 option httplog
8755 option logasap
8756 log global
8757 server cache1 192.168.1.1:3128
8758
8759 # log the name of the virtual server
8760 capture request header Host len 20
8761
8762 # log the amount of data uploaded during a POST
8763 capture request header Content-Length len 10
8764
8765 # log the beginning of the referrer
8766 capture request header Referer len 20
8767
8768 # server name (useful for outgoing proxies only)
8769 capture response header Server len 20
8770
8771 # logging the content-length is useful with "option logasap"
8772 capture response header Content-Length len 10
8773
8774 # log the expected cache behaviour on the response
8775 capture response header Cache-Control len 8
8776
8777 # the Via header will report the next proxy's name
8778 capture response header Via len 20
8779
8780 # log the URL location during a redirection
8781 capture response header Location len 20
8782
8783 >>> Aug 9 20:26:09 localhost \
8784 haproxy[2022]: 127.0.0.1:34014 [09/Aug/2004:20:26:09] proxy-out \
8785 proxy-out/cache1 0/0/0/162/+162 200 +350 - - ---- 0/0/0/0/0 0/0 \
8786 {fr.adserver.yahoo.co||http://fr.f416.mail.} {|864|private||} \
8787 "GET http://fr.adserver.yahoo.com/"
8788
8789 >>> Aug 9 20:30:46 localhost \
8790 haproxy[2022]: 127.0.0.1:34020 [09/Aug/2004:20:30:46] proxy-out \
8791 proxy-out/cache1 0/0/0/182/+182 200 +279 - - ---- 0/0/0/0/0 0/0 \
8792 {w.ods.org||} {Formilux/0.1.8|3495|||} \
Willy Tarreaud72758d2010-01-12 10:42:19 +01008793 "GET http://trafic.1wt.eu/ HTTP/1.1"
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008794
8795 >>> Aug 9 20:30:46 localhost \
8796 haproxy[2022]: 127.0.0.1:34028 [09/Aug/2004:20:30:46] proxy-out \
8797 proxy-out/cache1 0/0/2/126/+128 301 +223 - - ---- 0/0/0/0/0 0/0 \
8798 {www.sytadin.equipement.gouv.fr||http://trafic.1wt.eu/} \
8799 {Apache|230|||http://www.sytadin.} \
Willy Tarreaud72758d2010-01-12 10:42:19 +01008800 "GET http://www.sytadin.equipement.gouv.fr/ HTTP/1.1"
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008801
8802
Willy Tarreauc57f0e22009-05-10 13:12:33 +020088038.9. Examples of logs
8804---------------------
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008805
8806These are real-world examples of logs accompanied with an explanation. Some of
8807them have been made up by hand. The syslog part has been removed for better
8808reading. Their sole purpose is to explain how to decipher them.
8809
8810 >>> haproxy[674]: 127.0.0.1:33318 [15/Oct/2003:08:31:57.130] px-http \
8811 px-http/srv1 6559/0/7/147/6723 200 243 - - ---- 5/3/3/1/0 0/0 \
8812 "HEAD / HTTP/1.0"
8813
8814 => long request (6.5s) entered by hand through 'telnet'. The server replied
8815 in 147 ms, and the session ended normally ('----')
8816
8817 >>> haproxy[674]: 127.0.0.1:33319 [15/Oct/2003:08:31:57.149] px-http \
8818 px-http/srv1 6559/1230/7/147/6870 200 243 - - ---- 324/239/239/99/0 \
8819 0/9 "HEAD / HTTP/1.0"
8820
8821 => Idem, but the request was queued in the global queue behind 9 other
8822 requests, and waited there for 1230 ms.
8823
8824 >>> haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17.654] px-http \
8825 px-http/srv1 9/0/7/14/+30 200 +243 - - ---- 3/3/3/1/0 0/0 \
8826 "GET /image.iso HTTP/1.0"
8827
8828 => request for a long data transfer. The "logasap" option was specified, so
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01008829 the log was produced just before transferring data. The server replied in
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008830 14 ms, 243 bytes of headers were sent to the client, and total time from
8831 accept to first data byte is 30 ms.
8832
8833 >>> haproxy[674]: 127.0.0.1:33320 [15/Oct/2003:08:32:17.925] px-http \
8834 px-http/srv1 9/0/7/14/30 502 243 - - PH-- 3/2/2/0/0 0/0 \
8835 "GET /cgi-bin/bug.cgi? HTTP/1.0"
8836
8837 => the proxy blocked a server response either because of an "rspdeny" or
8838 "rspideny" filter, or because the response was improperly formatted and
8839 not HTTP-compliant, or because it blocked sensible information which
8840 risked being cached. In this case, the response is replaced with a "502
8841 bad gateway". The flags ("PH--") tell us that it was haproxy who decided
8842 to return the 502 and not the server.
8843
8844 >>> haproxy[18113]: 127.0.0.1:34548 [15/Oct/2003:15:18:55.798] px-http \
Willy Tarreaud72758d2010-01-12 10:42:19 +01008845 px-http/<NOSRV> -1/-1/-1/-1/8490 -1 0 - - CR-- 2/2/2/0/0 0/0 ""
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008846
8847 => the client never completed its request and aborted itself ("C---") after
8848 8.5s, while the proxy was waiting for the request headers ("-R--").
8849 Nothing was sent to any server.
8850
8851 >>> haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06.103] px-http \
8852 px-http/<NOSRV> -1/-1/-1/-1/50001 408 0 - - cR-- 2/2/2/0/0 0/0 ""
8853
8854 => The client never completed its request, which was aborted by the
8855 time-out ("c---") after 50s, while the proxy was waiting for the request
8856 headers ("-R--"). Nothing was sent to any server, but the proxy could
8857 send a 408 return code to the client.
8858
8859 >>> haproxy[18989]: 127.0.0.1:34550 [15/Oct/2003:15:24:28.312] px-tcp \
8860 px-tcp/srv1 0/0/5007 0 cD 0/0/0/0/0 0/0
8861
8862 => This log was produced with "option tcplog". The client timed out after
8863 5 seconds ("c----").
8864
8865 >>> haproxy[18989]: 10.0.0.1:34552 [15/Oct/2003:15:26:31.462] px-http \
8866 px-http/srv1 3183/-1/-1/-1/11215 503 0 - - SC-- 205/202/202/115/3 \
Willy Tarreaud72758d2010-01-12 10:42:19 +01008867 0/0 "HEAD / HTTP/1.0"
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008868
8869 => The request took 3s to complete (probably a network problem), and the
Willy Tarreauc57f0e22009-05-10 13:12:33 +02008870 connection to the server failed ('SC--') after 4 attempts of 2 seconds
Willy Tarreaucc6c8912009-02-22 10:53:55 +01008871 (config says 'retries 3'), and no redispatch (otherwise we would have
8872 seen "/+3"). Status code 503 was returned to the client. There were 115
8873 connections on this server, 202 connections on this proxy, and 205 on
8874 the global process. It is possible that the server refused the
8875 connection because of too many already established.
Willy Tarreau844e3c52008-01-11 16:28:18 +01008876
Willy Tarreau3dfe6cd2008-12-07 22:29:48 +01008877
Willy Tarreauc57f0e22009-05-10 13:12:33 +020088789. Statistics and monitoring
8879----------------------------
8880
8881It is possible to query HAProxy about its status. The most commonly used
8882mechanism is the HTTP statistics page. This page also exposes an alternative
8883CSV output format for monitoring tools. The same format is provided on the
8884Unix socket.
8885
8886
88879.1. CSV format
Willy Tarreau3dfe6cd2008-12-07 22:29:48 +01008888---------------
Krzysztof Piotr Oledzkif58a9622008-02-23 01:19:10 +01008889
Willy Tarreau7f062c42009-03-05 18:43:00 +01008890The statistics may be consulted either from the unix socket or from the HTTP
8891page. Both means provide a CSV format whose fields follow.
8892
Krzysztof Piotr Oledzkif58a9622008-02-23 01:19:10 +01008893 0. pxname: proxy name
8894 1. svname: service name (FRONTEND for frontend, BACKEND for backend, any name
8895 for server)
8896 2. qcur: current queued requests
8897 3. qmax: max queued requests
8898 4. scur: current sessions
8899 5. smax: max sessions
8900 6. slim: sessions limit
8901 7. stot: total sessions
8902 8. bin: bytes in
8903 9. bout: bytes out
8904 10. dreq: denied requests
Krzysztof Piotr Oledzki2c6962c2008-03-02 02:42:14 +01008905 11. dresp: denied responses
Krzysztof Piotr Oledzkif58a9622008-02-23 01:19:10 +01008906 12. ereq: request errors
8907 13. econ: connection errors
Willy Tarreauae526782010-03-04 20:34:23 +01008908 14. eresp: response errors (among which srv_abrt)
Krzysztof Piotr Oledzkif58a9622008-02-23 01:19:10 +01008909 15. wretr: retries (warning)
8910 16. wredis: redispatches (warning)
Cyril Bonté0dae5852010-02-03 00:26:28 +01008911 17. status: status (UP/DOWN/NOLB/MAINT/MAINT(via)...)
Krzysztof Piotr Oledzkif58a9622008-02-23 01:19:10 +01008912 18. weight: server weight (server), total weight (backend)
8913 19. act: server is active (server), number of active servers (backend)
8914 20. bck: server is backup (server), number of backup servers (backend)
8915 21. chkfail: number of failed checks
8916 22. chkdown: number of UP->DOWN transitions
8917 23. lastchg: last status change (in seconds)
8918 24. downtime: total downtime (in seconds)
8919 25. qlimit: queue limit
8920 26. pid: process id (0 for first instance, 1 for second, ...)
8921 27. iid: unique proxy id
8922 28. sid: service id (unique inside a proxy)
8923 29. throttle: warm up status
8924 30. lbtot: total number of times a server was selected
8925 31. tracked: id of proxy/server if tracking is enabled
Krzysztof Piotr Oledzkiaeebf9b2009-10-04 15:43:17 +02008926 32. type (0=frontend, 1=backend, 2=server, 3=socket)
Krzysztof Piotr Oledzkidb57c6b2009-08-31 21:23:27 +02008927 33. rate: number of sessions per second over last elapsed second
8928 34. rate_lim: limit on new sessions per second
8929 35. rate_max: max number of new sessions per second
Krzysztof Piotr Oledzki09605412009-09-23 22:09:24 +02008930 36. check_status: status of last health check, one of:
Cyril Bontéf0c60612010-02-06 14:44:47 +01008931 UNK -> unknown
8932 INI -> initializing
8933 SOCKERR -> socket error
8934 L4OK -> check passed on layer 4, no upper layers testing enabled
8935 L4TMOUT -> layer 1-4 timeout
8936 L4CON -> layer 1-4 connection problem, for example
8937 "Connection refused" (tcp rst) or "No route to host" (icmp)
8938 L6OK -> check passed on layer 6
8939 L6TOUT -> layer 6 (SSL) timeout
8940 L6RSP -> layer 6 invalid response - protocol error
8941 L7OK -> check passed on layer 7
8942 L7OKC -> check conditionally passed on layer 7, for example 404 with
8943 disable-on-404
8944 L7TOUT -> layer 7 (HTTP/SMTP) timeout
8945 L7RSP -> layer 7 invalid response - protocol error
8946 L7STS -> layer 7 response error, for example HTTP 5xx
Krzysztof Piotr Oledzki09605412009-09-23 22:09:24 +02008947 37. check_code: layer5-7 code, if available
8948 38. check_duration: time in ms took to finish last health check
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01008949 39. hrsp_1xx: http responses with 1xx code
8950 40. hrsp_2xx: http responses with 2xx code
8951 41. hrsp_3xx: http responses with 3xx code
8952 42. hrsp_4xx: http responses with 4xx code
8953 43. hrsp_5xx: http responses with 5xx code
8954 44. hrsp_other: http responses with other codes (protocol error)
Willy Tarreaud63335a2010-02-26 12:56:52 +01008955 45. hanafail: failed health checks details
8956 46. req_rate: HTTP requests per second over last elapsed second
8957 47. req_rate_max: max number of HTTP requests per second observed
8958 48. req_tot: total number of HTTP requests received
Willy Tarreauae526782010-03-04 20:34:23 +01008959 49. cli_abrt: number of data transfers aborted by the client
8960 50. srv_abrt: number of data transfers aborted by the server (inc. in eresp)
Willy Tarreau844e3c52008-01-11 16:28:18 +01008961
Willy Tarreau3dfe6cd2008-12-07 22:29:48 +01008962
Willy Tarreauc57f0e22009-05-10 13:12:33 +020089639.2. Unix Socket commands
Willy Tarreau3dfe6cd2008-12-07 22:29:48 +01008964-------------------------
Krzysztof Piotr Oledzki2c6962c2008-03-02 02:42:14 +01008965
Willy Tarreau3dfe6cd2008-12-07 22:29:48 +01008966The following commands are supported on the UNIX stats socket ; all of them
Willy Tarreau9a42c0d2009-09-22 19:31:03 +02008967must be terminated by a line feed. The socket supports pipelining, so that it
8968is possible to chain multiple commands at once provided they are delimited by
8969a semi-colon or a line feed, although the former is more reliable as it has no
8970risk of being truncated over the network. The responses themselves will each be
8971followed by an empty line, so it will be easy for an external script to match a
8972given response with a given request. By default one command line is processed
8973then the connection closes, but there is an interactive allowing multiple lines
8974to be issued one at a time.
Willy Tarreau3dfe6cd2008-12-07 22:29:48 +01008975
Willy Tarreau9a42c0d2009-09-22 19:31:03 +02008976It is important to understand that when multiple haproxy processes are started
8977on the same sockets, any process may pick up the request and will output its
8978own stats.
Willy Tarreau3dfe6cd2008-12-07 22:29:48 +01008979
Willy Tarreaud63335a2010-02-26 12:56:52 +01008980clear counters
8981 Clear the max values of the statistics counters in each proxy (frontend &
8982 backend) and in each server. The cumulated counters are not affected. This
8983 can be used to get clean counters after an incident, without having to
8984 restart nor to clear traffic counters. This command is restricted and can
8985 only be issued on sockets configured for levels "operator" or "admin".
8986
8987clear counters all
8988 Clear all statistics counters in each proxy (frontend & backend) and in each
8989 server. This has the same effect as restarting. This command is restricted
8990 and can only be issued on sockets configured for level "admin".
8991
Willy Tarreau88bc4ec2010-08-01 07:58:48 +02008992clear table <table> key <key>
8993 Remove entry <key> from the stick-table <table>. The key must be of the same
8994 type as the table, which currently is limited to IPv4. This is typically used
8995 un unblock some users complaining they have been abusively denied access to a
8996 service, but this can also be used to clear some stickiness entries matching
8997 a server that is going to be replaced (see "show table" below for details).
8998 Note that sometimes, removal of a key will be refused because it is currently
8999 tracked by a session. Retrying a few seconds later after the session ends is
9000 usuall enough.
9001
9002 Example :
Willy Tarreau62a36c42010-08-17 15:53:10 +02009003 $ echo "show table http_proxy" | socat stdio /tmp/sock1
Emeric Brun7c6b82e2010-09-24 16:34:28 +02009004 >>> # table: http_proxy, type: ip, size:204800, used:2
Willy Tarreau62a36c42010-08-17 15:53:10 +02009005 >>> 0x80e6a4c: key=127.0.0.1 use=0 exp=3594729 gpc0=0 conn_rate(30000)=1 \
9006 bytes_out_rate(60000)=187
9007 >>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
9008 bytes_out_rate(60000)=191
Willy Tarreau88bc4ec2010-08-01 07:58:48 +02009009
9010 $ echo "clear table http_proxy key 127.0.0.1" | socat stdio /tmp/sock1
9011
9012 $ echo "show table http_proxy" | socat stdio /tmp/sock1
Emeric Brun7c6b82e2010-09-24 16:34:28 +02009013 >>> # table: http_proxy, type: ip, size:204800, used:1
Willy Tarreau62a36c42010-08-17 15:53:10 +02009014 >>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
9015 bytes_out_rate(60000)=191
Willy Tarreau88bc4ec2010-08-01 07:58:48 +02009016
Willy Tarreaud63335a2010-02-26 12:56:52 +01009017disable server <backend>/<server>
9018 Mark the server DOWN for maintenance. In this mode, no more checks will be
9019 performed on the server until it leaves maintenance.
9020 If the server is tracked by other servers, those servers will be set to DOWN
9021 during the maintenance.
9022
9023 In the statistics page, a server DOWN for maintenance will appear with a
9024 "MAINT" status, its tracking servers with the "MAINT(via)" one.
9025
9026 Both the backend and the server may be specified either by their name or by
9027 their numeric ID, prefixed with a dash ('#').
9028
9029 This command is restricted and can only be issued on sockets configured for
9030 level "admin".
9031
9032enable server <backend>/<server>
9033 If the server was previously marked as DOWN for maintenance, this marks the
9034 server UP and checks are re-enabled.
9035
9036 Both the backend and the server may be specified either by their name or by
9037 their numeric ID, prefixed with a dash ('#').
9038
9039 This command is restricted and can only be issued on sockets configured for
9040 level "admin".
9041
9042get weight <backend>/<server>
9043 Report the current weight and the initial weight of server <server> in
9044 backend <backend> or an error if either doesn't exist. The initial weight is
9045 the one that appears in the configuration file. Both are normally equal
9046 unless the current weight has been changed. Both the backend and the server
9047 may be specified either by their name or by their numeric ID, prefixed with a
9048 dash ('#').
9049
Willy Tarreau9a42c0d2009-09-22 19:31:03 +02009050help
9051 Print the list of known keywords and their basic usage. The same help screen
9052 is also displayed for unknown commands.
Willy Tarreau3dfe6cd2008-12-07 22:29:48 +01009053
Willy Tarreau9a42c0d2009-09-22 19:31:03 +02009054prompt
9055 Toggle the prompt at the beginning of the line and enter or leave interactive
9056 mode. In interactive mode, the connection is not closed after a command
9057 completes. Instead, the prompt will appear again, indicating the user that
9058 the interpreter is waiting for a new command. The prompt consists in a right
9059 angle bracket followed by a space "> ". This mode is particularly convenient
9060 when one wants to periodically check information such as stats or errors.
9061 It is also a good idea to enter interactive mode before issuing a "help"
9062 command.
9063
9064quit
9065 Close the connection when in interactive mode.
Krzysztof Piotr Oledzki2c6962c2008-03-02 02:42:14 +01009066
Willy Tarreaud63335a2010-02-26 12:56:52 +01009067set timeout cli <delay>
9068 Change the CLI interface timeout for current connection. This can be useful
9069 during long debugging sessions where the user needs to constantly inspect
9070 some indicators without being disconnected. The delay is passed in seconds.
9071
9072set weight <backend>/<server> <weight>[%]
9073 Change a server's weight to the value passed in argument. If the value ends
9074 with the '%' sign, then the new weight will be relative to the initially
9075 configured weight. Relative weights are only permitted between 0 and 100%,
9076 and absolute weights are permitted between 0 and 256. Servers which are part
9077 of a farm running a static load-balancing algorithm have stricter limitations
9078 because the weight cannot change once set. Thus for these servers, the only
9079 accepted values are 0 and 100% (or 0 and the initial weight). Changes take
9080 effect immediately, though certain LB algorithms require a certain amount of
9081 requests to consider changes. A typical usage of this command is to disable
9082 a server during an update by setting its weight to zero, then to enable it
9083 again after the update by setting it back to 100%. This command is restricted
9084 and can only be issued on sockets configured for level "admin". Both the
9085 backend and the server may be specified either by their name or by their
9086 numeric ID, prefixed with a dash ('#').
9087
Willy Tarreaue0c8a1a2009-03-04 16:33:10 +01009088show errors [<iid>]
9089 Dump last known request and response errors collected by frontends and
9090 backends. If <iid> is specified, the limit the dump to errors concerning
Willy Tarreau6162db22009-10-10 17:13:00 +02009091 either frontend or backend whose ID is <iid>. This command is restricted
9092 and can only be issued on sockets configured for levels "operator" or
9093 "admin".
Willy Tarreaue0c8a1a2009-03-04 16:33:10 +01009094
9095 The errors which may be collected are the last request and response errors
9096 caused by protocol violations, often due to invalid characters in header
9097 names. The report precisely indicates what exact character violated the
9098 protocol. Other important information such as the exact date the error was
9099 detected, frontend and backend names, the server name (when known), the
9100 internal session ID and the source address which has initiated the session
9101 are reported too.
9102
9103 All characters are returned, and non-printable characters are encoded. The
9104 most common ones (\t = 9, \n = 10, \r = 13 and \e = 27) are encoded as one
9105 letter following a backslash. The backslash itself is encoded as '\\' to
9106 avoid confusion. Other non-printable characters are encoded '\xNN' where
9107 NN is the two-digits hexadecimal representation of the character's ASCII
9108 code.
9109
9110 Lines are prefixed with the position of their first character, starting at 0
9111 for the beginning of the buffer. At most one input line is printed per line,
9112 and large lines will be broken into multiple consecutive output lines so that
9113 the output never goes beyond 79 characters wide. It is easy to detect if a
9114 line was broken, because it will not end with '\n' and the next line's offset
9115 will be followed by a '+' sign, indicating it is a continuation of previous
9116 line.
9117
9118 Example :
Willy Tarreau62a36c42010-08-17 15:53:10 +02009119 $ echo "show errors" | socat stdio /tmp/sock1
9120 >>> [04/Mar/2009:15:46:56.081] backend http-in (#2) : invalid response
Willy Tarreaue0c8a1a2009-03-04 16:33:10 +01009121 src 127.0.0.1, session #54, frontend fe-eth0 (#1), server s2 (#1)
9122 response length 213 bytes, error at position 23:
9123
9124 00000 HTTP/1.0 200 OK\r\n
9125 00017 header/bizarre:blah\r\n
9126 00038 Location: blah\r\n
9127 00054 Long-line: this is a very long line which should b
9128 00104+ e broken into multiple lines on the output buffer,
9129 00154+ otherwise it would be too large to print in a ter
9130 00204+ minal\r\n
9131 00211 \r\n
9132
Willy Tarreauc57f0e22009-05-10 13:12:33 +02009133 In the example above, we see that the backend "http-in" which has internal
Willy Tarreaue0c8a1a2009-03-04 16:33:10 +01009134 ID 2 has blocked an invalid response from its server s2 which has internal
9135 ID 1. The request was on session 54 initiated by source 127.0.0.1 and
9136 received by frontend fe-eth0 whose ID is 1. The total response length was
9137 213 bytes when the error was detected, and the error was at byte 23. This
9138 is the slash ('/') in header name "header/bizarre", which is not a valid
9139 HTTP character for a header name.
Krzysztof Piotr Oledzki2c6962c2008-03-02 02:42:14 +01009140
Willy Tarreau9a42c0d2009-09-22 19:31:03 +02009141show info
9142 Dump info about haproxy status on current process.
9143
9144show sess
9145 Dump all known sessions. Avoid doing this on slow connections as this can
Willy Tarreau6162db22009-10-10 17:13:00 +02009146 be huge. This command is restricted and can only be issued on sockets
9147 configured for levels "operator" or "admin".
9148
Willy Tarreau66dc20a2010-03-05 17:53:32 +01009149show sess <id>
9150 Display a lot of internal information about the specified session identifier.
9151 This identifier is the first field at the beginning of the lines in the dumps
9152 of "show sess" (it corresponds to the session pointer). Those information are
9153 useless to most users but may be used by haproxy developers to troubleshoot a
9154 complex bug. The output format is intentionally not documented so that it can
9155 freely evolve depending on demands.
Willy Tarreau9a42c0d2009-09-22 19:31:03 +02009156
9157show stat [<iid> <type> <sid>]
9158 Dump statistics in the CSV format. By passing <id>, <type> and <sid>, it is
9159 possible to dump only selected items :
9160 - <iid> is a proxy ID, -1 to dump everything
9161 - <type> selects the type of dumpable objects : 1 for frontends, 2 for
9162 backends, 4 for servers, -1 for everything. These values can be ORed,
9163 for example:
9164 1 + 2 = 3 -> frontend + backend.
9165 1 + 2 + 4 = 7 -> frontend + backend + server.
9166 - <sid> is a server ID, -1 to dump everything from the selected proxy.
9167
9168 Example :
Willy Tarreau62a36c42010-08-17 15:53:10 +02009169 $ echo "show info;show stat" | socat stdio unix-connect:/tmp/sock1
9170 >>> Name: HAProxy
Willy Tarreau9a42c0d2009-09-22 19:31:03 +02009171 Version: 1.4-dev2-49
9172 Release_date: 2009/09/23
9173 Nbproc: 1
9174 Process_num: 1
9175 (...)
9176
9177 # pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq, (...)
9178 stats,FRONTEND,,,0,0,1000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,1,0, (...)
9179 stats,BACKEND,0,0,0,0,1000,0,0,0,0,0,,0,0,0,0,UP,0,0,0,,0,250,(...)
9180 (...)
9181 www1,BACKEND,0,0,0,0,1000,0,0,0,0,0,,0,0,0,0,UP,1,1,0,,0,250, (...)
9182
9183 $
9184
9185 Here, two commands have been issued at once. That way it's easy to find
9186 which process the stats apply to in multi-process mode. Notice the empty
9187 line after the information output which marks the end of the first block.
9188 A similar empty line appears at the end of the second block (stats) so that
Krzysztof Piotr Oledzkif8645332009-12-13 21:55:50 +01009189 the reader knows the output has not been truncated.
Willy Tarreau9a42c0d2009-09-22 19:31:03 +02009190
Willy Tarreau88bc4ec2010-08-01 07:58:48 +02009191show table
9192 Dump general information on all known stick-tables. Their name is returned
9193 (the name of the proxy which holds them), their type (currently zero, always
9194 IP), their size in maximum possible number of entries, and the number of
9195 entries currently in use.
9196
9197 Example :
Willy Tarreau62a36c42010-08-17 15:53:10 +02009198 $ echo "show table" | socat stdio /tmp/sock1
9199 >>> # table: front_pub, type: 0, size:204800, used:171454
9200 >>> # table: back_rdp, type: 0, size:204800, used:0
Willy Tarreau88bc4ec2010-08-01 07:58:48 +02009201
9202show table <name> [ data.<type> <operator> <value> ]
9203 Dump contents of stick-table <name>. In this mode, a first line of generic
9204 information about the table is reported as with "show table", then all
9205 entries are dumped. Since this can be quite heavy, it is possible to specify
9206 a filter in order to specify what entries to display. The filter then applies
9207 to the stored data (see "stick-table" in section 4.2). One stored data type
9208 has to be specified in <type>, and this data type must be stored in the table
9209 otherwise an error is reported. The data is compared according to <operator>
9210 with the 64-bit integer <value>. Operators are the same as with the ACLs :
9211 - eq : match entries whose data is equal to this value
9212 - ne : match entries whose data is not equal to this value
9213 - le : match entries whose data is less than or equal to this value
9214 - ge : match entries whose data is greater than or equal to this value
9215 - lt : match entries whose data is less than this value
9216 - gt : match entries whose data is greater than this value
9217
9218 Example :
Willy Tarreau62a36c42010-08-17 15:53:10 +02009219 $ echo "show table http_proxy" | socat stdio /tmp/sock1
9220 >>> # table: http_proxy, type: 0, size:204800, used:2
9221 >>> 0x80e6a4c: key=127.0.0.1 use=0 exp=3594729 gpc0=0 conn_rate(30000)=1 \
9222 bytes_out_rate(60000)=187
9223 >>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
9224 bytes_out_rate(60000)=191
Willy Tarreau88bc4ec2010-08-01 07:58:48 +02009225
Willy Tarreau62a36c42010-08-17 15:53:10 +02009226 $ echo "show table http_proxy data.gpc0 gt 0" | socat stdio /tmp/sock1
9227 >>> # table: http_proxy, type: 0, size:204800, used:2
9228 >>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
9229 bytes_out_rate(60000)=191
Willy Tarreau88bc4ec2010-08-01 07:58:48 +02009230
Willy Tarreau62a36c42010-08-17 15:53:10 +02009231 $ echo "show table http_proxy data.conn_rate gt 5" | \
9232 socat stdio /tmp/sock1
9233 >>> # table: http_proxy, type: 0, size:204800, used:2
9234 >>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
9235 bytes_out_rate(60000)=191
Willy Tarreau88bc4ec2010-08-01 07:58:48 +02009236
9237 When the data criterion applies to a dynamic value dependent on time such as
9238 a bytes rate, the value is dynamically computed during the evaluation of the
9239 entry in order to decide whether it has to be dumped or not. This means that
9240 such a filter could match for some time then not match anymore because as
9241 time goes, the average event rate drops.
9242
9243 It is possible to use this to extract lists of IP addresses abusing the
9244 service, in order to monitor them or even blacklist them in a firewall.
9245 Example :
Willy Tarreau62a36c42010-08-17 15:53:10 +02009246 $ echo "show table http_proxy data.gpc0 gt 0" \
9247 | socat stdio /tmp/sock1 \
Willy Tarreau88bc4ec2010-08-01 07:58:48 +02009248 | fgrep 'key=' | cut -d' ' -f2 | cut -d= -f2 > abusers-ip.txt
9249 ( or | awk '/key/{ print a[split($2,a,"=")]; }' )
Krzysztof Piotr Oledzki719e7262009-10-04 15:02:46 +02009250
Willy Tarreau0ba27502007-12-24 16:55:16 +01009251/*
9252 * Local variables:
9253 * fill-column: 79
9254 * End:
9255 */