rhaproxy 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,3238 +14,68 @@
14
14
  # connections.
15
15
  #
16
16
  class RhaproxyFrontend
17
-
18
- #
19
- # acl <aclname> <criterion> [flags] [operator] <value> ...
20
- # Declare or complete an access list.
21
- # May be used in sections : defaults | frontend | listen | backend
22
- # no | yes | yes | yes
23
- # Example:
24
- # acl invalid_src src 0.0.0.0/7 224.0.0.0/3
25
- # acl invalid_src src_port 0:1023
26
- # acl local_dst hdr(host) -i localhost
27
- #
28
- # See section 7 about ACL usage.
29
- #
30
- attr_accessor :acl
31
-
32
- #
33
- # bind [<address>]:<port_range> [, ...]
34
- # bind [<address>]:<port_range> [, ...] interface <interface>
35
- # bind [<address>]:<port_range> [, ...] mss <maxseg>
36
- # bind [<address>]:<port_range> [, ...] transparent
37
- # bind [<address>]:<port_range> [, ...] id <id>
38
- # bind [<address>]:<port_range> [, ...] name <name>
39
- # bind [<address>]:<port_range> [, ...] defer-accept
40
- # bind [<address>]:<port_range> [, ...] accept-proxy
41
- # bind /<path> [, ...]
42
- # bind /<path> [, ...] mode <mode>
43
- # bind /<path> [, ...] [ user <user> | uid <uid> ]
44
- # bind /<path> [, ...] [ group <user> | gid <gid> ]
45
- # Define one or several listening addresses and/or ports in a frontend.
46
- # May be used in sections : defaults | frontend | listen | backend
47
- # no | yes | yes | no
48
- # Arguments :
49
- # <address> is optional and can be a host name, an IPv4 address, an IPv6
50
- # address, or '*'. It designates the address the frontend will
51
- # listen on. If unset, all IPv4 addresses of the system will be
52
- # listened on. The same will apply for '*' or the system's
53
- # special address "0.0.0.0".
54
- #
55
- # <port_range> is either a unique TCP port, or a port range for which the
56
- # proxy will accept connections for the IP address specified
57
- # above. The port is mandatory for TCP listeners. Note that in
58
- # the case of an IPv6 address, the port is always the number
59
- # after the last colon (':'). A range can either be :
60
- # - a numerical port (ex: '80')
61
- # - a dash-delimited ports range explicitly stating the lower
62
- # and upper bounds (ex: '2000-2100') which are included in
63
- # the range.
64
- #
65
- # Particular care must be taken against port ranges, because
66
- # every <address:port> couple consumes one socket (= a file
67
- # descriptor), so it's easy to consume lots of descriptors
68
- # with a simple range, and to run out of sockets. Also, each
69
- # <address:port> couple must be used only once among all
70
- # instances running on a same system. Please note that binding
71
- # to ports lower than 1024 generally require particular
72
- # privileges to start the program, which are independant of
73
- # the 'uid' parameter.
74
- #
75
- # <path> is a UNIX socket path beginning with a slash ('/'). This is
76
- # alternative to the TCP listening port. Haproxy will then
77
- # receive UNIX connections on the socket located at this place.
78
- # The path must begin with a slash and by default is absolute.
79
- # It can be relative to the prefix defined by "unix-bind" in
80
- # the global section. Note that the total length of the prefix
81
- # followed by the socket path cannot exceed some system limits
82
- # for UNIX sockets, which commonly are set to 107 characters.
83
- #
84
- # <interface> is an optional physical interface name. This is currently
85
- # only supported on Linux. The interface must be a physical
86
- # interface, not an aliased interface. When specified, all
87
- # addresses on the same line will only be accepted if the
88
- # incoming packet physically come through the designated
89
- # interface. It is also possible to bind multiple frontends to
90
- # the same address if they are bound to different interfaces.
91
- # Note that binding to a physical interface requires root
92
- # privileges. This parameter is only compatible with TCP
93
- # sockets.
94
- #
95
- # <maxseg> is an optional TCP Maximum Segment Size (MSS) value to be
96
- # advertised on incoming connections. This can be used to force
97
- # a lower MSS for certain specific ports, for instance for
98
- # connections passing through a VPN. Note that this relies on a
99
- # kernel feature which is theorically supported under Linux but
100
- # was buggy in all versions prior to 2.6.28. It may or may not
101
- # work on other operating systems. The commonly advertised
102
- # value on Ethernet networks is 1460 = 1500(MTU) - 40(IP+TCP).
103
- # This parameter is only compatible with TCP sockets.
104
- #
105
- # <id> is a persistent value for socket ID. Must be positive and
106
- # unique in the proxy. An unused value will automatically be
107
- # assigned if unset. Can only be used when defining only a
108
- # single socket.
109
- #
110
- # <name> is an optional name provided for stats
111
- #
112
- # <mode> is the octal mode used to define access permissions on the
113
- # UNIX socket. It can also be set by default in the global
114
- # section's "unix-bind" statement. Note that some platforms
115
- # simply ignore this.
116
- #
117
- # <user> is the name of user that will be marked owner of the UNIX
118
- # socket. It can also be set by default in the global
119
- # section's "unix-bind" statement. Note that some platforms
120
- # simply ignore this.
121
- #
122
- # <group> is the name of a group that will be used to create the UNIX
123
- # socket. It can also be set by default in the global section's
124
- # "unix-bind" statement. Note that some platforms simply ignore
125
- # this.
126
- #
127
- # <uid> is the uid of user that will be marked owner of the UNIX
128
- # socket. It can also be set by default in the global section's
129
- # "unix-bind" statement. Note that some platforms simply ignore
130
- # this.
131
- #
132
- # <gid> is the gid of a group that will be used to create the UNIX
133
- # socket. It can also be set by default in the global section's
134
- # "unix-bind" statement. Note that some platforms simply ignore
135
- # this.
136
- #
137
- # transparent is an optional keyword which is supported only on certain
138
- # Linux kernels. It indicates that the addresses will be bound
139
- # even if they do not belong to the local machine. Any packet
140
- # targeting any of these addresses will be caught just as if
141
- # the address was locally configured. This normally requires
142
- # that IP forwarding is enabled. Caution! do not use this with
143
- # the default address '*', as it would redirect any traffic for
144
- # the specified port. This keyword is available only when
145
- # HAProxy is built with USE_LINUX_TPROXY=1. This parameter is
146
- # only compatible with TCP sockets.
147
- #
148
- # defer-accept is an optional keyword which is supported only on certain
149
- # Linux kernels. It states that a connection will only be
150
- # accepted once some data arrive on it, or at worst after the
151
- # first retransmit. This should be used only on protocols for
152
- # which the client talks first (eg: HTTP). It can slightly
153
- # improve performance by ensuring that most of the request is
154
- # already available when the connection is accepted. On the
155
- # other hand, it will not be able to detect connections which
156
- # don't talk. It is important to note that this option is
157
- # broken in all kernels up to 2.6.31, as the connection is
158
- # never accepted until the client talks. This can cause issues
159
- # with front firewalls which would see an established
160
- # connection while the proxy will only see it in SYN_RECV.
161
- #
162
- # accept-proxy is an optional keyword which enforces use of the PROXY
163
- # protocol over any connection accepted by this listener. The
164
- # PROXY protocol dictates the layer 3/4 addresses of the
165
- # incoming connection to be used everywhere an address is used,
166
- # with the only exception of "tcp-request connection" rules
167
- # which will only see the real connection address. Logs will
168
- # reflect the addresses indicated in the protocol, unless it is
169
- # violated, in which case the real address will still be used.
170
- # This keyword combined with support from external components
171
- # can be used as an efficient and reliable alternative to the
172
- # X-Forwarded-For mechanism which is not always reliable and
173
- # not even always usable.
174
- #
175
- # It is possible to specify a list of address:port combinations delimited by
176
- # commas. The frontend will then listen on all of these addresses. There is no
177
- # fixed limit to the number of addresses and ports which can be listened on in
178
- # a frontend, as well as there is no limit to the number of "bind" statements
179
- # in a frontend.
180
- #
181
- # Example :
182
- # listen http_proxy
183
- # bind :80,:443
184
- # bind 10.0.0.1:10080,10.0.0.1:10443
185
- # bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
186
- #
187
- # See also : "source", "option forwardfor", "unix-bind" and the PROXY protocol
188
- # documentation.
189
- #
190
- attr_accessor :bind
191
-
192
- #
193
- # block { if | unless } <condition>
194
- # Block a layer 7 request if/unless a condition is matched
195
- # May be used in sections : defaults | frontend | listen | backend
196
- # no | yes | yes | yes
197
- #
198
- # The HTTP request will be blocked very early in the layer 7 processing
199
- # if/unless <condition> is matched. A 403 error will be returned if the request
200
- # is blocked. The condition has to reference ACLs (see section 7). This is
201
- # typically used to deny access to certain sensible resources if some
202
- # conditions are met or not met. There is no fixed limit to the number of
203
- # "block" statements per instance.
204
- #
205
- # Example:
206
- # acl invalid_src src 0.0.0.0/7 224.0.0.0/3
207
- # acl invalid_src src_port 0:1023
208
- # acl local_dst hdr(host) -i localhost
209
- # block if invalid_src || local_dst
210
- #
211
- # See section 7 about ACL usage.
212
- #
213
- attr_accessor :block
214
-
215
- #
216
- # capture cookie <name> len <length>
217
- # Capture and log a cookie in the request and in the response.
218
- # May be used in sections : defaults | frontend | listen | backend
219
- # no | yes | yes | no
220
- # Arguments :
221
- # <name> is the beginning of the name of the cookie to capture. In order
222
- # to match the exact name, simply suffix the name with an equal
223
- # sign ('='). The full name will appear in the logs, which is
224
- # useful with application servers which adjust both the cookie name
225
- # and value (eg: ASPSESSIONXXXXX).
226
- #
227
- # <length> is the maximum number of characters to report in the logs, which
228
- # include the cookie name, the equal sign and the value, all in the
229
- # standard "name=value" form. The string will be truncated on the
230
- # right if it exceeds <length>.
231
- #
232
- # Only the first cookie is captured. Both the "cookie" request headers and the
233
- # "set-cookie" response headers are monitored. This is particularly useful to
234
- # check for application bugs causing session crossing or stealing between
235
- # users, because generally the user's cookies can only change on a login page.
236
- #
237
- # When the cookie was not presented by the client, the associated log column
238
- # will report "-". When a request does not cause a cookie to be assigned by the
239
- # server, a "-" is reported in the response column.
240
- #
241
- # The capture is performed in the frontend only because it is necessary that
242
- # the log format does not change for a given frontend depending on the
243
- # backends. This may change in the future. Note that there can be only one
244
- # "capture cookie" statement in a frontend. The maximum capture length is
245
- # configured in the sources by default to 64 characters. It is not possible to
246
- # specify a capture in a "defaults" section.
247
- #
248
- # Example:
249
- # capture cookie ASPSESSION len 32
250
- #
251
- # See also : "capture request header", "capture response header" as well as
252
- # section 8 about logging.
253
- #
254
- attr_accessor :capture_cookie
255
-
256
- #
257
- # capture request header <name> len <length>
258
- # Capture and log the first occurrence of the specified request header.
259
- # May be used in sections : defaults | frontend | listen | backend
260
- # no | yes | yes | no
261
- # Arguments :
262
- # <name> is the name of the header to capture. The header names are not
263
- # case-sensitive, but it is a common practice to write them as they
264
- # appear in the requests, with the first letter of each word in
265
- # upper case. The header name will not appear in the logs, only the
266
- # value is reported, but the position in the logs is respected.
267
- #
268
- # <length> is the maximum number of characters to extract from the value and
269
- # report in the logs. The string will be truncated on the right if
270
- # it exceeds <length>.
271
- #
272
- # Only the first value of the last occurrence of the header is captured. The
273
- # value will be added to the logs between braces ('{}'). If multiple headers
274
- # are captured, they will be delimited by a vertical bar ('|') and will appear
275
- # in the same order they were declared in the configuration. Non-existent
276
- # headers will be logged just as an empty string. Common uses for request
277
- # header captures include the "Host" field in virtual hosting environments, the
278
- # "Content-length" when uploads are supported, "User-agent" to quickly
279
- # differentiate between real users and robots, and "X-Forwarded-For" in proxied
280
- # environments to find where the request came from.
281
- #
282
- # Note that when capturing headers such as "User-agent", some spaces may be
283
- # logged, making the log analysis more difficult. Thus be careful about what
284
- # you log if you know your log parser is not smart enough to rely on the
285
- # braces.
286
- #
287
- # There is no limit to the number of captured request headers, but each capture
288
- # is limited to 64 characters. In order to keep log format consistent for a
289
- # same frontend, header captures can only be declared in a frontend. It is not
290
- # possible to specify a capture in a "defaults" section.
291
- #
292
- # Example:
293
- # capture request header Host len 15
294
- # capture request header X-Forwarded-For len 15
295
- # capture request header Referrer len 15
296
- #
297
- # See also : "capture cookie", "capture response header" as well as section 8
298
- # about logging.
299
- #
300
- attr_accessor :capture_request_header
301
-
302
- #
303
- # capture response header <name> len <length>
304
- # Capture and log the first occurrence of the specified response header.
305
- # May be used in sections : defaults | frontend | listen | backend
306
- # no | yes | yes | no
307
- # Arguments :
308
- # <name> is the name of the header to capture. The header names are not
309
- # case-sensitive, but it is a common practice to write them as they
310
- # appear in the response, with the first letter of each word in
311
- # upper case. The header name will not appear in the logs, only the
312
- # value is reported, but the position in the logs is respected.
313
- #
314
- # <length> is the maximum number of characters to extract from the value and
315
- # report in the logs. The string will be truncated on the right if
316
- # it exceeds <length>.
317
- #
318
- # Only the first value of the last occurrence of the header is captured. The
319
- # result will be added to the logs between braces ('{}') after the captured
320
- # request headers. If multiple headers are captured, they will be delimited by
321
- # a vertical bar ('|') and will appear in the same order they were declared in
322
- # the configuration. Non-existent headers will be logged just as an empty
323
- # string. Common uses for response header captures include the "Content-length"
324
- # header which indicates how many bytes are expected to be returned, the
325
- # "Location" header to track redirections.
326
- #
327
- # There is no limit to the number of captured response headers, but each
328
- # capture is limited to 64 characters. In order to keep log format consistent
329
- # for a same frontend, header captures can only be declared in a frontend. It
330
- # is not possible to specify a capture in a "defaults" section.
331
- #
332
- # Example:
333
- # capture response header Content-length len 9
334
- # capture response header Location len 15
335
- #
336
- # See also : "capture cookie", "capture request header" as well as section 8
337
- # about logging.
338
- #
339
- attr_accessor :capture_response_header
340
-
341
- #
342
- # force-persist { if | unless } <condition>
343
- # Declare a condition to force persistence on down servers
344
- # May be used in sections: defaults | frontend | listen | backend
345
- # no | yes | yes | yes
346
- #
347
- # By default, requests are not dispatched to down servers. It is possible to
348
- # force this using "option persist", but it is unconditional and redispatches
349
- # to a valid server if "option redispatch" is set. That leaves with very little
350
- # possibilities to force some requests to reach a server which is artificially
351
- # marked down for maintenance operations.
352
- #
353
- # The "force-persist" statement allows one to declare various ACL-based
354
- # conditions which, when met, will cause a request to ignore the down status of
355
- # a server and still try to connect to it. That makes it possible to start a
356
- # server, still replying an error to the health checks, and run a specially
357
- # configured browser to test the service. Among the handy methods, one could
358
- # use a specific source IP address, or a specific cookie. The cookie also has
359
- # the advantage that it can easily be added/removed on the browser from a test
360
- # page. Once the service is validated, it is then possible to open the service
361
- # to the world by returning a valid response to health checks.
362
- #
363
- # The forced persistence is enabled when an "if" condition is met, or unless an
364
- # "unless" condition is met. The final redispatch is always disabled when this
365
- # is used.
366
- #
367
- # See also : "option redispatch", "ignore-persist", "persist",
368
- # and section 7 about ACL usage.
369
- #
370
- attr_accessor :force_persist
371
-
372
- #
373
- # http-request { allow | deny | auth [realm <realm>] }
374
- # [ { if | unless } <condition> ]
375
- # Access control for Layer 7 requests
376
- #
377
- # May be used in sections: defaults | frontend | listen | backend
378
- # no | yes | yes | yes
379
- #
380
- # These set of options allow to fine control access to a
381
- # frontend/listen/backend. Each option may be followed by if/unless and acl.
382
- # First option with matched condition (or option without condition) is final.
383
- # For "deny" a 403 error will be returned, for "allow" normal processing is
384
- # performed, for "auth" a 401/407 error code is returned so the client
385
- # should be asked to enter a username and password.
386
- #
387
- # There is no fixed limit to the number of http-request statements per
388
- # instance.
389
- #
390
- # Example:
391
- # acl nagios src 192.168.129.3
392
- # acl local_net src 192.168.0.0/16
393
- # acl auth_ok http_auth(L1)
394
- #
395
- # http-request allow if nagios
396
- # http-request allow if local_net auth_ok
397
- # http-request auth realm Gimme if local_net auth_ok
398
- # http-request deny
399
- #
400
- # Example:
401
- # acl auth_ok http_auth_group(L1) G1
402
- #
403
- # http-request auth unless auth_ok
404
- #
405
- # See also : "stats http-request", section 3.4 about userlists and section 7
406
- # about ACL usage.
407
- #
408
- attr_accessor :http_request
409
-
410
- # id <value>
411
- # Set a persistent ID to a proxy.
412
- # May be used in sections : defaults | frontend | listen | backend
413
- # no | yes | yes | yes
414
- # Arguments : none
415
- #
416
- # Set a persistent ID for the proxy. This ID must be unique and positive.
417
- # An unused ID will automatically be assigned if unset. The first assigned
418
- # value will be 1. This ID is currently only returned in statistics.
419
- #
420
- attr_accessor :persistent_id
421
-
422
- #
423
- # ignore-persist { if | unless } <condition>
424
- # Declare a condition to ignore persistence
425
- # May be used in sections: defaults | frontend | listen | backend
426
- # no | yes | yes | yes
427
- #
428
- # By default, when cookie persistence is enabled, every requests containing
429
- # the cookie are unconditionally persistent (assuming the target server is up
430
- # and running).
431
- #
432
- # The "ignore-persist" statement allows one to declare various ACL-based
433
- # conditions which, when met, will cause a request to ignore persistence.
434
- # This is sometimes useful to load balance requests for static files, which
435
- # oftenly don't require persistence. This can also be used to fully disable
436
- # persistence for a specific User-Agent (for example, some web crawler bots).
437
- #
438
- # Combined with "appsession", it can also help reduce HAProxy memory usage, as
439
- # the appsession table won't grow if persistence is ignored.
440
- #
441
- # The persistence is ignored when an "if" condition is met, or unless an
442
- # "unless" condition is met.
443
- #
444
- # See also : "force-persist", "cookie", and section 7 about ACL usage.
445
- #
446
- attr_accessor :ignore_persist
447
-
448
- #
449
- # monitor fail { if | unless } <condition>
450
- # Add a condition to report a failure to a monitor HTTP request.
451
- # May be used in sections : defaults | frontend | listen | backend
452
- # no | yes | yes | no
453
- # Arguments :
454
- # if <cond> the monitor request will fail if the condition is satisfied,
455
- # and will succeed otherwise. The condition should describe a
456
- # combined test which must induce a failure if all conditions
457
- # are met, for instance a low number of servers both in a
458
- # backend and its backup.
459
- #
460
- # unless <cond> the monitor request will succeed only if the condition is
461
- # satisfied, and will fail otherwise. Such a condition may be
462
- # based on a test on the presence of a minimum number of active
463
- # servers in a list of backends.
464
- #
465
- # This statement adds a condition which can force the response to a monitor
466
- # request to report a failure. By default, when an external component queries
467
- # the URI dedicated to monitoring, a 200 response is returned. When one of the
468
- # conditions above is met, haproxy will return 503 instead of 200. This is
469
- # very useful to report a site failure to an external component which may base
470
- # routing advertisements between multiple sites on the availability reported by
471
- # haproxy. In this case, one would rely on an ACL involving the "nbsrv"
472
- # criterion. Note that "monitor fail" only works in HTTP mode.
473
- #
474
- # Example:
475
- # frontend www
476
- # mode http
477
- # acl site_dead nbsrv(dynamic) lt 2
478
- # acl site_dead nbsrv(static) lt 2
479
- # monitor-uri /site_alive
480
- # monitor fail if site_dead
481
- #
482
- # See also : "monitor-net", "monitor-uri"
483
- #
484
- attr_accessor :monitor_fail
485
-
486
- #
487
- # option ignore-persist { if | unless } <condition>
488
- # Declare a condition to ignore persistence
489
- # May be used in sections: defaults | frontend | listen | backend
490
- # no | yes | yes | yes
491
- #
492
- # By default, when cookie persistence is enabled, every requests containing
493
- # the cookie are unconditionally persistent (assuming the target server is up
494
- # and running).
495
- #
496
- # The "ignore-persist" statement allows one to declare various ACL-based
497
- # conditions which, when met, will cause a request to ignore persistence.
498
- # This is sometimes useful to load balance requests for static files, which
499
- # oftenly don't require persistence. This can also be used to fully disable
500
- # persistence for a specific User-Agent (for example, some web crawler bots).
501
- #
502
- # Combined with "appsession", it can also help reduce HAProxy memory usage, as
503
- # the appsession table won't grow if persistence is ignored.
504
- #
505
- # The persistence is ignored when an "if" condition is met, or unless an
506
- # "unless" condition is met.
507
- #
508
- # See also : "option force-persist", "cookie", and section 7 about ACL usage.
509
- #
510
- attr_accessor :option_ignore_presist
511
-
512
- #
513
- # redirect location <to> [code <code>] <option> [(if | unless) <condition>]
514
- # redirect prefix <to> [code <code>] <option> [(if | unless) <condition>]
515
- # Return an HTTP redirection if/unless a condition is matched
516
- # May be used in sections : defaults | frontend | listen | backend
517
- # no | yes | yes | yes
518
- #
519
- # If/unless the condition is matched, the HTTP request will lead to a redirect
520
- # response. If no condition is specified, the redirect applies unconditionally.
521
- #
522
- # Arguments :
523
- # <to> With "redirect location", the exact value in <to> is placed into
524
- # the HTTP "Location" header. In case of "redirect prefix", the
525
- # "Location" header is built from the concatenation of <to> and the
526
- # complete URI, including the query string, unless the "drop-query"
527
- # option is specified (see below). As a special case, if <to>
528
- # equals exactly "/" in prefix mode, then nothing is inserted
529
- # before the original URI. It allows one to redirect to the same
530
- # URL.
531
- #
532
- # <code> The code is optional. It indicates which type of HTTP redirection
533
- # is desired. Only codes 301, 302 and 303 are supported, and 302 is
534
- # used if no code is specified. 301 means "Moved permanently", and
535
- # a browser may cache the Location. 302 means "Moved permanently"
536
- # and means that the browser should not cache the redirection. 303
537
- # is equivalent to 302 except that the browser will fetch the
538
- # location with a GET method.
539
- #
540
- # <option> There are several options which can be specified to adjust the
541
- # expected behaviour of a redirection :
542
- #
543
- # - "drop-query"
544
- # When this keyword is used in a prefix-based redirection, then the
545
- # location will be set without any possible query-string, which is useful
546
- # for directing users to a non-secure page for instance. It has no effect
547
- # with a location-type redirect.
548
- #
549
- # - "append-slash"
550
- # This keyword may be used in conjunction with "drop-query" to redirect
551
- # users who use a URL not ending with a '/' to the same one with the '/'.
552
- # It can be useful to ensure that search engines will only see one URL.
553
- # For this, a return code 301 is preferred.
554
- #
555
- # - "set-cookie NAME[=value]"
556
- # A "Set-Cookie" header will be added with NAME (and optionally "=value")
557
- # to the response. This is sometimes used to indicate that a user has
558
- # been seen, for instance to protect against some types of DoS. No other
559
- # cookie option is added, so the cookie will be a session cookie. Note
560
- # that for a browser, a sole cookie name without an equal sign is
561
- # different from a cookie with an equal sign.
562
- #
563
- # - "clear-cookie NAME[=]"
564
- # A "Set-Cookie" header will be added with NAME (and optionally "="), but
565
- # with the "Max-Age" attribute set to zero. This will tell the browser to
566
- # delete this cookie. It is useful for instance on logout pages. It is
567
- # important to note that clearing the cookie "NAME" will not remove a
568
- # cookie set with "NAME=value". You have to clear the cookie "NAME=" for
569
- # that, because the browser makes the difference.
570
- #
571
- # Example: move the login URL only to HTTPS.
572
- # acl clear dst_port 80
573
- # acl secure dst_port 8080
574
- # acl login_page url_beg /login
575
- # acl logout url_beg /logout
576
- # acl uid_given url_reg /login?userid=[^&]+
577
- # acl cookie_set hdr_sub(cookie) SEEN=1
578
- #
579
- # redirect prefix https://mysite.com set-cookie SEEN=1 if !cookie_set
580
- # redirect prefix https://mysite.com if login_page !secure
581
- # redirect prefix http://mysite.com drop-query if login_page !uid_given
582
- # redirect location http://mysite.com/ if !login_page secure
583
- # redirect location / clear-cookie USERID= if logout
584
- #
585
- # Example: send redirects for request for articles without a '/'.
586
- # acl missing_slash path_reg ^/article/[^/]*$
587
- # redirect code 301 prefix / drop-query append-slash if missing_slash
588
- #
589
- # See section 7 about ACL usage.
590
- #
591
- attr_accessor :redirect
592
-
593
- #
594
- # reqadd <string> [(if | unless) <cond>]
595
- # Add a header at the end of the HTTP request
596
- # May be used in sections : defaults | frontend | listen | backend
597
- # no | yes | yes | yes
598
- # Arguments :
599
- # <string> is the complete line to be added. Any space or known delimiter
600
- # must be escaped using a backslash ('\'). Please refer to section
601
- # 6 about HTTP header manipulation for more information.
602
- #
603
- # <cond> is an optional matching condition built from ACLs. It makes it
604
- # possible to ignore this rule when other conditions are not met.
605
- #
606
- # A new line consisting in <string> followed by a line feed will be added after
607
- # the last header of an HTTP request.
608
- #
609
- # Header transformations only apply to traffic which passes through HAProxy,
610
- # and not to traffic generated by HAProxy, such as health-checks or error
611
- # responses.
612
- #
613
- # Example : add "X-Proto: SSL" to requests coming via port 81
614
- # acl is-ssl dst_port 81
615
- # reqadd X-Proto:\ SSL if is-ssl
616
- #
617
- # See also: "rspadd", section 6 about HTTP header manipulation, and section 7
618
- # about ACLs.
619
- #
620
- attr_accessor :reqadd
621
-
622
- #
623
- # reqallow <search> [(if | unless) <cond>]
624
- # reqiallow <search> [(if | unless) <cond>] (ignore case)
625
- # Definitely allow an HTTP request if a line matches a regular expression
626
- # May be used in sections : defaults | frontend | listen | backend
627
- # no | yes | yes | yes
628
- # Arguments :
629
- # <search> is the regular expression applied to HTTP headers and to the
630
- # request line. This is an extended regular expression. Parenthesis
631
- # grouping is supported and no preliminary backslash is required.
632
- # Any space or known delimiter must be escaped using a backslash
633
- # ('\'). The pattern applies to a full line at a time. The
634
- # "reqallow" keyword strictly matches case while "reqiallow"
635
- # ignores case.
636
- #
637
- # <cond> is an optional matching condition built from ACLs. It makes it
638
- # possible to ignore this rule when other conditions are not met.
639
- #
640
- # A request containing any line which matches extended regular expression
641
- # <search> will mark the request as allowed, even if any later test would
642
- # result in a deny. The test applies both to the request line and to request
643
- # headers. Keep in mind that URLs in request line are case-sensitive while
644
- # header names are not.
645
- #
646
- # It is easier, faster and more powerful to use ACLs to write access policies.
647
- # Reqdeny, reqallow and reqpass should be avoided in new designs.
648
- #
649
- # Example :
650
- # # allow www.* but refuse *.local
651
- # reqiallow ^Host:\ www\.
652
- # reqideny ^Host:\ .*\.local
653
- #
654
- # See also: "reqdeny", "block", section 6 about HTTP header manipulation, and
655
- # section 7 about ACLs.
656
- #
657
- attr_accessor :reqallow
658
- attr_accessor :reqiallow
659
-
660
- #
661
- # reqdel <search> [(if | unless) <cond>]
662
- # reqidel <search> [(if | unless) <cond>] (ignore case)
663
- # Delete all headers matching a regular expression in an HTTP request
664
- # May be used in sections : defaults | frontend | listen | backend
665
- # no | yes | yes | yes
666
- # Arguments :
667
- # <search> is the regular expression applied to HTTP headers and to the
668
- # request line. This is an extended regular expression. Parenthesis
669
- # grouping is supported and no preliminary backslash is required.
670
- # Any space or known delimiter must be escaped using a backslash
671
- # ('\'). The pattern applies to a full line at a time. The "reqdel"
672
- # keyword strictly matches case while "reqidel" ignores case.
673
- #
674
- # <cond> is an optional matching condition built from ACLs. It makes it
675
- # possible to ignore this rule when other conditions are not met.
676
- #
677
- # Any header line matching extended regular expression <search> in the request
678
- # will be completely deleted. Most common use of this is to remove unwanted
679
- # and/or dangerous headers or cookies from a request before passing it to the
680
- # next servers.
681
- #
682
- # Header transformations only apply to traffic which passes through HAProxy,
683
- # and not to traffic generated by HAProxy, such as health-checks or error
684
- # responses. Keep in mind that header names are not case-sensitive.
685
- #
686
- # Example :
687
- # # remove X-Forwarded-For header and SERVER cookie
688
- # reqidel ^X-Forwarded-For:.*
689
- # reqidel ^Cookie:.*SERVER=
690
- #
691
- # See also: "reqadd", "reqrep", "rspdel", section 6 about HTTP header
692
- # manipulation, and section 7 about ACLs.
693
- #
694
- attr_accessor :reqdel
695
- attr_accessor :reqidel
696
-
697
- #
698
- # reqdeny <search> [(if | unless) <cond>]
699
- # reqideny <search> [(if | unless) <cond>] (ignore case)
700
- # Deny an HTTP request if a line matches a regular expression
701
- # May be used in sections : defaults | frontend | listen | backend
702
- # no | yes | yes | yes
703
- # Arguments :
704
- # <search> is the regular expression applied to HTTP headers and to the
705
- # request line. This is an extended regular expression. Parenthesis
706
- # grouping is supported and no preliminary backslash is required.
707
- # Any space or known delimiter must be escaped using a backslash
708
- # ('\'). The pattern applies to a full line at a time. The
709
- # "reqdeny" keyword strictly matches case while "reqideny" ignores
710
- # case.
711
- #
712
- # <cond> is an optional matching condition built from ACLs. It makes it
713
- # possible to ignore this rule when other conditions are not met.
714
- #
715
- # A request containing any line which matches extended regular expression
716
- # <search> will mark the request as denied, even if any later test would
717
- # result in an allow. The test applies both to the request line and to request
718
- # headers. Keep in mind that URLs in request line are case-sensitive while
719
- # header names are not.
720
- #
721
- # A denied request will generate an "HTTP 403 forbidden" response once the
722
- # complete request has been parsed. This is consistent with what is practiced
723
- # using ACLs.
724
- #
725
- # It is easier, faster and more powerful to use ACLs to write access policies.
726
- # Reqdeny, reqallow and reqpass should be avoided in new designs.
727
- #
728
- # Example :
729
- # # refuse *.local, then allow www.*
730
- # reqideny ^Host:\ .*\.local
731
- # reqiallow ^Host:\ www\.
732
- #
733
- # See also: "reqallow", "rspdeny", "block", section 6 about HTTP header
734
- # manipulation, and section 7 about ACLs.
735
- #
736
- attr_accessor :reqdeny
737
- attr_accessor :reqideny
738
-
739
- #
740
- # reqpass <search> [(if | unless) <cond>]
741
- # reqipass <search> [(if | unless) <cond>] (ignore case)
742
- # Ignore any HTTP request line matching a regular expression in next rules
743
- # May be used in sections : defaults | frontend | listen | backend
744
- # no | yes | yes | yes
745
- # Arguments :
746
- # <search> is the regular expression applied to HTTP headers and to the
747
- # request line. This is an extended regular expression. Parenthesis
748
- # grouping is supported and no preliminary backslash is required.
749
- # Any space or known delimiter must be escaped using a backslash
750
- # ('\'). The pattern applies to a full line at a time. The
751
- # "reqpass" keyword strictly matches case while "reqipass" ignores
752
- # case.
753
- #
754
- # <cond> is an optional matching condition built from ACLs. It makes it
755
- # possible to ignore this rule when other conditions are not met.
756
- #
757
- # A request containing any line which matches extended regular expression
758
- # <search> will skip next rules, without assigning any deny or allow verdict.
759
- # The test applies both to the request line and to request headers. Keep in
760
- # mind that URLs in request line are case-sensitive while header names are not.
761
- #
762
- # It is easier, faster and more powerful to use ACLs to write access policies.
763
- # Reqdeny, reqallow and reqpass should be avoided in new designs.
764
- #
765
- # Example :
766
- # # refuse *.local, then allow www.*, but ignore "www.private.local"
767
- # reqipass ^Host:\ www.private\.local
768
- # reqideny ^Host:\ .*\.local
769
- # reqiallow ^Host:\ www\.
770
- #
771
- # See also: "reqallow", "reqdeny", "block", section 6 about HTTP header
772
- # manipulation, and section 7 about ACLs.
773
- #
774
- attr_accessor :reqpass
775
- attr_accessor :reqipass
776
-
777
- #
778
- # reqrep <search> <string> [(if | unless) <cond>]
779
- # reqirep <search> <string> [(if | unless) <cond>] (ignore case)
780
- # Replace a regular expression with a string in an HTTP request line
781
- # May be used in sections : defaults | frontend | listen | backend
782
- # no | yes | yes | yes
783
- # Arguments :
784
- # <search> is the regular expression applied to HTTP headers and to the
785
- # request line. This is an extended regular expression. Parenthesis
786
- # grouping is supported and no preliminary backslash is required.
787
- # Any space or known delimiter must be escaped using a backslash
788
- # ('\'). The pattern applies to a full line at a time. The "reqrep"
789
- # keyword strictly matches case while "reqirep" ignores case.
790
- #
791
- # <string> is the complete line to be added. Any space or known delimiter
792
- # must be escaped using a backslash ('\'). References to matched
793
- # pattern groups are possible using the common \N form, with N
794
- # being a single digit between 0 and 9. Please refer to section
795
- # 6 about HTTP header manipulation for more information.
796
- #
797
- # <cond> is an optional matching condition built from ACLs. It makes it
798
- # possible to ignore this rule when other conditions are not met.
799
- #
800
- # Any line matching extended regular expression <search> in the request (both
801
- # the request line and header lines) will be completely replaced with <string>.
802
- # Most common use of this is to rewrite URLs or domain names in "Host" headers.
803
- #
804
- # Header transformations only apply to traffic which passes through HAProxy,
805
- # and not to traffic generated by HAProxy, such as health-checks or error
806
- # responses. Note that for increased readability, it is suggested to add enough
807
- # spaces between the request and the response. Keep in mind that URLs in
808
- # request line are case-sensitive while header names are not.
809
- #
810
- # Example :
811
- # # replace "/static/" with "/" at the beginning of any request path.
812
- # reqrep ^([^\ ]*)\ /static/(.*) \1\ /\2
813
- # # replace "www.mydomain.com" with "www" in the host name.
814
- # reqirep ^Host:\ www.mydomain.com Host:\ www
815
- #
816
- # See also: "reqadd", "reqdel", "rsprep", section 6 about HTTP header
817
- # manipulation, and section 7 about ACLs.
818
- #
819
- attr_accessor :reqrep
820
- attr_accessor :reqirep
821
-
822
- #
823
- # reqtarpit <search> [(if | unless) <cond>]
824
- # reqitarpit <search> [(if | unless) <cond>] (ignore case)
825
- # Tarpit an HTTP request containing a line matching a regular expression
826
- # May be used in sections : defaults | frontend | listen | backend
827
- # no | yes | yes | yes
828
- # Arguments :
829
- # <search> is the regular expression applied to HTTP headers and to the
830
- # request line. This is an extended regular expression. Parenthesis
831
- # grouping is supported and no preliminary backslash is required.
832
- # Any space or known delimiter must be escaped using a backslash
833
- # ('\'). The pattern applies to a full line at a time. The
834
- # "reqtarpit" keyword strictly matches case while "reqitarpit"
835
- # ignores case.
836
- #
837
- # <cond> is an optional matching condition built from ACLs. It makes it
838
- # possible to ignore this rule when other conditions are not met.
839
- #
840
- # A request containing any line which matches extended regular expression
841
- # <search> will be tarpitted, which means that it will connect to nowhere, will
842
- # be kept open for a pre-defined time, then will return an HTTP error 500 so
843
- # that the attacker does not suspect it has been tarpitted. The status 500 will
844
- # be reported in the logs, but the completion flags will indicate "PT". The
845
- # delay is defined by "timeout tarpit", or "timeout connect" if the former is
846
- # not set.
847
- #
848
- # The goal of the tarpit is to slow down robots attacking servers with
849
- # identifiable requests. Many robots limit their outgoing number of connections
850
- # and stay connected waiting for a reply which can take several minutes to
851
- # come. Depending on the environment and attack, it may be particularly
852
- # efficient at reducing the load on the network and firewalls.
853
- #
854
- # Examples :
855
- # # ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
856
- # # block all others.
857
- # reqipass ^User-Agent:\.*(Mozilla|MSIE)
858
- # reqitarpit ^User-Agent:
859
- #
860
- # # block bad guys
861
- # acl badguys src 10.1.0.3 172.16.13.20/28
862
- # reqitarpit . if badguys
863
- #
864
- # See also: "reqallow", "reqdeny", "reqpass", section 6 about HTTP header
865
- # manipulation, and section 7 about ACLs.
866
- #
867
- attr_accessor :reqtarpit
868
- attr_accessor :reqitarpit
869
-
870
- #
871
- # rspadd <string> [(if | unless) <cond>]
872
- # Add a header at the end of the HTTP response
873
- # May be used in sections : defaults | frontend | listen | backend
874
- # no | yes | yes | yes
875
- # Arguments :
876
- # <string> is the complete line to be added. Any space or known delimiter
877
- # must be escaped using a backslash ('\'). Please refer to section
878
- # 6 about HTTP header manipulation for more information.
879
- #
880
- # <cond> is an optional matching condition built from ACLs. It makes it
881
- # possible to ignore this rule when other conditions are not met.
882
- #
883
- # A new line consisting in <string> followed by a line feed will be added after
884
- # the last header of an HTTP response.
885
- #
886
- # Header transformations only apply to traffic which passes through HAProxy,
887
- # and not to traffic generated by HAProxy, such as health-checks or error
888
- # responses.
889
- #
890
- # See also: "reqadd", section 6 about HTTP header manipulation, and section 7
891
- # about ACLs.
892
- #
893
- attr_accessor :rspadd
894
-
895
- #
896
- # rspdel <search> [(if | unless) <cond>]
897
- # rspidel <search> [(if | unless) <cond>] (ignore case)
898
- # Delete all headers matching a regular expression in an HTTP response
899
- # May be used in sections : defaults | frontend | listen | backend
900
- # no | yes | yes | yes
901
- # Arguments :
902
- # <search> is the regular expression applied to HTTP headers and to the
903
- # response line. This is an extended regular expression, so
904
- # parenthesis grouping is supported and no preliminary backslash
905
- # is required. Any space or known delimiter must be escaped using
906
- # a backslash ('\'). The pattern applies to a full line at a time.
907
- # The "rspdel" keyword strictly matches case while "rspidel"
908
- # ignores case.
909
- #
910
- # <cond> is an optional matching condition built from ACLs. It makes it
911
- # possible to ignore this rule when other conditions are not met.
912
- #
913
- # Any header line matching extended regular expression <search> in the response
914
- # will be completely deleted. Most common use of this is to remove unwanted
915
- # and/or sensible headers or cookies from a response before passing it to the
916
- # client.
917
- #
918
- # Header transformations only apply to traffic which passes through HAProxy,
919
- # and not to traffic generated by HAProxy, such as health-checks or error
920
- # responses. Keep in mind that header names are not case-sensitive.
921
- #
922
- # Example :
923
- # # remove the Server header from responses
924
- # reqidel ^Server:.*
925
- #
926
- # See also: "rspadd", "rsprep", "reqdel", section 6 about HTTP header
927
- # manipulation, and section 7 about ACLs.
928
- #
929
- attr_accessor :rspdel
930
- attr_accessor :rspidel
931
-
932
- #
933
- # rspdeny <search> [(if | unless) <cond>]
934
- # rspideny <search> [(if | unless) <cond>] (ignore case)
935
- # Block an HTTP response if a line matches a regular expression
936
- # May be used in sections : defaults | frontend | listen | backend
937
- # no | yes | yes | yes
938
- # Arguments :
939
- # <search> is the regular expression applied to HTTP headers and to the
940
- # response line. This is an extended regular expression, so
941
- # parenthesis grouping is supported and no preliminary backslash
942
- # is required. Any space or known delimiter must be escaped using
943
- # a backslash ('\'). The pattern applies to a full line at a time.
944
- # The "rspdeny" keyword strictly matches case while "rspideny"
945
- # ignores case.
946
- #
947
- # <cond> is an optional matching condition built from ACLs. It makes it
948
- # possible to ignore this rule when other conditions are not met.
949
- #
950
- # A response containing any line which matches extended regular expression
951
- # <search> will mark the request as denied. The test applies both to the
952
- # response line and to response headers. Keep in mind that header names are not
953
- # case-sensitive.
954
- #
955
- # Main use of this keyword is to prevent sensitive information leak and to
956
- # block the response before it reaches the client. If a response is denied, it
957
- # will be replaced with an HTTP 502 error so that the client never retrieves
958
- # any sensitive data.
959
- #
960
- # It is easier, faster and more powerful to use ACLs to write access policies.
961
- # Rspdeny should be avoided in new designs.
962
- #
963
- # Example :
964
- # # Ensure that no content type matching ms-word will leak
965
- # rspideny ^Content-type:\.*/ms-word
966
- #
967
- # See also: "reqdeny", "acl", "block", section 6 about HTTP header manipulation
968
- # and section 7 about ACLs.
969
- #
970
- attr_accessor :rspdeny
971
- attr_accessor :rspideny
972
-
973
- #
974
- # rsprep <search> <string> [(if | unless) <cond>]
975
- # rspirep <search> <string> [(if | unless) <cond>] (ignore case)
976
- # Replace a regular expression with a string in an HTTP response line
977
- # May be used in sections : defaults | frontend | listen | backend
978
- # no | yes | yes | yes
979
- # Arguments :
980
- # <search> is the regular expression applied to HTTP headers and to the
981
- # response line. This is an extended regular expression, so
982
- # parenthesis grouping is supported and no preliminary backslash
983
- # is required. Any space or known delimiter must be escaped using
984
- # a backslash ('\'). The pattern applies to a full line at a time.
985
- # The "rsprep" keyword strictly matches case while "rspirep"
986
- # ignores case.
987
- #
988
- # <string> is the complete line to be added. Any space or known delimiter
989
- # must be escaped using a backslash ('\'). References to matched
990
- # pattern groups are possible using the common \N form, with N
991
- # being a single digit between 0 and 9. Please refer to section
992
- # 6 about HTTP header manipulation for more information.
993
- #
994
- # <cond> is an optional matching condition built from ACLs. It makes it
995
- # possible to ignore this rule when other conditions are not met.
996
- #
997
- # Any line matching extended regular expression <search> in the response (both
998
- # the response line and header lines) will be completely replaced with
999
- # <string>. Most common use of this is to rewrite Location headers.
1000
- #
1001
- # Header transformations only apply to traffic which passes through HAProxy,
1002
- # and not to traffic generated by HAProxy, such as health-checks or error
1003
- # responses. Note that for increased readability, it is suggested to add enough
1004
- # spaces between the request and the response. Keep in mind that header names
1005
- # are not case-sensitive.
1006
- #
1007
- # Example :
1008
- # # replace "Location: 127.0.0.1:8080" with "Location: www.mydomain.com"
1009
- # rspirep ^Location:\ 127.0.0.1:8080 Location:\ www.mydomain.com
1010
- #
1011
- # See also: "rspadd", "rspdel", "reqrep", section 6 about HTTP header
1012
- # manipulation, and section 7 about ACLs.
1013
- #
1014
- attr_accessor :rsprep
1015
- attr_accessor :rspirep
1016
-
1017
- #
1018
- # tcp-request connection <action> [(if | unless) <condition>]
1019
- # Perform an action on an incoming connection depending on a layer 4 condition
1020
- # May be used in sections : defaults | frontend | listen | backend
1021
- # no | yes | yes | no
1022
- # Arguments :
1023
- # <action> defines the action to perform if the condition applies. Valid
1024
- # actions include : "accept", "reject", "track-sc1", "track-sc2".
1025
- # See below for more details.
1026
- #
1027
- # <condition> is a standard layer4-only ACL-based condition (see section 7).
1028
- #
1029
- # Immediately after acceptance of a new incoming connection, it is possible to
1030
- # evaluate some conditions to decide whether this connection must be accepted
1031
- # or dropped or have its counters tracked. Those conditions cannot make use of
1032
- # any data contents because the connection has not been read from yet, and the
1033
- # buffers are not yet allocated. This is used to selectively and very quickly
1034
- # accept or drop connections from various sources with a very low overhead. If
1035
- # some contents need to be inspected in order to take the decision, the
1036
- # "tcp-request content" statements must be used instead.
1037
- #
1038
- # The "tcp-request connection" rules are evaluated in their exact declaration
1039
- # order. If no rule matches or if there is no rule, the default action is to
1040
- # accept the incoming connection. There is no specific limit to the number of
1041
- # rules which may be inserted.
1042
- #
1043
- # Three types of actions are supported :
1044
- # - accept :
1045
- # accepts the connection if the condition is true (when used with "if")
1046
- # or false (when used with "unless"). The first such rule executed ends
1047
- # the rules evaluation.
1048
- #
1049
- # - reject :
1050
- # rejects the connection if the condition is true (when used with "if")
1051
- # or false (when used with "unless"). The first such rule executed ends
1052
- # the rules evaluation. Rejected connections do not even become a
1053
- # session, which is why they are accounted separately for in the stats,
1054
- # as "denied connections". They are not considered for the session
1055
- # rate-limit and are not logged either. The reason is that these rules
1056
- # should only be used to filter extremely high connection rates such as
1057
- # the ones encountered during a massive DDoS attack. Under these extreme
1058
- # conditions, the simple action of logging each event would make the
1059
- # system collapse and would considerably lower the filtering capacity. If
1060
- # logging is absolutely desired, then "tcp-request content" rules should
1061
- # be used instead.
1062
- #
1063
- # - { track-sc1 | track-sc2 } <key> [table <table>] :
1064
- # enables tracking of sticky counters from current connection. These
1065
- # rules do not stop evaluation and do not change default action. Two sets
1066
- # of counters may be simultaneously tracked by the same connection. The
1067
- # first "track-sc1" rule executed enables tracking of the counters of the
1068
- # specified table as the first set. The first "track-sc2" rule executed
1069
- # enables tracking of the counters of the specified table as the second
1070
- # set. It is a recommended practice to use the first set of counters for
1071
- # the per-frontend counters and the second set for the per-backend ones.
1072
- #
1073
- # These actions take one or two arguments :
1074
- # <key> is mandatory, and defines the criterion the tracking key will
1075
- # be derived from. At the moment, only "src" is supported. With
1076
- # it, the key will be the connection's source IPv4 address.
1077
- #
1078
- # <table> is an optional table to be used instead of the default one,
1079
- # which is the stick-table declared in the current proxy. All
1080
- # the counters for the matches and updates for the key will
1081
- # then be performed in that table until the session ends.
1082
- #
1083
- # Once a "track-sc*" rule is executed, the key is looked up in the table
1084
- # and if it is not found, an entry is allocated for it. Then a pointer to
1085
- # that entry is kept during all the session's life, and this entry's
1086
- # counters are updated as often as possible, every time the session's
1087
- # counters are updated, and also systematically when the session ends.
1088
- # If the entry tracks concurrent connection counters, one connection is
1089
- # counted for as long as the entry is tracked, and the entry will not
1090
- # expire during that time. Tracking counters also provides a performance
1091
- # advantage over just checking the keys, because only one table lookup is
1092
- # performed for all ACL checks that make use of it.
1093
- #
1094
- # Note that the "if/unless" condition is optional. If no condition is set on
1095
- # the action, it is simply performed unconditionally. That can be useful for
1096
- # "track-sc*" actions as well as for changing the default action to a reject.
1097
- #
1098
- # Example: accept all connections from white-listed hosts, reject too fast
1099
- # connection without counting them, and track accepted connections.
1100
- # This results in connection rate being capped from abusive sources.
1101
- #
1102
- # tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
1103
- # tcp-request connection reject if { src_conn_rate gt 10 }
1104
- # tcp-request connection track-sc1 src
1105
- #
1106
- # Example: accept all connections from white-listed hosts, count all other
1107
- # connections and reject too fast ones. This results in abusive ones
1108
- # being blocked as long as they don't slow down.
1109
- #
1110
- # tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
1111
- # tcp-request connection track-sc1 src
1112
- # tcp-request connection reject if { sc1_conn_rate gt 10 }
1113
- #
1114
- # See section 7 about ACL usage.
1115
- #
1116
- # See also : "tcp-request content", "stick-table"
1117
- #
1118
- attr_accessor :tcp_request_connection
1119
-
1120
- #
1121
- # tcp-request content <action> [(if | unless) <condition>]
1122
- # Perform an action on a new session depending on a layer 4-7 condition
1123
- # May be used in sections : defaults | frontend | listen | backend
1124
- # no | yes | yes | yes
1125
- # Arguments :
1126
- # <action> defines the action to perform if the condition applies. Valid
1127
- # actions include : "accept", "reject", "track-sc1", "track-sc2".
1128
- # See "tcp-request connection" above for their signification.
1129
- #
1130
- # <condition> is a standard layer 4-7 ACL-based condition (see section 7).
1131
- #
1132
- # A request's contents can be analysed at an early stage of request processing
1133
- # called "TCP content inspection". During this stage, ACL-based rules are
1134
- # evaluated every time the request contents are updated, until either an
1135
- # "accept" or a "reject" rule matches, or the TCP request inspection delay
1136
- # expires with no matching rule.
1137
- #
1138
- # The first difference between these rules and "tcp-request connection" rules
1139
- # is that "tcp-request content" rules can make use of contents to take a
1140
- # decision. Most often, these decisions will consider a protocol recognition or
1141
- # validity. The second difference is that content-based rules can be used in
1142
- # both frontends and backends. In frontends, they will be evaluated upon new
1143
- # connections. In backends, they will be evaluated once a session is assigned
1144
- # a backend. This means that a single frontend connection may be evaluated
1145
- # several times by one or multiple backends when a session gets reassigned
1146
- # (for instance after a client-side HTTP keep-alive request).
1147
- #
1148
- # Content-based rules are evaluated in their exact declaration order. If no
1149
- # rule matches or if there is no rule, the default action is to accept the
1150
- # contents. There is no specific limit to the number of rules which may be
1151
- # inserted.
1152
- #
1153
- # Three types of actions are supported :
1154
- # - accept :
1155
- # - reject :
1156
- # - { track-sc1 | track-sc2 } <key> [table <table>]
1157
- #
1158
- # They have the same meaning as their counter-parts in "tcp-request connection"
1159
- # so please refer to that section for a complete description.
1160
- #
1161
- # Also, it is worth noting that if sticky counters are tracked from a rule
1162
- # defined in a backend, this tracking will automatically end when the session
1163
- # releases the backend. That allows per-backend counter tracking even in case
1164
- # of HTTP keep-alive requests when the backend changes. While there is nothing
1165
- # mandatory about it, it is recommended to use the track-sc1 pointer to track
1166
- # per-frontend counters and track-sc2 to track per-backend counters.
1167
- #
1168
- # Note that the "if/unless" condition is optional. If no condition is set on
1169
- # the action, it is simply performed unconditionally. That can be useful for
1170
- # "track-sc*" actions as well as for changing the default action to a reject.
1171
- #
1172
- # It is perfectly possible to match layer 7 contents with "tcp-request content"
1173
- # rules, but then it is important to ensure that a full request has been
1174
- # buffered, otherwise no contents will match. In order to achieve this, the
1175
- # best solution involves detecting the HTTP protocol during the inspection
1176
- # period.
1177
- #
1178
- # Example:
1179
- # # Accept HTTP requests containing a Host header saying "example.com"
1180
- # # and reject everything else.
1181
- # acl is_host_com hdr(Host) -i example.com
1182
- # tcp-request inspect-delay 30s
1183
- # tcp-request content accept if HTTP is_host_com
1184
- # tcp-request content reject
1185
- #
1186
- # Example:
1187
- # # reject SMTP connection if client speaks first
1188
- # tcp-request inspect-delay 30s
1189
- # acl content_present req_len gt 0
1190
- # tcp-request content reject if content_present
1191
- #
1192
- # # Forward HTTPS connection only if client speaks
1193
- # tcp-request inspect-delay 30s
1194
- # acl content_present req_len gt 0
1195
- # tcp-request content accept if content_present
1196
- # tcp-request content reject
1197
- #
1198
- # Example: track per-frontend and per-backend counters, block abusers at the
1199
- # frontend when the backend detects abuse.
1200
- #
1201
- # frontend http
1202
- # # Use General Purpose Couter 0 in SC1 as a global abuse counter
1203
- # # protecting all our sites
1204
- # stick-table type ip size 1m expire 5m store gpc0
1205
- # tcp-request connection track-sc1 src
1206
- # tcp-request connection reject if { sc1_get_gpc0 gt 0 }
1207
- # ...
1208
- # use_backend http_dynamic if { path_end .php }
1209
- #
1210
- # backend http_dynamic
1211
- # # if a source makes too fast requests to this dynamic site (tracked
1212
- # # by SC2), block it globally in the frontend.
1213
- # stick-table type ip size 1m expire 5m store http_req_rate(10s)
1214
- # acl click_too_fast sc2_http_req_rate gt 10
1215
- # acl mark_as_abuser sc1_inc_gpc0
1216
- # tcp-request content track-sc2 src
1217
- # tcp-request content reject if click_too_fast mark_as_abuser
1218
- #
1219
- # See section 7 about ACL usage.
1220
- #
1221
- # See also : "tcp-request connection", "tcp-request inspect-delay"
1222
- #
1223
- attr_accessor :tcp_request_content
1224
-
1225
- #
1226
- # tcp-request inspect-delay <timeout>
1227
- # Set the maximum allowed time to wait for data during content inspection
1228
- # May be used in sections : defaults | frontend | listen | backend
1229
- # no | yes | yes | yes
1230
- # Arguments :
1231
- # <timeout> is the timeout value specified in milliseconds by default, but
1232
- # can be in any other unit if the number is suffixed by the unit,
1233
- # as explained at the top of this document.
1234
- #
1235
- # People using haproxy primarily as a TCP relay are often worried about the
1236
- # risk of passing any type of protocol to a server without any analysis. In
1237
- # order to be able to analyze the request contents, we must first withhold
1238
- # the data then analyze them. This statement simply enables withholding of
1239
- # data for at most the specified amount of time.
1240
- #
1241
- # TCP content inspection applies very early when a connection reaches a
1242
- # frontend, then very early when the connection is forwarded to a backend. This
1243
- # means that a connection may experience a first delay in the frontend and a
1244
- # second delay in the backend if both have tcp-request rules.
1245
- #
1246
- # Note that when performing content inspection, haproxy will evaluate the whole
1247
- # rules for every new chunk which gets in, taking into account the fact that
1248
- # those data are partial. If no rule matches before the aforementioned delay,
1249
- # a last check is performed upon expiration, this time considering that the
1250
- # contents are definitive. If no delay is set, haproxy will not wait at all
1251
- # and will immediately apply a verdict based on the available information.
1252
- # Obviously this is unlikely to be very useful and might even be racy, so such
1253
- # setups are not recommended.
1254
- #
1255
- # As soon as a rule matches, the request is released and continues as usual. If
1256
- # the timeout is reached and no rule matches, the default policy will be to let
1257
- # it pass through unaffected.
1258
- #
1259
- # For most protocols, it is enough to set it to a few seconds, as most clients
1260
- # send the full request immediately upon connection. Add 3 or more seconds to
1261
- # cover TCP retransmits but that's all. For some protocols, it may make sense
1262
- # to use large values, for instance to ensure that the client never talks
1263
- # before the server (eg: SMTP), or to wait for a client to talk before passing
1264
- # data to the server (eg: SSL). Note that the client timeout must cover at
1265
- # least the inspection delay, otherwise it will expire first. If the client
1266
- # closes the connection or if the buffer is full, the delay immediately expires
1267
- # since the contents will not be able to change anymore.
1268
- #
1269
- # See also : "tcp-request content accept", "tcp-request content reject",
1270
- # "timeout client".
1271
- #
1272
- attr_accessor :tcp_request_inspect_delay
1273
-
1274
- #
1275
- # use_backend <backend> if <condition>
1276
- # use_backend <backend> unless <condition>
1277
- # Switch to a specific backend if/unless an ACL-based condition is matched.
1278
- # May be used in sections : defaults | frontend | listen | backend
1279
- # no | yes | yes | no
1280
- # Arguments :
1281
- # <backend> is the name of a valid backend or "listen" section.
1282
- #
1283
- # <condition> is a condition composed of ACLs, as described in section 7.
1284
- #
1285
- # When doing content-switching, connections arrive on a frontend and are then
1286
- # dispatched to various backends depending on a number of conditions. The
1287
- # relation between the conditions and the backends is described with the
1288
- # "use_backend" keyword. While it is normally used with HTTP processing, it can
1289
- # also be used in pure TCP, either without content using stateless ACLs (eg:
1290
- # source address validation) or combined with a "tcp-request" rule to wait for
1291
- # some payload.
1292
- #
1293
- # There may be as many "use_backend" rules as desired. All of these rules are
1294
- # evaluated in their declaration order, and the first one which matches will
1295
- # assign the backend.
1296
- #
1297
- # In the first form, the backend will be used if the condition is met. In the
1298
- # second form, the backend will be used if the condition is not met. If no
1299
- # condition is valid, the backend defined with "default_backend" will be used.
1300
- # If no default backend is defined, either the servers in the same section are
1301
- # used (in case of a "listen" section) or, in case of a frontend, no server is
1302
- # used and a 503 service unavailable response is returned.
1303
- #
1304
- # Note that it is possible to switch from a TCP frontend to an HTTP backend. In
1305
- # this case, either the frontend has already checked that the protocol is HTTP,
1306
- # and backend processing will immediately follow, or the backend will wait for
1307
- # a complete HTTP request to get in. This feature is useful when a frontend
1308
- # must decode several protocols on a unique port, one of them being HTTP.
1309
- #
1310
- # See also: "default_backend", "tcp-request", and section 7 about ACLs.
1311
- #
1312
- attr_accessor :use_backend
1313
-
1314
- #
1315
- # description <text>
1316
- # Add a text that describes the instance.
1317
- #
1318
- # Please note that it is required to escape certain characters (# for example)
1319
- # and this text is inserted into a html page so you should avoid using
1320
- # "<" and ">" characters.
1321
- #
1322
- attr_accessor :description
1323
-
1324
- #
1325
- # backlog <conns>
1326
- # Give hints to the system about the approximate listen backlog desired size
1327
- # May be used in sections : defaults | frontend | listen | backend
1328
- # yes | yes | yes | no
1329
- # Arguments :
1330
- # <conns> is the number of pending connections. Depending on the operating
1331
- # system, it may represent the number of already acknowledged
1332
- # connections, of non-acknowledged ones, or both.
1333
- #
1334
- # In order to protect against SYN flood attacks, one solution is to increase
1335
- # the system's SYN backlog size. Depending on the system, sometimes it is just
1336
- # tunable via a system parameter, sometimes it is not adjustable at all, and
1337
- # sometimes the system relies on hints given by the application at the time of
1338
- # the listen() syscall. By default, HAProxy passes the frontend's maxconn value
1339
- # to the listen() syscall. On systems which can make use of this value, it can
1340
- # sometimes be useful to be able to specify a different value, hence this
1341
- # backlog parameter.
1342
- #
1343
- # On Linux 2.4, the parameter is ignored by the system. On Linux 2.6, it is
1344
- # used as a hint and the system accepts up to the smallest greater power of
1345
- # two, and never more than some limits (usually 32768).
1346
- #
1347
- # See also : "maxconn" and the target operating system's tuning guide.
1348
- #
1349
- attr_accessor :backlog
1350
-
1351
- #
1352
- # bind-process [ all | odd | even | <number 1-32> ] ...
1353
- # Limit visibility of an instance to a certain set of processes numbers.
1354
- # May be used in sections : defaults | frontend | listen | backend
1355
- # yes | yes | yes | yes
1356
- # Arguments :
1357
- # all All process will see this instance. This is the default. It
1358
- # may be used to override a default value.
1359
- #
1360
- # odd This instance will be enabled on processes 1,3,5,...31. This
1361
- # option may be combined with other numbers.
1362
- #
1363
- # even This instance will be enabled on processes 2,4,6,...32. This
1364
- # option may be combined with other numbers. Do not use it
1365
- # with less than 2 processes otherwise some instances might be
1366
- # missing from all processes.
1367
- #
1368
- # number The instance will be enabled on this process number, between
1369
- # 1 and 32. You must be careful not to reference a process
1370
- # number greater than the configured global.nbproc, otherwise
1371
- # some instances might be missing from all processes.
1372
- #
1373
- # This keyword limits binding of certain instances to certain processes. This
1374
- # is useful in order not to have too many processes listening to the same
1375
- # ports. For instance, on a dual-core machine, it might make sense to set
1376
- # 'nbproc 2' in the global section, then distributes the listeners among 'odd'
1377
- # and 'even' instances.
1378
- #
1379
- # At the moment, it is not possible to reference more than 32 processes using
1380
- # this keyword, but this should be more than enough for most setups. Please
1381
- # note that 'all' really means all processes and is not limited to the first
1382
- # 32.
1383
- #
1384
- # If some backends are referenced by frontends bound to other processes, the
1385
- # backend automatically inherits the frontend's processes.
1386
- #
1387
- # Example :
1388
- # listen app_ip1
1389
- # bind 10.0.0.1:80
1390
- # bind-process odd
1391
- #
1392
- # listen app_ip2
1393
- # bind 10.0.0.2:80
1394
- # bind-process even
1395
- #
1396
- # listen management
1397
- # bind 10.0.0.3:80
1398
- # bind-process 1 2 3 4
1399
- #
1400
- # See also : "nbproc" in global section.
1401
- #
1402
- attr_accessor :bind_process
1403
-
1404
- #
1405
- # default_backend <backend>
1406
- # Specify the backend to use when no "use_backend" rule has been matched.
1407
- # May be used in sections : defaults | frontend | listen | backend
1408
- # yes | yes | yes | no
1409
- # Arguments :
1410
- # <backend> is the name of the backend to use.
1411
- #
1412
- # When doing content-switching between frontend and backends using the
1413
- # "use_backend" keyword, it is often useful to indicate which backend will be
1414
- # used when no rule has matched. It generally is the dynamic backend which
1415
- # will catch all undetermined requests.
1416
- #
1417
- # Example :
1418
- #
1419
- # use_backend dynamic if url_dyn
1420
- # use_backend static if url_css url_img extension_img
1421
- # default_backend dynamic
1422
- #
1423
- # See also : "use_backend", "reqsetbe", "reqisetbe"
1424
- #
1425
- attr_accessor :default_backend
1426
-
1427
- #
1428
- # disabled
1429
- # Disable a proxy, frontend or backend.
1430
- # May be used in sections : defaults | frontend | listen | backend
1431
- # yes | yes | yes | yes
1432
- # Arguments : none
1433
- #
1434
- # The "disabled" keyword is used to disable an instance, mainly in order to
1435
- # liberate a listening port or to temporarily disable a service. The instance
1436
- # will still be created and its configuration will be checked, but it will be
1437
- # created in the "stopped" state and will appear as such in the statistics. It
1438
- # will not receive any traffic nor will it send any health-checks or logs. It
1439
- # is possible to disable many instances at once by adding the "disabled"
1440
- # keyword in a "defaults" section.
1441
- #
1442
- # See also : "enabled"
1443
- #
1444
- attr_accessor :disabled
1445
-
1446
- #
1447
- # enabled
1448
- # Enable a proxy, frontend or backend.
1449
- # May be used in sections : defaults | frontend | listen | backend
1450
- # yes | yes | yes | yes
1451
- # Arguments : none
1452
- #
1453
- # The "enabled" keyword is used to explicitly enable an instance, when the
1454
- # defaults has been set to "disabled". This is very rarely used.
1455
- #
1456
- # See also : "disabled"
1457
- #
1458
- attr_accessor :enabled
1459
-
1460
- #
1461
- # errorfile <code> <file>
1462
- # Return a file contents instead of errors generated by HAProxy
1463
- # May be used in sections : defaults | frontend | listen | backend
1464
- # yes | yes | yes | yes
1465
- # Arguments :
1466
- # <code> is the HTTP status code. Currently, HAProxy is capable of
1467
- # generating codes 400, 403, 408, 500, 502, 503, and 504.
1468
- #
1469
- # <file> designates a file containing the full HTTP response. It is
1470
- # recommended to follow the common practice of appending ".http" to
1471
- # the filename so that people do not confuse the response with HTML
1472
- # error pages, and to use absolute paths, since files are read
1473
- # before any chroot is performed.
1474
- #
1475
- # It is important to understand that this keyword is not meant to rewrite
1476
- # errors returned by the server, but errors detected and returned by HAProxy.
1477
- # This is why the list of supported errors is limited to a small set.
1478
- #
1479
- # The files are returned verbatim on the TCP socket. This allows any trick such
1480
- # as redirections to another URL or site, as well as tricks to clean cookies,
1481
- # force enable or disable caching, etc... The package provides default error
1482
- # files returning the same contents as default errors.
1483
- #
1484
- # The files should not exceed the configured buffer size (BUFSIZE), which
1485
- # generally is 8 or 16 kB, otherwise they will be truncated. It is also wise
1486
- # not to put any reference to local contents (eg: images) in order to avoid
1487
- # loops between the client and HAProxy when all servers are down, causing an
1488
- # error to be returned instead of an image. For better HTTP compliance, it is
1489
- # recommended that all header lines end with CR-LF and not LF alone.
1490
- #
1491
- # The files are read at the same time as the configuration and kept in memory.
1492
- # For this reason, the errors continue to be returned even when the process is
1493
- # chrooted, and no file change is considered while the process is running. A
1494
- # simple method for developing those files consists in associating them to the
1495
- # 403 status code and interrogating a blocked URL.
1496
- #
1497
- # See also : "errorloc", "errorloc302", "errorloc303"
1498
- #
1499
- # Example :
1500
- # errorfile 400 /etc/haproxy/errorfiles/400badreq.http
1501
- # errorfile 403 /etc/haproxy/errorfiles/403forbid.http
1502
- # errorfile 503 /etc/haproxy/errorfiles/503sorry.http
1503
- #
1504
- attr_accessor :errorfile
1505
-
1506
- #
1507
- # errorloc <code> <url>
1508
- # Return an HTTP redirection to a URL instead of errors generated by HAProxy
1509
- # May be used in sections : defaults | frontend | listen | backend
1510
- # yes | yes | yes | yes
1511
- # Arguments :
1512
- # <code> is the HTTP status code. Currently, HAProxy is capable of
1513
- # generating codes 400, 403, 408, 500, 502, 503, and 504.
1514
- #
1515
- # <url> it is the exact contents of the "Location" header. It may contain
1516
- # either a relative URI to an error page hosted on the same site,
1517
- # or an absolute URI designating an error page on another site.
1518
- # Special care should be given to relative URIs to avoid redirect
1519
- # loops if the URI itself may generate the same error (eg: 500).
1520
- #
1521
- # It is important to understand that this keyword is not meant to rewrite
1522
- # errors returned by the server, but errors detected and returned by HAProxy.
1523
- # This is why the list of supported errors is limited to a small set.
1524
- #
1525
- # Note that both keyword return the HTTP 302 status code, which tells the
1526
- # client to fetch the designated URL using the same HTTP method. This can be
1527
- # quite problematic in case of non-GET methods such as POST, because the URL
1528
- # sent to the client might not be allowed for something other than GET. To
1529
- # workaround this problem, please use "errorloc303" which send the HTTP 303
1530
- # status code, indicating to the client that the URL must be fetched with a GET
1531
- # request.
1532
- #
1533
- # See also : "errorfile", "errorloc303"
1534
- #
1535
- attr_accessor :errorloc
1536
-
1537
- #
1538
- # errorloc302 <code> <url>
1539
- # Return an HTTP redirection to a URL instead of errors generated by HAProxy
1540
- # May be used in sections : defaults | frontend | listen | backend
1541
- # yes | yes | yes | yes
1542
- # Arguments :
1543
- # <code> is the HTTP status code. Currently, HAProxy is capable of
1544
- # generating codes 400, 403, 408, 500, 502, 503, and 504.
1545
- #
1546
- # <url> it is the exact contents of the "Location" header. It may contain
1547
- # either a relative URI to an error page hosted on the same site,
1548
- # or an absolute URI designating an error page on another site.
1549
- # Special care should be given to relative URIs to avoid redirect
1550
- # loops if the URI itself may generate the same error (eg: 500).
1551
- #
1552
- # It is important to understand that this keyword is not meant to rewrite
1553
- # errors returned by the server, but errors detected and returned by HAProxy.
1554
- # This is why the list of supported errors is limited to a small set.
1555
- #
1556
- # Note that both keyword return the HTTP 302 status code, which tells the
1557
- # client to fetch the designated URL using the same HTTP method. This can be
1558
- # quite problematic in case of non-GET methods such as POST, because the URL
1559
- # sent to the client might not be allowed for something other than GET. To
1560
- # workaround this problem, please use "errorloc303" which send the HTTP 303
1561
- # status code, indicating to the client that the URL must be fetched with a GET
1562
- # request.
1563
- #
1564
- # See also : "errorfile", "errorloc303"
1565
- #
1566
- attr_accessor :errorloc302
1567
-
1568
- #
1569
- # errorloc303 <code> <url>
1570
- # Return an HTTP redirection to a URL instead of errors generated by HAProxy
1571
- # May be used in sections : defaults | frontend | listen | backend
1572
- # yes | yes | yes | yes
1573
- # Arguments :
1574
- # <code> is the HTTP status code. Currently, HAProxy is capable of
1575
- # generating codes 400, 403, 408, 500, 502, 503, and 504.
1576
- #
1577
- # <url> it is the exact contents of the "Location" header. It may contain
1578
- # either a relative URI to an error page hosted on the same site,
1579
- # or an absolute URI designating an error page on another site.
1580
- # Special care should be given to relative URIs to avoid redirect
1581
- # loops if the URI itself may generate the same error (eg: 500).
1582
- #
1583
- # It is important to understand that this keyword is not meant to rewrite
1584
- # errors returned by the server, but errors detected and returned by HAProxy.
1585
- # This is why the list of supported errors is limited to a small set.
1586
- #
1587
- # Note that both keyword return the HTTP 303 status code, which tells the
1588
- # client to fetch the designated URL using the same HTTP GET method. This
1589
- # solves the usual problems associated with "errorloc" and the 302 code. It is
1590
- # possible that some very old browsers designed before HTTP/1.1 do not support
1591
- # it, but no such problem has been reported till now.
1592
- #
1593
- # See also : "errorfile", "errorloc", "errorloc302"
1594
- #
1595
- attr_accessor :errorloc303
1596
-
1597
- #
1598
- # grace <time>
1599
- # Maintain a proxy operational for some time after a soft stop
1600
- # May be used in sections : defaults | frontend | listen | backend
1601
- # yes | yes | yes | yes
1602
- # Arguments :
1603
- # <time> is the time (by default in milliseconds) for which the instance
1604
- # will remain operational with the frontend sockets still listening
1605
- # when a soft-stop is received via the SIGUSR1 signal.
1606
- #
1607
- # This may be used to ensure that the services disappear in a certain order.
1608
- # This was designed so that frontends which are dedicated to monitoring by an
1609
- # external equipment fail immediately while other ones remain up for the time
1610
- # needed by the equipment to detect the failure.
1611
- #
1612
- # Note that currently, there is very little benefit in using this parameter,
1613
- # and it may in fact complicate the soft-reconfiguration process more than
1614
- # simplify it.
1615
- #
1616
- attr_accessor :grace
1617
-
1618
- # log global
1619
- # log <address> <facility> [<level> [<minlevel>]]
1620
- # Enable per-instance logging of events and traffic.
1621
- # May be used in sections : defaults | frontend | listen | backend
1622
- # yes | yes | yes | yes
1623
- # Arguments :
1624
- # global should be used when the instance's logging parameters are the
1625
- # same as the global ones. This is the most common usage. "global"
1626
- # replaces <address>, <facility> and <level> with those of the log
1627
- # entries found in the "global" section. Only one "log global"
1628
- # statement may be used per instance, and this form takes no other
1629
- # parameter.
1630
- #
1631
- # <address> indicates where to send the logs. It takes the same format as
1632
- # for the "global" section's logs, and can be one of :
1633
- #
1634
- # - An IPv4 address optionally followed by a colon (':') and a UDP
1635
- # port. If no port is specified, 514 is used by default (the
1636
- # standard syslog port).
1637
- #
1638
- # - A filesystem path to a UNIX domain socket, keeping in mind
1639
- # considerations for chroot (be sure the path is accessible
1640
- # inside the chroot) and uid/gid (be sure the path is
1641
- # appropriately writeable).
1642
- #
1643
- # <facility> must be one of the 24 standard syslog facilities :
1644
- #
1645
- # kern user mail daemon auth syslog lpr news
1646
- # uucp cron auth2 ftp ntp audit alert cron2
1647
- # local0 local1 local2 local3 local4 local5 local6 local7
1648
- #
1649
- # <level> is optional and can be specified to filter outgoing messages. By
1650
- # default, all messages are sent. If a level is specified, only
1651
- # messages with a severity at least as important as this level
1652
- # will be sent. An optional minimum level can be specified. If it
1653
- # is set, logs emitted with a more severe level than this one will
1654
- # be capped to this level. This is used to avoid sending "emerg"
1655
- # messages on all terminals on some default syslog configurations.
1656
- # Eight levels are known :
1657
- #
1658
- # emerg alert crit err warning notice info debug
1659
- #
1660
- # Note that up to two "log" entries may be specified per instance. However, if
1661
- # "log global" is used and if the "global" section already contains 2 log
1662
- # entries, then additional log entries will be ignored.
1663
- #
1664
- # Also, it is important to keep in mind that it is the frontend which decides
1665
- # what to log from a connection, and that in case of content switching, the log
1666
- # entries from the backend will be ignored. Connections are logged at level
1667
- # "info".
1668
- #
1669
- # However, backend log declaration define how and where servers status changes
1670
- # will be logged. Level "notice" will be used to indicate a server going up,
1671
- # "warning" will be used for termination signals and definitive service
1672
- # termination, and "alert" will be used for when a server goes down.
1673
- #
1674
- # Note : According to RFC3164, messages are truncated to 1024 bytes before
1675
- # being emitted.
1676
- #
1677
- # Example :
1678
- # log global
1679
- # log 127.0.0.1:514 local0 notice # only send important events
1680
- # log 127.0.0.1:514 local0 notice notice # same but limit output level
1681
- #
1682
- attr_accessor :log
1683
-
1684
- #
1685
- # maxconn <conns>
1686
- # Fix the maximum number of concurrent connections on a frontend
1687
- # May be used in sections : defaults | frontend | listen | backend
1688
- # yes | yes | yes | no
1689
- # Arguments :
1690
- # <conns> is the maximum number of concurrent connections the frontend will
1691
- # accept to serve. Excess connections will be queued by the system
1692
- # in the socket's listen queue and will be served once a connection
1693
- # closes.
1694
- #
1695
- # If the system supports it, it can be useful on big sites to raise this limit
1696
- # very high so that haproxy manages connection queues, instead of leaving the
1697
- # clients with unanswered connection attempts. This value should not exceed the
1698
- # global maxconn. Also, keep in mind that a connection contains two buffers
1699
- # of 8kB each, as well as some other data resulting in about 17 kB of RAM being
1700
- # consumed per established connection. That means that a medium system equipped
1701
- # with 1GB of RAM can withstand around 40000-50000 concurrent connections if
1702
- # properly tuned.
1703
- #
1704
- # Also, when <conns> is set to large values, it is possible that the servers
1705
- # are not sized to accept such loads, and for this reason it is generally wise
1706
- # to assign them some reasonable connection limits.
1707
- #
1708
- # See also : "server", global section's "maxconn", "fullconn"
1709
- #
1710
- attr_accessor :maxconn
1711
-
1712
- #
1713
- # mode { tcp|http|health }
1714
- # Set the running mode or protocol of the instance
1715
- # May be used in sections : defaults | frontend | listen | backend
1716
- # yes | yes | yes | yes
1717
- # Arguments :
1718
- # tcp The instance will work in pure TCP mode. A full-duplex connection
1719
- # will be established between clients and servers, and no layer 7
1720
- # examination will be performed. This is the default mode. It
1721
- # should be used for SSL, SSH, SMTP, ...
1722
- #
1723
- # http The instance will work in HTTP mode. The client request will be
1724
- # analyzed in depth before connecting to any server. Any request
1725
- # which is not RFC-compliant will be rejected. Layer 7 filtering,
1726
- # processing and switching will be possible. This is the mode which
1727
- # brings HAProxy most of its value.
1728
- #
1729
- # health The instance will work in "health" mode. It will just reply "OK"
1730
- # to incoming connections and close the connection. Nothing will be
1731
- # logged. This mode is used to reply to external components health
1732
- # checks. This mode is deprecated and should not be used anymore as
1733
- # it is possible to do the same and even better by combining TCP or
1734
- # HTTP modes with the "monitor" keyword.
1735
- #
1736
- # When doing content switching, it is mandatory that the frontend and the
1737
- # backend are in the same mode (generally HTTP), otherwise the configuration
1738
- # will be refused.
1739
- #
1740
- # Example :
1741
- # defaults http_instances
1742
- # mode http
1743
- #
1744
- # See also : "monitor", "monitor-net"
1745
- #
1746
- attr_accessor :mode
1747
-
1748
- #
1749
- # monitor-net <source>
1750
- # Declare a source network which is limited to monitor requests
1751
- # May be used in sections : defaults | frontend | listen | backend
1752
- # yes | yes | yes | no
1753
- # Arguments :
1754
- # <source> is the source IPv4 address or network which will only be able to
1755
- # get monitor responses to any request. It can be either an IPv4
1756
- # address, a host name, or an address followed by a slash ('/')
1757
- # followed by a mask.
1758
- #
1759
- # In TCP mode, any connection coming from a source matching <source> will cause
1760
- # the connection to be immediately closed without any log. This allows another
1761
- # equipment to probe the port and verify that it is still listening, without
1762
- # forwarding the connection to a remote server.
1763
- #
1764
- # In HTTP mode, a connection coming from a source matching <source> will be
1765
- # accepted, the following response will be sent without waiting for a request,
1766
- # then the connection will be closed : "HTTP/1.0 200 OK". This is normally
1767
- # enough for any front-end HTTP probe to detect that the service is UP and
1768
- # running without forwarding the request to a backend server.
1769
- #
1770
- # Monitor requests are processed very early. It is not possible to block nor
1771
- # divert them using ACLs. They cannot be logged either, and it is the intended
1772
- # purpose. They are only used to report HAProxy's health to an upper component,
1773
- # nothing more. Right now, it is not possible to set failure conditions on
1774
- # requests caught by "monitor-net".
1775
- #
1776
- # Last, please note that only one "monitor-net" statement can be specified in
1777
- # a frontend. If more than one is found, only the last one will be considered.
1778
- #
1779
- # Example :
1780
- # # addresses .252 and .253 are just probing us.
1781
- # frontend www
1782
- # monitor-net 192.168.0.252/31
1783
- #
1784
- # See also : "monitor fail", "monitor-uri"
1785
- #
1786
- attr_accessor :monitor_net
1787
-
1788
- #
1789
- # monitor-uri <uri>
1790
- # Intercept a URI used by external components' monitor requests
1791
- # May be used in sections : defaults | frontend | listen | backend
1792
- # yes | yes | yes | no
1793
- # Arguments :
1794
- # <uri> is the exact URI which we want to intercept to return HAProxy's
1795
- # health status instead of forwarding the request.
1796
- #
1797
- # When an HTTP request referencing <uri> will be received on a frontend,
1798
- # HAProxy will not forward it nor log it, but instead will return either
1799
- # "HTTP/1.0 200 OK" or "HTTP/1.0 503 Service unavailable", depending on failure
1800
- # conditions defined with "monitor fail". This is normally enough for any
1801
- # front-end HTTP probe to detect that the service is UP and running without
1802
- # forwarding the request to a backend server. Note that the HTTP method, the
1803
- # version and all headers are ignored, but the request must at least be valid
1804
- # at the HTTP level. This keyword may only be used with an HTTP-mode frontend.
1805
- #
1806
- # Monitor requests are processed very early. It is not possible to block nor
1807
- # divert them using ACLs. They cannot be logged either, and it is the intended
1808
- # purpose. They are only used to report HAProxy's health to an upper component,
1809
- # nothing more. However, it is possible to add any number of conditions using
1810
- # "monitor fail" and ACLs so that the result can be adjusted to whatever check
1811
- # can be imagined (most often the number of available servers in a backend).
1812
- #
1813
- # Example :
1814
- # # Use /haproxy_test to report haproxy's status
1815
- # frontend www
1816
- # mode http
1817
- # monitor-uri /haproxy_test
1818
- #
1819
- # See also : "monitor fail", "monitor-net"
1820
- #
1821
- attr_accessor :monitor_uri
1822
-
1823
- #
1824
- # option accept-invalid-http-request
1825
- # no option accept-invalid-http-request
1826
- # Enable or disable relaxing of HTTP request parsing
1827
- # May be used in sections : defaults | frontend | listen | backend
1828
- # yes | yes | yes | no
1829
- # Arguments : none
1830
- #
1831
- # By default, HAProxy complies with RFC2616 in terms of message parsing. This
1832
- # means that invalid characters in header names are not permitted and cause an
1833
- # error to be returned to the client. This is the desired behaviour as such
1834
- # forbidden characters are essentially used to build attacks exploiting server
1835
- # weaknesses, and bypass security filtering. Sometimes, a buggy browser or
1836
- # server will emit invalid header names for whatever reason (configuration,
1837
- # implementation) and the issue will not be immediately fixed. In such a case,
1838
- # it is possible to relax HAProxy's header name parser to accept any character
1839
- # even if that does not make sense, by specifying this option.
1840
- #
1841
- # This option should never be enabled by default as it hides application bugs
1842
- # and open security breaches. It should only be deployed after a problem has
1843
- # been confirmed.
1844
- #
1845
- # When this option is enabled, erroneous header names will still be accepted in
1846
- # requests, but the complete request will be captured in order to permit later
1847
- # analysis using the "show errors" request on the UNIX stats socket. Doing this
1848
- # also helps confirming that the issue has been solved.
1849
- #
1850
- # If this option has been enabled in a "defaults" section, it can be disabled
1851
- # in a specific instance by prepending the "no" keyword before it.
1852
- #
1853
- # See also : "option accept-invalid-http-response" and "show errors" on the
1854
- # stats socket.
1855
- #
1856
- attr_accessor :option_accept_invalid_http_request
1857
-
1858
- #
1859
- # option clitcpka
1860
- # no option clitcpka
1861
- # Enable or disable the sending of TCP keepalive packets on the client side
1862
- # May be used in sections : defaults | frontend | listen | backend
1863
- # yes | yes | yes | no
1864
- # Arguments : none
1865
- #
1866
- # When there is a firewall or any session-aware component between a client and
1867
- # a server, and when the protocol involves very long sessions with long idle
1868
- # periods (eg: remote desktops), there is a risk that one of the intermediate
1869
- # components decides to expire a session which has remained idle for too long.
1870
- #
1871
- # Enabling socket-level TCP keep-alives makes the system regularly send packets
1872
- # to the other end of the connection, leaving it active. The delay between
1873
- # keep-alive probes is controlled by the system only and depends both on the
1874
- # operating system and its tuning parameters.
1875
- #
1876
- # It is important to understand that keep-alive packets are neither emitted nor
1877
- # received at the application level. It is only the network stacks which sees
1878
- # them. For this reason, even if one side of the proxy already uses keep-alives
1879
- # to maintain its connection alive, those keep-alive packets will not be
1880
- # forwarded to the other side of the proxy.
1881
- #
1882
- # Please note that this has nothing to do with HTTP keep-alive.
1883
- #
1884
- # Using option "clitcpka" enables the emission of TCP keep-alive probes on the
1885
- # client side of a connection, which should help when session expirations are
1886
- # noticed between HAProxy and a client.
1887
- #
1888
- # If this option has been enabled in a "defaults" section, it can be disabled
1889
- # in a specific instance by prepending the "no" keyword before it.
1890
- #
1891
- # See also : "option srvtcpka", "option tcpka"
1892
- #
1893
- attr_accessor :option_clitcpka
1894
-
1895
- #
1896
- # option contstats
1897
- # Enable continuous traffic statistics updates
1898
- # May be used in sections : defaults | frontend | listen | backend
1899
- # yes | yes | yes | no
1900
- # Arguments : none
1901
- #
1902
- # By default, counters used for statistics calculation are incremented
1903
- # only when a session finishes. It works quite well when serving small
1904
- # objects, but with big ones (for example large images or archives) or
1905
- # with A/V streaming, a graph generated from haproxy counters looks like
1906
- # a hedgehog. With this option enabled counters get incremented continuously,
1907
- # during a whole session. Recounting touches a hotpath directly so
1908
- # it is not enabled by default, as it has small performance impact (~0.5%).
1909
- #
1910
- attr_accessor :option_contstats
1911
-
1912
- #
1913
- # option dontlog-normal
1914
- # no option dontlog-normal
1915
- # Enable or disable logging of normal, successful connections
1916
- # May be used in sections : defaults | frontend | listen | backend
1917
- # yes | yes | yes | no
1918
- # Arguments : none
1919
- #
1920
- # There are large sites dealing with several thousand connections per second
1921
- # and for which logging is a major pain. Some of them are even forced to turn
1922
- # logs off and cannot debug production issues. Setting this option ensures that
1923
- # normal connections, those which experience no error, no timeout, no retry nor
1924
- # redispatch, will not be logged. This leaves disk space for anomalies. In HTTP
1925
- # mode, the response status code is checked and return codes 5xx will still be
1926
- # logged.
1927
- #
1928
- # It is strongly discouraged to use this option as most of the time, the key to
1929
- # complex issues is in the normal logs which will not be logged here. If you
1930
- # need to separate logs, see the "log-separate-errors" option instead.
1931
- #
1932
- # See also : "log", "dontlognull", "log-separate-errors" and section 8 about
1933
- # logging.
1934
- #
1935
- attr_accessor :option_dontlog_normal
1936
-
1937
- #
1938
- # option dontlognull
1939
- # no option dontlognull
1940
- # Enable or disable logging of null connections
1941
- # May be used in sections : defaults | frontend | listen | backend
1942
- # yes | yes | yes | no
1943
- # Arguments : none
1944
- #
1945
- # In certain environments, there are components which will regularly connect to
1946
- # various systems to ensure that they are still alive. It can be the case from
1947
- # another load balancer as well as from monitoring systems. By default, even a
1948
- # simple port probe or scan will produce a log. If those connections pollute
1949
- # the logs too much, it is possible to enable option "dontlognull" to indicate
1950
- # that a connection on which no data has been transferred will not be logged,
1951
- # which typically corresponds to those probes.
1952
- #
1953
- # It is generally recommended not to use this option in uncontrolled
1954
- # environments (eg: internet), otherwise scans and other malicious activities
1955
- # would not be logged.
1956
- #
1957
- # If this option has been enabled in a "defaults" section, it can be disabled
1958
- # in a specific instance by prepending the "no" keyword before it.
1959
- #
1960
- # See also : "log", "monitor-net", "monitor-uri" and section 8 about logging.
1961
- #
1962
- attr_accessor :option_dontlognull
1963
-
1964
- #
1965
- # option forceclose
1966
- # no option forceclose
1967
- # Enable or disable active connection closing after response is transferred.
1968
- # May be used in sections : defaults | frontend | listen | backend
1969
- # yes | yes | yes | yes
1970
- # Arguments : none
1971
- #
1972
- # Some HTTP servers do not necessarily close the connections when they receive
1973
- # the "Connection: close" set by "option httpclose", and if the client does not
1974
- # close either, then the connection remains open till the timeout expires. This
1975
- # causes high number of simultaneous connections on the servers and shows high
1976
- # global session times in the logs.
1977
- #
1978
- # When this happens, it is possible to use "option forceclose". It will
1979
- # actively close the outgoing server channel as soon as the server has finished
1980
- # to respond. This option implicitly enables the "httpclose" option. Note that
1981
- # this option also enables the parsing of the full request and response, which
1982
- # means we can close the connection to the server very quickly, releasing some
1983
- # resources earlier than with httpclose.
1984
- #
1985
- # This option may also be combined with "option http-pretend-keepalive", which
1986
- # will disable sending of the "Connection: close" header, but will still cause
1987
- # the connection to be closed once the whole response is received.
1988
- #
1989
- # If this option has been enabled in a "defaults" section, it can be disabled
1990
- # in a specific instance by prepending the "no" keyword before it.
1991
- #
1992
- # See also : "option httpclose" and "option http-pretend-keepalive"
1993
- #
1994
- attr_accessor :option_forceclose
1995
-
1996
- #
1997
- # option forwardfor [ except <network> ] [ header <name> ]
1998
- # Enable insertion of the X-Forwarded-For header to requests sent to servers
1999
- # May be used in sections : defaults | frontend | listen | backend
2000
- # yes | yes | yes | yes
2001
- # Arguments :
2002
- # <network> is an optional argument used to disable this option for sources
2003
- # matching <network>
2004
- # <name> an optional argument to specify a different "X-Forwarded-For"
2005
- # header name.
2006
- #
2007
- # Since HAProxy works in reverse-proxy mode, the servers see its IP address as
2008
- # their client address. This is sometimes annoying when the client's IP address
2009
- # is expected in server logs. To solve this problem, the well-known HTTP header
2010
- # "X-Forwarded-For" may be added by HAProxy to all requests sent to the server.
2011
- # This header contains a value representing the client's IP address. Since this
2012
- # header is always appended at the end of the existing header list, the server
2013
- # must be configured to always use the last occurrence of this header only. See
2014
- # the server's manual to find how to enable use of this standard header. Note
2015
- # that only the last occurrence of the header must be used, since it is really
2016
- # possible that the client has already brought one.
2017
- #
2018
- # The keyword "header" may be used to supply a different header name to replace
2019
- # the default "X-Forwarded-For". This can be useful where you might already
2020
- # have a "X-Forwarded-For" header from a different application (eg: stunnel),
2021
- # and you need preserve it. Also if your backend server doesn't use the
2022
- # "X-Forwarded-For" header and requires different one (eg: Zeus Web Servers
2023
- # require "X-Cluster-Client-IP").
2024
- #
2025
- # Sometimes, a same HAProxy instance may be shared between a direct client
2026
- # access and a reverse-proxy access (for instance when an SSL reverse-proxy is
2027
- # used to decrypt HTTPS traffic). It is possible to disable the addition of the
2028
- # header for a known source address or network by adding the "except" keyword
2029
- # followed by the network address. In this case, any source IP matching the
2030
- # network will not cause an addition of this header. Most common uses are with
2031
- # private networks or 127.0.0.1.
2032
- #
2033
- # This option may be specified either in the frontend or in the backend. If at
2034
- # least one of them uses it, the header will be added. Note that the backend's
2035
- # setting of the header subargument takes precedence over the frontend's if
2036
- # both are defined.
2037
- #
2038
- # It is important to note that as long as HAProxy does not support keep-alive
2039
- # connections, only the first request of a connection will receive the header.
2040
- # For this reason, it is important to ensure that "option httpclose" is set
2041
- # when using this option.
2042
- #
2043
- # Examples :
2044
- # # Public HTTP address also used by stunnel on the same machine
2045
- # frontend www
2046
- # mode http
2047
- # option forwardfor except 127.0.0.1 # stunnel already adds the header
2048
- #
2049
- # # Those servers want the IP Address in X-Client
2050
- # backend www
2051
- # mode http
2052
- # option forwardfor header X-Client
2053
- #
2054
- # See also : "option httpclose"
2055
- #
2056
- attr_accessor :option_forwardfor
2057
-
2058
- #
2059
- # option http-pretend-keepalive
2060
- # no option http-pretend-keepalive
2061
- # Define whether haproxy will announce keepalive to the server or not
2062
- # May be used in sections : defaults | frontend | listen | backend
2063
- # yes | yes | yes | yes
2064
- # Arguments : none
2065
- #
2066
- # When running with "option http-server-close" or "option forceclose", haproxy
2067
- # adds a "Connection: close" header to the request forwarded to the server.
2068
- # Unfortunately, when some servers see this header, they automatically refrain
2069
- # from using the chunked encoding for responses of unknown length, while this
2070
- # is totally unrelated. The immediate effect is that this prevents haproxy from
2071
- # maintaining the client connection alive. A second effect is that a client or
2072
- # a cache could receive an incomplete response without being aware of it, and
2073
- # consider the response complete.
2074
- #
2075
- # By setting "option http-pretend-keepalive", haproxy will make the server
2076
- # believe it will keep the connection alive. The server will then not fall back
2077
- # to the abnormal undesired above. When haproxy gets the whole response, it
2078
- # will close the connection with the server just as it would do with the
2079
- # "forceclose" option. That way the client gets a normal response and the
2080
- # connection is correctly closed on the server side.
2081
- #
2082
- # It is recommended not to enable this option by default, because most servers
2083
- # will more efficiently close the connection themselves after the last packet,
2084
- # and release its buffers slightly earlier. Also, the added packet on the
2085
- # network could slightly reduce the overall peak performance. However it is
2086
- # worth noting that when this option is enabled, haproxy will have slightly
2087
- # less work to do. So if haproxy is the bottleneck on the whole architecture,
2088
- # enabling this option might save a few CPU cycles.
2089
- #
2090
- # This option may be set both in a frontend and in a backend. It is enabled if
2091
- # at least one of the frontend or backend holding a connection has it enabled.
2092
- # This option may be compbined with "option httpclose", which will cause
2093
- # keepalive to be announced to the server and close to be announced to the
2094
- # client. This practice is discouraged though.
2095
- #
2096
- # If this option has been enabled in a "defaults" section, it can be disabled
2097
- # in a specific instance by prepending the "no" keyword before it.
2098
- #
2099
- # See also : "option forceclose" and "option http-server-close"
2100
- #
2101
- attr_accessor :option_http_pretend_keepalive
2102
-
2103
- #
2104
- # option http-server-close
2105
- # no option http-server-close
2106
- # Enable or disable HTTP connection closing on the server side
2107
- # May be used in sections : defaults | frontend | listen | backend
2108
- # yes | yes | yes | yes
2109
- # Arguments : none
2110
- #
2111
- # By default, when a client communicates with a server, HAProxy will only
2112
- # analyze, log, and process the first request of each connection. Setting
2113
- # "option http-server-close" enables HTTP connection-close mode on the server
2114
- # side while keeping the ability to support HTTP keep-alive and pipelining on
2115
- # the client side. This provides the lowest latency on the client side (slow
2116
- # network) and the fastest session reuse on the server side to save server
2117
- # resources, similarly to "option forceclose". It also permits non-keepalive
2118
- # capable servers to be served in keep-alive mode to the clients if they
2119
- # conform to the requirements of RFC2616. Please note that some servers do not
2120
- # always conform to those requirements when they see "Connection: close" in the
2121
- # request. The effect will be that keep-alive will never be used. A workaround
2122
- # consists in enabling "option http-pretend-keepalive".
2123
- #
2124
- # At the moment, logs will not indicate whether requests came from the same
2125
- # session or not. The accept date reported in the logs corresponds to the end
2126
- # of the previous request, and the request time corresponds to the time spent
2127
- # waiting for a new request. The keep-alive request time is still bound to the
2128
- # timeout defined by "timeout http-keep-alive" or "timeout http-request" if
2129
- # not set.
2130
- #
2131
- # This option may be set both in a frontend and in a backend. It is enabled if
2132
- # at least one of the frontend or backend holding a connection has it enabled.
2133
- # It is worth noting that "option forceclose" has precedence over "option
2134
- # http-server-close" and that combining "http-server-close" with "httpclose"
2135
- # basically achieve the same result as "forceclose".
2136
- #
2137
- # If this option has been enabled in a "defaults" section, it can be disabled
2138
- # in a specific instance by prepending the "no" keyword before it.
2139
- #
2140
- # See also : "option forceclose", "option http-pretend-keepalive",
2141
- # "option httpclose" and "1.1. The HTTP transaction model".
2142
- #
2143
- attr_accessor :option_http_server_close
2144
-
2145
- #
2146
- # option http-use-proxy-header
2147
- # no option http-use-proxy-header
2148
- # Make use of non-standard Proxy-Connection header instead of Connection
2149
- # May be used in sections : defaults | frontend | listen | backend
2150
- # yes | yes | yes | no
2151
- # Arguments : none
2152
- #
2153
- # While RFC2616 explicitly states that HTTP/1.1 agents must use the
2154
- # Connection header to indicate their wish of persistent or non-persistent
2155
- # connections, both browsers and proxies ignore this header for proxied
2156
- # connections and make use of the undocumented, non-standard Proxy-Connection
2157
- # header instead. The issue begins when trying to put a load balancer between
2158
- # browsers and such proxies, because there will be a difference between what
2159
- # haproxy understands and what the client and the proxy agree on.
2160
- #
2161
- # By setting this option in a frontend, haproxy can automatically switch to use
2162
- # that non-standard header if it sees proxied requests. A proxied request is
2163
- # defined here as one where the URI begins with neither a '/' nor a '*'. The
2164
- # choice of header only affects requests passing through proxies making use of
2165
- # one of the "httpclose", "forceclose" and "http-server-close" options. Note
2166
- # that this option can only be specified in a frontend and will affect the
2167
- # request along its whole life.
2168
- #
2169
- # Also, when this option is set, a request which requires authentication will
2170
- # automatically switch to use proxy authentication headers if it is itself a
2171
- # proxied request. That makes it possible to check or enforce authentication in
2172
- # front of an existing proxy.
2173
- #
2174
- # This option should normally never be used, except in front of a proxy.
2175
- #
2176
- # See also : "option httpclose", "option forceclose" and "option
2177
- # http-server-close".
2178
- #
2179
- attr_accessor :option_http_use_proxy_header
2180
-
2181
- #
2182
- # option httpclose
2183
- # no option httpclose
2184
- # Enable or disable passive HTTP connection closing
2185
- # May be used in sections : defaults | frontend | listen | backend
2186
- # yes | yes | yes | yes
2187
- # Arguments : none
2188
- #
2189
- # By default, when a client communicates with a server, HAProxy will only
2190
- # analyze, log, and process the first request of each connection. If "option
2191
- # httpclose" is set, it will check if a "Connection: close" header is already
2192
- # set in each direction, and will add one if missing. Each end should react to
2193
- # this by actively closing the TCP connection after each transfer, thus
2194
- # resulting in a switch to the HTTP close mode. Any "Connection" header
2195
- # different from "close" will also be removed.
2196
- #
2197
- # It seldom happens that some servers incorrectly ignore this header and do not
2198
- # close the connection eventhough they reply "Connection: close". For this
2199
- # reason, they are not compatible with older HTTP 1.0 browsers. If this happens
2200
- # it is possible to use the "option forceclose" which actively closes the
2201
- # request connection once the server responds. Option "forceclose" also
2202
- # releases the server connection earlier because it does not have to wait for
2203
- # the client to acknowledge it.
2204
- #
2205
- # This option may be set both in a frontend and in a backend. It is enabled if
2206
- # at least one of the frontend or backend holding a connection has it enabled.
2207
- # If "option forceclose" is specified too, it has precedence over "httpclose".
2208
- # If "option http-server-close" is enabled at the same time as "httpclose", it
2209
- # basically achieves the same result as "option forceclose".
2210
- #
2211
- # If this option has been enabled in a "defaults" section, it can be disabled
2212
- # in a specific instance by prepending the "no" keyword before it.
2213
- #
2214
- # See also : "option forceclose", "option http-server-close" and
2215
- # "1.1. The HTTP transaction model".
2216
- #
2217
- attr_accessor :option_httpclose
2218
-
2219
- #
2220
- # option httplog [ clf ]
2221
- # Enable logging of HTTP request, session state and timers
2222
- # May be used in sections : defaults | frontend | listen | backend
2223
- # yes | yes | yes | yes
2224
- # Arguments :
2225
- # clf if the "clf" argument is added, then the output format will be
2226
- # the CLF format instead of HAProxy's default HTTP format. You can
2227
- # use this when you need to feed HAProxy's logs through a specific
2228
- # log analyser which only support the CLF format and which is not
2229
- # extensible.
2230
- #
2231
- # By default, the log output format is very poor, as it only contains the
2232
- # source and destination addresses, and the instance name. By specifying
2233
- # "option httplog", each log line turns into a much richer format including,
2234
- # but not limited to, the HTTP request, the connection timers, the session
2235
- # status, the connections numbers, the captured headers and cookies, the
2236
- # frontend, backend and server name, and of course the source address and
2237
- # ports.
2238
- #
2239
- # This option may be set either in the frontend or the backend.
2240
- #
2241
- # If this option has been enabled in a "defaults" section, it can be disabled
2242
- # in a specific instance by prepending the "no" keyword before it. Specifying
2243
- # only "option httplog" will automatically clear the 'clf' mode if it was set
2244
- # by default.
2245
- #
2246
- # See also : section 8 about logging.
2247
- #
2248
- attr_accessor :option_httplog
2249
-
2250
- #
2251
- # option http_proxy
2252
- # no option http_proxy
2253
- # Enable or disable plain HTTP proxy mode
2254
- # May be used in sections : defaults | frontend | listen | backend
2255
- # yes | yes | yes | yes
2256
- # Arguments : none
2257
- #
2258
- # It sometimes happens that people need a pure HTTP proxy which understands
2259
- # basic proxy requests without caching nor any fancy feature. In this case,
2260
- # it may be worth setting up an HAProxy instance with the "option http_proxy"
2261
- # set. In this mode, no server is declared, and the connection is forwarded to
2262
- # the IP address and port found in the URL after the "http://" scheme.
2263
- #
2264
- # No host address resolution is performed, so this only works when pure IP
2265
- # addresses are passed. Since this option's usage perimeter is rather limited,
2266
- # it will probably be used only by experts who know they need exactly it. Last,
2267
- # if the clients are susceptible of sending keep-alive requests, it will be
2268
- # needed to add "option http_close" to ensure that all requests will correctly
2269
- # be analyzed.
2270
- #
2271
- # If this option has been enabled in a "defaults" section, it can be disabled
2272
- # in a specific instance by prepending the "no" keyword before it.
2273
- #
2274
- # Example :
2275
- # # this backend understands HTTP proxy requests and forwards them directly.
2276
- # backend direct_forward
2277
- # option httpclose
2278
- # option http_proxy
2279
- #
2280
- # See also : "option httpclose"
2281
- #
2282
- attr_accessor :option_http_proxy
2283
-
2284
- #
2285
- # option independant-streams
2286
- # no option independant-streams
2287
- # Enable or disable independant timeout processing for both directions
2288
- # May be used in sections : defaults | frontend | listen | backend
2289
- # yes | yes | yes | yes
2290
- # Arguments : none
2291
- #
2292
- # By default, when data is sent over a socket, both the write timeout and the
2293
- # read timeout for that socket are refreshed, because we consider that there is
2294
- # activity on that socket, and we have no other means of guessing if we should
2295
- # receive data or not.
2296
- #
2297
- # While this default behaviour is desirable for almost all applications, there
2298
- # exists a situation where it is desirable to disable it, and only refresh the
2299
- # read timeout if there are incoming data. This happens on sessions with large
2300
- # timeouts and low amounts of exchanged data such as telnet session. If the
2301
- # server suddenly disappears, the output data accumulates in the system's
2302
- # socket buffers, both timeouts are correctly refreshed, and there is no way
2303
- # to know the server does not receive them, so we don't timeout. However, when
2304
- # the underlying protocol always echoes sent data, it would be enough by itself
2305
- # to detect the issue using the read timeout. Note that this problem does not
2306
- # happen with more verbose protocols because data won't accumulate long in the
2307
- # socket buffers.
2308
- #
2309
- # When this option is set on the frontend, it will disable read timeout updates
2310
- # on data sent to the client. There probably is little use of this case. When
2311
- # the option is set on the backend, it will disable read timeout updates on
2312
- # data sent to the server. Doing so will typically break large HTTP posts from
2313
- # slow lines, so use it with caution.
2314
- #
2315
- # See also : "timeout client" and "timeout server"
2316
- #
2317
- attr_accessor :option_independant_streams
2318
-
2319
- #
2320
- # option log-separate-errors
2321
- # no option log-separate-errors
2322
- # Change log level for non-completely successful connections
2323
- # May be used in sections : defaults | frontend | listen | backend
2324
- # yes | yes | yes | no
2325
- # Arguments : none
2326
- #
2327
- # Sometimes looking for errors in logs is not easy. This option makes haproxy
2328
- # raise the level of logs containing potentially interesting information such
2329
- # as errors, timeouts, retries, redispatches, or HTTP status codes 5xx. The
2330
- # level changes from "info" to "err". This makes it possible to log them
2331
- # separately to a different file with most syslog daemons. Be careful not to
2332
- # remove them from the original file, otherwise you would lose ordering which
2333
- # provides very important information.
2334
- #
2335
- # Using this option, large sites dealing with several thousand connections per
2336
- # second may log normal traffic to a rotating buffer and only archive smaller
2337
- # error logs.
2338
- #
2339
- # See also : "log", "dontlognull", "dontlog-normal" and section 8 about
2340
- # logging.
2341
- #
2342
- attr_accessor :option_log_separate_errors
2343
-
2344
- #
2345
- # option logasap
2346
- # no option logasap
2347
- # Enable or disable early logging of HTTP requests
2348
- # May be used in sections : defaults | frontend | listen | backend
2349
- # yes | yes | yes | no
2350
- # Arguments : none
2351
- #
2352
- # By default, HTTP requests are logged upon termination so that the total
2353
- # transfer time and the number of bytes appear in the logs. When large objects
2354
- # are being transferred, it may take a while before the request appears in the
2355
- # logs. Using "option logasap", the request gets logged as soon as the server
2356
- # sends the complete headers. The only missing information in the logs will be
2357
- # the total number of bytes which will indicate everything except the amount
2358
- # of data transferred, and the total time which will not take the transfer
2359
- # time into account. In such a situation, it's a good practice to capture the
2360
- # "Content-Length" response header so that the logs at least indicate how many
2361
- # bytes are expected to be transferred.
2362
- #
2363
- # Examples :
2364
- # listen http_proxy 0.0.0.0:80
2365
- # mode http
2366
- # option httplog
2367
- # option logasap
2368
- # log 192.168.2.200 local3
2369
- #
2370
- # >>> Feb 6 12:14:14 localhost \
2371
- # haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in \
2372
- # static/srv1 9/10/7/14/+30 200 +243 - - ---- 3/1/1/1/0 1/0 \
2373
- # "GET /image.iso HTTP/1.0"
2374
- #
2375
- # See also : "option httplog", "capture response header", and section 8 about
2376
- # logging.
2377
- #
2378
- attr_accessor :option_logasap
2379
-
2380
- #
2381
- # option nolinger
2382
- # no option nolinger
2383
- # Enable or disable immediate session resource cleaning after close
2384
- # May be used in sections: defaults | frontend | listen | backend
2385
- # yes | yes | yes | yes
2386
- # Arguments : none
2387
- #
2388
- # When clients or servers abort connections in a dirty way (eg: they are
2389
- # physically disconnected), the session timeouts triggers and the session is
2390
- # closed. But it will remain in FIN_WAIT1 state for some time in the system,
2391
- # using some resources and possibly limiting the ability to establish newer
2392
- # connections.
2393
- #
2394
- # When this happens, it is possible to activate "option nolinger" which forces
2395
- # the system to immediately remove any socket's pending data on close. Thus,
2396
- # the session is instantly purged from the system's tables. This usually has
2397
- # side effects such as increased number of TCP resets due to old retransmits
2398
- # getting immediately rejected. Some firewalls may sometimes complain about
2399
- # this too.
2400
- #
2401
- # For this reason, it is not recommended to use this option when not absolutely
2402
- # needed. You know that you need it when you have thousands of FIN_WAIT1
2403
- # sessions on your system (TIME_WAIT ones do not count).
2404
- #
2405
- # This option may be used both on frontends and backends, depending on the side
2406
- # where it is required. Use it on the frontend for clients, and on the backend
2407
- # for servers.
2408
- #
2409
- # If this option has been enabled in a "defaults" section, it can be disabled
2410
- # in a specific instance by prepending the "no" keyword before it.
2411
- #
2412
- attr_accessor :option_nolinger
2413
-
2414
- #
2415
- # option originalto [ except <network> ] [ header <name> ]
2416
- # Enable insertion of the X-Original-To header to requests sent to servers
2417
- # May be used in sections : defaults | frontend | listen | backend
2418
- # yes | yes | yes | yes
2419
- # Arguments :
2420
- # <network> is an optional argument used to disable this option for sources
2421
- # matching <network>
2422
- # <name> an optional argument to specify a different "X-Original-To"
2423
- # header name.
2424
- #
2425
- # Since HAProxy can work in transparent mode, every request from a client can
2426
- # be redirected to the proxy and HAProxy itself can proxy every request to a
2427
- # complex SQUID environment and the destination host from SO_ORIGINAL_DST will
2428
- # be lost. This is annoying when you want access rules based on destination ip
2429
- # addresses. To solve this problem, a new HTTP header "X-Original-To" may be
2430
- # added by HAProxy to all requests sent to the server. This header contains a
2431
- # value representing the original destination IP address. Since this must be
2432
- # configured to always use the last occurrence of this header only. Note that
2433
- # only the last occurrence of the header must be used, since it is really
2434
- # possible that the client has already brought one.
2435
- #
2436
- # The keyword "header" may be used to supply a different header name to replace
2437
- # the default "X-Original-To". This can be useful where you might already
2438
- # have a "X-Original-To" header from a different application, and you need
2439
- # preserve it. Also if your backend server doesn't use the "X-Original-To"
2440
- # header and requires different one.
2441
- #
2442
- # Sometimes, a same HAProxy instance may be shared between a direct client
2443
- # access and a reverse-proxy access (for instance when an SSL reverse-proxy is
2444
- # used to decrypt HTTPS traffic). It is possible to disable the addition of the
2445
- # header for a known source address or network by adding the "except" keyword
2446
- # followed by the network address. In this case, any source IP matching the
2447
- # network will not cause an addition of this header. Most common uses are with
2448
- # private networks or 127.0.0.1.
2449
- #
2450
- # This option may be specified either in the frontend or in the backend. If at
2451
- # least one of them uses it, the header will be added. Note that the backend's
2452
- # setting of the header subargument takes precedence over the frontend's if
2453
- # both are defined.
2454
- #
2455
- # It is important to note that as long as HAProxy does not support keep-alive
2456
- # connections, only the first request of a connection will receive the header.
2457
- # For this reason, it is important to ensure that "option httpclose" is set
2458
- # when using this option.
2459
- #
2460
- # Examples :
2461
- # # Original Destination address
2462
- # frontend www
2463
- # mode http
2464
- # option originalto except 127.0.0.1
2465
- #
2466
- # # Those servers want the IP Address in X-Client-Dst
2467
- # backend www
2468
- # mode http
2469
- # option originalto header X-Client-Dst
2470
- #
2471
- # See also : "option httpclose"
2472
- #
2473
- attr_accessor :option_originalto
2474
-
2475
- #
2476
- # option socket-stats
2477
- # no option socket-stats
2478
- #
2479
- # Enable or disable collecting & providing separate statistics for each socket.
2480
- # May be used in sections : defaults | frontend | listen | backend
2481
- # yes | yes | yes | no
2482
- #
2483
- # Arguments : none
2484
- #
2485
- attr_accessor :option_socket_stats
2486
-
2487
- #
2488
- # option splice-auto
2489
- # no option splice-auto
2490
- # Enable or disable automatic kernel acceleration on sockets in both directions
2491
- # May be used in sections : defaults | frontend | listen | backend
2492
- # yes | yes | yes | yes
2493
- # Arguments : none
2494
- #
2495
- # When this option is enabled either on a frontend or on a backend, haproxy
2496
- # will automatically evaluate the opportunity to use kernel tcp splicing to
2497
- # forward data between the client and the server, in either direction. Haproxy
2498
- # uses heuristics to estimate if kernel splicing might improve performance or
2499
- # not. Both directions are handled independently. Note that the heuristics used
2500
- # are not much aggressive in order to limit excessive use of splicing. This
2501
- # option requires splicing to be enabled at compile time, and may be globally
2502
- # disabled with the global option "nosplice". Since splice uses pipes, using it
2503
- # requires that there are enough spare pipes.
2504
- #
2505
- # Important note: kernel-based TCP splicing is a Linux-specific feature which
2506
- # first appeared in kernel 2.6.25. It offers kernel-based acceleration to
2507
- # transfer data between sockets without copying these data to user-space, thus
2508
- # providing noticeable performance gains and CPU cycles savings. Since many
2509
- # early implementations are buggy, corrupt data and/or are inefficient, this
2510
- # feature is not enabled by default, and it should be used with extreme care.
2511
- # While it is not possible to detect the correctness of an implementation,
2512
- # 2.6.29 is the first version offering a properly working implementation. In
2513
- # case of doubt, splicing may be globally disabled using the global "nosplice"
2514
- # keyword.
2515
- #
2516
- # Example :
2517
- # option splice-auto
2518
- #
2519
- # If this option has been enabled in a "defaults" section, it can be disabled
2520
- # in a specific instance by prepending the "no" keyword before it.
2521
- #
2522
- # See also : "option splice-request", "option splice-response", and global
2523
- # options "nosplice" and "maxpipes"
2524
- #
2525
- attr_accessor :option_splice_auto
2526
-
2527
- #
2528
- # option splice-request
2529
- # no option splice-request
2530
- # Enable or disable automatic kernel acceleration on sockets for requests
2531
- # May be used in sections : defaults | frontend | listen | backend
2532
- # yes | yes | yes | yes
2533
- # Arguments : none
2534
- #
2535
- # When this option is enabled either on a frontend or on a backend, haproxy
2536
- # will user kernel tcp splicing whenever possible to forward data going from
2537
- # the client to the server. It might still use the recv/send scheme if there
2538
- # are no spare pipes left. This option requires splicing to be enabled at
2539
- # compile time, and may be globally disabled with the global option "nosplice".
2540
- # Since splice uses pipes, using it requires that there are enough spare pipes.
2541
- #
2542
- # Important note: see "option splice-auto" for usage limitations.
2543
- #
2544
- # Example :
2545
- # option splice-request
2546
- #
2547
- # If this option has been enabled in a "defaults" section, it can be disabled
2548
- # in a specific instance by prepending the "no" keyword before it.
2549
- #
2550
- # See also : "option splice-auto", "option splice-response", and global options
2551
- # "nosplice" and "maxpipes"
2552
- #
2553
- attr_accessor :option_splice_request
2554
-
2555
- #
2556
- # option splice-response
2557
- # no option splice-response
2558
- # Enable or disable automatic kernel acceleration on sockets for responses
2559
- # May be used in sections : defaults | frontend | listen | backend
2560
- # yes | yes | yes | yes
2561
- # Arguments : none
2562
- #
2563
- # When this option is enabled either on a frontend or on a backend, haproxy
2564
- # will user kernel tcp splicing whenever possible to forward data going from
2565
- # the server to the client. It might still use the recv/send scheme if there
2566
- # are no spare pipes left. This option requires splicing to be enabled at
2567
- # compile time, and may be globally disabled with the global option "nosplice".
2568
- # Since splice uses pipes, using it requires that there are enough spare pipes.
2569
- #
2570
- # Important note: see "option splice-auto" for usage limitations.
2571
- #
2572
- # Example :
2573
- # option splice-response
2574
- #
2575
- # If this option has been enabled in a "defaults" section, it can be disabled
2576
- # in a specific instance by prepending the "no" keyword before it.
2577
- #
2578
- # See also : "option splice-auto", "option splice-request", and global options
2579
- # "nosplice" and "maxpipes"
2580
- #
2581
- attr_accessor :option_splice_response
2582
-
2583
- #
2584
- # option tcp-smart-accept
2585
- # no option tcp-smart-accept
2586
- # Enable or disable the saving of one ACK packet during the accept sequence
2587
- # May be used in sections : defaults | frontend | listen | backend
2588
- # yes | yes | yes | no
2589
- # Arguments : none
2590
- #
2591
- # When an HTTP connection request comes in, the system acknowledges it on
2592
- # behalf of HAProxy, then the client immediately sends its request, and the
2593
- # system acknowledges it too while it is notifying HAProxy about the new
2594
- # connection. HAProxy then reads the request and responds. This means that we
2595
- # have one TCP ACK sent by the system for nothing, because the request could
2596
- # very well be acknowledged by HAProxy when it sends its response.
2597
- #
2598
- # For this reason, in HTTP mode, HAProxy automatically asks the system to avoid
2599
- # sending this useless ACK on platforms which support it (currently at least
2600
- # Linux). It must not cause any problem, because the system will send it anyway
2601
- # after 40 ms if the response takes more time than expected to come.
2602
- #
2603
- # During complex network debugging sessions, it may be desirable to disable
2604
- # this optimization because delayed ACKs can make troubleshooting more complex
2605
- # when trying to identify where packets are delayed. It is then possible to
2606
- # fall back to normal behaviour by specifying "no option tcp-smart-accept".
2607
- #
2608
- # It is also possible to force it for non-HTTP proxies by simply specifying
2609
- # "option tcp-smart-accept". For instance, it can make sense with some services
2610
- # such as SMTP where the server speaks first.
2611
- #
2612
- # It is recommended to avoid forcing this option in a defaults section. In case
2613
- # of doubt, consider setting it back to automatic values by prepending the
2614
- # "default" keyword before it, or disabling it using the "no" keyword.
2615
- #
2616
- # See also : "option tcp-smart-connect"
2617
- #
2618
- attr_accessor :option_tcp_smart_accept
2619
-
2620
- #
2621
- # option tcpka
2622
- # Enable or disable the sending of TCP keepalive packets on both sides
2623
- # May be used in sections : defaults | frontend | listen | backend
2624
- # yes | yes | yes | yes
2625
- # Arguments : none
2626
- #
2627
- # When there is a firewall or any session-aware component between a client and
2628
- # a server, and when the protocol involves very long sessions with long idle
2629
- # periods (eg: remote desktops), there is a risk that one of the intermediate
2630
- # components decides to expire a session which has remained idle for too long.
2631
- #
2632
- # Enabling socket-level TCP keep-alives makes the system regularly send packets
2633
- # to the other end of the connection, leaving it active. The delay between
2634
- # keep-alive probes is controlled by the system only and depends both on the
2635
- # operating system and its tuning parameters.
2636
- #
2637
- # It is important to understand that keep-alive packets are neither emitted nor
2638
- # received at the application level. It is only the network stacks which sees
2639
- # them. For this reason, even if one side of the proxy already uses keep-alives
2640
- # to maintain its connection alive, those keep-alive packets will not be
2641
- # forwarded to the other side of the proxy.
2642
- #
2643
- # Please note that this has nothing to do with HTTP keep-alive.
2644
- #
2645
- # Using option "tcpka" enables the emission of TCP keep-alive probes on both
2646
- # the client and server sides of a connection. Note that this is meaningful
2647
- # only in "defaults" or "listen" sections. If this option is used in a
2648
- # frontend, only the client side will get keep-alives, and if this option is
2649
- # used in a backend, only the server side will get keep-alives. For this
2650
- # reason, it is strongly recommended to explicitly use "option clitcpka" and
2651
- # "option srvtcpka" when the configuration is split between frontends and
2652
- # backends.
2653
- #
2654
- # See also : "option clitcpka", "option srvtcpka"
2655
- #
2656
- attr_accessor :option_tcpka
2657
-
2658
- #
2659
- # option tcplog
2660
- # Enable advanced logging of TCP connections with session state and timers
2661
- # May be used in sections : defaults | frontend | listen | backend
2662
- # yes | yes | yes | yes
2663
- # Arguments : none
2664
- #
2665
- # By default, the log output format is very poor, as it only contains the
2666
- # source and destination addresses, and the instance name. By specifying
2667
- # "option tcplog", each log line turns into a much richer format including, but
2668
- # not limited to, the connection timers, the session status, the connections
2669
- # numbers, the frontend, backend and server name, and of course the source
2670
- # address and ports. This option is useful for pure TCP proxies in order to
2671
- # find which of the client or server disconnects or times out. For normal HTTP
2672
- # proxies, it's better to use "option httplog" which is even more complete.
2673
- #
2674
- # This option may be set either in the frontend or the backend.
2675
- #
2676
- # See also : "option httplog", and section 8 about logging.
2677
- #
2678
- attr_accessor :option_tcplog
2679
-
2680
- #
2681
- # rate-limit sessions <rate>
2682
- # Set a limit on the number of new sessions accepted per second on a frontend
2683
- # May be used in sections : defaults | frontend | listen | backend
2684
- # yes | yes | yes | no
2685
- # Arguments :
2686
- # <rate> The <rate> parameter is an integer designating the maximum number
2687
- # of new sessions per second to accept on the frontend.
2688
- #
2689
- # When the frontend reaches the specified number of new sessions per second, it
2690
- # stops accepting new connections until the rate drops below the limit again.
2691
- # During this time, the pending sessions will be kept in the socket's backlog
2692
- # (in system buffers) and haproxy will not even be aware that sessions are
2693
- # pending. When applying very low limit on a highly loaded service, it may make
2694
- # sense to increase the socket's backlog using the "backlog" keyword.
2695
- #
2696
- # This feature is particularly efficient at blocking connection-based attacks
2697
- # or service abuse on fragile servers. Since the session rate is measured every
2698
- # millisecond, it is extremely accurate. Also, the limit applies immediately,
2699
- # no delay is needed at all to detect the threshold.
2700
- #
2701
- # Example : limit the connection rate on SMTP to 10 per second max
2702
- # listen smtp
2703
- # mode tcp
2704
- # bind :25
2705
- # rate-limit sessions 10
2706
- # server 127.0.0.1:1025
2707
- #
2708
- # Note : when the maximum rate is reached, the frontend's status appears as
2709
- # "FULL" in the statistics, exactly as when it is saturated.
2710
- #
2711
- # See also : the "backlog" keyword and the "fe_sess_rate" ACL criterion.
2712
- #
2713
- attr_accessor :rate_limit_sessions
2714
-
2715
- #
2716
- # timeout client <timeout>
2717
- # timeout clitimeout <timeout> (deprecated)
2718
- # Set the maximum inactivity time on the client side.
2719
- # May be used in sections : defaults | frontend | listen | backend
2720
- # yes | yes | yes | no
2721
- # Arguments :
2722
- # <timeout> is the timeout value specified in milliseconds by default, but
2723
- # can be in any other unit if the number is suffixed by the unit,
2724
- # as explained at the top of this document.
2725
- #
2726
- # The inactivity timeout applies when the client is expected to acknowledge or
2727
- # send data. In HTTP mode, this timeout is particularly important to consider
2728
- # during the first phase, when the client sends the request, and during the
2729
- # response while it is reading data sent by the server. The value is specified
2730
- # in milliseconds by default, but can be in any other unit if the number is
2731
- # suffixed by the unit, as specified at the top of this document. In TCP mode
2732
- # (and to a lesser extent, in HTTP mode), it is highly recommended that the
2733
- # client timeout remains equal to the server timeout in order to avoid complex
2734
- # situations to debug. It is a good practice to cover one or several TCP packet
2735
- # losses by specifying timeouts that are slightly above multiples of 3 seconds
2736
- # (eg: 4 or 5 seconds).
2737
- #
2738
- # This parameter is specific to frontends, but can be specified once for all in
2739
- # "defaults" sections. This is in fact one of the easiest solutions not to
2740
- # forget about it. An unspecified timeout results in an infinite timeout, which
2741
- # is not recommended. Such a usage is accepted and works but reports a warning
2742
- # during startup because it may results in accumulation of expired sessions in
2743
- # the system if the system's timeouts are not configured either.
2744
- #
2745
- # This parameter replaces the old, deprecated "clitimeout". It is recommended
2746
- # to use it to write new configurations. The form "timeout clitimeout" is
2747
- # provided only by backwards compatibility but its use is strongly discouraged.
2748
- #
2749
- # See also : "clitimeout", "timeout server".
2750
- #
2751
- attr_accessor :timeout_client
2752
-
2753
- #
2754
- # timeout http-keep-alive <timeout>
2755
- # Set the maximum allowed time to wait for a new HTTP request to appear
2756
- # May be used in sections : defaults | frontend | listen | backend
2757
- # yes | yes | yes | yes
2758
- # Arguments :
2759
- # <timeout> is the timeout value specified in milliseconds by default, but
2760
- # can be in any other unit if the number is suffixed by the unit,
2761
- # as explained at the top of this document.
2762
- #
2763
- # By default, the time to wait for a new request in case of keep-alive is set
2764
- # by "timeout http-request". However this is not always convenient because some
2765
- # people want very short keep-alive timeouts in order to release connections
2766
- # faster, and others prefer to have larger ones but still have short timeouts
2767
- # once the request has started to present itself.
2768
- #
2769
- # The "http-keep-alive" timeout covers these needs. It will define how long to
2770
- # wait for a new HTTP request to start coming after a response was sent. Once
2771
- # the first byte of request has been seen, the "http-request" timeout is used
2772
- # to wait for the complete request to come. Note that empty lines prior to a
2773
- # new request do not refresh the timeout and are not counted as a new request.
2774
- #
2775
- # There is also another difference between the two timeouts : when a connection
2776
- # expires during timeout http-keep-alive, no error is returned, the connection
2777
- # just closes. If the connection expires in "http-request" while waiting for a
2778
- # connection to complete, a HTTP 408 error is returned.
2779
- #
2780
- # In general it is optimal to set this value to a few tens to hundreds of
2781
- # milliseconds, to allow users to fetch all objects of a page at once but
2782
- # without waiting for further clicks. Also, if set to a very small value (eg:
2783
- # 1 millisecond) it will probably only accept pipelined requests but not the
2784
- # non-pipelined ones. It may be a nice trade-off for very large sites running
2785
- # with tens to hundreds of thousands of clients.
2786
- #
2787
- # If this parameter is not set, the "http-request" timeout applies, and if both
2788
- # are not set, "timeout client" still applies at the lower level. It should be
2789
- # set in the frontend to take effect, unless the frontend is in TCP mode, in
2790
- # which case the HTTP backend's timeout will be used.
2791
- #
2792
- # See also : "timeout http-request", "timeout client".
2793
- #
2794
- attr_accessor :timeout_http_keep_alive
2795
-
2796
- #
2797
- # timeout http-request <timeout>
2798
- # Set the maximum allowed time to wait for a complete HTTP request
2799
- # May be used in sections : defaults | frontend | listen | backend
2800
- # yes | yes | yes | yes
2801
- # Arguments :
2802
- # <timeout> is the timeout value specified in milliseconds by default, but
2803
- # can be in any other unit if the number is suffixed by the unit,
2804
- # as explained at the top of this document.
2805
- #
2806
- # In order to offer DoS protection, it may be required to lower the maximum
2807
- # accepted time to receive a complete HTTP request without affecting the client
2808
- # timeout. This helps protecting against established connections on which
2809
- # nothing is sent. The client timeout cannot offer a good protection against
2810
- # this abuse because it is an inactivity timeout, which means that if the
2811
- # attacker sends one character every now and then, the timeout will not
2812
- # trigger. With the HTTP request timeout, no matter what speed the client
2813
- # types, the request will be aborted if it does not complete in time.
2814
- #
2815
- # Note that this timeout only applies to the header part of the request, and
2816
- # not to any data. As soon as the empty line is received, this timeout is not
2817
- # used anymore. It is used again on keep-alive connections to wait for a second
2818
- # request if "timeout http-keep-alive" is not set.
2819
- #
2820
- # Generally it is enough to set it to a few seconds, as most clients send the
2821
- # full request immediately upon connection. Add 3 or more seconds to cover TCP
2822
- # retransmits but that's all. Setting it to very low values (eg: 50 ms) will
2823
- # generally work on local networks as long as there are no packet losses. This
2824
- # will prevent people from sending bare HTTP requests using telnet.
2825
- #
2826
- # If this parameter is not set, the client timeout still applies between each
2827
- # chunk of the incoming request. It should be set in the frontend to take
2828
- # effect, unless the frontend is in TCP mode, in which case the HTTP backend's
2829
- # timeout will be used.
2830
- #
2831
- # See also : "timeout http-keep-alive", "timeout client".
2832
- #
2833
- attr_accessor :timeout_http_request
2834
-
2835
- #
2836
- # timeout tarpit <timeout>
2837
- # Set the duration for which tarpitted connections will be maintained
2838
- # May be used in sections : defaults | frontend | listen | backend
2839
- # yes | yes | yes | yes
2840
- # Arguments :
2841
- # <timeout> is the tarpit duration specified in milliseconds by default, but
2842
- # can be in any other unit if the number is suffixed by the unit,
2843
- # as explained at the top of this document.
2844
- #
2845
- # When a connection is tarpitted using "reqtarpit", it is maintained open with
2846
- # no activity for a certain amount of time, then closed. "timeout tarpit"
2847
- # defines how long it will be maintained open.
2848
- #
2849
- # The value is specified in milliseconds by default, but can be in any other
2850
- # unit if the number is suffixed by the unit, as specified at the top of this
2851
- # document. If unspecified, the same value as the backend's connection timeout
2852
- # ("timeout connect") is used, for backwards compatibility with older versions
2853
- # with no "timeout tarpit" parameter.
2854
- #
2855
- # See also : "timeout connect", "contimeout".
2856
- #
2857
- attr_accessor :timeout_tarpit
2858
-
2859
- attr_accessor :reqisetbe
2860
- attr_accessor :reqsetbe
2861
-
2862
- #
2863
- # name <name>
2864
- # The frontend name is required.
2865
- #
2866
- attr_accessor :name
17
+ include RhaproxyKeywords,
18
+ :exclude => [
19
+ :appsession,
20
+ :balance,
21
+ :cookie,
22
+ :default_server,
23
+ :dispatch,
24
+ :fullconn,
25
+ :hash_type,
26
+ :http_check_disable_on_404,
27
+ :http_check_expect,
28
+ :http_check_send_state,
29
+ :option_abortonclose,
30
+ :option_accept_invalid_http_response,
31
+ :option_allbackups,
32
+ :option_checkcache,
33
+ :option_httpchk,
34
+ :option_ldap_check,
35
+ :option_log_health_checks,
36
+ :option_mysql_check,
37
+ :option_persist,
38
+ :option_redispatch,
39
+ :option_smtpchk,
40
+ :option_srvtcpka,
41
+ :option_ssl_hello_chk,
42
+ :option_tcp_smart_connect,
43
+ :option_transparent,
44
+ :persist_rdp_cookie,
45
+ :retries,
46
+ :server,
47
+ :source,
48
+ :stats_admin,
49
+ :stats_auth,
50
+ :stats_enable,
51
+ :stats_hide_version,
52
+ :stats_http_request,
53
+ :stats_realm,
54
+ :stats_refresh,
55
+ :stats_scope,
56
+ :stats_show_desc,
57
+ :stats_show_legends,
58
+ :stats_show_node,
59
+ :stats_uri,
60
+ :stick_match,
61
+ :stick_on,
62
+ :stick_store_request,
63
+ :stick_table,
64
+ :tcp_response_content,
65
+ :tcp_response_inspect_delay,
66
+ :timeout_check,
67
+ :timeout_connect,
68
+ :timeout_queue,
69
+ :timeout_server
70
+ ]
2867
71
 
2868
72
  #
2869
73
  # Returns a new RhaproxyFrontend Object
2870
74
  #
2871
75
  def initialize()
76
+ @conf ||= []
77
+ @proxy_type = "frontend"
2872
78
  end
2873
79
 
2874
- #
2875
- # Compile the HAproxy frontend configuration
2876
- #
2877
- def config
2878
-
2879
- if @name
2880
-
2881
- conf = option_string()
2882
-
2883
- return conf
2884
-
2885
- else
2886
-
2887
- puts "frontend name not defined"
2888
-
2889
- return false
2890
-
2891
- end
2892
-
2893
- end
2894
-
2895
- private
2896
-
2897
- def option_string()
2898
-
2899
- ostring = " " + "frontend " + @name + "\n"
2900
-
2901
- if @acl
2902
- ostring += " " + "acl " + @acl.to_s + "\n"
2903
- end
2904
-
2905
- if @bind
2906
- ostring += " " + "bind " + @bind.to_s + "\n"
2907
- end
2908
-
2909
- if @block
2910
- ostring += " " + "block " + @block.to_s + "\n"
2911
- end
2912
-
2913
- if @capture_cookie
2914
- ostring += " " + "capture cookie " + @capture_cookie.to_s + "\n"
2915
- end
2916
-
2917
- if @capture_request_header
2918
- ostring += " " + "capture request header " + @capture_request_header.to_s + "\n"
2919
- end
2920
-
2921
- if @capture_response_header
2922
- ostring += " " + "capture response header " + @capture_response_header.to_s + "\n"
2923
- end
2924
-
2925
- if @force_persist
2926
- ostring += " " + "force-persist " + @force_persist.to_s + "\n"
2927
- end
2928
-
2929
- if @http_request
2930
- ostring += " " + "http-request " + @http_request.to_s + "\n"
2931
- end
2932
-
2933
- if @persistent_id
2934
- ostring += " " + "id " + @persistent_id.to_s + "\n"
2935
- end
2936
-
2937
- if @ignore_persist
2938
- ostring += " " + "ignore persist " + @ignore_persist.to_s + "\n"
2939
- end
2940
-
2941
- if @monitor_fail
2942
- ostring += " " + "monitor fail " + @monitor_fail.to_s + "\n"
2943
- end
2944
-
2945
- if @option_ignore_presist
2946
- ostring += " " + "option ignore-presist " + @option_ignore_presist.to_s + "\n"
2947
- end
2948
-
2949
- if @redirect
2950
- ostring += " " + "redirect " + @redirect.to_s + "\n"
2951
- end
2952
-
2953
- if @reqadd
2954
- ostring += " " + "reqadd " + @reqadd.to_s + "\n"
2955
- end
2956
-
2957
- if @reqallow
2958
- ostring += " " + "reqallow " + @reqallow.to_s + "\n"
2959
- end
2960
-
2961
- if @reqiallow
2962
- ostring += " " + "reqiallow " + @reqiallow.to_s + "\n"
2963
- end
2964
-
2965
- if @reqdel
2966
- ostring += " " + "reqdel " + @reqdel.to_s + "\n"
2967
- end
2968
-
2969
- if @reqidel
2970
- ostring += " " + "reqidel " + @reqidel.to_s + "\n"
2971
- end
2972
-
2973
- if @reqdeny
2974
- ostring += " " + "reqdeny " + @reqdeny.to_s + "\n"
2975
- end
2976
-
2977
- if @reqideny
2978
- ostring += " " + "reqideny " + @reqideny.to_s + "\n"
2979
- end
2980
-
2981
- if @reqpass
2982
- ostring += " " + "reqpass " + @reqpass.to_s + "\n"
2983
- end
2984
-
2985
- if @reqipass
2986
- ostring += " " + "reqipass " + @reqipass.to_s + "\n"
2987
- end
2988
-
2989
- if @reqrep
2990
- ostring += " " + "reqrep " + @reqrep.to_s + "\n"
2991
- end
2992
-
2993
- if @reqirep
2994
- ostring += " " + "reqirep " + @reqirep.to_s + "\n"
2995
- end
2996
-
2997
- if @reqtarpit
2998
- ostring += " " + "reqtarpit " + @reqtarpit.to_s + "\n"
2999
- end
3000
-
3001
- if @reqitarpit
3002
- ostring += " " + "reqitarpit " + @reqitarpit.to_s + "\n"
3003
- end
3004
-
3005
- if @rspadd
3006
- ostring += " " + "rspadd " + @rspadd.to_s + "\n"
3007
- end
3008
-
3009
- if @rspdel
3010
- ostring += " " + "rspdel " + @rspdel.to_s + "\n"
3011
- end
3012
-
3013
- if @rspidel
3014
- ostring += " " + "rspidel " + @rspidel.to_s + "\n"
3015
- end
3016
-
3017
- if @rspdeny
3018
- ostring += " " + "rspdeny " + @rspdeny.to_s + "\n"
3019
- end
3020
-
3021
- if @rspideny
3022
- ostring += " " + "rspideny " + @rspideny.to_s + "\n"
3023
- end
3024
-
3025
- if @rspirep
3026
- ostring += " " + "rspirep " + @rspirep.to_s + "\n"
3027
- end
3028
-
3029
- if @rsprep
3030
- ostring += " " + "rsprep " + @rsprep.to_s + "\n"
3031
- end
3032
-
3033
- if @tcp_request_connection
3034
- ostring += " " + "tcp-request connection " + @tcp_request_connection.to_s + "\n"
3035
- end
3036
-
3037
- if @tcp_request_content
3038
- ostring += " " + "tcp-request content " + @tcp_request_content.to_s + "\n"
3039
- end
3040
-
3041
- if @tcp_request_inspect_delay
3042
- ostring += " " + "tcp-request inspect-delay " + @tcp_request_inspect_delay.to_s + "\n"
3043
- end
3044
-
3045
- if @use_backend
3046
- ostring += " " + "use_backend " + @use_backend.to_s + "\n"
3047
- end
3048
-
3049
- if @description
3050
- ostring += " " + "description " + @description.to_s + "\n"
3051
- end
3052
-
3053
- if @reqisetbe
3054
- ostring += " " + "reqisetbe " + @reqisetbe.to_s + "\n"
3055
- end
3056
-
3057
- if @reqsetbe
3058
- ostring += " " + "reqsetbe " + @reqsetbe.to_s + "\n"
3059
- end
3060
-
3061
- if @backlog
3062
- ostring += " " + "backlog " + @backlog.to_s + "\n"
3063
- end
3064
-
3065
- if @bind_process
3066
- ostring += " " + "bind-process " + @bind_process.to_s + "\n"
3067
- end
3068
-
3069
- if @default_backend
3070
- ostring += " " + "default_backend " + @default_backend.to_s + "\n"
3071
- end
3072
-
3073
- if @disabled
3074
- ostring += " " + "disabled " + "\n"
3075
- end
3076
-
3077
- if @enabled
3078
- ostring += " " + "enabled " + "\n"
3079
- end
3080
-
3081
- if @errorfile
3082
- ostring += " " + "errorfile " + @errorfile.to_s + "\n"
3083
- end
3084
-
3085
- if @errorloc
3086
- ostring += " " + "errorloc " + @errorloc.to_s + "\n"
3087
- end
3088
-
3089
- if @errorloc302
3090
- ostring += " " + "errorloc302 " + @errorloc302.to_s + "\n"
3091
- end
3092
-
3093
- if @errorloc303
3094
- ostring += " " + "errorloc303 " + @errorloc303.to_s + "\n"
3095
- end
3096
-
3097
- if @grace
3098
- ostring += " " + "grace " + @grace.to_s + "\n"
3099
- end
3100
-
3101
- if @log
3102
- ostring += " " + "log " + @log.to_s + "\n"
3103
- end
3104
-
3105
- if @maxconn
3106
- ostring += " " + "maxconn " + @maxconn.to_s + "\n"
3107
- end
3108
-
3109
- if @mode
3110
- ostring += " " + "mode " + @mode.to_s + "\n"
3111
- end
3112
-
3113
- if @monitor_net
3114
- ostring += " " + "monitor-net " + @monitor_net.to_s + "\n"
3115
- end
3116
-
3117
- if @monitor_uri
3118
- ostring += " " + "monitor-uri " + @monitor_uri.to_s + "\n"
3119
- end
3120
-
3121
- if @option_accept_invalid_http_request
3122
- ostring += " " + "option accept-invalid-http-request " + "\n"
3123
- end
3124
-
3125
- if @option_clitcpka
3126
- ostring += " " + "option clitcpka " + "\n"
3127
- end
3128
-
3129
- if @option_contstats
3130
- ostring += " " + "option contstats " + "\n"
3131
- end
3132
-
3133
- if @option_dontlog_normal
3134
- ostring += " " + "option dontlog-normal " + "\n"
3135
- end
3136
-
3137
- if @option_dontlognull
3138
- ostring += " " + "option dontlognull " + "\n"
3139
- end
3140
-
3141
- if @option_forceclose
3142
- ostring += " " + "option forceclose " + "\n"
3143
- end
3144
-
3145
- if @option_forwardfor
3146
- ostring += " " + "option forwardfor " + @option_forwardfor.to_s + "\n"
3147
- end
3148
-
3149
- if @option_http_pretend_keepalive
3150
- ostring += " " + "option http-pretend-keepalive " + "\n"
3151
- end
3152
-
3153
- if @option_http_server_close
3154
- ostring += " " + "option http-server-close " + "\n"
3155
- end
3156
-
3157
- if @option_http_use_proxy_header
3158
- ostring += " " + "option http-use-proxy-header " + "\n"
3159
- end
3160
-
3161
- if @option_httpclose
3162
- ostring += " " + "option httpclose " + "\n"
3163
- end
3164
-
3165
- if @option_httplog
3166
- ostring += " " + "option httplog " + "\n"
3167
- end
3168
-
3169
- if @option_httplog_clf
3170
- ostring += " " + "option httplog " + @option_httplog_clf.to_s + "\n"
3171
- end
3172
-
3173
- if @option_http_proxy
3174
- ostring += " " + "option http_proxy " + "\n"
3175
- end
3176
-
3177
- if @option_independant_streams
3178
- ostring += " " + "option independant-streams " + "\n"
3179
- end
3180
-
3181
- if @option_log_separate_errors
3182
- ostring += " " + "option log-separate-errors " + "\n"
3183
- end
3184
-
3185
- if @option_logasap
3186
- ostring += " " + "option logasap " + "\n"
3187
- end
3188
-
3189
- if @option_nolinger
3190
- ostring += " " + "option nolinger " + "\n"
3191
- end
3192
-
3193
- if @option_originalto
3194
- ostring += " " + "option originalto " + @option_originalto.to_s + "\n"
3195
- end
3196
-
3197
- if @option_socket_stats
3198
- ostring += " " + "option socket-stats " + "\n"
3199
- end
3200
-
3201
- if @option_splice_auto
3202
- ostring += " " + "option splice-auto " + "\n"
3203
- end
3204
-
3205
- if @option_splice_request
3206
- ostring += " " + "option splice-request " + "\n"
3207
- end
3208
-
3209
- if @option_splice_response
3210
- ostring += " " + "option splice-response " + "\n"
3211
- end
3212
-
3213
- if @option_tcp_smart_accept
3214
- ostring += " " + "option tcp-smart-accept " + "\n"
3215
- end
3216
-
3217
- if @option_tcpka
3218
- ostring += " " + "option tcpka " + "\n"
3219
- end
3220
-
3221
- if @option_tcplog
3222
- ostring += " " + "option tcplog " + "\n"
3223
- end
3224
-
3225
- if @rate_limit_sessions
3226
- ostring += " " + "rate-limit sessions " + @rate_limit_sessions.to_s + "\n"
3227
- end
3228
-
3229
- if @timeout_client
3230
- ostring += " " + "timeout client " + @timeout_client.to_s + "\n"
3231
- end
3232
-
3233
- if @timeout_http_keep_alive
3234
- ostring += " " + "timeout http-keep-alive " + @timeout_http_keep_alive.to_s + "\n"
3235
- end
3236
-
3237
- if @timeout_http_request
3238
- ostring += " " + "timeout http-request " + @timeout_http_request.to_s + "\n"
3239
- end
3240
-
3241
- if @timeout_tarpit
3242
- ostring += " " + "timeout tarpit " + @timeout_tarpit.to_s + "\n"
3243
- end
3244
-
3245
- ostring += "\n"
3246
-
3247
- return ostring
3248
-
3249
- end
3250
80
  end
3251
81