|
commit a100980f50f92e588c2b60f20571e84bf749f3e3
|
|
Author: Lukas Tribus <lukas@ltri.eu>
|
|
Date: Sat Oct 27 20:07:40 2018 +0200
|
|
|
|
BUG/MINOR: only auto-prefer last server if lb-alg is non-deterministic
|
|
|
|
While "option prefer-last-server" only applies to non-deterministic load
|
|
balancing algorithms, 401/407 responses actually caused haproxy to prefer
|
|
the last server unconditionally.
|
|
|
|
As this breaks deterministic load balancing algorithms like uri, this
|
|
patch applies the same condition here.
|
|
|
|
Should be backported to 1.8 (together with "BUG/MINOR: only mark
|
|
connections private if NTLM is detected").
|
|
|
|
(cherry picked from commit 80512b186fd7f4ef3bc7d9c92b281c549d72aa8a)
|
|
Signed-off-by: Willy Tarreau <w@1wt.eu>
|
|
|
|
diff --git a/doc/configuration.txt b/doc/configuration.txt
|
|
index 43b1b822..f0558d5e 100644
|
|
--- a/doc/configuration.txt
|
|
+++ b/doc/configuration.txt
|
|
@@ -2498,6 +2498,11 @@ balance url_param <param> [check_post]
|
|
algorithm, mode nor option have been set. The algorithm may only be set once
|
|
for each backend.
|
|
|
|
+ With authentication schemes that require the same connection like NTLM, URI
|
|
+ based alghoritms must not be used, as they would cause subsequent requests
|
|
+ to be routed to different backend servers, breaking the invalid assumptions
|
|
+ NTLM relies on.
|
|
+
|
|
Examples :
|
|
balance roundrobin
|
|
balance url_param userid
|
|
@@ -6486,8 +6491,9 @@ no option prefer-last-server
|
|
close of the connection. This can make sense for static file servers. It does
|
|
not make much sense to use this in combination with hashing algorithms. Note,
|
|
haproxy already automatically tries to stick to a server which sends a 401 or
|
|
- to a proxy which sends a 407 (authentication required). This is mandatory for
|
|
- use with the broken NTLM authentication challenge, and significantly helps in
|
|
+ to a proxy which sends a 407 (authentication required), when the load
|
|
+ balancing algorithm is not deterministic. This is mandatory for use with the
|
|
+ broken NTLM authentication challenge, and significantly helps in
|
|
troubleshooting some faulty applications. Option prefer-last-server might be
|
|
desirable in these environments as well, to avoid redistributing the traffic
|
|
after every other response.
|
|
diff --git a/src/backend.c b/src/backend.c
|
|
index fc1eac0d..b3fd6c67 100644
|
|
--- a/src/backend.c
|
|
+++ b/src/backend.c
|
|
@@ -572,9 +572,9 @@ int assign_server(struct stream *s)
|
|
if (conn &&
|
|
(conn->flags & CO_FL_CONNECTED) &&
|
|
objt_server(conn->target) && __objt_server(conn->target)->proxy == s->be &&
|
|
+ (s->be->lbprm.algo & BE_LB_KIND) != BE_LB_KIND_HI &&
|
|
((s->txn && s->txn->flags & TX_PREFER_LAST) ||
|
|
((s->be->options & PR_O_PREF_LAST) &&
|
|
- (s->be->lbprm.algo & BE_LB_KIND) != BE_LB_KIND_HI &&
|
|
(!s->be->max_ka_queue ||
|
|
server_has_room(__objt_server(conn->target)) ||
|
|
(__objt_server(conn->target)->nbpend + 1) < s->be->max_ka_queue))) &&
|
|
diff --git a/src/proto_http.c b/src/proto_http.c
|
|
index cde2dbf7..a48c4fdb 100644
|
|
--- a/src/proto_http.c
|
|
+++ b/src/proto_http.c
|
|
@@ -4385,7 +4385,8 @@ void http_end_txn_clean_session(struct stream *s)
|
|
* server over the same connection. This is required by some
|
|
* broken protocols such as NTLM, and anyway whenever there is
|
|
* an opportunity for sending the challenge to the proper place,
|
|
- * it's better to do it (at least it helps with debugging).
|
|
+ * it's better to do it (at least it helps with debugging), at
|
|
+ * least for non-deterministic load balancing algorithms.
|
|
*/
|
|
s->txn->flags |= TX_PREFER_LAST;
|
|
}
|